1from __future__ import absolute_import, division
2
3import json
4import string
5from random import choice
6
7from twisted.application import service
8from twisted.python import log
9from twisted.words.protocols.jabber import jid
10from twisted.words.protocols.jabber.jid import JID
11
12from wokkel import muc
13from wokkel.client import XMPPClient
14from wokkel.xmppim import AvailablePresence
15
16import cowrie.core.output
17from cowrie.core.config import CowrieConfig
18
19
20class XMPPLoggerProtocol(muc.MUCClient):
21
22    def __init__(self, rooms, server, nick):
23        muc.MUCClient.__init__(self)
24        self.server = rooms.host
25        self.jrooms = rooms
26        self._roomOccupantMap = {}
27        log.msg(rooms.user)
28        log.msg(rooms.host)
29        self.nick = nick
30        self.last = {}
31        self.activity = None
32
33    def connectionInitialized(self):
34        """
35        The bot has connected to the xmpp server, now try to join the room.
36        """
37        self.join(self.jrooms, self.nick)
38
39    def joinedRoom(self, room):
40        log.msg('Joined room {}'.format(room.name))
41
42    def connectionMade(self):
43        log.msg('Connected!')
44
45        # send initial presence
46        self.send(AvailablePresence())
47
48    def connectionLost(self, reason):
49        log.msg('Disconnected!')
50
51    def onMessage(self, msg):
52        pass
53
54    def receivedGroupChat(self, room, user, body):
55        pass
56
57    def receivedHistory(self, room, user, body, dely, frm=None):
58        pass
59
60
61class Output(cowrie.core.output.Output):
62    """
63    xmpp output
64    """
65    def start(self):
66        server = CowrieConfig().get('output_xmpp', 'server')
67        user = CowrieConfig().get('output_xmpp', 'user')
68        password = CowrieConfig().get('output_xmpp', 'password')
69        muc = CowrieConfig().get('output_xmpp', 'muc')
70        resource = ''.join([choice(string.ascii_letters)
71                            for i in range(8)])
72        jid = user + '/' + resource
73        application = service.Application('honeypot')
74        self.run(application, jid, password, JID(None, [muc, server, None]), server)
75
76    def run(self, application, jidstr, password, muc, server):
77        self.xmppclient = XMPPClient(JID(jidstr), password)
78        if CowrieConfig().getboolean('output_xmpp', 'debug', fallback=False):
79            self.xmppclient.logTraffic = True
80        (user, host, resource) = jid.parse(jidstr)
81        self.muc = XMPPLoggerProtocol(
82            muc, server, user + '-' + resource)
83        self.muc.setHandlerParent(self.xmppclient)
84        self.xmppclient.setServiceParent(application)
85        self.anonymous = True
86        self.xmppclient.startService()
87
88    def write(self, logentry):
89        for i in list(logentry.keys()):
90            # Remove twisted 15 legacy keys
91            if i.startswith('log_'):
92                del logentry[i]
93            elif i == "time":
94                del logentry[i]
95        msgJson = json.dumps(logentry, indent=5)
96
97        self.muc.groupChat(self.muc.jrooms, msgJson)
98
99    def stop(self):
100        self.xmppclient.stopService()
101