ig-pixelfed-mirror/server.py

92 lines
2.9 KiB
Python

from http.server import BaseHTTPRequestHandler, HTTPServer
import igmirror
import sys
import os
import re
class MyServer(BaseHTTPRequestHandler):
def do_GET(self):
path = self.path.strip('/')
parts = path.split('/')
if len(parts) == 1:
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
# list accounts (plain text)
if parts[0] == 'list':
accounts = os.listdir('./db/accounts')
for acc in sorted(set(accounts)):
self.wfile.write(bytes(acc+'\n', "utf-8"))
# lists accounts on a pretty HTML + CSS
# making sure there is no XSS possible on account names
elif parts[0] == 'mirrors':
self.wfile.write(bytes('HTML', "utf-8"))
return
if len(parts) == 2:
self.send_response(200)
self.send_header("Content-type", "application/json")
self.end_headers()
# a wilcard select all accounts
what = parts[0]
action = parts[1].lower()
if what == '*':
if False:
pass
elif action == 'update':
igmirror.update_allaccounts_async()
elif action == 'login':
igmirror.pixelfed_loginall_async()
elif action == 'logout':
igmirror.pixelfed_logoutall_async()
else:
# make sure account name contains only safe characters
# i think IG usernames can only have this characters:
accname = re.sub(r'[^a-zA-Z0-9_\.]+', '', what)
if False:
pass
elif action == 'add':
igmirror.add_igaccount(accname)
elif action == 'update':
igmirror.update_igaccount_async(accname)
elif action == 'login':
igmirror.pixelfed_login(accname, True)
elif action == 'logout':
igmirror.pixelfed_logout(accname)
elif action == 'nuke':
igmirror.delete_statuses(accname)
self.wfile.write(bytes('{"status": "ok"}', "utf-8"))
return
self.send_response(400)
self.send_header("Content-type", "application/json")
self.end_headers()
self.wfile.write(bytes('{"status": "parameters are not correct"}', "utf-8"))
if __name__ == "__main__":
addr = '0.0.0.0'
port = 8080
if len(sys.argv) > 1:
addr = sys.argv[1]
if len(sys.argv) > 2:
port = sys.argv[2]
webServer = HTTPServer((addr, port), MyServer)
print("Server started http://%s:%s" % (addr, port))
try:
webServer.serve_forever()
except KeyboardInterrupt:
pass
webServer.server_close()
print("Server stopped.")