Exemplo n.º 1
0
    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']
Exemplo n.º 2
0
    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']
Exemplo n.º 3
0
                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