From 5f4af2f5ee176d881e29038b462185c319a2fd65 Mon Sep 17 00:00:00 2001 From: Anthony Wang Date: Sat, 1 Oct 2022 12:26:37 -0400 Subject: [PATCH] Implement petnames and pubkeys --- gen.py | 6 +++--- server.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/gen.py b/gen.py index a47b4f5..69c2ad4 100644 --- a/gen.py +++ b/gen.py @@ -1,4 +1,4 @@ -from base64 import b64encode +from base64 import urlsafe_b64encode from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import ed25519 @@ -10,7 +10,7 @@ private_bytes = private_key.private_bytes( encryption_algorithm=serialization.NoEncryption() ) with open('privkey', 'wb') as f: - f.write(b64encode(private_bytes)) + f.write(urlsafe_b64encode(private_bytes)) public_key = private_key.public_key() @@ -19,4 +19,4 @@ public_bytes = public_key.public_bytes( format=serialization.PublicFormat.Raw ) with open('pubkey', 'wb') as f: - f.write(b64encode(public_bytes)) + f.write(urlsafe_b64encode(public_bytes)) diff --git a/server.py b/server.py index 8be52bc..5b988eb 100644 --- a/server.py +++ b/server.py @@ -1,19 +1,65 @@ from http.server import HTTPServer, BaseHTTPRequestHandler -from inbox import Send, Fetch +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/html") + self.send_header('Content-type', 'text/plain') self.end_headers() - self.wfile.write(str(Fetch(self.path)).encode('utf-8')) + self.wfile.write(str(Fetch(user)).encode('utf-8')) def do_POST(self): - Send(self.rfile.read(int(self.headers['Content-Length'])), self.path) + 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) - self.end_headers() -server = HTTPServer(("0.0.0.0", 8000), HTTPRequestHandler) +server = HTTPServer(("0.0.0.0", int(argv[1])), HTTPRequestHandler) server.serve_forever()