diff options
Diffstat (limited to 'module/remote/wsbackend/ApiHandler.py')
| -rw-r--r-- | module/remote/wsbackend/ApiHandler.py | 109 | 
1 files changed, 109 insertions, 0 deletions
| diff --git a/module/remote/wsbackend/ApiHandler.py b/module/remote/wsbackend/ApiHandler.py new file mode 100644 index 000000000..8f6bb3a0a --- /dev/null +++ b/module/remote/wsbackend/ApiHandler.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +############################################################################### +#   Copyright(c) 2008-2012 pyLoad Team +#   http://www.pyload.org +# +#   This file is part of pyLoad. +#   pyLoad is free software: you can redistribute it and/or modify +#   it under the terms of the GNU Affero General Public License as +#   published by the Free Software Foundation, either version 3 of the +#   License, or (at your option) any later version. +# +#   Subjected to the terms and conditions in LICENSE +# +#   @author: RaNaN +############################################################################### + +from mod_pywebsocket.util import get_class_logger +from mod_pywebsocket.msgutil import receive_message, send_message +from module.remote.json_converter import loads, dumps + +class ApiHandler: +    """Provides access to the API. + +    Send your request as json encoded string in the following manner: +    ["function", [*args]] or ["function", {**kwargs}] + +    the result will be: + +    [code, result] + +    Don't forget to login first. +    Non json request will be ignored. +    """ + +    def __init__(self, api): +        self.log = get_class_logger() +        self.api = api + +    def do_extra_handshake(self, req): +        self.log.debug("WS Connected: %s" % req) + +    def transfer_data(self, req): + +        while True: +            try: +                line = receive_message(req) +                self.handle_message(line, req) +            except TypeError, e: # connection closed +                print e +                return + +    def passive_closing_handshake(self, req): +        self.log.debug("WS Closed: %s" % req) + +    def handle_message(self, msg, req): +        try: +            o = loads(msg) +        except ValueError, e: #invalid json object +            self.log.debug("Invalid Request: %s" % e) +            return + +        if type(o) != list and len(o) > 2: +            self.log.debug("Invalid Api call: %s" % o) +            return self.send_result(req, 500, "Invalid Api call") +        if len(o) == 1: # arguments ommited +            o.append([]) + +        func, args = o +        if type(args) == list: +            kwargs = {} +        else: +            args, kwargs = [], args + +        if func == 'login': +            user =  self.api.checkAuth(*args, **kwargs) +            if user: +                req.api = self.api.withUserContext(user.uid) +                return self.send_result(req, 200, True) + +            else: +                return self.send_result(req, 403, "Forbidden") + +        elif func == 'logout': +            req.api = None +            return self.send_result(req, 200, True) + +        else: +            if not req.api: +                return self.send_result(req, 403, "Forbidden") + +            if not self.api.isAuthorized(func, req.api.user): +                return self.send_result(req, 401, "Unauthorized") + +            try: +                result = getattr(req.api, func)(*args, **kwargs) +            except AttributeError: +                return self.send_result(req, 404, "Not Found") +            except Exception, e: +                return self.send_result(req, 500, str(e)) + +            if result is None: result = True + +            return self.send_result(req, 200, result) + + +    def send_result(self, req, code, result): +        return send_message(req, dumps([code, result]))
\ No newline at end of file | 
