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)
|