|
@@ -0,0 +1,78 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+
|
|
|
+import logging
|
|
|
+from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
|
+import configparser
|
|
|
+import slixmpp
|
|
|
+
|
|
|
+config = configparser.ConfigParser()
|
|
|
+config.read("config.ini") # <--- Read configfile in dictionary
|
|
|
+
|
|
|
+def getRcpt(token): # <--- lookup recipient for token in config
|
|
|
+ if token in config['RECIPIENT']:
|
|
|
+ rcpt = config['RECIPIENT'][token]
|
|
|
+ return rcpt
|
|
|
+ else:
|
|
|
+ return "" # <--- empty string / FALSE when no token was found
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class S(BaseHTTPRequestHandler):
|
|
|
+
|
|
|
+ def _set_response(code):
|
|
|
+ self.send_header('Content-type', 'text/plain')
|
|
|
+ self.send_response(code)
|
|
|
+ self.end_headers()
|
|
|
+
|
|
|
+ def do_POST(self):
|
|
|
+ token = self.headers['Authorization'][-64:]
|
|
|
+ if token.isalnum():
|
|
|
+ logging.info('Valid token received.')
|
|
|
+ content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
|
|
|
+ post_data = self.rfile.read(content_length) # <--- Gets the data itself
|
|
|
+ msg = post_data.decode('utf-8')
|
|
|
+ rcpt = getRcpt(token) # <--- lookup recipient for token in config
|
|
|
+ if rcpt:
|
|
|
+ sendMsg(rcpt, msg)
|
|
|
+ self._set_response(202) # <--- HTTP Accepted, message sent + posibly received
|
|
|
+ else:
|
|
|
+ self._set_response(401) # <--- HTTP Unauthorized, no token found
|
|
|
+ else:
|
|
|
+ self._set_response(400) # <--- HTTP Bad Request, token contains special characters
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class SendMsgBot(slixmpp.ClientXMPP):
|
|
|
+ def __init__(self, jid, password, recipient, message):
|
|
|
+ slixmpp.ClientXMPP.__init__(self, jid, password)
|
|
|
+ self.recipient = recipient
|
|
|
+ self.msg = message
|
|
|
+ # Event session_start event is triggered when connection is ready
|
|
|
+ self.add_event_handler("session_start", self.start)
|
|
|
+
|
|
|
+ async def start(self, event):
|
|
|
+ self.send_message(mto=self.recipient, mbody=self.msg, mtype='chat')
|
|
|
+ self.disconnect()
|
|
|
+
|
|
|
+
|
|
|
+def sendMsg(rcpt, msg):
|
|
|
+ jid = config['ACCOUNT']['jid']
|
|
|
+ password = config['ACCOUNT']['password']
|
|
|
+ logging.info('Sending message.')
|
|
|
+ xmpp = SendMsgBot(jid, password, rcpt, msg)
|
|
|
+ xmpp.connect()
|
|
|
+ xmpp.process(forever=False)
|
|
|
+ del xmpp
|
|
|
+
|
|
|
+
|
|
|
+def run(server_class=HTTPServer, handler_class=S, port=8080):
|
|
|
+ server_address = ('', port)
|
|
|
+ httpd = server_class(server_address, handler_class)
|
|
|
+ logging.info('Starting server...')
|
|
|
+ try:
|
|
|
+ httpd.serve_forever()
|
|
|
+ except KeyboardInterrupt:
|
|
|
+ pass
|
|
|
+ httpd.server_close()
|
|
|
+
|
|
|
+run()
|