jegolize 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. data/VERSION +1 -1
  2. data/app/controllers/jegol_controller.rb +43 -0
  3. data/app/views/_jegol.html.erb +49 -0
  4. data/app/views/jebol_demo.html.erb +3 -0
  5. data/config/initializers/jegol.rb +3 -0
  6. data/config/jegol.yml +31 -0
  7. data/jegolize.gemspec +31 -1
  8. data/lib/jegolize.rb +31 -0
  9. data/lib/ruby_bosh.rb +161 -0
  10. data/public/javascripts/jegol.js +571 -0
  11. data/public/javascripts/jegol.plugin/jegol.plugin.update.subject_docs/images/doc_background.gif +0 -0
  12. data/public/javascripts/jegol.plugin/jegol.plugin.update.subject_docs/images/shared.css +360 -0
  13. data/public/javascripts/jegol.plugin/jegol.plugin.update.subject_docs/index.html +1 -0
  14. data/public/javascripts/jegol.plugin/jegol.plugin.update.subject_docs/index.html.xml +2 -0
  15. data/public/javascripts/jegol.plugin/jegol.plugin.update.tag_docs/images/doc_background.gif +0 -0
  16. data/public/javascripts/jegol.plugin/jegol.plugin.update.tag_docs/images/shared.css +360 -0
  17. data/public/javascripts/jegol.plugin/jegol.plugin.update.tag_docs/index.html +1 -0
  18. data/public/javascripts/jegol.plugin/jegol.plugin.update.tag_docs/index.html.xml +2 -0
  19. data/public/javascripts/jegol.plugin/update.notify.js +53 -0
  20. data/public/javascripts/jegol.plugin/update.subject.js +17 -0
  21. data/public/javascripts/jegol.plugin/update.tag.js +84 -0
  22. data/public/javascripts/jegol.plugin/viewer.default.js +17 -0
  23. data/public/javascripts/jegol.plugin/viewer.image.js +7 -0
  24. data/public/javascripts/jegol.plugin/viewer.poll.js +6 -0
  25. data/public/javascripts/jegol.plugin/viewer.youtube.js +7 -0
  26. data/public/javascripts/jegol.tag.js +102 -0
  27. data/public/javascripts/jegol_docs/images/doc_background.gif +0 -0
  28. data/public/javascripts/jegol_docs/images/shared.css +360 -0
  29. data/public/javascripts/jegol_docs/index.html +1 -0
  30. data/public/javascripts/jegol_docs/index.html.xml +200 -0
  31. data/public/javascripts/strophe.js +3543 -0
  32. data/public/stylesheets/.gitkeep +0 -0
  33. data/public/stylesheets/jegol.css +181 -0
  34. metadata +32 -2
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -0,0 +1,43 @@
1
+ require 'ruby_bosh'
2
+ require 'xmpp4r'
3
+ require 'xmpp4r/muc/helper/mucclient'
4
+ require 'xmpp4r/muc/helper/simplemucclient'
5
+
6
+ class JegolController < ApplicationController
7
+ def new_boshsession
8
+ username = session[:user_jid].nil? ? get_jid() : session[:user_jid]
9
+ password = session[:user_password].nil? ? JEGOL_CONFIG['default_pwd'] : session[:user_password]
10
+
11
+ xmpp_server = JEGOL_CONFIG['xmpp_server']
12
+ xmpp_bosh_port = JEGOL_CONFIG['xmpp_bosh_port']
13
+ jid = "#{username}@#{xmpp_server}"
14
+ server_url = "http://#{xmpp_server}:#{xmpp_bosh_port}/http-bind/"
15
+ room = "#{params[:room_jid]}@#{JEGOL_CONFIG['muc_namespace']}"
16
+ nickname = "#{username}:~:#{Time.new.tv_sec}" #append timestamp to make sure nickname is unique
17
+
18
+ @session_jid, @session_id, @session_random_id = RubyBOSH.initialize_session(jid,
19
+ password,
20
+ server_url,
21
+ {:timeout => 20})
22
+
23
+ render :json => {:jid=>@session_jid, :sid=>@session_id, :rid=>@session_random_id, :room => room, :nickname => nickname}
24
+ end
25
+
26
+ def get_jid
27
+ if(session[:user_jid].nil?)
28
+ session[:user_jid] = "#{JEGOL_CONFIG['guest_jid']}#{rand(9999)}"
29
+ create_jid(session[:user_jid])
30
+ end
31
+ session[:user_jid]
32
+ end
33
+
34
+ def create_jid(username)
35
+ jid = "#{username}@#{JEGOL_CONFIG['xmpp_server']}"
36
+ client = Jabber::Client.new(jid)
37
+ client.connect(nil, JEGOL_CONFIG['c2s_port'].to_i)
38
+ client.register(JEGOL_CONFIG['default_pwd'])
39
+
40
+ client.close
41
+ return username
42
+ end
43
+ end
@@ -0,0 +1,49 @@
1
+
2
+ <%= stylesheet_link_tag "jegol", "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" %>
3
+ <%= javascript_include_tag 'jegol', 'strophe', 'jegol.tag', 'jegol/plugin/viewer.default', 'jegol/plugin/update.tag', 'jegol/plugin/viewer.image', 'jegol/plugin/viewer.youtube', 'jegol/plugin/viewer.poll', 'jegol/plugin/update.subject', 'jegol/plugin/update.notify', 'http://platform.twitter.com/widgets.js', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js'%>
4
+ <div id="jegol_box">
5
+ <input type='hidden' id='jegol_service_url' value='<%= service %>' />
6
+ <div>
7
+ <div id="jegol_version">
8
+ <strong>jeGol</strong><span style="font-size:xx-small;">beta</span>
9
+ </div>
10
+ </div>
11
+ <div>
12
+ <div id="jegol_buzz">
13
+ <div id="jegol_feedback">
14
+ <input class="jegol_Button" type="button" onclick='javascript:window.open("https://github.com/alemyis/jeGol/issues", "blank")' value="Feedback" />
15
+ </div>
16
+ <% if(!tweeturl.nil?) %>
17
+ <a href='http://twitter.com/share?url=<%= tweeturl %>&via=jegol' class="twitter-share-button">Tweet</a>
18
+ <% end %>
19
+
20
+ </div>
21
+ <div id="jegol_topic">Welcome</div>
22
+ </div>
23
+ <div id="jegol_tabs">
24
+ <ul>
25
+ <li><a href="#jegol_chatlog"><span>All</span></a></li>
26
+ <li><a href="#jegol_tags"><span>Tagged</span></a></li>
27
+ <li><a href="#jegol_roster"><span>Roster</span></a></li>
28
+ </ul>
29
+ <div id="jegol_chatlog"></div>
30
+ <div id="jegol_tags"></div>
31
+ <div id="jegol_roster"></div>
32
+ </div>
33
+ <div>
34
+
35
+ </div>
36
+ <% if(!readonly) %>
37
+ <div>
38
+ <textarea id='jegol_msgArea'></textarea>
39
+ <input id='jegol_postButton' class="jegol_Button" type="submit" value="Post" tabindex="3"/>
40
+ <span id='jegol_connection_status'>loading...</span>
41
+ </div>
42
+ <% end %>
43
+ </div>
44
+
45
+ <script>
46
+ $(document).ready(function() {
47
+ $("#jegol_tabs").tabs();
48
+ });
49
+ </script>
@@ -0,0 +1,3 @@
1
+ <div>
2
+ <%= render "jegol", :service => "/jegol/boshsession/#{Jegol.get_MUC_name(@meeting.id.to_s)}", :readonly => !@meeting.active? , :tweeturl => "http://jegolize.com"%>
3
+ </div>
@@ -0,0 +1,3 @@
1
+ if __FILE__ == $0
2
+ JEGOL_CONFIG = YAML.load_file("#{Rails.root}/config/jegol.yml")
3
+ end
data/config/jegol.yml ADDED
@@ -0,0 +1,31 @@
1
+ #Set true if you want a chat room created when create a meeting.
2
+ create_muc: true
3
+
4
+ #Set true to send xmpp update stanza when meeting/items get updated
5
+ send_xmpp_CRUD: true
6
+
7
+ # XMPP server address e.g jabber.net
8
+ xmpp_server: <TODO: XMPP.MYSERVER.COM>
9
+ xmpp_bosh_port: 5280
10
+ c2s_port: 5333
11
+
12
+ # Credential used to create chat rooms
13
+ username: <TODO:BACKEND-ADMIN-USERNAME>
14
+ password: <TODO:BACKEND-ADMIN-PASSWORD>
15
+
16
+ #Set true if you want a JID to be created on xmpp_server when users register on qworky site
17
+ create_jid: true
18
+
19
+ #Guest JIDs will be Guest<random-number>
20
+ guest_jid: Juest
21
+
22
+ #default password for user JIDs on xmpp_server
23
+ default_pwd: <TODO: DEFAULT-GUEST-PASSWORD>
24
+
25
+ #sub-domain for chat rooms
26
+ muc_namespace: conference.<TODO: XMPP.MYSERVER.COM>
27
+
28
+ #chat rooms are named [jegolizating_<ID>]
29
+ muc_name_constant: jegolizing_
30
+
31
+
data/jegolize.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{jegolize}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alemeshet Alemu"]
@@ -24,8 +24,38 @@ Gem::Specification.new do |s|
24
24
  "README.rdoc",
25
25
  "Rakefile",
26
26
  "VERSION",
27
+ "app/controllers/jegol_controller.rb",
28
+ "app/views/_jegol.html.erb",
29
+ "app/views/jebol_demo.html.erb",
30
+ "config/initializers/jegol.rb",
31
+ "config/jegol.yml",
27
32
  "jegolize.gemspec",
28
33
  "lib/jegolize.rb",
34
+ "lib/ruby_bosh.rb",
35
+ "public/javascripts/jegol.js",
36
+ "public/javascripts/jegol.plugin/jegol.plugin.update.subject_docs/images/doc_background.gif",
37
+ "public/javascripts/jegol.plugin/jegol.plugin.update.subject_docs/images/shared.css",
38
+ "public/javascripts/jegol.plugin/jegol.plugin.update.subject_docs/index.html",
39
+ "public/javascripts/jegol.plugin/jegol.plugin.update.subject_docs/index.html.xml",
40
+ "public/javascripts/jegol.plugin/jegol.plugin.update.tag_docs/images/doc_background.gif",
41
+ "public/javascripts/jegol.plugin/jegol.plugin.update.tag_docs/images/shared.css",
42
+ "public/javascripts/jegol.plugin/jegol.plugin.update.tag_docs/index.html",
43
+ "public/javascripts/jegol.plugin/jegol.plugin.update.tag_docs/index.html.xml",
44
+ "public/javascripts/jegol.plugin/update.notify.js",
45
+ "public/javascripts/jegol.plugin/update.subject.js",
46
+ "public/javascripts/jegol.plugin/update.tag.js",
47
+ "public/javascripts/jegol.plugin/viewer.default.js",
48
+ "public/javascripts/jegol.plugin/viewer.image.js",
49
+ "public/javascripts/jegol.plugin/viewer.poll.js",
50
+ "public/javascripts/jegol.plugin/viewer.youtube.js",
51
+ "public/javascripts/jegol.tag.js",
52
+ "public/javascripts/jegol_docs/images/doc_background.gif",
53
+ "public/javascripts/jegol_docs/images/shared.css",
54
+ "public/javascripts/jegol_docs/index.html",
55
+ "public/javascripts/jegol_docs/index.html.xml",
56
+ "public/javascripts/strophe.js",
57
+ "public/stylesheets/.gitkeep",
58
+ "public/stylesheets/jegol.css",
29
59
  "test/helper.rb",
30
60
  "test/test_jegolize.rb"
31
61
  ]
data/lib/jegolize.rb CHANGED
@@ -0,0 +1,31 @@
1
+ require 'xmpp4r'
2
+ require 'xmpp4r/muc/helper/mucclient'
3
+ require 'xmpp4r/muc/helper/simplemucclient'
4
+
5
+ class Jegol
6
+ def self.create_room(unique_id)
7
+ muc_name = get_MUC_name(unique_id)
8
+ if JEGOL_CONFIG['create_muc']
9
+ jid = "#{JEGOL_CONFIG['username']}@#{JEGOL_CONFIG['xmpp_server']}"
10
+ client = Jabber::Client.new(jid)
11
+ client.connect
12
+ client.auth("#{JEGOL_CONFIG['password']}")
13
+ client.send(Jabber::Presence.new.set_show(:chat).set_status('backend'))
14
+
15
+ muc = Jabber::MUC::MUCClient.new(client)
16
+ muc.join(Jabber::JID.new("#{muc_name}@#{JEGOL_CONFIG['muc_namespace']}/jegol"))
17
+ muc.configure('muc#roomconfig_roomname' => "#{muc_name}",
18
+ 'muc#roomconfig_persistentroom' => 1,
19
+ 'muc#roomconfig_changesubject' => 1)
20
+
21
+ muc.exit
22
+ client.close
23
+ end
24
+ end
25
+
26
+ def self.get_MUC_name (unique_id)
27
+ muc_name = JEGOL_CONFIG['muc_name_constant'].nil? ? 'jegol_room_' : JEGOL_CONFIG['muc_name_constant']
28
+ muc_name += unique_id
29
+ muc_name
30
+ end
31
+ end
data/lib/ruby_bosh.rb ADDED
@@ -0,0 +1,161 @@
1
+ require 'rest_client'
2
+ require 'builder'
3
+ require 'rexml/document'
4
+ require 'base64'
5
+ require 'hpricot'
6
+ require 'timeout'
7
+
8
+ class RubyBOSH
9
+ BOSH_XMLNS = 'http://jabber.org/protocol/httpbind'
10
+ TLS_XMLNS = 'urn:ietf:params:xml:ns:xmpp-tls'
11
+ SASL_XMLNS = 'urn:ietf:params:xml:ns:xmpp-sasl'
12
+ BIND_XMLNS = 'urn:ietf:params:xml:ns:xmpp-bind'
13
+ SESSION_XMLNS = 'urn:ietf:params:xml:ns:xmpp-session'
14
+ CLIENT_XMLNS = 'jabber:client'
15
+
16
+ class Error < StandardError; end
17
+ class Timeout < RubyBOSH::Error; end
18
+ class AuthFailed < RubyBOSH::Error; end
19
+ class ConnFailed < RubyBOSH::Error; end
20
+
21
+ @@logging = true
22
+ def self.logging=(value)
23
+ @@logging = value
24
+ end
25
+
26
+ attr_accessor :jid, :rid, :sid, :success
27
+ def initialize(jid, pw, service_url, opts={})
28
+ @service_url = service_url
29
+ @jid, @pw = jid, pw
30
+ @host = jid.split("@").last
31
+ @success = false
32
+ @timeout = opts[:timeout] || 3 #seconds
33
+ @headers = {"Content-Type" => "text/xml; charset=utf-8",
34
+ "Accept" => "text/xml"}
35
+ @wait = opts[:wait] || 5
36
+ @hold = opts[:hold] || 3
37
+ @window = opts[:window] || 5
38
+ end
39
+
40
+ def success?
41
+ @success == true
42
+ end
43
+
44
+ def self.initialize_session(*args)
45
+ new(*args).connect
46
+ end
47
+
48
+ def connect
49
+ initialize_bosh_session
50
+ if send_auth_request
51
+ send_restart_request
52
+ request_resource_binding
53
+ @success = send_session_request
54
+ end
55
+
56
+ raise RubyBOSH::AuthFailed, "could not authenticate #{@jid}" unless success?
57
+ @rid += 1 #updates the rid for the next call from the browser
58
+
59
+ [@jid, @sid, @rid]
60
+ end
61
+
62
+ private
63
+ def initialize_bosh_session
64
+ response = deliver(construct_body(:wait => @wait, :to => @host,
65
+ :hold => @hold, :window => @window,
66
+ "xmpp:version" => '1.0'))
67
+ parse(response)
68
+ end
69
+
70
+ def construct_body(params={}, &block)
71
+ @rid ? @rid+=1 : @rid=rand(100000)
72
+
73
+ builder = Builder::XmlMarkup.new
74
+ parameters = {:rid => @rid, :xmlns => BOSH_XMLNS,
75
+ "xmpp:version" => "1.0",
76
+ "xmlns:xmpp" => "urn:xmpp:xbosh"}.merge(params)
77
+
78
+ if block_given?
79
+ builder.body(parameters) {|body| yield(body)}
80
+ else
81
+ builder.body(parameters)
82
+ end
83
+ end
84
+
85
+ def send_auth_request
86
+ request = construct_body(:sid => @sid) do |body|
87
+ auth_string = "#{@jid}\x00#{@jid.split("@").first.strip}\x00#{@pw}"
88
+ body.auth(Base64.encode64(auth_string).gsub(/\s/,''),
89
+ :xmlns => SASL_XMLNS, :mechanism => 'PLAIN')
90
+ end
91
+
92
+ response = deliver(request)
93
+ response.include?("success")
94
+ end
95
+
96
+ def send_restart_request
97
+ request = construct_body(:sid => @sid, "xmpp:restart" => true, "xmlns:xmpp" => 'urn:xmpp:xbosh')
98
+ deliver(request).include?("stream:features")
99
+ end
100
+
101
+ def request_resource_binding
102
+ request = construct_body(:sid => @sid) do |body|
103
+ body.iq(:id => "bind_#{rand(100000)}", :type => "set",
104
+ :xmlns => "jabber:client") do |iq|
105
+ iq.bind(:xmlns => BIND_XMLNS) do |bind|
106
+ bind.resource("bosh_#{rand(10000)}")
107
+ end
108
+ end
109
+ end
110
+
111
+ response = deliver(request)
112
+ response.include?("<jid>")
113
+ end
114
+
115
+ def send_session_request
116
+ request = construct_body(:sid => @sid) do |body|
117
+ body.iq(:xmlns => CLIENT_XMLNS, :type => "set",
118
+ :id => "sess_#{rand(100000)}") do |iq|
119
+ iq.session(:xmlns => SESSION_XMLNS)
120
+ end
121
+ end
122
+
123
+ response = deliver(request)
124
+ response.include?("body")
125
+ end
126
+
127
+ def parse(_response)
128
+ doc = Hpricot(_response)
129
+ doc.search("//body").each do |body|
130
+ @sid = body.attributes["sid"].to_s
131
+ end
132
+ _response
133
+ end
134
+
135
+ def deliver(xml)
136
+ #SystemTimer.timeout(@timeout) do
137
+ send(xml)
138
+ recv(RestClient.post(@service_url, xml, @headers))
139
+ #end
140
+ rescue ::Timeout::Error => e
141
+ raise RubyBOSH::Timeout, e.message
142
+ rescue Errno::ECONNREFUSED => e
143
+ raise RubyBOSH::ConnFailed, "could not connect to #{@host}\n#{e.message}"
144
+ rescue Exception => e
145
+ raise RubyBOSH::Error, e.message
146
+ end
147
+
148
+ def send(msg)
149
+ puts("Ruby-BOSH - SEND\n#{msg}") if @@logging; msg
150
+ end
151
+
152
+ def recv(msg)
153
+ puts("Ruby-BOSH - RECV\n#{msg}") if @logging; msg
154
+ end
155
+ end
156
+
157
+
158
+ if __FILE__ == $0
159
+ p RubyBOSH.initialize_session(ARGV[0], ARGV[1],
160
+ "http://localhost:5280/http-bind")
161
+ end