Mercurial > libervia-web
annotate libervia.tac @ 215:e830a0c60d32
server side: added the security_limit to setParam
- in addition to the check which is done by the core, libervia checks if the param to be modified was really part of the XML that has been returned by getParams with security_limit = 0.
author | souliane <souliane@mailoo.org> |
---|---|
date | Sat, 07 Sep 2013 02:07:07 +0200 |
parents | 7b26be266ab1 |
children | 4e6467efd6bf |
rev | line source |
---|---|
0 | 1 #!/usr/bin/python |
2 # -*- coding: utf-8 -*- | |
3 | |
4 """ | |
5 Libervia: a Salut à Toi frontend | |
165 | 6 Copyright (C) 2011, 2012, 2013 Jérôme Poisson <goffi@goffi.org> |
0 | 7 |
8 This program is free software: you can redistribute it and/or modify | |
9 it under the terms of the GNU Affero General Public License as published by | |
10 the Free Software Foundation, either version 3 of the License, or | |
11 (at your option) any later version. | |
12 | |
13 This program is distributed in the hope that it will be useful, | |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 GNU Affero General Public License for more details. | |
17 | |
18 You should have received a copy of the GNU Affero General Public License | |
19 along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 """ | |
21 | |
22 from twisted.application import internet, service | |
23 from twisted.internet import glib2reactor | |
24 glib2reactor.install() | |
25 from twisted.internet import reactor, defer | |
26 from twisted.web import server | |
27 from twisted.web import error as weberror | |
28 from twisted.web.static import File | |
61 | 29 from twisted.web.resource import Resource, NoResource |
172
631556a64850
server side: added root redirection to libervia.html
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
30 from twisted.web.util import Redirect |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
31 from twisted.python.components import registerAdapter |
10 | 32 from twisted.words.protocols.jabber.jid import JID |
0 | 33 from txjsonrpc.web import jsonrpc |
34 from txjsonrpc import jsonrpclib | |
35 from sat_frontends.bridge.DBus import DBusBridgeFrontend,BridgeExceptionNoService | |
46 | 36 from logging import debug, info, warning, error |
127 | 37 import re, glob |
38 import os.path, sys | |
39 import tempfile, shutil, uuid | |
10 | 40 from server_side.blog import MicroBlog |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
41 from zope.interface import Interface, Attribute, implements |
215
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
42 from xml.dom import minidom |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
43 |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
44 |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
45 #import time |
10 | 46 |
154 | 47 TIMEOUT = 300 #Session's time out, after that the user will be disconnected |
36 | 48 LIBERVIA_DIR = "output/" |
77 | 49 MEDIA_DIR = "media/" |
110
dfc02690deb4
browser side: CSS: header, unibox, tabs + drag'n' drop reworked
Adrien Vigneron <adrienvigneron@mailoo.org>
parents:
107
diff
changeset
|
50 AVATARS_DIR = "avatars/" |
77 | 51 CARDS_DIR = "games/cards/tarot" |
0 | 52 |
215
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
53 # Security limit for Libervia (get/set params) |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
54 SECURITY_LIMIT = 0 |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
55 |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
56 class ISATSession(Interface): |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
57 profile = Attribute("Sat profile") |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
58 jid = Attribute("JID associated with the profile") |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
59 |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
60 class SATSession(object): |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
61 implements(ISATSession) |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
62 def __init__(self, session): |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
63 self.profile = None |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
64 self.jid = None |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
65 |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
66 class LiberviaSession(server.Session): |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
67 sessionTimeout = TIMEOUT |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
68 |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
69 def __init__(self, *args, **kwargs): |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
70 self.__lock = False |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
71 server.Session.__init__(self, *args, **kwargs) |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
72 |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
73 def lock(self): |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
74 """Prevent session from expiring""" |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
75 self.__lock = True |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
76 self._expireCall.reset(sys.maxint) |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
77 |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
78 def unlock(self): |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
79 """Allow session to expire again, and touch it""" |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
80 self.__lock = False |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
81 self.touch() |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
82 |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
83 def touch(self): |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
84 if not self.__lock: |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
85 server.Session.touch(self) |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
86 |
59
d0fa4e96a5e4
server side: 404 error is now sent instead of directory listing when requesting a directory
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
87 class ProtectedFile(File): |
d0fa4e96a5e4
server side: 404 error is now sent instead of directory listing when requesting a directory
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
88 """A File class which doens't show directory listing""" |
d0fa4e96a5e4
server side: 404 error is now sent instead of directory listing when requesting a directory
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
89 |
d0fa4e96a5e4
server side: 404 error is now sent instead of directory listing when requesting a directory
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
90 def directoryListing(self): |
d0fa4e96a5e4
server side: 404 error is now sent instead of directory listing when requesting a directory
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
91 return NoResource() |
d0fa4e96a5e4
server side: 404 error is now sent instead of directory listing when requesting a directory
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
92 |
46 | 93 class SATActionIDHandler(object): |
140
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
94 """Manage SàT action action_id lifecycle""" |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
95 ID_LIFETIME = 30 #after this time (in seconds), action_id will be suppressed and action result will be ignored |
46 | 96 |
97 def __init__(self): | |
98 self.waiting_ids = {} | |
99 | |
140
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
100 def waitForId(self, callback, action_id, profile, *args, **kwargs): |
46 | 101 """Wait for an action result |
102 @param callback: method to call when action gave a result back | |
140
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
103 @param action_id: action_id to wait for |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
104 @param profile: %(doc_profile)s |
46 | 105 @param *args: additional argument to pass to callback |
106 @param **kwargs: idem""" | |
140
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
107 action_tuple = (action_id, profile) |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
108 self.waiting_ids[action_tuple] = (callback, args, kwargs) |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
109 reactor.callLater(self.ID_LIFETIME, self.purgeID, action_tuple) |
46 | 110 |
140
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
111 def purgeID(self, action_tuple): |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
112 """Called when an action_id has not be handled in time""" |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
113 if action_tuple in self.waiting_ids: |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
114 warning ("action of action_id %s [%s] has not been managed, action_id is now ignored" % action_tuple) |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
115 del self.waiting_ids[action_tuple] |
46 | 116 |
140
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
117 def actionResultCb(self, answer_type, action_id, data, profile): |
46 | 118 """Manage the actionResult signal""" |
140
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
119 action_tuple = (action_id, profile) |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
120 if action_tuple in self.waiting_ids: |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
121 callback, args, kwargs = self.waiting_ids[action_tuple] |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
122 del self.waiting_ids[action_tuple] |
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
123 callback(answer_type, action_id, data, *args, **kwargs) |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
124 |
0 | 125 class MethodHandler(jsonrpc.JSONRPC): |
126 | |
127 def __init__(self, sat_host): | |
128 jsonrpc.JSONRPC.__init__(self) | |
129 self.sat_host=sat_host | |
215
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
130 self.authorized_params = None |
0 | 131 |
132 def render(self, request): | |
1 | 133 self.session = request.getSession() |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
134 profile = ISATSession(self.session).profile |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
135 if not profile: |
0 | 136 #user is not identified, we return a jsonrpc fault |
137 parsed = jsonrpclib.loads(request.content.read()) | |
138 fault = jsonrpclib.Fault(0, "Not allowed") #FIXME: define some standard error codes for libervia | |
139 return jsonrpc.JSONRPC._cbRender(self, fault, request, parsed.get('id'), parsed.get('jsonrpc')) | |
140 return jsonrpc.JSONRPC.render(self, request) | |
19 | 141 |
142 def jsonrpc_getProfileJid(self): | |
143 """Return the jid of the profile""" | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
144 sat_session = ISATSession(self.session) |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
145 profile = sat_session.profile |
61 | 146 sat_session.jid = JID(self.sat_host.bridge.getParamA("JabberID", "Connection", profile_key=profile)) |
147 return sat_session.jid.full() | |
0 | 148 |
156 | 149 def jsonrpc_disconnect(self): |
150 """Disconnect the profile""" | |
151 sat_session = ISATSession(self.session) | |
152 profile = sat_session.profile | |
153 self.sat_host.bridge.disconnect(profile) | |
154 | |
0 | 155 def jsonrpc_getContacts(self): |
156 """Return all passed args.""" | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
157 profile = ISATSession(self.session).profile |
1 | 158 return self.sat_host.bridge.getContacts(profile) |
20 | 159 |
54
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
160 def jsonrpc_addContact(self, entity, name, groups): |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
161 """Subscribe to contact presence, and add it to the given groups""" |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
162 profile = ISATSession(self.session).profile |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
163 self.sat_host.bridge.addContact(entity, profile) |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
164 self.sat_host.bridge.updateContact(entity, name, groups, profile) |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
165 |
55
d5266c41ca24
Roster list update, contact deletion + some refactoring
Goffi <goffi@goffi.org>
parents:
54
diff
changeset
|
166 def jsonrpc_delContact(self, entity): |
d5266c41ca24
Roster list update, contact deletion + some refactoring
Goffi <goffi@goffi.org>
parents:
54
diff
changeset
|
167 """Remove contact from contacts list""" |
d5266c41ca24
Roster list update, contact deletion + some refactoring
Goffi <goffi@goffi.org>
parents:
54
diff
changeset
|
168 profile = ISATSession(self.session).profile |
d5266c41ca24
Roster list update, contact deletion + some refactoring
Goffi <goffi@goffi.org>
parents:
54
diff
changeset
|
169 self.sat_host.bridge.delContact(entity, profile) |
d5266c41ca24
Roster list update, contact deletion + some refactoring
Goffi <goffi@goffi.org>
parents:
54
diff
changeset
|
170 |
57
e552a67b933d
Contact update + add dedication in About dialog
Goffi <goffi@goffi.org>
parents:
55
diff
changeset
|
171 def jsonrpc_updateContact(self, entity, name, groups): |
e552a67b933d
Contact update + add dedication in About dialog
Goffi <goffi@goffi.org>
parents:
55
diff
changeset
|
172 """Update contact's roster item""" |
e552a67b933d
Contact update + add dedication in About dialog
Goffi <goffi@goffi.org>
parents:
55
diff
changeset
|
173 profile = ISATSession(self.session).profile |
e552a67b933d
Contact update + add dedication in About dialog
Goffi <goffi@goffi.org>
parents:
55
diff
changeset
|
174 self.sat_host.bridge.updateContact(entity, name, groups, profile) |
e552a67b933d
Contact update + add dedication in About dialog
Goffi <goffi@goffi.org>
parents:
55
diff
changeset
|
175 |
54
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
176 def jsonrpc_subscription(self, sub_type, entity, name, groups): |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
177 """Confirm (or infirm) subscription, |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
178 and setup user roster in case of subscription""" |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
179 profile = ISATSession(self.session).profile |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
180 self.sat_host.bridge.subscription(sub_type, entity, profile) |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
181 if sub_type == 'subscribed': |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
182 self.sat_host.bridge.updateContact(entity, name, groups, profile) |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
183 |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
184 def jsonrpc_getWaitingSub(self): |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
185 """Return list of room already joined by user""" |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
186 profile = ISATSession(self.session).profile |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
187 return self.sat_host.bridge.getWaitingSub(profile) |
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
188 |
20 | 189 def jsonrpc_setStatus(self, status): |
190 """Change the status""" | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
191 profile = ISATSession(self.session).profile |
20 | 192 self.sat_host.bridge.setPresence('', '', 0, {'':status}, profile) |
193 | |
19 | 194 |
214
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
195 def jsonrpc_sendMessage(self, to_jid, msg, subject, _type, options={}): |
19 | 196 """send message""" |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
197 profile = ISATSession(self.session).profile |
214
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
198 return self.sat_host.bridge.sendMessage(to_jid, msg, subject, _type, options, profile) |
0 | 199 |
201
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
200 def jsonrpc_sendMblog(self, _type, dest, text): |
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
201 """ Send microblog message |
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
202 @param _type: one of "PUBLIC", "GROUP" |
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
203 @param dest: destinees (list of groups, ignored for "PUBLIC") |
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
204 @param text: microblog's text |
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
205 """ |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
206 profile = ISATSession(self.session).profile |
201
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
207 if _type in ("PUBLIC", "GROUP") and text: |
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
208 if _type == "PUBLIC": |
14
9bf8ed012adc
- Group microblog management, first draft
Goffi <goffi@goffi.org>
parents:
11
diff
changeset
|
209 #This text if for the public microblog |
133
4ad621df9e34
browser side: group blog is now used to send all microblogs
Goffi <goffi@goffi.org>
parents:
132
diff
changeset
|
210 print "sending public blog" |
202
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
211 return self.sat_host.bridge.sendGroupBlog("PUBLIC", [], text, {'allow_comments': 'True'}, profile) |
14
9bf8ed012adc
- Group microblog management, first draft
Goffi <goffi@goffi.org>
parents:
11
diff
changeset
|
212 else: |
133
4ad621df9e34
browser side: group blog is now used to send all microblogs
Goffi <goffi@goffi.org>
parents:
132
diff
changeset
|
213 print "sending group blog" |
202
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
214 return self.sat_host.bridge.sendGroupBlog("GROUP", [dest], text, {'allow_comments': 'True'}, profile) |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
215 else: |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
216 raise Exception("Invalid data") |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
217 |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
218 def jsonrpc_sendMblogComment(self, node, text): |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
219 """ Send microblog message |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
220 @param node: url of the comments node |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
221 @param text: comment |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
222 """ |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
223 profile = ISATSession(self.session).profile |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
224 if node and text: |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
225 return self.sat_host.bridge.sendGroupBlogComment(node, text, profile) |
201
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
226 else: |
aa76793da353
server + browser: message warning level/sending refactoring:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
227 raise Exception("Invalid data") |
132
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
228 |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
229 def jsonrpc_getLastMblogs(self, publisher_jid, max_item): |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
230 """Get last microblogs posted by a contact |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
231 @param publisher_jid: jid of the publisher |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
232 @param max_item: number of items to ask |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
233 @return list of microblog data (dict)""" |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
234 profile = ISATSession(self.session).profile |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
235 d = defer.Deferred() |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
236 self.sat_host.bridge.getLastGroupBlogs(publisher_jid, max_item, profile, callback=d.callback, errback=d.errback) |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
237 return d |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
238 |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
239 def jsonrpc_getMassiveLastMblogs(self, publishers_type, publishers_list, max_item): |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
240 """Get lasts microblogs posted by several contacts at once |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
241 @param publishers_type: one of "ALL", "GROUP", "JID" |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
242 @param publishers_list: list of publishers type (empty list of all, list of groups or list of jids) |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
243 @param max_item: number of items to ask |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
244 @return: dictionary key=publisher's jid, value=list of microblog data (dict)""" |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
245 profile = ISATSession(self.session).profile |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
246 d = defer.Deferred() |
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
247 self.sat_host.bridge.getMassiveLastGroupBlogs(publishers_type, publishers_list, max_item, profile, callback=d.callback, errback=d.errback) |
135
ceef355156de
server + browser side: groupblog subscription + fixed blog insertion order
Goffi <goffi@goffi.org>
parents:
133
diff
changeset
|
248 self.sat_host.bridge.massiveSubscribeGroupBlogs(publishers_type, publishers_list, profile) |
132
30d8e328559b
server & browser side: microblogging refactoring first draft
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
249 return d |
14
9bf8ed012adc
- Group microblog management, first draft
Goffi <goffi@goffi.org>
parents:
11
diff
changeset
|
250 |
202
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
251 def jsonrpc_getMblogComments(self, service, node): |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
252 """Get all comments of given node |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
253 @param service: jid of the service hosting the node |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
254 @param node: comments node |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
255 """ |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
256 profile = ISATSession(self.session).profile |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
257 d = defer.Deferred() |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
258 self.sat_host.bridge.getGroupBlogComments(service, node, profile, callback=d.callback, errback=d.errback) |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
259 return d |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
260 |
2bc6cf004e61
browser, server: comments handling:
Goffi <goffi@goffi.org>
parents:
201
diff
changeset
|
261 |
20 | 262 def jsonrpc_getPresenceStatus(self): |
263 """Get Presence information for connected contacts""" | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
264 profile = ISATSession(self.session).profile |
20 | 265 return self.sat_host.bridge.getPresenceStatus(profile) |
266 | |
123 | 267 def jsonrpc_getHistory(self, from_jid, to_jid, size, between): |
19 | 268 """Return history for the from_jid/to_jid couple""" |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
269 sat_session = ISATSession(self.session) |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
270 profile = sat_session.profile |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
271 sat_jid = sat_session.jid |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
272 if not sat_jid: |
19 | 273 error("No jid saved for this profile") |
274 return {} | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
275 if JID(from_jid).userhost() != sat_jid.userhost() and JID(to_jid).userhost() != sat_jid.userhost(): |
19 | 276 error("Trying to get history from a different jid, maybe a hack attempt ?") |
277 return {} | |
123 | 278 d = defer.Deferred() |
140
09a512d9a0c0
server side: fixed getHistory call and action result management
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
279 self.sat_host.bridge.getHistory(from_jid, to_jid, size, between, profile, callback=d.callback, errback=d.errback) |
123 | 280 def show(result_dbus): |
281 result = [] | |
282 for line in result_dbus: | |
283 #XXX: we have to do this stupid thing because Python D-Bus use its own types instead of standard types | |
284 # and txJsonRPC doesn't accept D-Bus types, resulting in a empty query | |
137 | 285 timestamp, from_jid, to_jid, message, mess_type = line |
286 result.append((float(timestamp), unicode(from_jid), unicode(to_jid), unicode(message), unicode(mess_type))) | |
123 | 287 return result |
288 d.addCallback(show) | |
289 return d | |
19 | 290 |
50 | 291 def jsonrpc_joinMUC(self, room_jid, nick): |
292 """Join a Multi-User Chat room""" | |
293 profile = ISATSession(self.session).profile | |
294 try: | |
295 room_jid = JID(room_jid) | |
296 except: | |
297 warning('Invalid room jid') | |
298 return | |
125
f9d63624699f
radio collective integration, first draft
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
299 self.sat_host.bridge.joinMUC(room_jid.userhost(), nick, {}, profile) |
50 | 300 |
179
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
301 def jsonrpc_mucLeave(self, room_jid): |
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
302 """Quit a Multi-User Chat room""" |
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
303 profile = ISATSession(self.session).profile |
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
304 try: |
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
305 room_jid = JID(room_jid) |
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
306 except: |
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
307 warning('Invalid room jid') |
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
308 return |
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
309 self.sat_host.bridge.mucLeave(room_jid.userhost(), profile) |
8475a29d7214
closing a group chat widget now leave the muc room (bug 11)
Goffi <goffi@goffi.org>
parents:
172
diff
changeset
|
310 |
121 | 311 def jsonrpc_getRoomsJoined(self): |
30
7684e3ceb12d
server_side: added getRoomJoined method
Goffi <goffi@goffi.org>
parents:
24
diff
changeset
|
312 """Return list of room already joined by user""" |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
313 profile = ISATSession(self.session).profile |
121 | 314 return self.sat_host.bridge.getRoomsJoined(profile) |
30
7684e3ceb12d
server_side: added getRoomJoined method
Goffi <goffi@goffi.org>
parents:
24
diff
changeset
|
315 |
24 | 316 def jsonrpc_launchTarotGame(self, other_players): |
317 """Create a room, invite the other players and start a Tarot game""" | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
318 profile = ISATSession(self.session).profile |
24 | 319 self.sat_host.bridge.tarotGameLaunch(other_players, profile) |
11
331c093e4eb3
magicBox is now able to send global microblog
Goffi <goffi@goffi.org>
parents:
10
diff
changeset
|
320 |
36 | 321 def jsonrpc_getTarotCardsPaths(self): |
322 """Give the path of all the tarot cards""" | |
77 | 323 _join = os.path.join |
324 _media_dir = _join(self.sat_host.media_dir,'') | |
325 return map(lambda x: _join(MEDIA_DIR, x[len(_media_dir):]),glob.glob(_join(_media_dir,CARDS_DIR,'*_*.png'))); | |
36 | 326 |
37
b306aa090438
Tarot game: game launching (first hand showed), and contract selection
Goffi <goffi@goffi.org>
parents:
36
diff
changeset
|
327 def jsonrpc_tarotGameReady(self, player, referee): |
b306aa090438
Tarot game: game launching (first hand showed), and contract selection
Goffi <goffi@goffi.org>
parents:
36
diff
changeset
|
328 """Tell to the server that we are ready to start the game""" |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
329 profile = ISATSession(self.session).profile |
153
ada146bac8fe
server side: fixed tarotGameReady call
Goffi <goffi@goffi.org>
parents:
151
diff
changeset
|
330 self.sat_host.bridge.tarotGameReady(player, referee, profile) |
36 | 331 |
37
b306aa090438
Tarot game: game launching (first hand showed), and contract selection
Goffi <goffi@goffi.org>
parents:
36
diff
changeset
|
332 def jsonrpc_tarotGameContratChoosed(self, player_nick, referee, contrat): |
b306aa090438
Tarot game: game launching (first hand showed), and contract selection
Goffi <goffi@goffi.org>
parents:
36
diff
changeset
|
333 """Tell to the server that we are ready to start the game""" |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
334 profile = ISATSession(self.session).profile |
37
b306aa090438
Tarot game: game launching (first hand showed), and contract selection
Goffi <goffi@goffi.org>
parents:
36
diff
changeset
|
335 self.sat_host.bridge.tarotGameContratChoosed(player_nick, referee, contrat, profile) |
39
305e81c7a32c
Tarot game: a game can now be finished
Goffi <goffi@goffi.org>
parents:
38
diff
changeset
|
336 |
305e81c7a32c
Tarot game: a game can now be finished
Goffi <goffi@goffi.org>
parents:
38
diff
changeset
|
337 def jsonrpc_tarotGamePlayCards(self, player_nick, referee, cards): |
128 | 338 """Tell to the server the cards we want to put on the table""" |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
339 profile = ISATSession(self.session).profile |
39
305e81c7a32c
Tarot game: a game can now be finished
Goffi <goffi@goffi.org>
parents:
38
diff
changeset
|
340 self.sat_host.bridge.tarotGamePlayCards(player_nick, referee, cards, profile) |
36 | 341 |
125
f9d63624699f
radio collective integration, first draft
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
342 def jsonrpc_launchRadioCollective(self, invited): |
f9d63624699f
radio collective integration, first draft
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
343 """Create a room, invite people, and start a radio collective""" |
f9d63624699f
radio collective integration, first draft
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
344 profile = ISATSession(self.session).profile |
f9d63624699f
radio collective integration, first draft
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
345 self.sat_host.bridge.radiocolLaunch(invited, profile) |
f9d63624699f
radio collective integration, first draft
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
346 |
137 | 347 def jsonrpc_getEntityData(self, jid, keys): |
348 """Get cached data for an entit | |
349 @param jid: jid of contact from who we want data | |
350 @param keys: name of data we want (list) | |
351 @return: requested data""" | |
124
6d1f4a3da29b
server: fixed buggy vcard cache retrieving, fixes avatar issue
Goffi <goffi@goffi.org>
parents:
123
diff
changeset
|
352 profile = ISATSession(self.session).profile |
137 | 353 return self.sat_host.bridge.getEntityData(jid, keys, profile) |
110
dfc02690deb4
browser side: CSS: header, unibox, tabs + drag'n' drop reworked
Adrien Vigneron <adrienvigneron@mailoo.org>
parents:
107
diff
changeset
|
354 |
204
890776a6fdb7
browser + server: vcard is requested when no avatar data is found in cache
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
355 def jsonrpc_getCard(self, jid): |
890776a6fdb7
browser + server: vcard is requested when no avatar data is found in cache
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
356 """Get VCard for entiry |
890776a6fdb7
browser + server: vcard is requested when no avatar data is found in cache
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
357 @param jid: jid of contact from who we want data |
890776a6fdb7
browser + server: vcard is requested when no avatar data is found in cache
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
358 @return: id to retrieve the profile""" |
890776a6fdb7
browser + server: vcard is requested when no avatar data is found in cache
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
359 profile = ISATSession(self.session).profile |
890776a6fdb7
browser + server: vcard is requested when no avatar data is found in cache
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
360 return self.sat_host.bridge.getCard(jid, profile) |
890776a6fdb7
browser + server: vcard is requested when no avatar data is found in cache
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
361 |
214
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
362 def jsonrpc_getParamsUI(self): |
215
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
363 """Return the parameters XML for profile""" |
214
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
364 profile = ISATSession(self.session).profile |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
365 d = defer.Deferred() |
215
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
366 |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
367 def setAuthorizedParams(d): |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
368 if self.authorized_params is None: |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
369 self.authorized_params = {} |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
370 for cat in minidom.parseString(d.encode('utf-8')).getElementsByTagName("category"): |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
371 params = cat.getElementsByTagName("param") |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
372 params_list = [param.getAttribute("name") for param in params] |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
373 self.authorized_params[cat.getAttribute("name")] = params_list |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
374 return d |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
375 d.addCallback(setAuthorizedParams) |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
376 |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
377 from sat.tools.xml_tools import paramsXml2xmlUI |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
378 d.addCallback(lambda d: paramsXml2xmlUI(d)) |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
379 |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
380 self.sat_host.bridge.getParams(SECURITY_LIMIT, profile, callback=d.callback, errback=d.errback) |
214
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
381 return d |
148
8635bc9db9bf
added parameter management to test XMLUI, but it's currently deactivated for security reasons (need some configuration options) + separated mainTabPanel CSS from LiberviaTabPanel
Goffi <goffi@goffi.org>
parents:
140
diff
changeset
|
382 |
214
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
383 def jsonrpc_setParam(self, name, value, category): |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
384 profile = ISATSession(self.session).profile |
215
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
385 if category in self.authorized_params and name in self.authorized_params[category]: |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
386 return self.sat_host.bridge.setParam(name, value, category, SECURITY_LIMIT, profile) |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
387 else: |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
388 warning("Trying to set parameter '%s' in category '%s' without authorization!!!" |
e830a0c60d32
server side: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
214
diff
changeset
|
389 % (name, category)) |
148
8635bc9db9bf
added parameter management to test XMLUI, but it's currently deactivated for security reasons (need some configuration options) + separated mainTabPanel CSS from LiberviaTabPanel
Goffi <goffi@goffi.org>
parents:
140
diff
changeset
|
390 |
8635bc9db9bf
added parameter management to test XMLUI, but it's currently deactivated for security reasons (need some configuration options) + separated mainTabPanel CSS from LiberviaTabPanel
Goffi <goffi@goffi.org>
parents:
140
diff
changeset
|
391 def jsonrpc_launchAction(self, action_type, data): |
8635bc9db9bf
added parameter management to test XMLUI, but it's currently deactivated for security reasons (need some configuration options) + separated mainTabPanel CSS from LiberviaTabPanel
Goffi <goffi@goffi.org>
parents:
140
diff
changeset
|
392 profile = ISATSession(self.session).profile |
8635bc9db9bf
added parameter management to test XMLUI, but it's currently deactivated for security reasons (need some configuration options) + separated mainTabPanel CSS from LiberviaTabPanel
Goffi <goffi@goffi.org>
parents:
140
diff
changeset
|
393 return self.sat_host.bridge.launchAction(action_type, data, profile) |
8635bc9db9bf
added parameter management to test XMLUI, but it's currently deactivated for security reasons (need some configuration options) + separated mainTabPanel CSS from LiberviaTabPanel
Goffi <goffi@goffi.org>
parents:
140
diff
changeset
|
394 |
214
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
395 def jsonrpc_chatStateComposing(self, to_jid_s): |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
396 """Broadcast a signal for "composing" state. |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
397 @param to_jid_s: contact the user is composing to |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
398 """ |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
399 profile = ISATSession(self.session).profile |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
400 self.sat_host.bridge.chatStateComposing(to_jid_s, profile) |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
401 |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
402 |
0 | 403 class Register(jsonrpc.JSONRPC): |
404 """This class manage the registration procedure with SàT | |
405 It provide an api for the browser, check password and setup the web server""" | |
406 | |
407 def __init__(self, sat_host): | |
408 jsonrpc.JSONRPC.__init__(self) | |
409 self.sat_host=sat_host | |
410 self.profiles_waiting={} | |
411 self.request=None | |
412 | |
413 def getWaitingRequest(self, profile): | |
414 """Tell if a profile is trying to log in""" | |
415 if self.profiles_waiting.has_key(profile): | |
416 return self.profiles_waiting[profile] | |
417 else: | |
418 return None | |
419 | |
420 def render(self, request): | |
421 """ | |
422 Render method with some hacks: | |
423 - if login is requested, try to login with form data | |
424 - except login, every method is jsonrpc | |
425 - user doesn't need to be authentified for isRegistered, but must be for all other methods | |
426 """ | |
427 if request.postpath==['login']: | |
428 return self.login(request) | |
429 _session = request.getSession() | |
430 parsed = jsonrpclib.loads(request.content.read()) | |
431 if parsed.get("method")!="isRegistered": | |
432 #if we don't call login or isRegistered, we need to be identified | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
433 profile = ISATSession(_session).profile |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
434 if not profile: |
0 | 435 #user is not identified, we return a jsonrpc fault |
436 fault = jsonrpclib.Fault(0, "Not allowed") #FIXME: define some standard error codes for libervia | |
437 return jsonrpc.JSONRPC._cbRender(self, fault, request, parsed.get('id'), parsed.get('jsonrpc')) | |
438 self.request = request | |
439 return jsonrpc.JSONRPC.render(self, request) | |
440 | |
441 def login(self, request): | |
442 """ | |
443 this method is called with the POST information from the registering form | |
444 it test if the password is ok, and log in if it's the case, | |
445 else it return an error | |
446 @param request: request of the register formulaire, must have "login" and "password" as arguments | |
447 @return: A constant indicating the state: | |
448 - BAD REQUEST: something is wrong in the request (bad arguments, profile_key for login) | |
449 - AUTH ERROR: either the profile or the password is wrong | |
450 - ALREADY WAITING: a request has already be made for this profile | |
451 - server.NOT_DONE_YET: the profile is being processed, the return value will be given by self._logged or self._logginError | |
452 """ | |
160
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
453 |
0 | 454 try: |
66
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
455 if request.args['submit_type'][0] == 'login': |
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
456 _login = request.args['login'][0] |
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
457 if _login.startswith('@'): |
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
458 raise Exception('No profile_key allowed') |
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
459 _pass = request.args['login_password'][0] |
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
460 |
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
461 elif request.args['submit_type'][0] == 'register': |
160
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
462 return self._registerNewAccount(request) |
66
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
463 |
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
464 else: |
9d8e79ac4c9c
Login/Register box: integration of Adrien Vigneron's design
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
465 raise Exception('Unknown submit type') |
0 | 466 except KeyError: |
467 return "BAD REQUEST" | |
468 | |
469 _profile_check = self.sat_host.bridge.getProfileName(_login) | |
470 | |
121 | 471 def profile_pass_cb(_profile_pass): |
472 if not _profile_check or _profile_check != _login or _profile_pass != _pass: | |
473 request.write("AUTH ERROR") | |
474 request.finish() | |
475 return | |
476 | |
477 if self.profiles_waiting.has_key(_login): | |
478 request.write("ALREADY WAITING") | |
479 request.finish() | |
480 return | |
481 | |
482 if self.sat_host.bridge.isConnected(_login): | |
483 request.write(self._logged(_login, request, finish=False)) | |
484 request.finish() | |
485 return | |
486 | |
487 self.profiles_waiting[_login] = request | |
155 | 488 d = defer.Deferred() |
489 self.sat_host.bridge.asyncConnect(_login, lambda: d.callback(None), d.errback) | |
490 return d | |
0 | 491 |
121 | 492 def profile_pass_errback(ignore): |
493 error("INTERNAL ERROR: can't check profile password") | |
494 request.write("AUTH ERROR") | |
495 request.finish() | |
496 | |
497 d = defer.Deferred() | |
498 self.sat_host.bridge.asyncGetParamA("Password", "Connection", profile_key=_login, callback=d.callback, errback=d.errback) | |
499 d.addCallbacks(profile_pass_cb, profile_pass_errback) | |
0 | 500 |
501 return server.NOT_DONE_YET | |
502 | |
46 | 503 def _postAccountCreation(self, answer_type, id, data, profile): |
504 """Called when a account has just been created, | |
505 setup stuff has microblog access""" | |
506 def _connected(ignore): | |
507 mblog_d = defer.Deferred() | |
508 self.sat_host.bridge.setMicroblogAccess("open", profile, lambda: mblog_d.callback(None), mblog_d.errback) | |
509 mblog_d.addBoth(lambda ignore: self.sat_host.bridge.disconnect(profile)) | |
510 | |
511 d = defer.Deferred() | |
512 self.sat_host.bridge.asyncConnect(profile, lambda: d.callback(None), d.errback) | |
513 d.addCallback(_connected) | |
514 | |
160
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
515 def _registerNewAccount(self, request): |
46 | 516 """Create a new account, or return error |
160
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
517 @param request: initial login request |
46 | 518 @return: "REGISTRATION" in case of success""" |
54
f25c4077f6b9
addind contact + subscription management + misc
Goffi <goffi@goffi.org>
parents:
50
diff
changeset
|
519 #TODO: must be moved in SàT core |
160
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
520 |
46 | 521 try: |
160
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
522 profile = login = request.args['register_login'][0] |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
523 password = request.args['register_password'][0] #FIXME: password is ignored so far |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
524 email = request.args['email'][0] |
46 | 525 except KeyError: |
526 return "BAD REQUEST" | |
527 if not re.match(r'^[a-z0-9_-]+$', login, re.IGNORECASE) or \ | |
528 not re.match(r'^.+@.+\..+', email, re.IGNORECASE): | |
529 return "BAD REQUEST" | |
530 | |
160
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
531 def registered(result): |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
532 request.write('REGISTRATION') |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
533 request.finish() |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
534 #import pudb |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
535 #pudb.set_trace() |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
536 |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
537 def registeringError(failure): |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
538 reason = str(failure.value) |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
539 if reason == "CONFLICT": |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
540 request.write('ALREADY EXISTS') |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
541 elif reason == "INTERNAL": |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
542 request.write('INTERNAL') |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
543 else: |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
544 #import pdb |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
545 #pdb.set_trace() |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
546 |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
547 error('Unknown registering error: %s' % (reason,)) |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
548 request.write('Unknown error (%s)' % reason) |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
549 request.finish() |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
550 |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
551 d = defer.Deferred() |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
552 self.sat_host.bridge.registerSatAccount(email, password, profile, lambda: d.callback(None), d.errback) |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
553 d.addCallback(registered) |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
554 d.addErrback(registeringError) |
6f913f5adca8
server side: registration refactoring first draft; main registration code is moved to SàT backend
Goffi <goffi@goffi.org>
parents:
156
diff
changeset
|
555 return server.NOT_DONE_YET |
46 | 556 |
0 | 557 def __cleanWaiting(self, login): |
558 """Remove login from waiting queue""" | |
559 try: | |
560 del self.profiles_waiting[login] | |
561 except KeyError: | |
562 pass | |
563 | |
14
9bf8ed012adc
- Group microblog management, first draft
Goffi <goffi@goffi.org>
parents:
11
diff
changeset
|
564 def _logged(self, profile, request, finish=True): |
0 | 565 """Set everything when a user just logged |
566 and return "LOGGED" to the requester""" | |
61 | 567 def result(answer): |
568 if finish: | |
569 request.write(answer) | |
570 request.finish() | |
571 else: | |
572 return answer | |
573 | |
14
9bf8ed012adc
- Group microblog management, first draft
Goffi <goffi@goffi.org>
parents:
11
diff
changeset
|
574 self.__cleanWaiting(profile) |
0 | 575 _session = request.getSession() |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
576 sat_session = ISATSession(_session) |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
577 if sat_session.profile: |
61 | 578 error (('/!\\ Session has already a profile, this should NEVER happen !')) |
579 return result('SESSION_ACTIVE') | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
580 sat_session.profile = profile |
24 | 581 self.sat_host.prof_connected.add(profile) |
45
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
582 |
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
583 def onExpire(): |
156 | 584 info ("Session expired (profile=%s)" % (profile,)) |
45
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
585 try: |
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
586 #We purge the queue |
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
587 del self.sat_host.signal_handler.queue[profile] |
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
588 except KeyError: |
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
589 pass |
130 | 590 #and now we disconnect the profile |
45
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
591 self.sat_host.bridge.disconnect(profile) |
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
592 |
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
593 _session.notifyOnExpire(onExpire) |
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
594 |
14
9bf8ed012adc
- Group microblog management, first draft
Goffi <goffi@goffi.org>
parents:
11
diff
changeset
|
595 d = defer.Deferred() |
61 | 596 return result('LOGGED') |
0 | 597 |
598 def _logginError(self, login, request, error_type): | |
599 """Something went wrong during loggin, return an error""" | |
600 self.__cleanWaiting(login) | |
601 return error_type | |
602 | |
603 def jsonrpc_isConnected(self): | |
604 _session = self.request.getSession() | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
605 profile = ISATSession(_session).profile |
0 | 606 return self.sat_host.bridge.isConnected(profile) |
607 | |
608 def jsonrpc_connect(self): | |
609 _session = self.request.getSession() | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
610 profile = ISATSession(_session).profile |
0 | 611 if self.profiles_waiting.has_key(profile): |
612 raise jsonrpclib.Fault('1','Already waiting') #FIXME: define some standard error codes for libervia | |
613 self.profiles_waiting[profile] = self.request | |
614 self.sat_host.bridge.connect(profile) | |
615 return server.NOT_DONE_YET | |
616 | |
617 def jsonrpc_isRegistered(self): | |
618 """Tell if the user is already registered""" | |
619 _session = self.request.getSession() | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
620 profile = ISATSession(_session).profile |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
621 return bool(profile) |
0 | 622 |
623 class SignalHandler(jsonrpc.JSONRPC): | |
624 | |
625 def __init__(self, sat_host): | |
626 Resource.__init__(self) | |
627 self.register=None | |
628 self.sat_host=sat_host | |
3
154d4caa57f4
server side: proper profile management in signals generic callback
Goffi <goffi@goffi.org>
parents:
2
diff
changeset
|
629 self.signalDeferred = {} |
45
7f106052326f
server side: user is now disconnected on session end, and queue is purged
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
630 self.queue = {} |
2
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
631 |
0 | 632 def plugRegister(self, register): |
633 self.register = register | |
2
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
634 |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
635 def jsonrpc_getSignals(self): |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
636 """Keep the connection alive until a signal is received, then send it |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
637 @return: (signal, *signal_args)""" |
3
154d4caa57f4
server side: proper profile management in signals generic callback
Goffi <goffi@goffi.org>
parents:
2
diff
changeset
|
638 _session = self.request.getSession() |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
639 profile = ISATSession(_session).profile |
24 | 640 if profile in self.queue: #if we have signals to send in queue |
641 if self.queue[profile]: | |
642 return self.queue[profile].pop(0) | |
643 else: | |
644 #the queue is empty, we delete the profile from queue | |
645 del self.queue[profile] | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
646 _session.lock() #we don't want the session to expire as long as this connection is active |
156 | 647 def unlock(signal, profile): |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
648 _session.unlock() |
156 | 649 try: |
650 source_defer = self.signalDeferred[profile] | |
651 if source_defer.called and source_defer.result[0] == "disconnected": | |
652 info(u"[%s] disconnected" % (profile,)) | |
653 _session.expire() | |
654 except IndexError: | |
655 error("Deferred result should be a tuple with fonction name first") | |
656 | |
3
154d4caa57f4
server side: proper profile management in signals generic callback
Goffi <goffi@goffi.org>
parents:
2
diff
changeset
|
657 self.signalDeferred[profile] = defer.Deferred() |
156 | 658 self.request.notifyFinish().addBoth(unlock, profile) |
3
154d4caa57f4
server side: proper profile management in signals generic callback
Goffi <goffi@goffi.org>
parents:
2
diff
changeset
|
659 return self.signalDeferred[profile] |
2
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
660 |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
661 def getGenericCb(self, function_name): |
3
154d4caa57f4
server side: proper profile management in signals generic callback
Goffi <goffi@goffi.org>
parents:
2
diff
changeset
|
662 """Return a generic function which send all params to signalDeferred.callback |
154d4caa57f4
server side: proper profile management in signals generic callback
Goffi <goffi@goffi.org>
parents:
2
diff
changeset
|
663 function must have profile as last argument""" |
2
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
664 def genericCb(*args): |
3
154d4caa57f4
server side: proper profile management in signals generic callback
Goffi <goffi@goffi.org>
parents:
2
diff
changeset
|
665 profile = args[-1] |
24 | 666 if not profile in self.sat_host.prof_connected: |
667 return | |
3
154d4caa57f4
server side: proper profile management in signals generic callback
Goffi <goffi@goffi.org>
parents:
2
diff
changeset
|
668 if profile in self.signalDeferred: |
154d4caa57f4
server side: proper profile management in signals generic callback
Goffi <goffi@goffi.org>
parents:
2
diff
changeset
|
669 self.signalDeferred[profile].callback((function_name,args[:-1])) |
24 | 670 del self.signalDeferred[profile] |
2
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
671 else: |
24 | 672 if not self.queue.has_key(profile): |
673 self.queue[profile] = [] | |
674 self.queue[profile].append((function_name, args[:-1])) | |
2
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
675 return genericCb |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
676 |
0 | 677 def connected(self, profile): |
678 assert(self.register) #register must be plugged | |
679 request = self.register.getWaitingRequest(profile) | |
680 if request: | |
681 self.register._logged(profile, request) | |
682 | |
156 | 683 def disconnected(self, profile): |
684 if not profile in self.sat_host.prof_connected: | |
685 error("'disconnected' signal received for a not connected profile") | |
686 return | |
687 self.sat_host.prof_connected.remove(profile) | |
688 if profile in self.signalDeferred: | |
689 self.signalDeferred[profile].callback(("disconnected",)) | |
690 del self.signalDeferred[profile] | |
691 else: | |
692 if not self.queue.has_key(profile): | |
693 self.queue[profile] = [] | |
694 self.queue[profile].append(("disconnected",)) | |
695 | |
696 | |
0 | 697 def connectionError(self, error_type, profile): |
698 assert(self.register) #register must be plugged | |
699 request = self.register.getWaitingRequest(profile) | |
700 if request: #The user is trying to log in | |
701 if error_type == "AUTH_ERROR": | |
702 _error_t = "AUTH ERROR" | |
703 else: | |
704 _error_t = "UNKNOWN" | |
705 self.register._logginError(profile, request, _error_t) | |
706 | |
2
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
707 def render(self, request): |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
708 """ |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
709 Render method wich reject access if user is not identified |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
710 """ |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
711 _session = request.getSession() |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
712 parsed = jsonrpclib.loads(request.content.read()) |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
713 profile = ISATSession(_session).profile |
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
714 if not profile: |
2
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
715 #user is not identified, we return a jsonrpc fault |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
716 fault = jsonrpclib.Fault(0, "Not allowed") #FIXME: define some standard error codes for libervia |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
717 return jsonrpc.JSONRPC._cbRender(self, fault, request, parsed.get('id'), parsed.get('jsonrpc')) |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
718 self.request = request |
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
719 return jsonrpc.JSONRPC.render(self, request) |
0 | 720 |
127 | 721 class UploadManager(Resource): |
722 """This class manage the upload of a file | |
723 It redirect the stream to SàT core backend""" | |
724 isLeaf = True | |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
725 NAME = 'path' #name use by the FileUpload |
127 | 726 |
727 def __init__(self, sat_host): | |
728 self.sat_host=sat_host | |
729 self.upload_dir = tempfile.mkdtemp() | |
730 self.sat_host.addCleanup(shutil.rmtree, self.upload_dir) | |
731 | |
128 | 732 def getTmpDir(self): |
733 return self.upload_dir | |
734 | |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
735 def _getFileName(self, request): |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
736 """Generate unique filename for a file""" |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
737 raise NotImplementedError |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
738 |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
739 def _fileWritten(self, request, filepath): |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
740 """Called once the file is actually written on disk""" |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
741 raise NotImplementedError |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
742 |
127 | 743 def render(self, request): |
744 """ | |
745 Render method with some hacks: | |
746 - if login is requested, try to login with form data | |
747 - except login, every method is jsonrpc | |
748 - user doesn't need to be authentified for isRegistered, but must be for all other methods | |
749 """ | |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
750 #start = time.time() |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
751 filename = self._getFileName(request) |
128 | 752 filepath = os.path.join(self.upload_dir, filename) |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
753 #FIXME: the uploaded file is fully loaded in memory at form parsing time so far |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
754 # (see twisted.web.http.Request.requestReceived). A custom requestReceived should |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
755 # be written in the futur. In addition, it is not yet possible to get progression informations |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
756 # (see http://twistedmatrix.com/trac/ticket/288) |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
757 |
128 | 758 with open(filepath,'w') as f: |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
759 f.write(request.args[self.NAME][0]) |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
760 self._fileWritten(request, filepath) |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
761 #end = time.time() |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
762 #print "time spent in render: %fs" % (end - start) |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
763 return "OK" |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
764 |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
765 class UploadManagerRadioCol(UploadManager): |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
766 NAME = 'song' |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
767 |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
768 def _getFileName(self, request): |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
769 return "%s.ogg" % str(uuid.uuid4()) #XXX: chromium doesn't seem to play song without the .ogg extension, even with audio/ogg mime-type |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
770 |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
771 def _fileWritten(self, request, filepath): |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
772 """Called once the file is actually written on disk""" |
128 | 773 profile = ISATSession(request.getSession()).profile |
774 self.sat_host.bridge.radiocolSongAdded(request.args['referee'][0], filepath, profile) | |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
775 |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
776 class UploadManagerAvatar(UploadManager): |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
777 NAME = 'avatar_path' |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
778 |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
779 def _getFileName(self, request): |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
780 return str(uuid.uuid4()) |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
781 |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
782 def _fileWritten(self, request, filepath): |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
783 """Called once the file is actually written on disk""" |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
784 profile = ISATSession(request.getSession()).profile |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
785 print u"fichier écrit:", filepath |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
786 self.sat_host.bridge.setAvatar(filepath, profile) |
10 | 787 |
0 | 788 class Libervia(service.Service): |
789 | |
790 def __init__(self): | |
127 | 791 self._cleanup = [] |
59
d0fa4e96a5e4
server side: 404 error is now sent instead of directory listing when requesting a directory
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
792 root = ProtectedFile(LIBERVIA_DIR) |
0 | 793 self.signal_handler = SignalHandler(self) |
794 _register = Register(self) | |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
795 _upload_radiocol = UploadManagerRadioCol(self) |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
796 _upload_avatar = UploadManagerAvatar(self) |
0 | 797 self.signal_handler.plugRegister(_register) |
798 self.sessions = {} #key = session value = user | |
24 | 799 self.prof_connected = set() #Profiles connected |
46 | 800 self.action_handler = SATActionIDHandler() |
0 | 801 ## bridge ## |
802 try: | |
803 self.bridge=DBusBridgeFrontend() | |
804 except BridgeExceptionNoService: | |
805 print(u"Can't connect to SàT backend, are you sure it's launched ?") | |
806 sys.exit(1) | |
807 self.bridge.register("connected", self.signal_handler.connected) | |
156 | 808 self.bridge.register("disconnected", self.signal_handler.disconnected) |
0 | 809 self.bridge.register("connectionError", self.signal_handler.connectionError) |
117
2e2e10785c33
server side: refactored signal according to SàT's bridge changes + getCardCache handling + updatedValue handling
Goffi <goffi@goffi.org>
parents:
110
diff
changeset
|
810 self.bridge.register("actionResult", self.action_handler.actionResultCb) |
2e2e10785c33
server side: refactored signal according to SàT's bridge changes + getCardCache handling + updatedValue handling
Goffi <goffi@goffi.org>
parents:
110
diff
changeset
|
811 #core |
137 | 812 for signal_name in ['presenceUpdate', 'newMessage', 'subscribe', 'contactDeleted', 'newContact', 'entityDataUpdated']: |
2
669c531a857e
signals handling and first draft of microblogging
Goffi <goffi@goffi.org>
parents:
1
diff
changeset
|
813 self.bridge.register(signal_name, self.signal_handler.getGenericCb(signal_name)) |
117
2e2e10785c33
server side: refactored signal according to SàT's bridge changes + getCardCache handling + updatedValue handling
Goffi <goffi@goffi.org>
parents:
110
diff
changeset
|
814 #plugins |
2e2e10785c33
server side: refactored signal according to SàT's bridge changes + getCardCache handling + updatedValue handling
Goffi <goffi@goffi.org>
parents:
110
diff
changeset
|
815 for signal_name in ['personalEvent', 'roomJoined', 'roomUserJoined', 'roomUserLeft', 'tarotGameStarted', 'tarotGameNew', 'tarotGameChooseContrat', |
127 | 816 'tarotGameShowCards', 'tarotGameInvalidCards', 'tarotGameCardsPlayed', 'tarotGameYourTurn', 'tarotGameScore', |
214
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
817 'radiocolStarted', 'radiocolPreload', 'radiocolPlay', 'radiocolNoUpload', 'radiocolUploadOk', 'radiocolSongRejected', |
7b26be266ab1
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
204
diff
changeset
|
818 'chatStateReceived']: |
117
2e2e10785c33
server side: refactored signal according to SàT's bridge changes + getCardCache handling + updatedValue handling
Goffi <goffi@goffi.org>
parents:
110
diff
changeset
|
819 self.bridge.register(signal_name, self.signal_handler.getGenericCb(signal_name), "plugin") |
77 | 820 self.media_dir = self.bridge.getConfig('','media_dir') |
107
c3fb3292f582
browser side: CSS: changed tabs margin + fixed dragover background for chat panels
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
821 self.local_dir = self.bridge.getConfig('','local_dir') |
172
631556a64850
server side: added root redirection to libervia.html
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
822 root.putChild('', Redirect('libervia.html')) |
10 | 823 root.putChild('json_signal_api', self.signal_handler) |
824 root.putChild('json_api', MethodHandler(self)) | |
825 root.putChild('register_api', _register) | |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
826 root.putChild('upload_radiocol', _upload_radiocol) |
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
827 root.putChild('upload_avatar', _upload_avatar) |
10 | 828 root.putChild('blog', MicroBlog(self)) |
59
d0fa4e96a5e4
server side: 404 error is now sent instead of directory listing when requesting a directory
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
829 root.putChild('css', ProtectedFile("server_css/")) |
77 | 830 root.putChild(os.path.dirname(MEDIA_DIR), ProtectedFile(self.media_dir)) |
110
dfc02690deb4
browser side: CSS: header, unibox, tabs + drag'n' drop reworked
Adrien Vigneron <adrienvigneron@mailoo.org>
parents:
107
diff
changeset
|
831 root.putChild(os.path.dirname(AVATARS_DIR), ProtectedFile(os.path.join(self.local_dir, AVATARS_DIR))) |
151
a159cc29b556
server side: file upload is now more generic:
Goffi <goffi@goffi.org>
parents:
148
diff
changeset
|
832 root.putChild('radiocol', ProtectedFile(_upload_radiocol.getTmpDir(), defaultType="audio/ogg")) #We cheat for PoC because we know we are on the same host, so we use directly upload dir |
10 | 833 self.site = server.Site(root) |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
834 self.site.sessionFactory = LiberviaSession |
0 | 835 |
127 | 836 def addCleanup(self, callback, *args, **kwargs): |
837 """Add cleaning method to call when service is stopped | |
838 cleaning method will be called in reverse order of they insertion | |
839 @param callback: callable to call on service stop | |
840 @param *args: list of arguments of the callback | |
841 @param **kwargs: list of keyword arguments of the callback""" | |
842 self._cleanup.insert(0, (callback, args, kwargs)) | |
843 | |
0 | 844 def startService(self): |
845 reactor.listenTCP(8080, self.site) | |
127 | 846 |
847 def stopService(self): | |
848 print "launching cleaning methods" | |
849 for callback, args, kwargs in self._cleanup: | |
850 callback(*args, **kwargs) | |
1 | 851 |
0 | 852 def run(self): |
853 reactor.run() | |
854 | |
855 def stop(self): | |
856 reactor.stop() | |
857 | |
858 | |
44
2744dd31e8a5
server side: Session management refactoring
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
859 registerAdapter(SATSession, server.Session, ISATSession) |
0 | 860 application = service.Application('Libervia') |
861 service = Libervia() | |
862 service.setServiceParent(application) |