summaryrefslogtreecommitdiff
path: root/src/leap/bonafide/zmq_service.py
blob: df8e2344dbfb89b0d3ead4cae1cecff57393e647 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# -*- coding: utf-8 -*-
# zmq_service.py
# Copyright (C) 2015 LEAP
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""
Bonafide ZMQ Service.
"""
from leap.bonafide import config
from leap.bonafide.protocol import BonafideProtocol, COMMANDS

from txzmq import ZmqEndpoint, ZmqFactory, ZmqREPConnection

from twisted.application import service
from twisted.internet import reactor
from twisted.python import log


class BonafideZMQService(service.Service):

    def __init__(self):
        self._bonafide = BonafideProtocol()
        self._conn = None

    def startService(self):
        zf = ZmqFactory()
        e = ZmqEndpoint("bind", config.ENDPOINT)
        self._conn = _BonafideZmqREPConnection(zf, e, self._bonafide)
        reactor.callWhenRunning(self._conn.do_greet)


class _BonafideZmqREPConnection(ZmqREPConnection):

    def __init__(self, zf, e, bonafide):
        ZmqREPConnection.__init__(self, zf, e)
        self._bonafide = bonafide

    def do_greet(self):
        print "Bonafide service running..."

    def do_bye(self):
        print "[+] Bonafide service stopped. Have a nice day."
        reactor.stop()

    def gotMessage(self, msgId, *parts):
        def defer_reply(response):
            reactor.callLater(0, self.reply, msgId, str(response))

        def log_err(failure):
            log.err(failure)
            print "FAILURE", failure
            defer_reply("ERROR: %r" % failure)

        cmd = parts[0]

        if cmd == "shutdown":
            defer_reply('ok, shutting down')
            reactor.callLater(1, self.do_bye)

        if cmd not in COMMANDS:
            response = 'INVALID COMMAND'
            defer_reply(response)

        elif cmd == 'signup':
            username, password = parts[1], parts[2]
            d = self._bonafide.do_signup(username, password)
            d.addCallback(lambda response: defer_reply(
                'REGISTERED -> %s' % response))
            d.addErrback(log_err)

        elif cmd == 'authenticate':
            username, password = parts[1], parts[2]
            d = self._bonafide.do_authenticate(username, password)
            d.addCallback(lambda response: defer_reply(
                'TOKEN -> %s' % response))
            d.addErrback(log_err)

        elif cmd == 'logout':
            username, password = parts[1], parts[2]
            d = self._bonafide.do_logout(username, password)
            d.addCallback(lambda response: defer_reply(
                'LOGOUT -> ok'))
            d.addErrback(log_err)

        elif cmd == 'stats':
            response = self._bonafide.do_stats()
            defer_reply(response)