66 lines
2.1 KiB
Python
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()
|