social_stream 0.21.4 → 0.22.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/README.rdoc +11 -5
  2. data/base/app/assets/stylesheets/cheesecake.css.scss +1 -0
  3. data/base/app/views/cheesecake/_cheesecake.html.erb +3 -0
  4. data/base/app/views/cheesecake/_index.html.erb +88 -41
  5. data/base/app/views/cheesecake/_sector_form.html.erb +12 -12
  6. data/base/lib/social_stream/base/version.rb +1 -1
  7. data/base/lib/social_stream/test_helpers/controllers.rb +19 -2
  8. data/base/lib/tasks/db/populate.rake +190 -165
  9. data/base/social_stream-base.gemspec +1 -1
  10. data/base/spec/controllers/posts_controller_spec.rb +19 -1
  11. data/lib/social_stream/version.rb +1 -1
  12. data/presence/app/assets/images/status/chat.png +0 -0
  13. data/presence/app/assets/javascripts/chat_interface_manager.js.erb +42 -45
  14. data/presence/app/assets/javascripts/chat_parser.js +5 -5
  15. data/presence/app/assets/javascripts/chat_persistence.js +25 -26
  16. data/presence/app/assets/javascripts/chat_utilities.js +15 -11
  17. data/presence/app/assets/javascripts/chat_window_manager.js +129 -26
  18. data/presence/app/assets/javascripts/jquery.ui.chatbox.sstreampresence.js +22 -3
  19. data/presence/app/assets/javascripts/social_stream-presence.js +1 -0
  20. data/presence/app/assets/javascripts/videochat.js.erb +459 -0
  21. data/presence/app/assets/javascripts/xmpp_client_management.js.erb +303 -65
  22. data/presence/app/assets/stylesheets/chat.css.scss +42 -1
  23. data/presence/app/controllers/xmpp_controller.rb +20 -3
  24. data/presence/app/views/chat/_index.html.erb +7 -2
  25. data/presence/app/views/xmpp/getOpenTokSessionIDAndToken.xml.builder +6 -0
  26. data/presence/config/locales/en.yml +22 -1
  27. data/presence/config/locales/es.yml +23 -2
  28. data/presence/config/routes.rb +2 -0
  29. data/presence/ejabberd/conf/ssconfig_example.cfg +4 -3
  30. data/presence/ejabberd/ejabberd_files.zip +0 -0
  31. data/presence/ejabberd/ejabberd_scripts/authentication_script +22 -12
  32. data/presence/ejabberd/ejabberd_scripts/development_scripts/show_config.sh +9 -10
  33. data/presence/ejabberd/ejabberd_scripts/emanagement +275 -178
  34. data/presence/ejabberd/ejabberd_scripts/manageWebDomains +164 -0
  35. data/presence/ejabberd/ejabberd_scripts/rest_api_client_script +75 -32
  36. data/presence/ejabberd/ejabberd_scripts/synchronize_presence_script +81 -34
  37. data/presence/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
  38. data/presence/ejabberd/mod_sspresence/mod_sspresence.erl +27 -23
  39. data/presence/lib/OpenTok/Exceptions.rb +11 -0
  40. data/presence/lib/OpenTok/OpenTokSDK.rb +184 -0
  41. data/presence/lib/OpenTok/Session.rb +27 -0
  42. data/presence/lib/generators/social_stream/presence/templates/initializer.rb +8 -2
  43. data/presence/lib/open_tok.rb +31 -0
  44. data/presence/lib/opentok.rb +29 -0
  45. data/presence/lib/social_stream-presence.rb +4 -0
  46. data/presence/lib/social_stream/presence/models/buddy_manager.rb +1 -1
  47. data/presence/lib/social_stream/presence/version.rb +1 -1
  48. data/presence/lib/social_stream/presence/xmpp_server_order.rb +96 -76
  49. data/presence/lib/social_stream/presence/xmpp_ssclient.rb +54 -0
  50. data/presence/lib/tasks/presence/multidomain.rake +45 -0
  51. data/presence/lib/tasks/presence/synchronize.rake +18 -4
  52. data/presence/vendor/assets/javascripts/TB.min.js +4329 -0
  53. data/social_stream.gemspec +2 -2
  54. metadata +40 -30
  55. data/presence/ejabberd/ejabberd_scripts/reset_connection_script +0 -300
  56. data/presence/ejabberd/ejabberd_scripts/set_script_header.sh +0 -112
@@ -80,12 +80,48 @@
80
80
  div.ui-videobox{
81
81
  height: 0px;
82
82
  border-bottom: 1px solid $separation-color;
83
+ max-width: 230px;
83
84
  }
84
85
 
85
86
  div.ui-videobox-icon{
86
87
 
87
88
  }
88
89
 
90
+ div.ui-videobox-icon-change{
91
+ width: 100px;
92
+ height: 100px;
93
+ }
94
+
95
+
96
+ p.video-info{
97
+ padding-top: 25%;
98
+ text-align: center;
99
+ }
100
+
101
+ p.video-request{
102
+ padding-top: 20%;
103
+ text-align: center;
104
+ font-size: 130%;
105
+ font-weight: bolder;
106
+ color: $main-color;
107
+ }
108
+
109
+ .videoChatButton {
110
+ cursor: pointer;
111
+ font-size: 100%;
112
+ }
113
+
114
+ .stream_publish_videochat {
115
+ z-index: -1;
116
+ position: absolute;
117
+ top: 177px;
118
+ }
119
+
120
+ .stream_videochat{
121
+ width: 60%;
122
+ height: 60%;
123
+ }
124
+
89
125
  /* notifications style sheet */
90
126
 
91
127
  div.ui-chatbox-notify{
@@ -135,9 +171,14 @@ p.ui-chatbox-notify-text{
135
171
  }
136
172
 
137
173
  .chat-videothick{
138
- display: none;
174
+ /* display: none; */
175
+ padding: 1px;
139
176
  }
140
177
 
178
+ .chat-videoPublisherthick{
179
+ display: none;
180
+ padding: 0px 9px 0px 9px;
181
+ }
141
182
 
142
183
  /* Presence Partial */
143
184
 
@@ -1,3 +1,6 @@
1
+ require 'opentok'
2
+
3
+
1
4
  class XmppController < ApplicationController
2
5
 
3
6
  before_filter :authorization, :only => [:setConnection, :unsetConecction, :setPresence, :unsetPresence, :resetConnection, :synchronizePresence ]
@@ -95,9 +98,9 @@ class XmppController < ApplicationController
95
98
  return
96
99
  end
97
100
 
98
- #Actual connected users
99
- user_slugs = params[:name].split(",")
100
- SocialStream::Presence::XmppServerOrder::synchronizePresenceForSlugs(user_slugs)
101
+ #Actual connected jids
102
+ user_jids = params[:name].split(",")
103
+ SocialStream::Presence::XmppServerOrder::synchronizePresenceForJids(user_jids)
101
104
  render :text => "Ok"
102
105
  end
103
106
 
@@ -157,6 +160,20 @@ class XmppController < ApplicationController
157
160
  end
158
161
 
159
162
 
163
+ def getOpenTokSessionIDAndToken
164
+ if current_user
165
+ opentok = OpenTok::OpenTokSDK.new SocialStream::Presence.opentok_api_key, SocialStream::Presence.opentok_api_secret
166
+ @session = opentok.create_session request.remote_addr
167
+ @user_token = opentok.generate_token :session_id => @session
168
+ @guest_token = opentok.generate_token :session_id => @session
169
+
170
+ respond_to do |format|
171
+ format.xml
172
+ end
173
+ end
174
+ end
175
+
176
+
160
177
  private
161
178
 
162
179
  def setStatus(user,status)
@@ -68,6 +68,10 @@
68
68
  </div>
69
69
  </div>
70
70
 
71
+ <div>
72
+ <div id="publisherID"></div>
73
+ </div>
74
+
71
75
  </div>
72
76
 
73
77
 
@@ -94,13 +98,14 @@
94
98
  connectToChat(user_jid,null,null);
95
99
  }
96
100
 
97
- initialTimer = setTimeout("updateChatWindow()", 15000);
101
+ initialTimer = setTimeout("updateChatWindow()", 10000);
98
102
  } else {
99
- initialTimer = setTimeout("updateChatWindow()", 1);
103
+ updateChatWindow();
100
104
  }
101
105
 
102
106
  initAudio();
103
107
  initFocusListeners();
108
+ checkVideocallFeature();
104
109
  });
105
110
 
106
111
  </script>
@@ -0,0 +1,6 @@
1
+ xml.instruct!
2
+ xml.session do
3
+ xml.id @session
4
+ xml.user_token @user_token
5
+ xml.guest_token @guest_token
6
+ end
@@ -21,4 +21,25 @@ en:
21
21
  update: "Update Settings"
22
22
  notify:
23
23
  offline: "You are offline"
24
- guestOffline: "is offline"
24
+ guestOffline: "{{name}} is offline"
25
+ videochat:
26
+ disconnected: Videochat disconnected
27
+ disconnecting: Videochat disconnecting...
28
+ negotiating: Negotiating...
29
+ connectingWait: Connecting...
30
+ connecting: Connecting to the server...
31
+ waiting: Waiting for response...
32
+ establishing: Establishing...
33
+ connnected: Videochat connected.
34
+ unable: Unable to init videochat.
35
+ serverIssue: "Server Error: Invalid response"
36
+ call: "{{name}} wants to start a video call"
37
+ rejected: "{{name}} has rejected your call"
38
+ rejectedBusy: "{{name}} is busy"
39
+ accept: Accept
40
+ deny: Deny
41
+ clientIssue: "{{name}}'s client not support videochat"
42
+ guestOffline: "Unable to connect. {{name}} is offline"
43
+ offline: "Unable to connect. You are offline"
44
+ cancel: "{{name}} cancel the videocall"
45
+ requirements: You don't have the minimum requirements to run videocall application. Please upgrade to the latest version of Flash.
@@ -20,5 +20,26 @@ es:
20
20
  checkbox: "Activar o desactivar chat"
21
21
  update: "Guardar configuración"
22
22
  notify:
23
- offline: "Desconectado"
24
- guestOffline: "está desconectado"
23
+ offline: "Estás desconectado"
24
+ guestOffline: "{{name}} está desconectado"
25
+ videochat:
26
+ disconnected: Videochat desconectado
27
+ disconnecting: Videochat desconectando...
28
+ negotiating: Negociando...
29
+ connectingWait: Conectando...
30
+ connecting: Conectando con el servidor...
31
+ waiting: Esperando respuesta...
32
+ establishing: Estableciendo conexión...
33
+ connnected: Videochat conectado
34
+ unable: Imposible iniciar videochat
35
+ serverIssue: "Error del servidor: Respuesta inválida"
36
+ call: "{{name}} quiere iniciar una videollamada"
37
+ rejected: "{{name}} ha rechazado tu llamada"
38
+ rejectedBusy: "{{name}} está ocupado"
39
+ accept: Aceptar
40
+ deny: Rechazar
41
+ clientIssue: "El cliente de {{name}} no soporta videochat"
42
+ guestOffline: "Imposible conectar. {{name}} está desconectado"
43
+ offline: "Imposible conectar. Estás desconectado"
44
+ cancel: "{{name}} canceló la videollamada"
45
+ requirements: No tienes los requisitos minimos para iniciar la aplicación de videoconferencia. Por favor, actualiza a la última versión de Flash.
@@ -7,7 +7,9 @@ Rails.application.routes.draw do
7
7
  match '/xmpp/unsetPresence' => "Xmpp#unsetPresence"
8
8
  match '/xmpp/resetConnection' => "Xmpp#resetConnection"
9
9
  match '/xmpp/synchronizePresence' => "Xmpp#synchronizePresence"
10
+
10
11
  match '/xmpp/updateSettings'=> "Xmpp#updateSettings"
11
12
  match '/chatWindow'=> "Xmpp#chatWindow"
13
+ match '/requestVideoChat'=> "Xmpp#getOpenTokSessionIDAndToken"
12
14
 
13
15
  end
@@ -13,15 +13,16 @@ scripts_path=/my_scripts_path
13
13
  #Source path: uncomment to compile ejabberd social stream module
14
14
  #source_path=/.../ejabberd_source/src
15
15
 
16
+ #Web Domains for REST API
17
+ web_domains=[webDomain1,webDomain2,...,webDomainN]
16
18
 
17
- #Web Domain for REST API
18
- web_domain=ssdomain.example.com
19
+ #Specify Web Domains URL
20
+ web_domain_name=ssdomain.example.com
19
21
 
20
22
  #Rails Web Server Cookie name
21
23
  #Check this line in your app/config/initializers/session_store.rb: Global::Application.config.session_store :cookie_store, :key => '_rails_server_cookie'
22
24
  cookie_name=_rails_server_cookie
23
25
 
24
-
25
26
  #Ejabberd Server Password
26
27
  ejabberd_password=password
27
28
  #True to enable REST API Security
Binary file
@@ -31,12 +31,10 @@ def getOption(option)
31
31
  return "Undefined"
32
32
  end
33
33
 
34
- $accessByPasswordUrl = "http://" + getOption("web_domain=") + "/users/sign_in"
35
- $accessByCookieUrl = "http://" + getOption("web_domain=") + "/api/me"
36
34
  $cookie_name = getOption("cookie_name=")
37
35
 
38
36
 
39
- def auth(username, password)
37
+ def auth(username,domain,password)
40
38
 
41
39
  #[TEST ONLY] Allow everybody
42
40
  #return true
@@ -46,9 +44,10 @@ def auth(username, password)
46
44
  # return true
47
45
  #end
48
46
 
47
+ accessByPasswordUrl = "http://" + getWebDomainUrlFromDomain(domain) + "/users/sign_in"
49
48
 
50
49
  begin
51
- response = RestClient.post $accessByPasswordUrl, :user => { :email => username , :password => password }
50
+ response = RestClient.post accessByPasswordUrl, :user => { :email => username , :password => password }
52
51
 
53
52
  if response.code == 201
54
53
  return true
@@ -69,9 +68,10 @@ def auth(username, password)
69
68
  end
70
69
 
71
70
 
72
- def authByCookie(username, cookie)
71
+ def authByCookie(username, domain, cookie)
73
72
  begin
74
- response = RestClient.get $accessByCookieUrl, :cookies => {:"#{$cookie_name}" => cookie}
73
+ accessByCookieUrl = "http://" + getWebDomainUrlFromDomain(domain) + "/api/me"
74
+ response = RestClient.get accessByCookieUrl, :cookies => {:"#{$cookie_name}" => cookie}
75
75
  doc = REXML::Document.new(response.body)
76
76
 
77
77
  slug = ""
@@ -108,6 +108,16 @@ def validateParameters(username,domain,password)
108
108
  end
109
109
 
110
110
 
111
+ def getWebDomainUrlFromDomain(domain)
112
+ web_domain = getOption(domain + "=");
113
+ if (web_domain != "Undefined")
114
+ return web_domain
115
+ else
116
+ return domain
117
+ end
118
+ end
119
+
120
+
111
121
  loop do
112
122
  begin
113
123
  $stdin.eof? # wait for input
@@ -136,17 +146,17 @@ loop do
136
146
  password = data[2]
137
147
  if password.split(">>")[0]=="AuthenticationByCookie"
138
148
  cookie = password.split(">>")[1]
139
- $logger.info "#{Process.pid}: With username #{data[0]} and cookie #{cookie}"
140
- authByCookie(data[0], cookie)
149
+ $logger.info "#{Process.pid}: With userJid #{data[0]}@#{data[1]} and cookie #{cookie}"
150
+ authByCookie(data[0], data[1], cookie)
141
151
  else
142
- $logger.info "#{Process.pid}: With username #{data[0]} and password ******"
143
- #$logger.info "#{Process.pid}: With username #{data[0]} and password #{data[2]}"
144
- auth(data[0], data[2])
152
+ $logger.info "#{Process.pid}: With userJid #{data[0]}@#{data[1]} and password ******"
153
+ #$logger.info "#{Process.pid}: With userJid #{data[0]}@#{data[1]} and password #{data[2]}"
154
+ auth(data[0], data[1], data[2])
145
155
  end
146
156
 
147
157
  when "isuser"
148
158
 
149
- $logger.info "#{Process.pid}: Isuser #{data[0]}@#{data[1]}"
159
+ $logger.info "#{Process.pid}: Isuser with userJid: #{data[0]}@#{data[1]}"
150
160
 
151
161
  #Authorization condition for ISUSER (Add buddys)
152
162
  true
@@ -17,20 +17,19 @@ end
17
17
  puts ""
18
18
  puts "############### Ejabberd Configuration ###############"
19
19
  puts "Config file for Social Stream Presence: /etc/ejabberd/ssconfig.cfg"
20
- puts "Xmpp Server domain: #{getOption("server_domain=")}"
21
20
  puts "Scripts Path: #{getOption("scripts_path=")}"
22
21
  puts "mod_sspresence Path: #{getOption("source_path=")}"
23
- puts "Web Domain for REST API: #{getOption("web_domain=")}"
22
+ puts "Web Server domains: #{getOption("web_domains=")}"
24
23
  puts "##############################"
25
24
  puts "REST API"
26
- puts "Authentication by password: http://#{getOption("web_domain=")}/users/sign_in"
27
- puts "Authentication by cookie: http://#{getOption("web_domain=")}/api/me"
28
- puts "onRegisterConnection: http://#{getOption("web_domain=")}/xmpp/setConnection"
29
- puts "onRemoveConnection: http://#{getOption("web_domain=")}/xmpp/unsetConnection"
30
- puts "onPresence: http://#{getOption("web_domain=")}/xmpp/setPresence"
31
- puts "onUnsetPresence: http://#{getOption("web_domain=")}/xmpp/unsetPresence"
32
- puts "ResetConnection: http://#{getOption("web_domain=")}/xmpp/resetConnection"
33
- puts "SynchronizePresence: http://#{getOption("web_domain=")}/xmpp/synchronizePresence"
25
+ puts "Authentication by password: http://domainURL/users/sign_in"
26
+ puts "Authentication by cookie: http://domainURL/api/me"
27
+ puts "onRegisterConnection: http://domainURL/xmpp/setConnection"
28
+ puts "onRemoveConnection: http://domainURL/xmpp/unsetConnection"
29
+ puts "onPresence: http://domainURL/xmpp/setPresence"
30
+ puts "onUnsetPresence: http://domainURL/xmpp/unsetPresence"
31
+ puts "ResetConnection: http://domainURL/xmpp/resetConnection"
32
+ puts "SynchronizePresence: http://domainURL/xmpp/synchronizePresence"
34
33
  puts "##############################"
35
34
  puts "Social Stream Presence logs in var/log/ejabberd/"
36
35
  puts "######################################################"
@@ -1,8 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- #Ejabberd Management script
3
+ ####################################
4
+ # EMANAGEMENT
5
+ #Ejabberd Management script
4
6
  #New features for management and maintenance ejabberd
5
- #@author Aldo
7
+ #@author Aldo Gordillo < agordillos@gmail.com >
8
+ #@version 2.0 - 24-2-2012
9
+ ####################################
6
10
 
7
11
  require 'logger'
8
12
 
@@ -27,9 +31,7 @@ def getOption(option)
27
31
  end
28
32
 
29
33
 
30
-
31
34
  #Configuration variables
32
- $domain = getOption("server_domain=")
33
35
  $verbose = (getOption("verbose=")=="true")
34
36
  $ejabberd_user = getOption("ejabberd_server_user=")
35
37
  $checkEjabberdctlQuotedString = false
@@ -42,11 +44,12 @@ PARAMS_FOR_COMMANDS = {
42
44
  'unsetBidireccionalBuddys' => 4,
43
45
  'getRoster' => 1,
44
46
  'removeRoster' => 1,
47
+ 'removeAllRostersByDomain' => 1,
45
48
  'removeAllRosters' => 0,
46
- 'getAllUsersWithRoster' => 0,
47
- 'printAllRosters' => 0,
48
- 'printAllBidirecctionalBuddys' => 0,
49
- 'checkUser' => 1,
49
+ 'getAllUserJidsWithRosterByDomain' => 1,
50
+ 'printAllRostersByDomain' => 1,
51
+ 'printAllBidirecctionalBuddysByDomain' => 1,
52
+ 'checkUserJid' => 1,
50
53
  'checkBidirecctionalBuddys' => 2,
51
54
  'sendPresence' => 2,
52
55
  'setPresence' => 1,
@@ -55,39 +58,45 @@ PARAMS_FOR_COMMANDS = {
55
58
  'getUserResource' => 1,
56
59
  'isEjabberdNodeStarted' => 0,
57
60
  'broadcast' => 3,
58
- 'checkEjabberdctlQuotedString' => 0,
59
- 'getConnectedUsers' => 0,
61
+ 'broadcastToConnectedUsers' => 3,
62
+ 'getConnectedJidsByDomain' => 1,
63
+ 'getConnectedJids' => 0,
64
+ 'kickUserJid' => 1,
60
65
  'help' => 0,
61
66
  }
62
67
 
63
68
  SYNTAX_FOR_COMMANDS = {
64
- 'addBuddyToRoster' => 'addBuddyToRoster userSid buddySid buddyNick buddyGroup subscription_type',
65
- 'removeBuddyFromRoster' => 'removeBuddyFromRoster userSid buddySid',
66
- 'setBidireccionalBuddys' => 'setBidireccionalBuddys userASid userBSid userANick userBNick groupForA groupForB',
67
- 'unsetBidireccionalBuddys' => 'unsetBidireccionalBuddys userSid oldFriendSid oldFriendNick groupForOldFriend',
68
- 'getRoster' => 'getRoster username',
69
- 'removeRoster' => 'removeRoster username',
69
+ 'addBuddyToRoster' => 'addBuddyToRoster userJid buddyJid buddyNick buddyGroup subscription_type',
70
+ 'removeBuddyFromRoster' => 'removeBuddyFromRoster userJid buddyJid',
71
+ 'setBidireccionalBuddys' => 'setBidireccionalBuddys userAJid userBJid userANick userBNick groupForA groupForB',
72
+ 'unsetBidireccionalBuddys' => 'unsetBidireccionalBuddys userJid oldFriendJid oldFriendNick groupForOldFriend',
73
+ 'getRoster' => 'getRoster userJid',
74
+ 'removeRoster' => 'removeRoster userJid',
75
+ 'removeAllRostersByDomain' => 'removeAllRostersByDomain domain',
70
76
  'removeAllRosters' => 'removeAllRosters',
71
- 'getAllUsersWithRoster' => 'getAllUsersWithRoster',
72
- 'printAllRosters' => 'printAllRosters',
73
- 'printAllBidirecctionalBuddys' => 'printAllBidirecctionalBuddys',
74
- 'checkUser' => 'checkUser user',
75
- 'checkBidirecctionalBuddys' => 'checkBidirecctionalBuddys userASid userBSid',
76
- 'sendPresence' => 'sendPresence username show',
77
- 'setPresence' => 'setPresence username',
78
- 'unsetPresence' => 'unsetPresence username',
79
- 'sendMessageToUser' => 'sendMessageToUser from_name to_name msg',
80
- 'getUserResource' => 'getUserResource username',
77
+ 'getAllUserJidsWithRosterByDomain' => 'getAllUserJidsWithRosterByDomain domain',
78
+ 'printAllRostersByDomain' => 'printAllRostersByDomain domain',
79
+ 'printAllBidirecctionalBuddysByDomain' => 'printAllBidirecctionalBuddysByDomain domain',
80
+ 'checkUserJid' => 'checkUserJid userJid',
81
+ 'checkBidirecctionalBuddys' => 'checkBidirecctionalBuddys userAJid userBJid',
82
+ 'sendPresence' => 'sendPresence userJid show',
83
+ 'setPresence' => 'setPresence userJid',
84
+ 'unsetPresence' => 'unsetPresence userJid',
85
+ 'sendMessageToUser' => 'sendMessageToUser fromJid toJid msg',
86
+ 'getUserResource' => 'getUserResource userJid',
81
87
  'isEjabberdNodeStarted' => 'isEjabberdNodeStarted',
82
- 'broadcast' => 'broadcast admin users msg (users values: "all" or slugs array)',
83
- 'checkEjabberdctlQuotedString' => 'checkEjabberdctlQuotedString',
84
- 'getConnectedUsers' => 'getConnectedUsers',
88
+ 'broadcast' => 'broadcast admin userJids msg ',
89
+ 'broadcastToConnectedUsers' => 'broadcastToConnectedUsers admin userJids msg (userJids value: "all" or jids array [jid1,jid2,...,jidN])',
90
+ 'getConnectedJidsByDomain' => 'getConnectedJidsByDomain domain',
91
+ 'getConnectedJids' => 'getConnectedJids',
92
+ 'kickUserJid' => 'kickUserJid(userJid)',
85
93
  'help' => 'help',
86
94
  }
87
95
 
88
96
 
89
-
97
+ #########################
90
98
  #Debug methods
99
+ #########################
91
100
  def ejabberdLog(text)
92
101
  $logger.info "Ejabberd Management Script: " + text
93
102
  if $verbose
@@ -109,93 +118,99 @@ def logWithTitle(msg,title)
109
118
  end
110
119
 
111
120
 
112
-
121
+ #########################
113
122
  #Methods to manage rosters from Social Stream Rails App
114
-
115
- def setBidireccionalBuddys(userASid,userBSid,userANick,userBNick,groupForA,groupForB)
116
- addBuddyToRoster(userASid,userBSid,userBNick,groupForB,"both")
117
- addBuddyToRoster(userBSid,userASid,userANick,groupForA,"both")
123
+ #########################
124
+ def setBidireccionalBuddys(userAJid,userBJid,userANick,userBNick,groupForA,groupForB)
125
+ addBuddyToRoster(userAJid,userBJid,userBNick,groupForB,"both")
126
+ addBuddyToRoster(userBJid,userAJid,userANick,groupForA,"both")
118
127
  return "Done"
119
128
  end
120
129
 
121
- def unsetBidireccionalBuddys(userSid,oldFriendSid,oldFriendNick,groupForOldFriend)
122
- if checkBidirecctionalBuddys(userSid,oldFriendSid)
123
- removeBuddyFromRoster(userSid,oldFriendSid)
124
- removeBuddyFromRoster(oldFriendSid,userSid)
125
- addBuddyToRoster(userSid,oldFriendSid,oldFriendNick,groupForOldFriend,"to")
130
+ def unsetBidireccionalBuddys(userJid,oldFriendJid,oldFriendNick,groupForOldFriend)
131
+ if checkBidirecctionalBuddys(userJid,oldFriendJid)
132
+ removeBuddyFromRoster(userJid,oldFriendJid)
133
+ removeBuddyFromRoster(oldFriendJid,userJid)
134
+ addBuddyToRoster(userJid,oldFriendJid,oldFriendNick,groupForOldFriend,"to")
126
135
  return "Done"
127
136
  else
128
- return userSid + " and " + oldFriendSid + " aren't bidireccional buddys"
137
+ return userJid + " and " + oldFriendJid + " aren't bidireccional buddys"
129
138
  end
130
139
  end
131
140
 
132
- def addBuddyToRoster(userSid,buddySid,buddyNick,buddyGroup,subscription_type)
133
- user = userSid.split("@")[0]
134
- buddy = buddySid.split("@")[0]
135
- userDomain = userSid.split("@")[1]
136
- buddyDomain = buddySid.split("@")[1]
141
+ def addBuddyToRoster(userJid,buddyJid,buddyNick,buddyGroup,subscription_type)
142
+ user = getUsernameFromJid(userJid)
143
+ buddy = getUsernameFromJid(buddyJid)
144
+ userDomain = getDomainFromJid(userJid)
145
+ buddyDomain = getDomainFromJid(buddyJid)
137
146
  executeCommand("ejabberdctl add-rosteritem " + user + " " + userDomain + " " + buddy + " " + buddyDomain + " " + buddyNick + " " + buddyGroup + " " + subscription_type)
138
147
  return "Done"
139
148
  end
140
149
 
141
- def removeBuddyFromRoster(userSid,buddySid)
142
- user = userSid.split("@")[0]
143
- buddy = buddySid.split("@")[0]
144
- userDomain = userSid.split("@")[1]
145
- buddyDomain = buddySid.split("@")[1]
146
- if checkUserInRoster(buddy,getRoster(user))
150
+ def removeBuddyFromRoster(userJid,buddyJid)
151
+ user = getUsernameFromJid(userJid)
152
+ buddy = getUsernameFromJid(buddyJid)
153
+ userDomain = getDomainFromJid(userJid)
154
+ buddyDomain = getDomainFromJid(buddyJid)
155
+ if checkUserJidInRoster(buddyJid,getRoster(userJid))
147
156
  executeCommand("ejabberdctl delete_rosteritem " + user + " " + userDomain + " " + buddy + " " + buddyDomain)
148
157
  return "Done"
149
158
  else
150
- return "User " + buddy + " not found in " + user + " roster."
159
+ return "User " + buddyJid + " not found in " + userJid + " roster."
151
160
  end
152
161
  end
153
162
 
154
163
 
164
+ #########################
155
165
  #Roster Utilities
156
-
157
- def getRoster(username)
158
- if checkUser(username)
159
- executeCommand("ejabberdctl get_roster " + username + " " + $domain)
166
+ #########################
167
+ def getRoster(userJid)
168
+ if checkUserJid(userJid)
169
+ executeCommand("ejabberdctl get_roster " + getUsernameFromJid(userJid) + " " + getDomainFromJid(userJid))
160
170
  else
161
- return "Roster not found for user " + username
171
+ return "Roster not found for user " + userJid
162
172
  end
163
173
  end
164
174
 
165
- def getBuddysFromRoster(roster)
166
- buddys = []
175
+ def getBuddyJidsFromRoster(roster)
176
+ buddyJids = []
167
177
  lines = roster.split("\n")
168
178
  lines.each do |line|
169
- buddys << line.split("@")[0]
179
+ buddyJids << line.split(" ")[0]
170
180
  end
171
- buddys
181
+ buddyJids
172
182
  end
173
183
 
174
- def removeRoster(username)
175
- if checkUser(username)
176
- user_sid = username + "@" + $domain
177
- user_roster = getRoster(username);
178
- user_buddys = getBuddysFromRoster(user_roster);
179
- user_buddys.each do |buddy|
180
- buddy_sid = buddy + "@" + $domain
181
- removeBuddyFromRoster(user_sid,buddy_sid)
182
- end
184
+ def removeRoster(userJid)
185
+ if checkUserJid(userJid)
186
+ executeCommand("ejabberdctl process_rosteritems delete any any " + userJid + " any")
183
187
  return "Done"
184
188
  else
185
- return "Roster not found for user " + username
189
+ return "Roster not found for userJid " + userJid
186
190
  end
187
191
  end
188
192
 
189
- def removeAllRosters()
190
- executeCommand("ejabberdctl process_rosteritems delete any any any any")
193
+ def removeAllRostersByDomain(domain)
194
+ if(domain=="all")
195
+ executeCommand("ejabberdctl process_rosteritems delete any any any any")
196
+ else
197
+ executeCommand("ejabberdctl process_rosteritems delete any any *@" + domain + " any")
198
+ end
191
199
  return "Done";
192
200
  end
193
201
 
194
- def getAllUsersWithRoster()
195
- output = executeCommand("ejabberdctl process_rosteritems list any any any any")
202
+ def removeAllRosters()
203
+ return removeAllRostersByDomain("all")
204
+ end
196
205
 
197
- users = []
206
+ def getAllUserJidsWithRosterByDomain(domain)
207
+ if(domain=="all")
208
+ output = executeCommand("ejabberdctl process_rosteritems list any any any any")
209
+ else
210
+ output = executeCommand("ejabberdctl process_rosteritems list any any *@" + domain + " any")
211
+ end
198
212
 
213
+ userJids = []
199
214
  lines = output.split("\n");
200
215
  items = lines[0].split(" ")[2]
201
216
 
@@ -204,180 +219,178 @@ def getAllUsersWithRoster()
204
219
  if items.to_i > 0
205
220
  lines.each do |line|
206
221
  if line.split(":")[0]=="Matches"
207
- user = line.split(" ")[1].split("@")[0]
208
- #puts i.to_s() + " :" + line
209
- unless users.include?(user)
210
- users << user
222
+ userJid = line.split(" ")[1]
223
+ #puts "Line:" + line
224
+ unless userJids.include?(userJid)
225
+ userJids << userJid
211
226
  end
212
227
  end
213
228
  end
214
229
  end
215
230
  end
216
231
 
217
- return users;
232
+ return userJids;
218
233
  end
219
234
 
220
- def getAllRosters()
235
+ def getAllUserJidsWithRoster()
236
+ return getAllUserJidsWithRosterByDomain("all")
237
+ end
238
+
239
+ def getAllRostersByDomain(domain)
221
240
  rosterList = { }
222
241
 
223
- users = getAllUsersWithRoster()
242
+ userJids = getAllUserJidsWithRosterByDomain(domain)
224
243
 
225
- users.each do |user|
226
- roster = getRoster(user)
227
- rosterList.store(user,roster)
244
+ userJids.each do |userJid|
245
+ roster = getRoster(userJid)
246
+ rosterList.store(userJid,roster)
228
247
  end
229
248
  return rosterList
230
249
  end
231
250
 
232
- def printAllRosters()
233
- rosterList = getAllRosters()
234
- rosterList.keys.each do |user|
251
+ def getAllRosters()
252
+ return getAllRostersByDomain("all");
253
+ end
254
+
255
+ def printAllRostersByDomain(domain)
256
+ rosterList = getAllRostersByDomain(domain)
257
+ rosterList.keys.each do |userJid|
235
258
  puts "\n"
236
259
  puts "-------------------------------------"
237
- puts user + " Roster"
260
+ puts userJid + " Roster"
238
261
  puts "-------------------------------------"
239
- puts rosterList[user]
262
+ puts rosterList[userJid]
240
263
  puts "-------------------------------------"
241
264
  puts "\n"
242
265
  end
243
266
  return "Done"
244
267
  end
245
268
 
246
- def getAllBidirecctionalBuddys()
247
- b_buddys = []
248
- users = getAllUsersWithRoster()
249
- nonCheckedUsers = users
250
- users.each do |user|
251
- nonCheckedUsers.delete(user)
252
- nonCheckedUsers.each do |checkUser|
253
- if checkBidirecctionalBuddys(user + "@" + $domain,checkUser + "@" + $domain)
254
- b_buddys << [user,checkUser]
269
+ def printAllRosters()
270
+ return printAllRostersByDomain("all")
271
+ end
272
+
273
+ def getAllBidirecctionalBuddysByDomain(domain)
274
+ b_buddyJids = []
275
+ userJids = getAllUserJidsWithRosterByDomain(domain)
276
+ nonCheckedUsers = userJids
277
+ userJids.each do |userJid|
278
+ nonCheckedUsers.delete(userJid)
279
+ nonCheckedUsers.each do |checkUserJid|
280
+ if checkBidirecctionalBuddys(userJid,checkUserJid)
281
+ b_buddyJids << [userJid,checkUserJid]
255
282
  end
256
283
  end
257
284
  end
258
- return b_buddys
285
+ return b_buddyJids
259
286
  end
260
287
 
261
- def printAllBidirecctionalBuddys()
288
+ def getAllBidirecctionalBuddys()
289
+ return getAllBidirecctionalBuddysByDomain("all")
290
+ end
291
+
292
+ def printAllBidirecctionalBuddysByDomain(domain)
262
293
  puts "This may take a while..."
263
- b_buddys = getAllBidirecctionalBuddys
294
+ b_buddys = getAllBidirecctionalBuddysByDomain(domain)
264
295
  b_buddys.each do |contact|
265
296
  puts "[" + contact[0] + "," + contact[1] + "]"
266
297
  end
267
298
  return "Done"
268
299
  end
269
300
 
270
- #Check if the user have a roster
271
- def checkUser(user)
272
- return getAllUsersWithRoster().include?(user)
301
+ def printAllBidirecctionalBuddys()
302
+ return printAllBidirecctionalBuddysByDomain("all")
273
303
  end
274
304
 
275
- def checkUserInRoster(user,roster)
276
- return getBuddysFromRoster(roster).include?(user)
305
+ #Check if the user have a roster in his domain
306
+ def checkUserJid(userJid)
307
+ domain = getDomainFromJid(userJid)
308
+ return getAllUserJidsWithRosterByDomain(domain).include?(userJid)
277
309
  end
278
310
 
279
- def checkBidirecctionalBuddys(userASid,userBSid)
280
- userA = userASid.split("@")[0]
281
- userB = userBSid.split("@")[0]
282
- rosterA = getRoster(userA)
283
- rosterB = getRoster(userB)
284
- return (checkUserInRoster(userA,rosterB) and checkUserInRoster(userB,rosterA))
311
+ def checkUserJidInRoster(userJid,roster)
312
+ return getBuddyJidsFromRoster(roster).include?(userJid)
285
313
  end
286
314
 
315
+ def checkBidirecctionalBuddys(userAJid,userBJid)
316
+ rosterA = getRoster(userAJid)
317
+ rosterB = getRoster(userBJid)
318
+ return (checkUserJidInRoster(userAJid,rosterB) and checkUserJidInRoster(userBJid,rosterA))
319
+ end
287
320
 
288
- #Manage stanzas Utilities
289
321
 
290
- def setPresence(username)
291
- sendPresenceStanzaWithType(username,username,"available")
322
+ #########################
323
+ #Manage stanzas Utilities
324
+ #########################
325
+ def setPresence(userJid)
326
+ sendPresenceStanzaWithType(userJid,userJid,"available")
292
327
  end
293
328
 
294
- def unsetPresence(username)
295
- sendPresenceStanzaWithType(username,username,"unavailable")
329
+ def unsetPresence(userJid)
330
+ sendPresenceStanzaWithType(userJid,userJid,"unavailable")
296
331
  end
297
332
 
298
333
  def sendPresence(username,show)
299
334
  sendPresenceWithShow(username,username,show)
300
335
  end
301
336
 
302
- def sendPresenceWithShow(from_name,to_name,show)
303
- #puts from_name
304
- resource = getUserResource(from_name);
305
- #puts resource
306
- from_sid = from_name + "@" + $domain;
307
- to_sid = to_name + "@" + $domain;
308
- pres_stanza = "\\<" + buildQuotedString("presence from=") + "\\\"" + buildQuotedString(from_sid) + "\\\"" + buildQuotedString(" to=") + "\\\"" +
309
- buildQuotedString(to_sid) + "\\\"\\>\\<" + buildQuotedString("show") + "\\>" + buildQuotedString(show) + "\\<" +
337
+ def sendPresenceWithShow(fromJid,toJid,show)
338
+ resource = getUserResource(fromJid);
339
+ from_name = getUsernameFromJid(fromJid)
340
+ domain = getDomainFromJid(fromJid)
341
+ pres_stanza = "\\<" + buildQuotedString("presence from=") + "\\\"" + buildQuotedString(fromJid) + "\\\"" + buildQuotedString(" to=") + "\\\"" +
342
+ buildQuotedString(toJid) + "\\\"\\>\\<" + buildQuotedString("show") + "\\>" + buildQuotedString(show) + "\\<" +
310
343
  buildQuotedString("/show") + "\\>\\<" + buildQuotedString("/presence") + "\\>"
311
- executeCommand("ejabberdctl send_stanza_c2s " + from_name + " " + $domain + " " + resource + " " + pres_stanza)
344
+ executeCommand("ejabberdctl send_stanza_c2s " + from_name + " " + domain + " " + resource + " " + pres_stanza)
312
345
  return "Done"
313
346
  end
314
347
 
315
- def sendPresenceStanzaWithType(from_name,to_name,presence_type)
316
- resource = getUserResource(from_name);
317
- from_sid = from_name + "@" + $domain;
318
- to_sid = to_name + "@" + $domain;
348
+ def sendPresenceStanzaWithType(fromJid,toJid,presence_type)
349
+ resource = getUserResource(fromJid);
350
+ from_name = getUsernameFromJid(fromJid)
351
+ domain = getDomainFromJid(fromJid)
319
352
  pres_stanza = "\\<" + buildQuotedString("presence type=") + "\\\"" + buildQuotedString(presence_type) + "\\\"" + buildQuotedString(" from=") + "\\\"" +
320
- buildQuotedString(from_sid) + "\\\"" + buildQuotedString(" to=") + "\\\"" + buildQuotedString(to_sid) + "\\\"\\>\\<" + buildQuotedString("/presence") + "\\>"
321
- executeCommand("ejabberdctl send_stanza_c2s " + from_name + " " + $domain + " " + resource + " " + pres_stanza)
353
+ buildQuotedString(fromJid) + "\\\"" + buildQuotedString(" to=") + "\\\"" + buildQuotedString(toJid) + "\\\"\\>\\<" + buildQuotedString("/presence") + "\\>"
354
+ executeCommand("ejabberdctl send_stanza_c2s " + from_name + " " + domain + " " + resource + " " + pres_stanza)
322
355
  return "Done"
323
356
  end
324
357
 
325
- def sendMessageToUser(from_name,to_name,msg)
326
- from_sid = from_name + "@" + $domain;
327
- to_sid = to_name + "@" + $domain;
328
- executeCommand("ejabberdctl send_message_chat " + from_sid + " " + to_sid + " " + buildQuotedString(msg))
358
+ def sendMessageToUser(fromJid,toJid,msg)
359
+ executeCommand("ejabberdctl send_message_chat " + fromJid + " " + toJid + " " + buildQuotedString(msg))
329
360
  return "Done"
330
361
  end
331
362
 
332
- def getUserResource(username)
363
+ def getUserResource(userJid)
333
364
  output = executeCommand("ejabberdctl connected-users")
334
365
  lines = output.split("\n");
335
366
  lines.each do |line|
336
- if line.split("@")[0] == username
337
- #puts "Find " + username
338
- s = line.split("@")[1];
339
- resource = s.split("/")[1];
367
+ if line.split("/")[0] == userJid
368
+ #puts "Find " + userJid
369
+ resource = line.split("/")[1];
340
370
  return resource;
341
371
  end
342
372
  end
343
- return username + " no have any active session"
373
+ return userJid + " no have any active session"
344
374
  end
345
375
 
346
376
 
347
- #More utilities
348
-
349
- def isEjabberdNodeStarted
350
- output = executeCommand("ejabberdctl status")
351
- if firstLine = output.split("\n")[0]
352
- return ((firstLine.split(":")[1]).strip()=="started")
353
- end
354
- return false
377
+ #########################
378
+ #Utilities
379
+ #########################
380
+ def getUsernameFromJid(jid)
381
+ return jid.split("@")[0];
355
382
  end
356
383
 
357
- def getConnectedUsers
358
- users = []
359
- output = executeCommand("ejabberdctl connected-users")
360
- sessions = output.split("\n")
361
- sessions.each do |session|
362
- users << session.split("@")[0]
363
- end
364
- return users
384
+ def getDomainFromJid(jid)
385
+ return jid.split("@")[1];
365
386
  end
366
387
 
367
- def broadcast(admin,users,msg)
368
- output = executeCommand("ejabberdctl connected-users")
369
- lines = output.split("\n");
370
- lines.each do |line|
371
- username = line.split("@")[0]
372
- if (users == "all") or (users.length > 1 and users.include?(username))
373
- s = line.split("@")[1];
374
- resource = s.split("/")[1];
375
- sendMessageToUser(admin,username,msg)
376
- end
377
- end
378
- return "Done"
388
+ def getElementsFromStringArray(stringArray)
389
+ stringArray=stringArray[1,stringArray.length-2]
390
+ return stringArray.split(",")
379
391
  end
380
392
 
393
+
381
394
  #Determine how to scape characters for build quoted strings
382
395
  def checkEjabberdctlQuotedString
383
396
  puts "checkForSimpleSlash: " + checkForSimpleSlash.to_s()
@@ -461,8 +474,84 @@ def buildQuotedString(msg)
461
474
  end
462
475
 
463
476
 
464
- #Help & Support methods
477
+ #########################
478
+ #Connection Info
479
+ #########################
480
+ def isEjabberdNodeStarted
481
+ output = executeCommand("ejabberdctl status")
482
+ if firstLine = output.split("\n")[0]
483
+ return ((firstLine.split(":")[1]).strip()=="started")
484
+ end
485
+ return false
486
+ end
465
487
 
488
+ def getConnectedJidsByDomain(domain)
489
+ jids = []
490
+ if(domain=="all")
491
+ output = executeCommand("ejabberdctl connected-users")
492
+ else
493
+ output = executeCommand("ejabberdctl connected-users | grep @" + domain + "/")
494
+ end
495
+ sessions = output.split("\n")
496
+ sessions.each do |session|
497
+ jids << session.split("/")[0]
498
+ end
499
+ return jids
500
+ end
501
+
502
+ def getConnectedJids()
503
+ return getConnectedJidsByDomain("all")
504
+ end
505
+
506
+
507
+ #########################
508
+ #Advanced features
509
+ #########################
510
+ def broadcast(admin,userJids,msg)
511
+ getElementsFromStringArray(userJids).each do |userJid|
512
+ sendMessageToUser(admin,userJid,msg)
513
+ end
514
+ return "Done"
515
+ end
516
+
517
+ def broadcastToConnectedUsers(admin,userJids,msg)
518
+ connectedJids = getConnectedJids()
519
+ if(userJids=="all")
520
+ connectedJids.each do |userJid|
521
+ sendMessageToUser(admin,userJid,msg)
522
+ end
523
+ else
524
+ getElementsFromStringArray(userJids).each do |userJid|
525
+ if (connectedJids.include?(userJid))
526
+ sendMessageToUser(admin,userJid,msg)
527
+ end
528
+ end
529
+ end
530
+ return "Done"
531
+ end
532
+
533
+ def kickUserJid(userJid)
534
+ user = getUsernameFromJid(userJid)
535
+ userDomain = getDomainFromJid(userJid)
536
+ resource = getUserResource(userJid);
537
+ reason = "0"
538
+ executeCommand("ejabberdctl kick_session " + user + " " + userDomain + " " + resource + " " + reason)
539
+ return "Done"
540
+ end
541
+
542
+ def banUserJid(userJid)
543
+ kickUserJid(userJid)
544
+ #Notify Web server to ban user permanently
545
+ end
546
+
547
+
548
+
549
+
550
+
551
+
552
+ #########################
553
+ #Execution commands methods
554
+ #########################
466
555
  def executeCommand(command)
467
556
  #Building...
468
557
  command = buildCommand(command)
@@ -499,6 +588,10 @@ def execute_as_sudo
499
588
  end
500
589
  end
501
590
 
591
+
592
+ #########################
593
+ #Support
594
+ #########################
502
595
  def help
503
596
  log("Command list")
504
597
  SYNTAX_FOR_COMMANDS.values.each do |command|
@@ -509,8 +602,9 @@ end
509
602
 
510
603
 
511
604
 
605
+ #########################
512
606
  #Main thread
513
-
607
+ #########################
514
608
  #log("Init Ejabberd Maintenance script")
515
609
 
516
610
  begin
@@ -545,11 +639,14 @@ begin
545
639
  puts "Use 'help' to get information about command syntax"
546
640
  end
547
641
  else
548
- puts "Error: Command not recognized"
549
- puts "Use 'help' to get information about command syntax"
642
+ if (ARGV.length==0)
643
+ help
644
+ else
645
+ puts "Error: Command not recognized"
646
+ puts "Use 'help' to get information about command syntax"
647
+ end
550
648
  end
551
649
  rescue
552
650
  puts "Syntax error"
553
651
  puts "Use 'help' to get information about command syntax"
554
652
  end
555
-