annotate libervia.tac @ 239:b911f2b43fd4

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