· 4 years ago · Jul 09, 2021, 05:12 PM
1# database
2
3import json
4import random
5import sqlite3
6from hashlib import sha256
7
8
9class Database:
10 def __init__(self):
11 self.con = sqlite3.connect("database.db", check_same_thread=False)
12 self.c = self.con.cursor()
13 self.all = list("qwertzuiopasdfghjklyxcvbnm0123456789")
14
15 def check_existance(self, name):
16 self.c.execute("SELECT name FROM accounts WHERE name=:name", {"name": name})
17 if len(self.c.fetchall()) == 0:
18 return False
19 return True
20
21 def check_secret(self, secret):
22 self.c.execute("SELECT name FROM accounts WHERE secret_key=:secret_key", {"secret_key": secret})
23 if len(self.c.fetchall()) != 0:
24 return True
25 return False
26
27 def create_account(self, name, password):
28 if len(password) != 64:
29 password = self._sha256_dig(password)
30 exst = self.check_existance(name)
31 if exst:
32 return {"code": "User already exists"}
33 self.c.execute("INSERT INTO accounts VALUES (:name, :password, :secret_key, null)", {"name": name, "password": password, "secret_key": self.create_secret()})
34 self.con.commit()
35 return {"code": "Account was created successfully"}
36
37 def add_server_info(self, info, secret):
38 self.c.execute("UPDATE accounts SET server_info=:server_info WHERE secret_key=:secret_key", {"server_info": str(info), "secret_key": secret})
39 self.con.commit()
40 return {"code": "Info was set"}
41
42 def remove_server_info(self, secret):
43 try:
44 self.c.execute("UPDATE accounts SET server_info=null WHERE secret_key=:secret_key", {"secret_key": secret})
45 self.con.commit()
46 return {"code": "Info was removed"}
47 except:
48 return {"code": "ERROR"}
49
50 def _sha256_dig(self, password):
51 return sha256(password.encode()).hexdigest()
52
53 def create_secret(self):
54 secret = ""
55 for i in range(64):
56 secret += str(random.choice(self.all))
57 return secret
58
59
60# api
61import threading
62import time
63
64import requests
65from flask import Flask, request
66
67from database import Database
68
69db = Database()
70app = Flask(__name__)
71
72checks = []
73ALIVE = False
74
75
76@app.route("/add_server", methods=["POST"])
77def add_server():
78 try:
79 content = request.get_json(silent=True)
80 if {"secret": content["secret"], "continent": content["continent"], "ip": content["ip"]} not in checks:
81 ret = db.add_server_info(content, content["secret"])
82 if ret["code"] == "Info was set":
83 checks.append({"secret": content["secret"], "continent": content["continent"], "ip": content["ip"]})
84 return "OK"
85 except:
86 return "ERROR"
87#fcpw2lxwoivg27m1qhkpc083ty7p4ktgk2kfepfmanlieob49vwdtb3gtxk0p6by
88
89@app.route("/check_secret", methods=["POST"])
90def check_secret():
91 try:
92 content = request.get_json(silent=True)
93 ret = db.check_secret(content["secret"])
94 if ret:
95 return "OK"
96 else:
97 return "INVALID"
98 except:
99 return "ERROR"
100
101
102def loop():
103 num = 0
104 while ALIVE:
105 num += 1
106 start = time.time()
107 for i in checks:
108 try:
109 req = requests.get("https://" + i["ip"] + "/hello")
110 if "Hello from Rpg server by jonasek369#4537 server" in req.text:
111 continue
112 else:
113 db.remove_server_info(i["secret"])
114 checks.remove(i)
115 except:
116 db.remove_server_info(i["secret"])
117 checks.remove(i)
118 print("Loop", num, "finished with check length", len(checks), "it took", round(time.time()-start, 8))
119 time.sleep(5)
120
121
122def start_loop():
123 global ALIVE
124 ALIVE = True
125 t = threading.Thread(target=loop)
126 t.start()
127
128
129def is_alive():
130 return ALIVE
131
132
133def kill_loop():
134 global ALIVE
135 ALIVE = False
136# wsgi
137from waitress import serve
138import main
139
140print("+------------------------------------------------+")
141print("| private main server |")
142print("| jonasek369#4537 |")
143print("+------------------------------------------------+")
144
145while True:
146 main.start_loop()
147 print("Server starting!")
148 serve(main.app, host="localhost", port=5001)
149 main.kill_loop()
150 print("Server crashed restarting!")