aboutsummaryrefslogtreecommitdiff
path: root/minetestauth.py
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()