HackMIT/server.py
2022-10-02 19:35:23 -04:00

98 lines
3.1 KiB
Python

from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
from sys import argv
from time import sleep
from urllib import parse
from requests import get, post
from inbox import Send, Fetch, inbox
petname_to_pubkey = {}
pubkey_to_server = {}
Q = ''
done = ''
class HTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
global Q, done
p = parse.parse_qs(parse.urlsplit(self.path).query)
func = parse.urlsplit(self.path).path[1:]
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
print(p)
if func == "tunnel":
if "pubkey" in p:
Q = p["path"][0]
while done == '':
sleep(0.01)
self.wfile.write(done)
done = ''
elif "petname" in p:
petname = petname_to_pubkey[p['user'][0]][p["petname"][0]]
print(f"http://{pubkey_to_server[petname]}/tunnel?pubkey={petname}&path={p['path'][0]}")
res = get(f"http://{pubkey_to_server[petname]}/tunnel?pubkey={petname}&path={p['path'][0]}").text
self.wfile.write(res)
elif func == "getinbox":
user = p['user'][0]
self.wfile.write(str(Fetch(user)).encode('utf-8'))
elif func == "queue":
while Q == '':
sleep(0.01)
self.wfile.write(Q.encode('utf-8'))
Q = ''
def do_POST(self):
global done
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] = {}
elif func == 'done':
done = data
else:
print('Not implemented')
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
server = ThreadingHTTPServer(("0.0.0.0", int(argv[1])), HTTPRequestHandler)
server.serve_forever()