def __call__(self, *args, **kwargs): if len(kwargs) > 0 and len(args) > 0: raise JSONRPCException("JSON-RPC does not support positional and keyword arguments at the same time") if len(kwargs): postdata = dumps({"method": self.__serviceName, 'params': kwargs, 'id': 'jsonrpc'}) else: postdata = dumps({"method": self.__serviceName, 'params': args, 'id': 'jsonrpc'}) respdata = self.__opener.open(self.__serviceURL, postdata).read() resp = loads(respdata) if resp['error'] != None: raise JSONRPCException(resp['error']) else: # Look for json class hint if "result" in resp and \ isinstance(resp["result"], DictType) and \ "__jsonclass__" in resp["result"] and \ resp["result"]["__jsonclass__"][0] == "json.ObjectFactory": resp = resp["result"] jc = resp["__jsonclass__"][1] del resp["__jsonclass__"] # Extract property presets data = {} for prop in resp: data[prop] = resp[prop] jc.insert(0, JSONServiceProxy(self.__serviceURL, None, self.__opener)) jc.append(data) return ObjectFactory.get_instance(*jc) return resp['result']
def __call__(self, *args, **kwargs): if len(kwargs) > 0 and len(args) > 0: raise JSONRPCException("JSON-RPC does not support positional and keyword arguments at the same time") # Default to 'core' queue, pylint: disable=W0612 queue = "core" if AMQPServiceProxy.methods[self.__serviceAddress]: if not self.__serviceName in AMQPServiceProxy.methods[self.__serviceAddress]: raise NameError("name '%s' not defined" % self.__serviceName) if AMQPServiceProxy.domain: queue = AMQPServiceProxy.methods[self.__serviceAddress][self.__serviceName]['target'] else: queue = self.__serviceAddress # Find free session for requested queue for sess, dsc in AMQPServiceProxy.worker[self.__serviceAddress].iteritems(): if not dsc['locked']: self.__ssn = dsc['ssn'] self.__sender = dsc['sender'] self.__receiver = dsc['receiver'] self.__worker = sess dsc['locked'] = True break # No free session? if not self.__ssn: raise AMQPException('no free session - increase workers') # Send if len(kwargs): postdata = dumps({"method": self.__serviceName, 'params': kwargs, 'id': 'jsonrpc'}) else: postdata = dumps({"method": self.__serviceName, 'params': args, 'id': 'jsonrpc'}) message = Message(postdata) message.user_id = self.__URL['user'] message.reply_to = 'reply-%s' % self.__ssn.name self.__sender.send(message) # Get response respdata = self.__receiver.fetch() resp = loads(respdata.content) self.__ssn.acknowledge(respdata) if resp['error'] != None: AMQPServiceProxy.worker[self.__serviceAddress][self.__worker]['locked'] = False raise JSONRPCException(resp['error']) else: # Look for json class hint if "result" in resp and \ isinstance(resp["result"], DictType) and \ "__jsonclass__" in resp["result"] and \ resp["result"]["__jsonclass__"][0] == "json.ObjectFactory": resp = resp["result"] jc = resp["__jsonclass__"][1] del resp["__jsonclass__"] # Extract property presets data = {} for prop in resp: data[prop] = resp[prop] jc.insert(0, AMQPServiceProxy(self.__serviceURL, self.__serviceAddress, None, self.__conn, workers=self.__workers)) jc.append(data) AMQPServiceProxy.worker[self.__serviceAddress][self.__worker]['locked'] = False return ObjectFactory.get_instance(*jc) AMQPServiceProxy.worker[self.__serviceAddress][self.__worker]['locked'] = False return resp['result']
self.__session[sid] = user environ["REMOTE_USER"] = user environ["REMOTE_SESSION"] = sid result = True self.log.info("login succeeded for user '%s'" % user) else: # Remove current sid if present if "REMOTE_SESSION" in environ and sid in self.__session: del self.__session[sid] result = False self.log.error("login failed for user '%s'" % user) raise exc.HTTPUnauthorized("Login failed", allow="POST").exception return Response( content_type="application/json", charset="utf8", body=dumps(dict(result=result, error=None, id=jid)) ) # Don't let calls pass beyond this point if we've no valid session ID if not environ.get("REMOTE_SESSION") in self.__session: self.log.error("blocked unauthenticated call of method '%s'" % method) raise exc.HTTPUnauthorized("Please use the login method to authorize yourself.", allow="POST").exception # Remove remote session on logout if method == "logout": # Remove current sid if present if "REMOTE_SESSION" in environ and environ.get("REMOTE_SESSION") in self.__session: del self.__session[environ.get("REMOTE_SESSION")] # Show logout message