98 lines
3.1 KiB
Python
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.encode('utf-8'))
|
|
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()
|