blob: eec3ba1d6a7953a0c01cd61e4768c1a5aa4ef9b6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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()
|