Exemplo n.º 1
0
 def __call__(self, request, **kw):
     try:
         return super().__call__(request, **kw)
     except PermissionDenied:
         raise rpc.InvalidRequest('permission denied') from None
     except Http401:
         raise rpc.InvalidRequest('authentication required') from None
Exemplo n.º 2
0
    def ws_model_create(self, wsrequest):
        """Create a new model

        From the client::

            client.rpc('model_create', {'field1': 'foo', ...})

        :param request:
        :return: object with metadata information
        """
        model = get_model(wsrequest)
        request = wsrequest.wsgi_request
        form_class = get_form_class(request, model.form)
        if not form_class:
            raise rpc.InvalidRequest('cannot create model %s' % model.name)

        fields = wsrequest.check_permission(model.name, 'create',
                                            model.fields())
        # fields = model.column_fields(fields, 'name')
        instance = model.instance(fields=fields)

        form = form_class(request, data=wsrequest.params)
        if form.is_valid():
            with model.session(request) as session:
                instance = model.create_model(request,
                                              instance,
                                              form.cleaned_data,
                                              session=session)
                return model.tojson(request, instance)
        else:
            raise rpc.InvalidParams(data=form.tojson())
Exemplo n.º 3
0
    def __init__(self, rpc, request_id, params):
        """
        Initialises the responder

        :param id:      RPC request ID
        :param params:  RPC parameters
        """
        self.rpc = rpc
        self.id = request_id
        self.params = params if params is not None else {}
        if not isinstance(self.params, dict):
            raise rpc.InvalidRequest('params entry must be a dictionary')
Exemplo n.º 4
0
 async def __call__(self, data):
     request_id = data.get('id')
     try:
         if 'method' in data:
             if not request_id:
                 raise rpc.InvalidRequest('Request ID not available')
             method = data['method']
             handler = self.methods.get(method)
             if not handler:
                 raise rpc.NoSuchFunction(method)
             #
             request = RpcWsMethodRequest(self, request_id,
                                          data.get('params'))
             result = await maybe_green(self.ws.app, handler, request)
             self.write(request_id, result)
         else:
             raise rpc.InvalidRequest('Method not available')
     except rpc.InvalidRequest as exc:
         self.write_error(request_id, exc)
     except Exception as exc:
         self.ws.logger.exception('While loading websocket message')
         self.write_error(request_id, exc)
Exemplo n.º 5
0
 def ws_authenticate(self, wsrequest):
     """Websocket RPC method for authenticating a user
     """
     if wsrequest.cache.user_info:
         raise rpc.InvalidRequest('Already authenticated')
     token = wsrequest.required_param("authToken")
     model = wsrequest.app.models.get('user')
     if not model:
         raise rpc.InternalError('user model missing')
     wsgi = wsrequest.ws.wsgi_request
     backend = wsgi.cache.auth_backend
     auth = 'bearer %s' % token
     try:
         backend.authorize(wsgi, auth)
     except BadRequest:
         raise rpc.InvalidParams('bad authToken') from None
     args = {model.id_field: getattr(wsgi.cache.user, model.id_field)}
     user = model.get_instance(wsgi, **args)
     user_info = model.tojson(wsgi, user)
     wsrequest.cache.user_info = user_info
     return user_info