This repository has been archived by the owner on Oct 3, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserve.py
128 lines (106 loc) · 4.03 KB
/
serve.py
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse
from urllib.parse import parse_qs
from data import ActiveServer
from datetime import datetime
from io import BytesIO
import signal
import json
import sys
import gzip
# leave keys empty to allow everyone to use that feature
# good practice to set announce key to something
PING_KEY = "" # no announce permissions but can ping
ANNOUNCE_KEY = "" # has ping permissions
active_servers = {}
class Serve(BaseHTTPRequestHandler):
def do_GET(self):
parsed_url = urlparse(self.path)
if self.path == '/Setting/QuietGet/ClientAppSettings' or self.path == '/Setting/QuietGet/ClientSharedSettings' or self.path == '/Setting/QuietGet/RCCService' or self.path == '/Setting/QuietGet/RccThumbnailers':
self.send_response(200)
self.end_headers()
with open('flags.json') as f:
self.wfile.write(bytes(json.dumps(json.load(f)), "utf-8"))
return
if self.path[0:7] == '/asset/' or self.path[0:7] == '/Asset/' or self.path[0:9] == '/v1/asset':
captured_value = parse_qs(parsed_url.query)['id'][0]
self.send_response(301)
self.send_header('Location', 'https://assetdelivery.roblox.com/v1/asset/?id=' + captured_value)
self.end_headers()
return
if self.path == '/ping':
canSeeServers = True
canHostServers = True
if "Authorization" not in self.headers:
if PING_KEY != "":
canSeeServers = False
if ANNOUNCE_KEY != "":
canHostServers = False
else:
print(PING_KEY, self.headers["Authorization"])
if PING_KEY != self.headers["Authorization"]:
canSeeServers = False
if ANNOUNCE_KEY != self.headers["Authorization"]:
canHostServers = False
obj = { "ActiveServers": [], "MasterMotd": "This is the official Aya Governor instance.", "SpecialMotd": "", "Authentication": { "CanHostServers": canHostServers, "CanReadMasterServer": canSeeServers } }
if canSeeServers:
for server in list(active_servers.keys()):
_obj = active_servers[server]
if _obj.ttl < datetime.now().timestamp():
del active_servers[server]
else:
t = json.loads(_obj.toJson())
obj["ActiveServers"].append(t)
self.send_response(200)
self.end_headers()
self.wfile.write(bytes(json.dumps(obj), "utf-8"))
return
elif self.path == '/':
self.send_response(200)
self.end_headers()
self.wfile.write(bytes(json.dumps({ "Response": "ok" }), "utf-8"))
return
else:
self.send_response(404)
self.end_headers()
return
def do_POST(self):
if self.path == '/announce':
content_length = int(self.headers['Content-Length'])
content_encoding = self.headers.get('Content-Encoding', '')
data = self.rfile.read(content_length)
if content_encoding == 'gzip':
try:
data = gzip.decompress(data)
except Exception as e:
self.send_response(400, "Bad Request - Failed to decompress gzip")
self.end_headers()
self.wfile.write(bytes("Failed to decompress gzip data", "utf-8"))
return
print(data);
aserv = ActiveServer()
ok = aserv.fromJson(data)
if ok:
if aserv.authorization != ANNOUNCE_KEY:
pass
aserv.machine_address = self.client_address[0]
active_servers[self.client_address[0]] = aserv
self.send_response(200)
self.end_headers()
else:
self.send_response(403, "Server suppressed")
self.end_headers()
self.wfile.write(bytes("OK", "utf-8"))
return
else:
self.send_response(400, "Bad Request")
self.end_headers()
return
def signal_handler(sig, frame):
print("\ngracefully shutting down the server...")
sys.exit(0)
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal_handler)
print("starting master server on port", 7767)
httpd = HTTPServer(('localhost', 7767), Serve)
httpd.serve_forever()