social_stream-presence 0.1.2 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/javascripts/chat_interface_manager.js.erb +43 -5
- data/app/assets/javascripts/chat_utilities.js +26 -0
- data/app/assets/javascripts/xmpp_client_management.js.erb +5 -1
- data/app/assets/stylesheets/chat.css +24 -0
- data/app/views/chat/_off.html.erb +0 -3
- data/app/views/xmpp/active_users.html.erb +1 -1
- data/config/locales/en.yml +4 -2
- data/config/locales/es.yml +3 -1
- data/config/routes.rb +3 -3
- data/ejabberd/conf/ssconfig_example.cfg +14 -20
- data/ejabberd/ejabberd_files.zip +0 -0
- data/ejabberd/ejabberd_scripts/authentication_script +3 -13
- data/ejabberd/ejabberd_scripts/development_scripts/show_config.sh +13 -9
- data/ejabberd/ejabberd_scripts/emanagement +65 -22
- data/ejabberd/ejabberd_scripts/reset_connection_script +1 -1
- data/ejabberd/ejabberd_scripts/set_connection_script +1 -1
- data/ejabberd/ejabberd_scripts/set_presence_script +1 -1
- data/ejabberd/ejabberd_scripts/set_script_header.sh +112 -0
- data/ejabberd/ejabberd_scripts/synchronize_presence_script +4 -2
- data/ejabberd/ejabberd_scripts/unset_connection_script +1 -1
- data/ejabberd/ejabberd_scripts/unset_presence_script +48 -0
- data/ejabberd/installer.sh +267 -0
- data/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
- data/ejabberd/mod_sspresence/mod_sspresence.erl +31 -99
- data/lib/generators/social_stream/presence/install_generator.rb +1 -1
- data/lib/generators/social_stream/presence/templates/initializer.rb +6 -4
- data/lib/social_stream-presence.rb +2 -1
- data/lib/social_stream/presence/models/buddy_manager.rb +1 -1
- data/lib/social_stream/presence/version.rb +1 -1
- data/lib/social_stream/presence/xmpp_server_order.rb +128 -28
- data/lib/tasks/presence/installer.rake +100 -0
- data/social_stream-presence.gemspec +2 -0
- data/vendor/assets/javascripts/jquery.ui.chatbox.js +18 -2
- metadata +23 -5
@@ -18,19 +18,20 @@ statusIcons['dnd'] = "dnd";
|
|
18
18
|
|
19
19
|
var connectButtonTimer;
|
20
20
|
var periodBetweenAttempts=15; //(seg)
|
21
|
-
var connectButtonTimerCounter=periodBetweenAttempts;
|
21
|
+
var connectButtonTimerCounter=periodBetweenAttempts+1;
|
22
22
|
|
23
23
|
function connectButtonTimerFunction(){
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
connectButtonTimerCounter++;
|
25
|
+
if (connectButtonTimerCounter > (periodBetweenAttempts-1)) {
|
26
|
+
clearTimeout(connectButtonTimer);
|
27
27
|
$("#chat_header_title").html('<%=I18n.t('chat.disconnected')%>')
|
28
28
|
}
|
29
29
|
}
|
30
30
|
|
31
31
|
function requestConnectToChat(){
|
32
32
|
if (connectButtonTimerCounter > (periodBetweenAttempts-1)) {
|
33
|
-
connectButtonTimerCounter=0;
|
33
|
+
connectButtonTimerCounter=0;
|
34
|
+
connectButtonTimer = setInterval("connectButtonTimerFunction()", 1000)
|
34
35
|
$("#chat_header_title").html('<%=I18n.t('chat.connecting')%>')
|
35
36
|
return true
|
36
37
|
} else {
|
@@ -292,4 +293,41 @@ function putReceivedMessageOnChatWindow(from_jid,from_slug,body,msgID){
|
|
292
293
|
playSound("onMessageAudio");
|
293
294
|
}
|
294
295
|
|
296
|
+
}
|
297
|
+
|
298
|
+
|
299
|
+
////////////////////
|
300
|
+
//Notifications on chat Window
|
301
|
+
////////////////////
|
302
|
+
|
303
|
+
function showChatNotificationForSlug(slug,msg){
|
304
|
+
var notification = $("#" + slug).parent().find("div.ui-chatbox-notify");
|
305
|
+
showChatNotification(notification,msg);
|
306
|
+
}
|
307
|
+
|
308
|
+
function showChatNotification(notification,msg){
|
309
|
+
notification.html("<p class==\"ui-chatbox-notify-text\">" + msg + "</p>");
|
310
|
+
notification.css("visibility","visible");
|
311
|
+
notification.fadeIn();
|
312
|
+
}
|
313
|
+
|
314
|
+
function hideChatNotificationForSlug(slug){
|
315
|
+
var notification = $("#" + slug).parent().find("div.ui-chatbox-notify");
|
316
|
+
hideChatNotification(notification);
|
317
|
+
}
|
318
|
+
|
319
|
+
function hideChatNotification(notification){
|
320
|
+
notification.fadeOut();
|
321
|
+
notification.css("visibility","hidden");
|
322
|
+
}
|
323
|
+
|
324
|
+
function notifyWhenUsersDisconnect(){
|
325
|
+
var notification = $("div.ui-chatbox-notify");
|
326
|
+
var msg = '<%=I18n.t('chat.notify.offline')%>';
|
327
|
+
showChatNotification(notification,msg);
|
328
|
+
}
|
329
|
+
|
330
|
+
function hideAllNotifications(){
|
331
|
+
var notification = $("div.ui-chatbox-notify");
|
332
|
+
hideChatNotification(notification);
|
295
333
|
}
|
@@ -65,6 +65,19 @@ function blinkTitleOnMessage(username){
|
|
65
65
|
|
66
66
|
|
67
67
|
|
68
|
+
////////////////////
|
69
|
+
//Control user data input on the chatbox
|
70
|
+
////////////////////
|
71
|
+
|
72
|
+
//Return true to allow user to send data to the chatbox.
|
73
|
+
function userChatDataInputControl(){
|
74
|
+
var floodControlBoolean = floodControl();
|
75
|
+
var offlineDataSendControlBoolean = offlineDataSendControl();
|
76
|
+
return (floodControlBoolean && offlineDataSendControlBoolean);
|
77
|
+
}
|
78
|
+
|
79
|
+
|
80
|
+
|
68
81
|
////////////////////
|
69
82
|
//Antiflood
|
70
83
|
////////////////////
|
@@ -190,6 +203,19 @@ function mustBounceBoxForChatWindow(jqueryUIChatbox){
|
|
190
203
|
|
191
204
|
}
|
192
205
|
|
206
|
+
|
207
|
+
|
208
|
+
////////////////////
|
209
|
+
//Prevent user to send data to the chatbox when he is offline.
|
210
|
+
////////////////////
|
211
|
+
|
212
|
+
function offlineDataSendControl(){
|
213
|
+
return ((!disconnectionFlag) && (isStropheConnected()));
|
214
|
+
}
|
215
|
+
|
216
|
+
|
217
|
+
|
218
|
+
|
193
219
|
////////////////////
|
194
220
|
//Next features...
|
195
221
|
////////////////////
|
@@ -160,6 +160,7 @@ function onConnect(status) {
|
|
160
160
|
log('Strophe is disconnected.');
|
161
161
|
disconnectionFlag = true;
|
162
162
|
clearTimeout(awayTimer);
|
163
|
+
notifyWhenUsersDisconnect();
|
163
164
|
reconnectTimer = setTimeout ("onReconnect()", 5000);
|
164
165
|
} else if (status == Strophe.Status.CONNECTED) {
|
165
166
|
log('Strophe is connected.');
|
@@ -173,13 +174,14 @@ function onConnect(status) {
|
|
173
174
|
sendStatus(userStatus);
|
174
175
|
awayTimer = setInterval("awayTimerFunction()", awayTimerPeriod);
|
175
176
|
timer = setInterval("timerFunction()", timerPeriod);
|
177
|
+
hideAllNotifications();
|
176
178
|
}
|
177
179
|
|
178
180
|
updateChatWindow();
|
179
181
|
}
|
180
182
|
|
181
183
|
function onReconnect(){
|
182
|
-
|
184
|
+
|
183
185
|
if ((!isStropheConnected())&&(userStatus!="offline")) {
|
184
186
|
|
185
187
|
if (reconnectAttempts>0) {
|
@@ -273,6 +275,7 @@ function processAvailablePresenceStanza(presence){
|
|
273
275
|
setUserIconStatus(slug, status);
|
274
276
|
if (cacheConnectedUsers.indexOf(slug) != -1) {
|
275
277
|
showConnectionBoxFromSlug(slug);
|
278
|
+
hideChatNotificationForSlug(slug);
|
276
279
|
}
|
277
280
|
} else {
|
278
281
|
setTimeout("refreshChatWindow()", 3000);
|
@@ -287,6 +290,7 @@ function processUnavailablePresenceStanza(presence){
|
|
287
290
|
if (slug != user_slug) {
|
288
291
|
if (getConnectionBoxFromSlug(slug)!=null){
|
289
292
|
hideConnectionBoxFromSlug(slug)
|
293
|
+
showChatNotificationForSlug(slug,$(getConnectionBoxFromSlug(slug)).attr("name") + " is offline");
|
290
294
|
}
|
291
295
|
}
|
292
296
|
}
|
@@ -62,6 +62,30 @@
|
|
62
62
|
clear: both;
|
63
63
|
}
|
64
64
|
|
65
|
+
div.ui-chatbox-notify{
|
66
|
+
visibility: hidden;
|
67
|
+
background: #E5E5E5;
|
68
|
+
background-color: #E5E5E5;
|
69
|
+
color: black;
|
70
|
+
z-index: 1;
|
71
|
+
position:absolute;
|
72
|
+
top: 0;
|
73
|
+
margin-top: 30px;
|
74
|
+
padding: 4px 0px 4px 0px;
|
75
|
+
width: 236px;
|
76
|
+
text-align: center;
|
77
|
+
border-style:solid;
|
78
|
+
border-width:1px;
|
79
|
+
border-color: #CCCCCC;
|
80
|
+
opacity:0.95;
|
81
|
+
filter:alpha(opacity=95); /* For IE8 and earlier */
|
82
|
+
}
|
83
|
+
|
84
|
+
p.ui-chatbox-notify-text{
|
85
|
+
text-align: center;
|
86
|
+
font-weight: bold;
|
87
|
+
}
|
88
|
+
|
65
89
|
|
66
90
|
/* Ticks */
|
67
91
|
|
data/config/locales/en.yml
CHANGED
@@ -3,7 +3,7 @@ en:
|
|
3
3
|
connecting: "Chat Connecting"
|
4
4
|
reconnecting: "Chat Reconnecting"
|
5
5
|
disconnected: "Chat Disconnected"
|
6
|
-
unableconnect: "Chat
|
6
|
+
unableconnect: "Chat Out of Service"
|
7
7
|
title: "Chat"
|
8
8
|
password: "Password"
|
9
9
|
status:
|
@@ -15,4 +15,6 @@ en:
|
|
15
15
|
settings:
|
16
16
|
title: "Enable and configure Social Stream Chat"
|
17
17
|
checkbox: "Enable or disable Social Stream Chat"
|
18
|
-
update: "Update Settings"
|
18
|
+
update: "Update Settings"
|
19
|
+
notify:
|
20
|
+
offline: "You are offline"
|
data/config/locales/es.yml
CHANGED
@@ -3,7 +3,7 @@ es:
|
|
3
3
|
connecting: "Chat Conectando"
|
4
4
|
reconnecting: "Chat Reconectando"
|
5
5
|
disconnected: "Chat Desconectado"
|
6
|
-
unableconnect: "Chat
|
6
|
+
unableconnect: "Chat Fuera de servicio"
|
7
7
|
title: "Chat"
|
8
8
|
password: "Contraseña"
|
9
9
|
status:
|
@@ -16,4 +16,6 @@ es:
|
|
16
16
|
title: "Activación y configuración del chat de Social Stream"
|
17
17
|
checkbox: "Activar o desactivar chat"
|
18
18
|
update: "Guardar configuración"
|
19
|
+
notify:
|
20
|
+
offline: "Desconectado"
|
19
21
|
|
data/config/routes.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
2
|
#match "/active_users" => "Xmpp#active_users"
|
3
3
|
|
4
|
-
match '/xmpp/resetConnection' => "Xmpp#resetConnection"
|
5
4
|
match '/xmpp/setConnection' => "Xmpp#setConnection"
|
6
5
|
match '/xmpp/unsetConnection' => "Xmpp#unsetConecction"
|
7
|
-
match '/xmpp/synchronizePresence' => "Xmpp#synchronizePresence"
|
8
6
|
match '/xmpp/setPresence' => "Xmpp#setPresence"
|
9
7
|
match '/xmpp/unsetPresence' => "Xmpp#unsetPresence"
|
10
|
-
match '/
|
8
|
+
match '/xmpp/resetConnection' => "Xmpp#resetConnection"
|
9
|
+
match '/xmpp/synchronizePresence' => "Xmpp#synchronizePresence"
|
11
10
|
match '/xmpp/updateSettings'=> "Xmpp#updateSettings"
|
11
|
+
match '/chatWindow'=> "Xmpp#chatWindow"
|
12
12
|
|
13
13
|
end
|
@@ -1,38 +1,32 @@
|
|
1
|
-
#Social Stream Presence:
|
1
|
+
#Social Stream Presence: Ejabberd configuration file
|
2
2
|
|
3
3
|
#Ejabberd node server domain
|
4
|
-
server_domain=
|
4
|
+
server_domain=xmppdomain.example.com
|
5
5
|
|
6
6
|
#Scripts Path
|
7
7
|
scripts_path=/my_scripts_path
|
8
8
|
|
9
|
-
#Source path: uncomment to compile ejabberd social stream module
|
10
|
-
#source_path=/.../ejabberd_source/src
|
11
|
-
|
12
9
|
#It is also necessary to modify the file: /etc/ejabberd/ejabberd.cfg
|
13
10
|
#%%{auth_method, external}.
|
14
11
|
#%%{extauth_program, "scripts_path/authentication_script"}.
|
15
12
|
|
16
|
-
#
|
17
|
-
|
18
|
-
|
19
|
-
cookie_name=_rails_server_cookie
|
20
|
-
set_connection_api=http://localhost/xmpp/setConnection
|
21
|
-
unset_connection_api=http://localhost/xmpp/unsetConnection
|
22
|
-
reset_connection_api=http://localhost/xmpp/resetConnection
|
23
|
-
synchronize_presence_api=http://localhost/xmpp/synchronizePresence
|
24
|
-
set_presence_api=http://localhost/xmpp/setPresence
|
25
|
-
unset_presence_api=http://localhost/xmpp/unsetPresence
|
13
|
+
#Source path: uncomment to compile ejabberd social stream module
|
14
|
+
#source_path=/.../ejabberd_source/src
|
15
|
+
|
26
16
|
|
27
|
-
#
|
28
|
-
|
17
|
+
#Web Domain for REST API
|
18
|
+
web_domain=ssdomain.example.com
|
19
|
+
|
20
|
+
#Rails Web Server Cookie name
|
21
|
+
#Check this line in your app/config/initializers/session_store.rb: Global::Application.config.session_store :cookie_store, :key => '_rails_server_cookie'
|
22
|
+
cookie_name=_rails_server_cookie
|
29
23
|
|
30
|
-
#Social Stream PASSWORD
|
31
|
-
ss_password=password
|
32
24
|
|
33
25
|
#Ejabberd Server Password
|
34
26
|
ejabberd_password=password
|
35
27
|
|
28
|
+
|
36
29
|
#Emanagement configuration
|
37
|
-
|
30
|
+
ejabberd_server_user=ejabberd
|
31
|
+
users_require_sudo=all
|
38
32
|
verbose=false
|
Binary file
|
@@ -31,11 +31,9 @@ def getOption(option)
|
|
31
31
|
return "Undefined"
|
32
32
|
end
|
33
33
|
|
34
|
-
$
|
35
|
-
$accessByCookieUrl = getOption("
|
34
|
+
$accessByPasswordUrl = "http://" + getOption("web_domain=") + "/users/sign_in"
|
35
|
+
$accessByCookieUrl = "http://" + getOption("web_domain=") + "/api/me"
|
36
36
|
$cookie_name = getOption("cookie_name=")
|
37
|
-
$sslogin = getOption("ss_login=")
|
38
|
-
$sspass = getOption("ss_password=")
|
39
37
|
|
40
38
|
|
41
39
|
def auth(username, password)
|
@@ -48,17 +46,9 @@ def auth(username, password)
|
|
48
46
|
# return true
|
49
47
|
#end
|
50
48
|
|
51
|
-
#Social Stream password
|
52
|
-
if username == $sslogin
|
53
|
-
if password == $sspass
|
54
|
-
return true
|
55
|
-
else
|
56
|
-
return false
|
57
|
-
end
|
58
|
-
end
|
59
49
|
|
60
50
|
begin
|
61
|
-
response = RestClient.post $
|
51
|
+
response = RestClient.post $accessByPasswordUrl, :user => { :email => username , :password => password }
|
62
52
|
|
63
53
|
if response.code == 201
|
64
54
|
return true
|
@@ -17,17 +17,21 @@ 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=")}"
|
20
21
|
puts "Scripts Path: #{getOption("scripts_path=")}"
|
21
22
|
puts "mod_sspresence Path: #{getOption("source_path=")}"
|
22
|
-
puts "
|
23
|
-
puts "
|
24
|
-
puts "
|
25
|
-
puts "
|
26
|
-
puts "
|
27
|
-
puts "
|
28
|
-
puts "
|
29
|
-
puts "
|
30
|
-
puts "
|
23
|
+
puts "Web Domain for REST API: #{getOption("web_domain=")}"
|
24
|
+
puts "##############################"
|
25
|
+
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"
|
34
|
+
puts "##############################"
|
31
35
|
puts "Social Stream Presence logs in var/log/ejabberd/"
|
32
36
|
puts "######################################################"
|
33
37
|
puts ""
|
@@ -31,6 +31,8 @@ end
|
|
31
31
|
#Configuration variables
|
32
32
|
$domain = getOption("server_domain=")
|
33
33
|
$verbose = (getOption("verbose=")=="true")
|
34
|
+
$ejabberd_user = getOption("ejabberd_server_user=")
|
35
|
+
$checkEjabberdctlQuotedString = false
|
34
36
|
|
35
37
|
|
36
38
|
PARAMS_FOR_COMMANDS = {
|
@@ -41,9 +43,7 @@ PARAMS_FOR_COMMANDS = {
|
|
41
43
|
'getRoster' => 1,
|
42
44
|
'removeRoster' => 1,
|
43
45
|
'removeAllRosters' => 0,
|
44
|
-
'getBuddysFromRoster' => 1,
|
45
46
|
'getAllUsersWithRoster' => 0,
|
46
|
-
'getAllRosters' => 0,
|
47
47
|
'printAllRosters' => 0,
|
48
48
|
'printAllBidirecctionalBuddys' => 0,
|
49
49
|
'checkUser' => 1,
|
@@ -54,7 +54,9 @@ PARAMS_FOR_COMMANDS = {
|
|
54
54
|
'sendMessageToUser' => 3,
|
55
55
|
'getUserResource' => 1,
|
56
56
|
'isEjabberdNodeStarted' => 0,
|
57
|
+
'broadcast' => 2,
|
57
58
|
'checkEjabberdctlQuotedString' => 0,
|
59
|
+
'getConnectedUsers' => 0,
|
58
60
|
'help' => 0,
|
59
61
|
}
|
60
62
|
|
@@ -66,9 +68,7 @@ SYNTAX_FOR_COMMANDS = {
|
|
66
68
|
'getRoster' => 'getRoster username',
|
67
69
|
'removeRoster' => 'removeRoster username',
|
68
70
|
'removeAllRosters' => 'removeAllRosters',
|
69
|
-
'getBuddysFromRoster' => 'getBuddysFromRoster roster',
|
70
71
|
'getAllUsersWithRoster' => 'getAllUsersWithRoster',
|
71
|
-
'getAllRosters' => 'getAllRosters',
|
72
72
|
'printAllRosters' => 'printAllRosters',
|
73
73
|
'printAllBidirecctionalBuddys' => 'printAllBidirecctionalBuddys',
|
74
74
|
'checkUser' => 'checkUser user',
|
@@ -79,7 +79,9 @@ SYNTAX_FOR_COMMANDS = {
|
|
79
79
|
'sendMessageToUser' => 'sendMessageToUser from_name to_name msg',
|
80
80
|
'getUserResource' => 'getUserResource username',
|
81
81
|
'isEjabberdNodeStarted' => 'isEjabberdNodeStarted',
|
82
|
+
'broadcast' => 'broadcast users msg (users values: "all" or slugs array)',
|
82
83
|
'checkEjabberdctlQuotedString' => 'checkEjabberdctlQuotedString',
|
84
|
+
'getConnectedUsers' => 'getConnectedUsers',
|
83
85
|
'help' => 'help',
|
84
86
|
}
|
85
87
|
|
@@ -285,13 +287,6 @@ end
|
|
285
287
|
|
286
288
|
#Manage stanzas Utilities
|
287
289
|
|
288
|
-
def sendStanzaUserMessage(username,msg)
|
289
|
-
resource = getUserResource(username);
|
290
|
-
stanza = "\\<\\'message\\'\\>\\<\\'body\\'\\>\\'" + msg + "\\'\\<\\'/body\\'\\>\\<\\'/message\\'\\>"
|
291
|
-
executeCommand("ejabberdctl send_stanza_c2s " + username + " " + $domain + " " + resource + " " + stanza)
|
292
|
-
return "Done"
|
293
|
-
end
|
294
|
-
|
295
290
|
def setPresence(username)
|
296
291
|
sendPresenceStanzaWithType(username,username,"available")
|
297
292
|
end
|
@@ -305,12 +300,14 @@ def sendPresence(username,show)
|
|
305
300
|
end
|
306
301
|
|
307
302
|
def sendPresenceWithShow(from_name,to_name,show)
|
308
|
-
puts from_name
|
303
|
+
#puts from_name
|
309
304
|
resource = getUserResource(from_name);
|
310
|
-
puts resource
|
305
|
+
#puts resource
|
311
306
|
from_sid = from_name + "@" + $domain;
|
312
307
|
to_sid = to_name + "@" + $domain;
|
313
|
-
pres_stanza = "
|
308
|
+
pres_stanza = "\\<" + buildQuotedString("presence from=") + "\\\"" + buildQuotedString(from_sid) + "\\\"" + buildQuotedString(" to=") + "\\\"" +
|
309
|
+
buildQuotedString(to_sid) + "\\\"\\>\\<" + buildQuotedString("show") + "\\>" + buildQuotedString(show) + "\\<" +
|
310
|
+
buildQuotedString("/show") + "\\>\\<" + buildQuotedString("/presence") + "\\>"
|
314
311
|
executeCommand("ejabberdctl send_stanza_c2s " + from_name + " " + $domain + " " + resource + " " + pres_stanza)
|
315
312
|
return "Done"
|
316
313
|
end
|
@@ -319,7 +316,8 @@ def sendPresenceStanzaWithType(from_name,to_name,presence_type)
|
|
319
316
|
resource = getUserResource(from_name);
|
320
317
|
from_sid = from_name + "@" + $domain;
|
321
318
|
to_sid = to_name + "@" + $domain;
|
322
|
-
pres_stanza = "
|
319
|
+
pres_stanza = "\\<" + buildQuotedString("presence type=") + "\\\"" + buildQuotedString(presence_type) + "\\\"" + buildQuotedString(" from=") + "\\\"" +
|
320
|
+
buildQuotedString(from_sid) + "\\\"" + buildQuotedString(" to=") + "\\\"" + buildQuotedString(to_sid) + "\\\"\\>\\<" + buildQuotedString("/presence") + "\\>"
|
323
321
|
executeCommand("ejabberdctl send_stanza_c2s " + from_name + " " + $domain + " " + resource + " " + pres_stanza)
|
324
322
|
return "Done"
|
325
323
|
end
|
@@ -356,17 +354,52 @@ def isEjabberdNodeStarted
|
|
356
354
|
return false
|
357
355
|
end
|
358
356
|
|
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
|
365
|
+
end
|
366
|
+
|
367
|
+
def broadcast(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("SocialStream",username,msg)
|
376
|
+
end
|
377
|
+
end
|
378
|
+
return "Done"
|
379
|
+
end
|
380
|
+
|
381
|
+
#Determine how to scape characters for build quoted strings
|
359
382
|
def checkEjabberdctlQuotedString
|
360
383
|
puts "checkForSimpleSlash: " + checkForSimpleSlash.to_s()
|
361
384
|
puts "checkForDoubleSlash: " + checkForDoubleSlash.to_s()
|
362
385
|
end
|
363
386
|
|
387
|
+
def checkAndSetEjabberdctlQuotedString
|
388
|
+
if checkForSimpleSlash
|
389
|
+
$checkForSimpleSlash = true
|
390
|
+
end
|
391
|
+
if checkForDoubleSlash
|
392
|
+
$checkForDoubleSlash = true
|
393
|
+
end
|
394
|
+
$checkEjabberdctlQuotedString = true
|
395
|
+
end
|
396
|
+
|
364
397
|
def checkForDoubleSlash
|
365
398
|
command = "ejabberdctl send_message_chat example@localhost example@localhost \\'Hello quoted string\\'"
|
366
399
|
if execute_as_sudo
|
367
400
|
command = "sudo " + command
|
368
401
|
end
|
369
|
-
|
402
|
+
|
370
403
|
output = %x[#{command}]
|
371
404
|
firstLine = ""
|
372
405
|
lines = output.split("\n")
|
@@ -414,10 +447,14 @@ def checkForSimpleSlash
|
|
414
447
|
end
|
415
448
|
|
416
449
|
def buildQuotedString(msg)
|
417
|
-
if
|
450
|
+
if !$checkEjabberdctlQuotedString
|
451
|
+
checkAndSetEjabberdctlQuotedString
|
452
|
+
end
|
453
|
+
|
454
|
+
if $checkForSimpleSlash
|
418
455
|
return "\'" + msg + "\'"
|
419
456
|
end
|
420
|
-
if checkForDoubleSlash
|
457
|
+
if $checkForDoubleSlash
|
421
458
|
return "\\'" + msg + "\\'"
|
422
459
|
end
|
423
460
|
return msg
|
@@ -431,7 +468,8 @@ def executeCommand(command)
|
|
431
468
|
command = buildCommand(command)
|
432
469
|
|
433
470
|
if $verbose
|
434
|
-
|
471
|
+
#Logging...
|
472
|
+
#puts "Executing: " + command
|
435
473
|
ejabberdLog("Executing (#{command})")
|
436
474
|
end
|
437
475
|
|
@@ -442,15 +480,20 @@ end
|
|
442
480
|
|
443
481
|
def buildCommand(command)
|
444
482
|
if execute_as_sudo
|
445
|
-
command = "sudo -u
|
483
|
+
command = "sudo -u " + $ejabberd_user + " " + command
|
446
484
|
end
|
447
485
|
return command
|
448
486
|
end
|
449
487
|
|
450
488
|
def execute_as_sudo
|
451
|
-
current_user = %x["whoami"].split("\n")[0]
|
452
489
|
sudo_users = getOption("users_require_sudo=")
|
490
|
+
|
491
|
+
if sudo_users=="all"
|
492
|
+
return true
|
493
|
+
end
|
494
|
+
|
453
495
|
sudo_users_array = sudo_users.split(",")
|
496
|
+
current_user = %x["whoami"].split("\n")[0]
|
454
497
|
if sudo_users_array.include?(current_user)
|
455
498
|
return true
|
456
499
|
end
|
@@ -468,7 +511,7 @@ end
|
|
468
511
|
|
469
512
|
#Main thread
|
470
513
|
|
471
|
-
log("Init Ejabberd Maintenance script")
|
514
|
+
#log("Init Ejabberd Maintenance script")
|
472
515
|
|
473
516
|
begin
|
474
517
|
if ARGV[0] and PARAMS_FOR_COMMANDS.keys.include?(ARGV[0])
|