diff src/server/server.py @ 589:a5019e62c3e9 frontends_multi_profiles

browser side: big refactoring to base Libervia on QuickFrontend, first draft: /!\ not finished, partially working and highly instable - add collections module with an OrderedDict like class - SatWebFrontend inherit from QuickApp - general sat_frontends tools.jid module is used - bridge/json methods have moved to json module - UniBox is partially removed (should be totally removed before merge to trunk) - Signals are now register with the generic registerSignal method (which is called mainly in QuickFrontend) - the generic getOrCreateWidget method from QuickWidgetsManager is used instead of Libervia's specific methods - all Widget are now based more or less directly on QuickWidget - with the new QuickWidgetsManager.getWidgets method, it's no more necessary to check all widgets which are instance of a particular class - ChatPanel and related moved to chat module - MicroblogPanel and related moved to blog module - global and overcomplicated send method has been disabled: each class should manage its own sending - for consistency with other frontends, former ContactPanel has been renamed to ContactList and vice versa - for the same reason, ChatPanel has been renamed to Chat - for compatibility with QuickFrontend, a fake profile is used in several places, it is set to C.PROF_KEY_NONE (real profile is managed server side for obvious security reasons) - changed default url for web panel to SàT website, and contact address to generic SàT contact address - ContactList is based on QuickContactList, UI changes are done in update method - bride call (now json module) have been greatly improved, in particular call can be done in the same way as for other frontends (bridge.method_name(arg1, arg2, ..., callback=cb, errback=eb). Blocking method must be called like async methods due to javascript architecture - in bridge calls, a callback can now exists without errback - hard reload on BridgeSignals remote error has been disabled, a better option should be implemented - use of constants where that make sens, some style improvments - avatars are temporarily disabled - lot of code disabled, will be fixed or removed before merge - various other changes, check diff for more details server side: manage remote exception on getEntityData, removed getProfileJid call, added getWaitingConf, added getRoomsSubjects
author Goffi <goffi@goffi.org>
date Sat, 24 Jan 2015 01:45:39 +0100
parents 8a607044ecfa
children be3fd3874c3a 917e271975d9
line wrap: on
line diff
--- a/src/server/server.py	Thu Oct 23 16:56:36 2014 +0200
+++ b/src/server/server.py	Sat Jan 24 01:45:39 2015 +0100
@@ -184,13 +184,6 @@
             return jsonrpc.JSONRPC._cbRender(self, fault, request, parsed.get('id'), parsed.get('jsonrpc'))  # pylint: disable=E1103
         return jsonrpc.JSONRPC.render(self, request)
 
-    def jsonrpc_getProfileJid(self):
-        """Return the jid of the profile"""
-        sat_session = ISATSession(self.session)
-        profile = sat_session.profile
-        sat_session.jid = JID(self.sat_host.bridge.getParamA("JabberID", "Connection", profile_key=profile))
-        return sat_session.jid.full()
-
     def jsonrpc_disconnect(self):
         """Disconnect the profile"""
         sat_session = ISATSession(self.session)
@@ -231,6 +224,11 @@
         profile = ISATSession(self.session).profile
         return self.sat_host.bridge.getWaitingSub(profile)
 
+    def jsonrpc_getWaitingConf(self):
+        """Return list of waiting confirmations"""
+        profile = ISATSession(self.session).profile
+        return self.sat_host.bridge.getWaitingConf(profile)
+
     def jsonrpc_setStatus(self, presence, status):
         """Change the presence and/or status
         @param presence: value from ("", "chat", "away", "dnd", "xa")
@@ -359,10 +357,10 @@
         profile = sat_session.profile
         sat_jid = sat_session.jid
         if not sat_jid:
-            log.error("No jid saved for this profile")
-            return {}
+            # we keep a session cache for jid to avoir jid spoofing
+            sat_jid = sat_session.jid = JID(self.sat_host.bridge.getParamA("JabberID", "Connection", profile_key=profile))
         if JID(from_jid).userhost() != sat_jid.userhost() and JID(to_jid).userhost() != sat_jid.userhost():
-            log.error("Trying to get history from a different jid, maybe a hack attempt ?")
+            log.error("Trying to get history from a different jid (given (browser): {}, real (backend): {}), maybe a hack attempt ?".format(from_jid, sat_jid))
             return {}
         d = self.asyncBridgeCall("getHistory", from_jid, to_jid, size, between, search, profile)
 
@@ -418,6 +416,11 @@
         profile = ISATSession(self.session).profile
         return self.sat_host.bridge.getRoomsJoined(profile)
 
+    def jsonrpc_getRoomsSubjects(self):
+        """Return list of room subjects"""
+        profile = ISATSession(self.session).profile
+        return self.sat_host.bridge.getRoomsSubjects(profile)
+
     def jsonrpc_launchTarotGame(self, other_players, room_jid=""):
         """Create a room, invite the other players and start a Tarot game
         @param room_jid: leave empty string to generate a unique room name
@@ -466,7 +469,10 @@
         @param keys: name of data we want (list)
         @return: requested data"""
         profile = ISATSession(self.session).profile
-        return self.sat_host.bridge.getEntityData(jid, keys, profile)
+        try:
+            return self.sat_host.bridge.getEntityData(jid, keys, profile)
+        except Exception as e:
+            raise Failure(jsonrpclib.Fault(C.ERRNUM_BRIDGE_ERRBACK, unicode(e)))
 
     def jsonrpc_getCard(self, jid):
         """Get VCard for entiry
@@ -761,6 +767,7 @@
             request.write(C.SESSION_ACTIVE)
             request.finish()
             return
+        # we manage profile server side to avoid profile spoofing
         sat_session.profile = profile
         self.sat_host.prof_connected.add(profile)