aboutsummaryrefslogtreecommitdiff
path: root/minetestauth.py
diff options
context:
space:
mode:
Diffstat (limited to 'minetestauth.py')
-rw-r--r--minetestauth.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/minetestauth.py b/minetestauth.py
new file mode 100644
index 0000000..eec3ba1
--- /dev/null
+++ b/minetestauth.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python3
+#
+# Primitive server to interface minetest with mediawiki
+# Functionality:
+# - responds to minetest server's requests for authentication
+# - mediawiki posts request to server on the URL /query
+# - mediawiki queries user auth status on the URL /status/$USERNAME
+#
+from http.server import BaseHTTPRequestHandler, HTTPServer
+import socketserver
+import cgi
+import json
+queue = []
+auth_status = {}
+allowed = ["127.0.0.1"]
+class S(BaseHTTPRequestHandler):
+ def check_allowed(self) :
+ if not self.client_address[0] in allowed :
+ self.send_response(403)
+ self.end_headers()
+ return False
+ return True
+ def _set_headers(self):
+
+ self.send_response(200)
+ self.send_header('Content-type', 'text/json')
+ self.send_header('Connection', 'keepalive')
+ self.end_headers()
+ return True
+
+ def do_GET(self):
+ if not self.check_allowed() :
+ return
+ self._set_headers()
+ if self.path == "/api/minetest/channel" :
+ if queue :
+ k = queue.pop()
+ self.wfile.write((' { "data" : { "name": %s, "password" : %s }, "type": "auth"} ' % (json.dumps(k[0]),json.dumps(k[1]))).encode())
+ else :
+ self.wfile.write("{}".encode())
+ elif self.path.startswith("/status/"):
+ name = self.path.split("/")[-1]
+ if not name in auth_status :
+ self.wfile.write("Unknown".encode())
+ else :
+ self.wfile.write(str(auth_status[name]).encode())
+ del auth_status[name]
+ def do_POST(self):
+ if not self.check_allowed() :
+ return
+ self._set_headers()
+ if self.path == "/query" :
+ form = cgi.FieldStorage(
+ fp=self.rfile,
+ headers=self.headers,
+ environ={'REQUEST_METHOD': 'POST'}
+ )
+ user = form.getvalue("name")
+ pwd = form.getvalue("password")
+ queue.append((user,pwd))
+ else: # User has been identified
+ js = self.rfile.read().decode()
+ k = json.loads(js)
+ auth_status[k["data"]["name"]] = k["data"]["success"]
+
+def run(port=8000):
+ server_address = ('127.0.0.1', port)
+ httpd = HTTPServer(server_address, S)
+ httpd.serve_forever()
+
+if __name__ == "__main__":
+ from sys import argv
+
+ if len(argv) == 2:
+ run(port=int(argv[1]))
+ else:
+ run()