social_stream-presence 0.1.2 → 0.1.4
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.
- 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
Binary file
|
@@ -1,10 +1,31 @@
|
|
1
|
+
%%%-------------------------------------------------------------------
|
2
|
+
%%% File : mod_sspresence.erl
|
3
|
+
%%% Author : Aldo
|
4
|
+
%%% Contact: < social-stream@dit.upm.es >
|
5
|
+
%%% Purpose : Process events and hooks for Social Stream Presence: http://social-stream.dit.upm.es/
|
6
|
+
%%% Created : 1 Oct 2011
|
7
|
+
%%%
|
8
|
+
%%%
|
9
|
+
%%% http://social-stream.dit.upm.es/
|
10
|
+
%%% Copyright © 2011 Social Stream
|
11
|
+
%%%
|
12
|
+
%%%-------------------------------------------------------------------
|
13
|
+
|
1
14
|
-module(mod_sspresence).
|
15
|
+
-author('aldo').
|
2
16
|
|
3
17
|
-behavior(gen_mod).
|
4
18
|
|
5
19
|
-include("ejabberd.hrl").
|
6
20
|
|
7
|
-
-export([start/2, stop/1,
|
21
|
+
-export([start/2, stop/1,
|
22
|
+
on_register_connection/3,
|
23
|
+
on_remove_connection/3,
|
24
|
+
on_presence/4,
|
25
|
+
on_unset_presence/4,
|
26
|
+
on_packet_send/3,
|
27
|
+
isConnected/1
|
28
|
+
]).
|
8
29
|
|
9
30
|
start(Host, _Opts) ->
|
10
31
|
?INFO_MSG("mod_sspresence starting", []),
|
@@ -52,30 +73,25 @@ on_presence(User, _Server, _Resource, Packet) ->
|
|
52
73
|
|
53
74
|
case Type of
|
54
75
|
"presence" -> Status = getStatusFromSubel(Subel),
|
55
|
-
|
76
|
+
Presence_path = string:concat(getOptionValue("scripts_path="), "/set_presence_script "),
|
56
77
|
?INFO_MSG("mod_sspresence: set_presence_script call with user (~p) and status (~p)", [User,Status]),
|
57
|
-
os:cmd(string:join([
|
78
|
+
os:cmd(string:join([Presence_path, User , Status], " "));
|
58
79
|
_ -> ok
|
59
80
|
end,
|
60
81
|
ok.
|
61
82
|
|
62
83
|
on_unset_presence(User, _Server, _Resource, _Status) ->
|
63
84
|
?INFO_MSG("mod_sspresence: on_unset_presence (~p)", [User]),
|
85
|
+
_UPresence_path = string:concat(getOptionValue("scripts_path="), "/unset_presence_script "),
|
86
|
+
%% Wait for on_remove_connection
|
87
|
+
%% ?INFO_MSG("mod_sspresence: unset_presence_script call with user (~p)", [User]),
|
88
|
+
%%os:cmd(string:join([UPresence_path, User , Status], " "));
|
64
89
|
ok.
|
65
90
|
|
66
|
-
on_packet_send(
|
91
|
+
on_packet_send(_From, _To, {xmlelement, Type, _Attr, _Subel} = _Packet) ->
|
67
92
|
case Type of
|
68
|
-
"message" ->
|
69
|
-
|
70
|
-
|
71
|
-
SSlogin = getOptionValue("ss_login="),
|
72
|
-
|
73
|
-
case Sender of
|
74
|
-
SSlogin ->
|
75
|
-
Message = getMessageFromSubel(Subel),
|
76
|
-
execute(Message);
|
77
|
-
_ -> ok
|
78
|
-
end;
|
93
|
+
"message" ->
|
94
|
+
ok;
|
79
95
|
_ -> ok
|
80
96
|
end.
|
81
97
|
|
@@ -101,82 +117,11 @@ getStatusFromSubel(Subel) ->
|
|
101
117
|
end.
|
102
118
|
|
103
119
|
|
104
|
-
getMessageFromSubel(Subel) ->
|
105
|
-
[{_I,_J,_K,[{_L,MessageData}]}] = Subel,
|
106
|
-
parseXmlCdata(MessageData).
|
107
|
-
|
108
|
-
|
109
120
|
parseXmlCdata(Msg) ->
|
110
121
|
MessageString = binary_to_list(list_to_binary(io_lib:format("~p", [Msg]))),
|
111
122
|
lists:sublist(MessageString, 4, string:len(MessageString)-6).
|
112
123
|
|
113
124
|
|
114
|
-
execute(Message) ->
|
115
|
-
%?INFO_MSG("Message vale: ~p", [Message]),
|
116
|
-
%?INFO_MSG("Order vale: ~p", [Order]),
|
117
|
-
[Order|Params] = string:tokens(Message, "&"),
|
118
|
-
case Order of
|
119
|
-
"AddItemToRoster" ->
|
120
|
-
case length(Params) of
|
121
|
-
4 -> [UserSID,BuddySID,BuddyName,Subscription_type] = Params,
|
122
|
-
?INFO_MSG("Execute: ~p with params ~p", [Order,Params]),
|
123
|
-
[ContactName|_R] = string:tokens(BuddyName, " "),
|
124
|
-
[UserSlug,UserDomain] = string:tokens(UserSID, "@"),
|
125
|
-
[BuddySlug,BuddyDomain] = string:tokens(BuddySID, "@"),
|
126
|
-
addItemToRoster(UserSlug,UserDomain,BuddySlug,BuddyDomain,ContactName,"SocialStream",Subscription_type),
|
127
|
-
ok;
|
128
|
-
_ -> ?INFO_MSG("Incorrect parameters in order ~p", [Order]),
|
129
|
-
ok
|
130
|
-
end,
|
131
|
-
ok;
|
132
|
-
|
133
|
-
"SetRosterForBidirectionalTie" ->
|
134
|
-
case length(Params) of
|
135
|
-
4 -> [UserASID,UserBSID,UserAName,UserBName] = Params,
|
136
|
-
?INFO_MSG("Executing: ~p with params ~p", [Order,Params]),
|
137
|
-
[UserASlug,UserADomain] = string:tokens(UserASID, "@"),
|
138
|
-
[UserBSlug,UserBDomain] = string:tokens(UserBSID, "@"),
|
139
|
-
addItemToRoster(UserASlug,UserADomain,UserBSlug,UserBDomain,UserBName,"SocialStream","both"),
|
140
|
-
addItemToRoster(UserBSlug,UserBDomain,UserASlug,UserADomain,UserAName,"SocialStream","both"),
|
141
|
-
ok;
|
142
|
-
_ -> ?INFO_MSG("Incorrect parameters in order ~p", [Order]),
|
143
|
-
ok
|
144
|
-
end,
|
145
|
-
ok;
|
146
|
-
|
147
|
-
"Synchronize" ->
|
148
|
-
synchronizePresence(),
|
149
|
-
ok;
|
150
|
-
|
151
|
-
"SynchronizeRosters" ->
|
152
|
-
synchronizeRosters(),
|
153
|
-
ok;
|
154
|
-
|
155
|
-
_ -> ?INFO_MSG("Command not found", []),
|
156
|
-
ok
|
157
|
-
end.
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
%%Call ejabberdctl command add_rosteritem
|
162
|
-
%Command Name: add_rosteritem
|
163
|
-
%Needs mod_admin_extra (http://www.ejabberd.im/ejabberd-modules)
|
164
|
-
%ejabberdctl add_rosteritem localuser localserver buddy buddyserver nick group subs
|
165
|
-
%subs= none, from, to or both,
|
166
|
-
|
167
|
-
%Example
|
168
|
-
%ejabberdctl add_rosteritem frank-williamson trapo demo trapo NickName SocialStream from
|
169
|
-
%frank-williamson@trapo adds demo@trapo to its roster with subscription from, in the group SocialStream with the name Nickname
|
170
|
-
%%
|
171
|
-
addItemToRoster(UserSlug,UserDomain,BuddySlug,BuddyDomain,ContactName,Group,Subscription_type) ->
|
172
|
-
%%Command = lists:concat(["ejabberdctl add_rosteritem ", UserSlug , " ", UserDomain, " ", BuddySlug, " ", BuddyDomain , " \\'", ContactName , "\\' ", Group , " ", Subscription_type]),
|
173
|
-
%%Command = lists:concat(["ejabberdctl add_rosteritem ", UserSlug , " ", UserDomain, " ", BuddySlug, " ", BuddyDomain , " \'", ContactName , "\' ", Group , " ", Subscription_type]),
|
174
|
-
|
175
|
-
[UserName|_R] = string:tokens(ContactName, " "),
|
176
|
-
Command = lists:concat(["ejabberdctl add_rosteritem ", UserSlug , " ", UserDomain, " ", BuddySlug, " ", BuddyDomain , " ", UserName , " ", Group , " ", Subscription_type]),
|
177
|
-
os:cmd(Command),
|
178
|
-
?INFO_MSG("Execute command: ~p", [Command]),
|
179
|
-
ok.
|
180
125
|
|
181
126
|
%%GETTERS CONFIG VALUES
|
182
127
|
%%CONFIG FILE: /etc/ejabberd/ssconfig.cfg
|
@@ -237,19 +182,6 @@ case Output of
|
|
237
182
|
end.
|
238
183
|
|
239
184
|
|
240
|
-
%%Send all connected users to Social Stream Rails Application
|
241
|
-
synchronizePresence() ->
|
242
|
-
Synchronize_path = string:concat(getOptionValue("scripts_path="), "/synchronize_presence_script "),
|
243
|
-
os:cmd(Synchronize_path),
|
244
|
-
ok.
|
245
|
-
|
246
|
-
|
247
|
-
%%Reset all rosters and wait to received data from Social Stream Rails Application
|
248
|
-
synchronizeRosters() ->
|
249
|
-
SynchronizeRosters_path = string:concat(getOptionValue("scripts_path="), "/emanagement removeAllRosters"),
|
250
|
-
os:cmd(SynchronizeRosters_path),
|
251
|
-
ok.
|
252
|
-
|
253
185
|
|
254
186
|
%Reset all connections
|
255
187
|
reset_connections() ->
|
@@ -4,7 +4,7 @@ class SocialStream::Presence::InstallGenerator < Rails::Generators::Base
|
|
4
4
|
source_root File.expand_path('../templates', __FILE__)
|
5
5
|
|
6
6
|
def create_initializer_file
|
7
|
-
|
7
|
+
template 'initializer.rb', 'config/initializers/social_stream_presence.rb'
|
8
8
|
end
|
9
9
|
|
10
10
|
def create_migration_file
|
@@ -6,13 +6,15 @@ SocialStream::Presence.setup do |config|
|
|
6
6
|
#Configures Authentication Method: "cookie" or "password"
|
7
7
|
config.auth_method = "cookie"
|
8
8
|
#Configures XMPP Server Password
|
9
|
-
config.xmpp_server_password =
|
9
|
+
config.xmpp_server_password = <%= SecureRandom.hex(64).inspect %>
|
10
10
|
#Remote or local mode
|
11
11
|
config.remote_xmpp_server = false
|
12
12
|
#Scripts path to execute ejabberd scripts: local or remote
|
13
13
|
config.scripts_path = "/scripts_path"
|
14
|
-
#
|
15
|
-
|
14
|
+
#Ejabberd module path in the xmpp server
|
15
|
+
config.ejabberd_module_path = "/lib/ejabberd/ebin"
|
16
|
+
#Uncomment to enable Social Stream Presence
|
17
|
+
#config.enable = true
|
16
18
|
|
17
19
|
#Parameters for remote mode
|
18
20
|
#SSH Login
|
@@ -25,6 +27,6 @@ SocialStream::Presence.setup do |config|
|
|
25
27
|
#Username of the the Social Stream Admin sid
|
26
28
|
config.social_stream_presence_username = "social_stream-presence"
|
27
29
|
#Configures Social Stream Rails App Password
|
28
|
-
config.password =
|
30
|
+
config.password = <%= SecureRandom.hex(64).inspect %>
|
29
31
|
|
30
32
|
end
|
@@ -22,6 +22,7 @@ module SocialStream
|
|
22
22
|
mattr_accessor :xmpp_server_password
|
23
23
|
mattr_accessor :remote_xmpp_server
|
24
24
|
mattr_accessor :scripts_path
|
25
|
+
mattr_accessor :ejabberd_module_path
|
25
26
|
mattr_accessor :enable
|
26
27
|
|
27
28
|
mattr_accessor :ssh_domain
|
@@ -33,7 +34,7 @@ module SocialStream
|
|
33
34
|
|
34
35
|
@@auth_method = "cookie"
|
35
36
|
@@remote_xmpp_server = false
|
36
|
-
@@enable =
|
37
|
+
@@enable = false
|
37
38
|
|
38
39
|
class << self
|
39
40
|
def setup
|
@@ -39,7 +39,7 @@ module SocialStream
|
|
39
39
|
elsif self.positive?
|
40
40
|
#Case: Possitive tie unidirectional
|
41
41
|
#Execute addBuddyToRoster(userSID,buddySID,buddyNick,buddyGroup,subscription_type)
|
42
|
-
subscription_type = "
|
42
|
+
subscription_type = "from"
|
43
43
|
SocialStream::Presence::XmppServerOrder::addBuddyToRoster(user_sid,buddy_sid,buddy_name,"SocialStream",subscription_type)
|
44
44
|
else
|
45
45
|
#Negative Tie
|
@@ -4,6 +4,7 @@ require 'xmpp4r/roster'
|
|
4
4
|
require 'xmpp4r/client'
|
5
5
|
require 'xmpp4r/message'
|
6
6
|
require 'net/ssh'
|
7
|
+
require 'net/sftp'
|
7
8
|
|
8
9
|
module SocialStream
|
9
10
|
module Presence
|
@@ -31,32 +32,16 @@ module SocialStream
|
|
31
32
|
end
|
32
33
|
|
33
34
|
|
35
|
+
|
34
36
|
def synchronizePresence
|
35
|
-
|
36
|
-
|
37
|
+
if isEjabberdNodeUp
|
38
|
+
output = executeEmanagementCommand("getConnectedUsers",[])
|
39
|
+
user_slugs = output.split("\n")
|
40
|
+
synchronizePresenceForSlugs(user_slugs)
|
41
|
+
else
|
37
42
|
resetPresence
|
38
43
|
return "Xmpp Server Down: Reset Connected Users"
|
39
|
-
end
|
40
|
-
|
41
|
-
if SocialStream::Presence.remote_xmpp_server
|
42
|
-
command = buildCommand("synchronize_presence_script","",[])
|
43
|
-
executeCommand(command)
|
44
|
-
else
|
45
|
-
#SocialStream::Presence.remote_xmpp_server=false
|
46
|
-
|
47
|
-
#Get connected users locally
|
48
|
-
users = []
|
49
|
-
output = %x[ejabberdctl connected-users]
|
50
|
-
sessions = output.split("\n")
|
51
|
-
|
52
|
-
sessions.each do |session|
|
53
|
-
users << session.split("@")[0]
|
54
|
-
puts session.split("@")[0]
|
55
|
-
end
|
56
|
-
|
57
|
-
synchronizePresenceForSlugs(users)
|
58
|
-
|
59
|
-
end
|
44
|
+
end
|
60
45
|
end
|
61
46
|
|
62
47
|
|
@@ -93,6 +78,7 @@ module SocialStream
|
|
93
78
|
|
94
79
|
|
95
80
|
def synchronizePresenceForSlugs(user_slugs)
|
81
|
+
|
96
82
|
#Check connected users
|
97
83
|
users = User.find_all_by_connected(true)
|
98
84
|
|
@@ -123,6 +109,117 @@ module SocialStream
|
|
123
109
|
end
|
124
110
|
|
125
111
|
|
112
|
+
#Installation methods
|
113
|
+
|
114
|
+
def copyFolder(oPath,dPath)
|
115
|
+
if SocialStream::Presence.remote_xmpp_server
|
116
|
+
#Remote mode
|
117
|
+
copyRemoteFolder(oPath,dPath)
|
118
|
+
else
|
119
|
+
#Local mode
|
120
|
+
SocialStream::Presence::XmppServerOrder::executeCommand("cp -r " + oPath + "/* " + dPath)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
def copyRemoteFolder(localPath,remotePath)
|
126
|
+
begin
|
127
|
+
if SocialStream::Presence.ssh_password
|
128
|
+
|
129
|
+
Net::SFTP.start(SocialStream::Presence.ssh_domain, SocialStream::Presence.ssh_user, :password => SocialStream::Presence.ssh_password, :auth_methods => ["password"] ) do |sftp|
|
130
|
+
recursiveCopyFolder(localPath,remotePath,sftp)
|
131
|
+
end
|
132
|
+
|
133
|
+
else
|
134
|
+
#SSH with authentication key instead of password
|
135
|
+
Net::SFTP.start(SocialStream::Presence.ssh_domain, SocialStream::Presence.ssh_user) do |sftp|
|
136
|
+
recursiveCopyFolder(localPath,remotePath,sftp)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
output="Ok"
|
140
|
+
rescue Exception => e
|
141
|
+
case e
|
142
|
+
when Net::SSH::AuthenticationFailed
|
143
|
+
output = "AuthenticationFailed on remote access"
|
144
|
+
else
|
145
|
+
output = "Unknown exception in copyRemoteFolder method: #{e.to_s}"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
return output
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
def recursiveCopyFolder(localPath,remotePath,sftp)
|
154
|
+
# Create directory if not exits
|
155
|
+
sftp.mkdir(remotePath)
|
156
|
+
# Upload files to the remote host
|
157
|
+
Dir.foreach(localPath) do |f|
|
158
|
+
file_path = localPath + "/#{f}"
|
159
|
+
if File.file?(file_path)
|
160
|
+
sftp.upload(file_path, remotePath + "/#{f}")
|
161
|
+
elsif File.directory?(file_path) and f!="." and f!=".."
|
162
|
+
recursiveCopyFolder(file_path,remotePath + "/#{f}",sftp)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def autoconf(options)
|
168
|
+
autoconf=[]
|
169
|
+
|
170
|
+
#Add autoconfiguration options
|
171
|
+
#autoconf.push("key=value")
|
172
|
+
|
173
|
+
autoconf.push("scripts_path=" + SocialStream::Presence.scripts_path)
|
174
|
+
autoconf.push("ejabberd_password=" + SocialStream::Presence.xmpp_server_password)
|
175
|
+
autoconf.push("server_domain=" + SocialStream::Presence.domain)
|
176
|
+
autoconf.push("cookie_name=" + Rails.application.config.session_options[:key])
|
177
|
+
|
178
|
+
#Param options
|
179
|
+
if options
|
180
|
+
options.each do |option|
|
181
|
+
autoconf = addManualOption(autoconf,option)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
#return "[key1=value1,key2=value2,key3=value3]"
|
186
|
+
return "[" + autoconf.join(',') + "]"
|
187
|
+
end
|
188
|
+
|
189
|
+
|
190
|
+
def addManualOption(array,option)
|
191
|
+
|
192
|
+
optionSplit = option.split("=")
|
193
|
+
unless optionSplit.length == 2
|
194
|
+
return array
|
195
|
+
end
|
196
|
+
|
197
|
+
key = optionSplit[0];
|
198
|
+
array.each do |element|
|
199
|
+
if element.split("=")[0]==key
|
200
|
+
#Replace element
|
201
|
+
array[array.index(element)]=option
|
202
|
+
return array
|
203
|
+
end
|
204
|
+
end
|
205
|
+
#Add option
|
206
|
+
array.push(option)
|
207
|
+
return array
|
208
|
+
end
|
209
|
+
|
210
|
+
|
211
|
+
def getExecutorUser
|
212
|
+
if SocialStream::Presence.remote_xmpp_server
|
213
|
+
if SocialStream::Presence.ssh_user
|
214
|
+
return SocialStream::Presence.ssh_user
|
215
|
+
else
|
216
|
+
return nil
|
217
|
+
end
|
218
|
+
else
|
219
|
+
return %x["whoami"].gsub(/\n/,"");
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
126
223
|
|
127
224
|
#Execution commands manage
|
128
225
|
|
@@ -148,11 +245,11 @@ module SocialStream
|
|
148
245
|
if commands.length > 1
|
149
246
|
puts "Executing the following commands:"
|
150
247
|
commands.each do |command|
|
151
|
-
puts command
|
248
|
+
puts parsingCommand(command)
|
152
249
|
end
|
153
250
|
puts "Command list finish"
|
154
251
|
elsif commands.length == 1
|
155
|
-
puts "Executing " + commands[0]
|
252
|
+
puts "Executing " + parsingCommand(commands[0])
|
156
253
|
else
|
157
254
|
puts "No command to execute"
|
158
255
|
return
|
@@ -204,18 +301,21 @@ module SocialStream
|
|
204
301
|
|
205
302
|
return output
|
206
303
|
end
|
207
|
-
|
304
|
+
|
208
305
|
|
209
306
|
|
210
307
|
#Help methods
|
211
308
|
|
212
309
|
def isEjabberdNodeUp
|
213
310
|
output = executeEmanagementCommand("isEjabberdNodeStarted",[])
|
214
|
-
nodeUp = output.split("\n")[
|
311
|
+
nodeUp = output.split("\n")[0]
|
215
312
|
return (nodeUp and nodeUp.strip()=="true")
|
216
313
|
end
|
217
314
|
|
218
|
-
|
315
|
+
def parsingCommand(command)
|
316
|
+
#Hide passwords on sudo commands: command pattern = "echo password | sudo -S order"
|
317
|
+
return command.gsub(/echo ([aA-zZ]+) [|] sudo -S [.]*/,"echo ****** | sudo -S \\2")
|
318
|
+
end
|
219
319
|
|
220
320
|
#Xmpp client manage methods
|
221
321
|
|