diff options
author | 2013-03-11 19:49:20 +0100 | |
---|---|---|
committer | 2013-03-11 19:50:54 +0100 | |
commit | 763b142db70ce77952cb46cfccf84d9800f15651 (patch) | |
tree | d2636e48766d365bd8a9d079de603b127ab88744 /module/remote/wsbackend/AbstractHandler.py | |
parent | Merge pull request #33 from stickell/patch-3 (diff) | |
download | pyload-763b142db70ce77952cb46cfccf84d9800f15651.tar.xz |
websocket login via session, websocket pushes server status, webui renders server status
Diffstat (limited to 'module/remote/wsbackend/AbstractHandler.py')
-rw-r--r-- | module/remote/wsbackend/AbstractHandler.py | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/module/remote/wsbackend/AbstractHandler.py b/module/remote/wsbackend/AbstractHandler.py index f843fc278..45fbb134c 100644 --- a/module/remote/wsbackend/AbstractHandler.py +++ b/module/remote/wsbackend/AbstractHandler.py @@ -41,11 +41,38 @@ class AbstractHandler: def do_extra_handshake(self, req): self.log.debug("WS Connected: %s" % req) + req.api = None #when api is set client is logged in + + # allow login via session when webinterface is active + if self.core.config['webinterface']['activated']: + cookie = req.headers_in.getheader('Cookie') + s = self.load_session(cookie) + if s: + uid = s.get('uid', None) + req.api = self.api.withUserContext(uid) + self.log.debug("WS authenticated with cookie: %d" % uid) + self.on_open(req) def on_open(self, req): pass + def load_session(self, cookies): + from Cookie import SimpleCookie + from beaker.session import Session + from module.web.webinterface import session + + cookies = SimpleCookie(cookies) + sid = cookies.get(session.options['key']) + if not sid: + return None + + s = Session({}, use_cookies=False, id=sid.value, **session.options) + if s.is_new: + return None + + return s + def passive_closing_handshake(self, req): self.log.debug("WS Closed: %s" % req) self.on_close(req) @@ -59,8 +86,6 @@ class AbstractHandler: def handle_call(self, msg, req): """ Parses the msg for an argument call. If func is null an response was already sent. - :param msg: - :param req: :return: func, args, kwargs """ try: @@ -70,11 +95,15 @@ class AbstractHandler: self.send_result(req, self.ERROR, "No JSON request") return None, None, None - if type(o) != list and len(o) not in range(1,4): + if not isinstance(o, basestring) and type(o) != list and len(o) not in range(1, 4): self.log.debug("Invalid Api call: %s" % o) self.send_result(req, self.ERROR, "Invalid Api call") return None, None, None - if len(o) == 1: # arguments omitted + + # called only with name, no args + if isinstance(o, basestring): + return o, [], {} + elif len(o) == 1: # arguments omitted return o[0], [], {} elif len(o) == 2: func, args = o @@ -85,5 +114,20 @@ class AbstractHandler: else: return tuple(o) + def do_login(self, req, args, kwargs): + user = self.api.checkAuth(*args, **kwargs) + if user: + req.api = self.api.withUserContext(user.uid) + return self.send_result(req, self.OK, True) + else: + return self.send_result(req, self.FORBIDDEN, "Forbidden") + + def do_logout(self, req): + req.api = None + return self.send_result(req, self.OK, True) + def send_result(self, req, code, result): - return send_message(req, dumps([code, result]))
\ No newline at end of file + return send_message(req, dumps([code, result])) + + def send(self, req, obj): + return send_message(req, dumps(obj))
\ No newline at end of file |