diff options
author | Ruben Pollan <meskio@sindominio.net> | 2016-08-04 19:04:09 +0200 |
---|---|---|
committer | Kali Kaneko (leap communications) <kali@leap.se> | 2016-09-01 01:41:16 -0400 |
commit | 50a258d45e851a865801da9d888037b5869a3489 (patch) | |
tree | 39a797a6ffa7b0d90037ce0497621c96e90dcb2f /src/leap/bitmask/core/dispatcher.py | |
parent | 720ac7cab46f57971c71d2d2aec8235a47a53582 (diff) |
[feat] add web/js core API
Implements http REST API for the core and bitmask.js generic library to
use this API. For events it uses long polling.
- Resolves: #8265
Diffstat (limited to 'src/leap/bitmask/core/dispatcher.py')
-rw-r--r-- | src/leap/bitmask/core/dispatcher.py | 67 |
1 files changed, 59 insertions, 8 deletions
diff --git a/src/leap/bitmask/core/dispatcher.py b/src/leap/bitmask/core/dispatcher.py index e81cad6..0ea4e47 100644 --- a/src/leap/bitmask/core/dispatcher.py +++ b/src/leap/bitmask/core/dispatcher.py @@ -19,9 +19,18 @@ Command dispatcher. """ import json +try: + from Queue import Queue +except ImportError: + from queue import Queue + from twisted.internet import defer from twisted.python import failure, log +from leap.common.events import register_async as register +from leap.common.events import unregister_async as unregister +from leap.common.events import catalog + from .api import APICommand, register_method @@ -45,25 +54,21 @@ class UserCmd(SubCommand): @register_method("{'srp_token': unicode, 'uuid': unicode}") def do_AUTHENTICATE(self, bonafide, *parts): user, password = parts[2], parts[3] - d = defer.maybeDeferred(bonafide.do_authenticate, user, password) - return d + return bonafide.do_authenticate(user, password) @register_method("{'signup': 'ok', 'user': str}") def do_SIGNUP(self, bonafide, *parts): user, password = parts[2], parts[3] - d = defer.maybeDeferred(bonafide.do_signup, user, password) - return d + return bonafide.do_signup(user, password) @register_method("{'logout': 'ok'}") def do_LOGOUT(self, bonafide, *parts): user = parts[2] - d = defer.maybeDeferred(bonafide.do_logout, user) - return d + bonafide.do_logout(user) @register_method('str') def do_ACTIVE(self, bonafide, *parts): - d = defer.maybeDeferred(bonafide.do_get_active_user) - return d + return bonafide.do_get_active_user() class EIPCmd(SubCommand): @@ -209,6 +214,45 @@ class KeysCmd(SubCommand): return d +class EventsCmd(SubCommand): + + label = 'events' + + def __init__(self): + self.queue = Queue() + self.waiting = [] + + @register_method("") + def do_REGISTER(self, _, *parts, **kw): + event = getattr(catalog, parts[2]) + register(event, self._callback) + + @register_method("") + def do_UNREGISTER(self, _, *parts, **kw): + event = getattr(catalog, parts[2]) + unregister(event) + + @register_method("(str, [])") + def do_POLL(self, _, *parts, **kw): + if not self.queue.empty(): + return self.queue.get() + + d = defer.Deferred() + self.waiting.append(d) + return d + + @register_method("") + def _callback(self, event, *content): + payload = (str(event), content) + if not self.waiting: + self.queue.put(payload) + return + + while self.waiting: + d = self.waiting.pop() + d.callback(payload) + + class CommandDispatcher(object): __metaclass__ = APICommand @@ -222,6 +266,7 @@ class CommandDispatcher(object): self.subcommand_eip = EIPCmd() self.subcommand_mail = MailCmd() self.subcommand_keys = KeysCmd() + self.subcommand_events = EventsCmd() # XXX -------------------------------------------- # TODO move general services to another subclass @@ -302,6 +347,12 @@ class CommandDispatcher(object): d.addCallbacks(_format_result, _format_error) return d + def do_EVENTS(self, *parts): + dispatch = self.subcommand_events.dispatch + d = dispatch(None, *parts) + d.addCallbacks(_format_result, _format_error) + return d + def dispatch(self, msg): cmd = msg[0] |