HackMIT/server.py

66 lines
2.1 KiB
Python

from http.server import HTTPServer, BaseHTTPRequestHandler
from sys import argv
from urllib import parse
from requests import post
from inbox import Send, Fetch, inbox
petname_to_pubkey = {}
pubkey_to_server = {}
class HTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
'''Fetch the user inbox'''
user = parse.parse_qs(parse.urlsplit(self.path).query)['user'][0]
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(str(Fetch(user)).encode('utf-8'))
def do_POST(self):
data = self.rfile.read(int(self.headers['Content-Length']))
func = parse.urlsplit(self.path).path[1:]
p = parse.parse_qs(parse.urlsplit(self.path).query)
user = p['user'][0]
if func == 'send':
# Send to inbox
recipient = p['recipient'][0]
# If recipient is petname, convert to pubkey
if user in petname_to_pubkey and recipient in petname_to_pubkey[user]:
recipient_pubkey = petname_to_pubkey[user][recipient]
else:
recipient_pubkey = recipient
# Send it
if recipient_pubkey in inbox:
Send(data, recipient_pubkey)
else:
server = pubkey_to_server[recipient_pubkey]
path = self.path.replace(recipient, recipient_pubkey)
post('http://'+server+path, data=data).text
elif func == 'name':
# Update petname
pubkey = p['pubkey'][0]
petname = p['petname'][0]
server = p['server'][0]
petname_to_pubkey[user][petname] = pubkey
pubkey_to_server[pubkey] = server
elif func == 'register':
# Register new user
inbox[user] = []
petname_to_pubkey[user] = {}
else:
print('Not implemented')
self.send_response(200)
server = HTTPServer(("0.0.0.0", int(argv[1])), HTTPRequestHandler)
server.serve_forever()