1from flask import Blueprint, Flask, render_template, request, Response, send_file
2import mysql.connector
3import json, time, uuid
4from markupsafe import escape
5from functions import isValidSession, getUserPermission
6
7user = Blueprint('user', __name__, template_folder='templates')
8
9@user.route("/api/v1/user/create", methods=["POST"])
10def createuser():
11 if request.json == None:
12 return Response(json.dumps("No body was provided"), status=400, mimetype="application/json")
13
14 requestUsername = request.json.get("username")
15 requestEmail = request.json.get("email")
16 requestPassword = request.json.get("password")
17
18 if requestUsername == None:
19 return Response(json.dumps("No username was provided"), status=400, mimetype="application/json")
20
21 if requestEmail == None:
22 return Response(json.dumps("No email was provided"), status=400, mimetype="application/json")
23
24 if requestPassword == None:
25 return Response(json.dumps("No password was provided"), status=400, mimetype="application/json")
26
27
28 mydb = mysql.connector.connect(
29 host="localhost",
30 user="willem",
31 password="Dinkel2006!",
32 database="shykeiichicom"
33 )
34
35 mycursor = mydb.cursor()
36
37 mycursor.execute("SELECT * FROM users WHERE email=\"" + requestEmail + "\"")
38
39 myresult = mycursor.fetchone()
40
41 if myresult != None:
42 return Response(json.dumps("User already exists with this email"), status=500, mimetype="application/json")
43
44 mycursor.execute("SELECT * FROM users WHERE username=\"" + requestUsername + "\"")
45
46 myresult = mycursor.fetchone()
47
48 if myresult != None:
49 return Response(json.dumps("User already exists with this username"), status=500, mimetype="application/json")
50
51 curtime = int( time.time() )
52
53 sql = f"INSERT INTO users (username, email, password, registered, passwordchanged) VALUES (\"{requestUsername}\", \"{requestEmail}\", \"{requestPassword}\", \"{curtime}\", \"{curtime}\")"
54 mycursor.execute(sql)
55
56 mydb.commit()
57
58 return Response(json.dumps("User created"), status=201, mimetype="application/json")
59
60
61@user.route("/api/v1/user/login", methods=["POST"])
62def loginuser():
63 if request.json == None:
64 return Response(json.dumps("No body was provided"), status=400, mimetype="application/json")
65
66 requestEmail = request.json.get("email")
67 requestPassword = request.json.get("password")
68
69 if requestEmail == None:
70 return Response(json.dumps("No email was provided"), status=400, mimetype="application/json")
71
72 if requestPassword == None:
73 return Response(json.dumps("No password was provided"), status=400, mimetype="application/json")
74
75
76 mydb = mysql.connector.connect(
77 host="localhost",
78 user="willem",
79 password="Dinkel2006!",
80 database="shykeiichicom"
81 )
82
83 mycursor = mydb.cursor()
84
85 mycursor.execute("SELECT * FROM users WHERE email=\"" + requestEmail + "\"")
86
87 myresult = mycursor.fetchone()
88
89 if myresult == None:
90 return Response(json.dumps("No user exists with this email!"), status=400, mimetype="application/json")
91
92 if(myresult[3] != requestPassword):
93 return Response(json.dumps("Invalid password!"), status=400, mimetype="application/json")
94
95 curtime = int( time.time() )
96 sessionid = str(uuid.uuid4())
97 sql = f"INSERT INTO sessions (sessionid, userid, timestamp) VALUES (\"{sessionid}\", \"{myresult[0]}\", \"{curtime}\")"
98 mycursor.execute(sql)
99
100 mydb.commit()
101
102 return Response(json.dumps(sessionid), status=201, mimetype="application/json")
103
104
105@user.route("/api/v1/user/validatesession", methods=["POST"])
106def validatesession():
107 if request.json == None:
108 return Response(json.dumps("No body was provided"), status=400, mimetype="application/json")
109
110 requestSessionid = request.json.get("sessionid")
111
112
113 if requestSessionid == None:
114 return Response(json.dumps("No sessionid was provided"), status=400, mimetype="application/json")
115
116
117 mydb = mysql.connector.connect(
118 host="localhost",
119 user="willem",
120 password="Dinkel2006!",
121 database="shykeiichicom"
122 )
123
124 mycursor = mydb.cursor()
125
126 if(isValidSession(requestSessionid) == False):
127 return Response(json.dumps("Invalid sessionid"), status=400, mimetype="application/json")
128
129 mycursor.execute("SELECT * FROM users WHERE id=\"" + str(myresult[1]) + "\"")
130
131 myresult = mycursor.fetchone()
132
133 mycursor.execute(f"SELECT * FROM elevated_permissions WHERE userid={myresult[0]}")
134
135 permission = mycursor.fetchone()
136
137 result = {
138 "id": myresult[0],
139 "username": myresult[1],
140 "email": myresult[2],
141 "registered": myresult[4],
142 "passwordchanged": myresult[5],
143 "permission": 0 if permission == None else permission[2]
144 }
145
146 return Response(json.dumps(result), status=200, mimetype="application/json")
147
148
149@user.route("/api/v1/users/getall", methods=["GET"])
150def usersgetall():
151 if request.args == None:
152 return Response(json.dumps("No arguments were provided"), status=400, mimetype="application/json")
153
154 requestSessionid = request.args.get("sessionid")
155
156 if 'sessionid' in request.args:
157 requestSessionid = str(escape(request.args["sessionid"])).lower()
158 else:
159 return Response(json.dumps("No sessionid was provided."), status=400, mimetype='application/json')
160
161 mydb = mysql.connector.connect(
162 host="localhost",
163 user="willem",
164 password="Dinkel2006!",
165 database="shykeiichicom"
166 )
167
168 mycursor = mydb.cursor()
169
170 mycursor.execute("SELECT * FROM sessions WHERE sessionid=\"" + requestSessionid + "\"")
171
172 myresult = mycursor.fetchone()
173
174 if(isValidSession(requestSessionid) == False):
175 return Response(json.dumps("Invalid sessionid"), status=400, mimetype="application/json")
176
177 if(getUserPermission(myresult[1]) != 1):
178 return Response(json.dumps("User not admin"), status=400, mimetype="application/json")
179
180 mycursor.execute("SELECT * FROM users")
181
182 myresult = mycursor.fetchall()
183
184 users = []
185
186 for x in myresult:
187 mycursor.execute(f"SELECT * FROM elevated_permissions WHERE userid={x[0]}")
188
189 permission = mycursor.fetchone()
190
191 result = {
192 "id": x[0],
193 "username": x[1],
194 "email": x[2],
195 "registered": x[4],
196 "passwordchanged": x[5],
197 "permission": 0 if permission == None else permission[2]
198 }
199
200 users.append(result)
201
202 return Response(json.dumps(users), status=200, mimetype="application/json")
203
204@user.route("/api/v1/users/get", methods=["GET"])
205def usersget():
206 if request.args == None:
207 return Response(json.dumps("No arguments were provided"), status=400, mimetype="application/json")
208
209 requestSessionid = request.args.get("sessionid")
210 requestUserid = request.args.get("userid")
211
212
213 if 'sessionid' in request.args:
214 requestSessionid = str(escape(request.args["sessionid"])).lower()
215 else:
216 return Response(json.dumps("No sessionid was provided."), status=400, mimetype='application/json')
217
218 if 'userid' in request.args:
219 requestUserid = str(escape(request.args["userid"])).lower()
220 else:
221 return Response(json.dumps("No userid was provided."), status=400, mimetype='application/json')
222
223 mydb = mysql.connector.connect(
224 host="localhost",
225 user="willem",
226 password="Dinkel2006!",
227 database="shykeiichicom"
228 )
229
230 mycursor = mydb.cursor()
231
232 mycursor.execute("SELECT * FROM sessions WHERE sessionid=\"" + requestSessionid + "\"")
233
234 myresult = mycursor.fetchone()
235
236 if(isValidSession(requestSessionid) == False):
237 return Response(json.dumps("Invalid sessionid"), status=400, mimetype="application/json")
238
239 if(getUserPermission(myresult[1]) != 1):
240 return Response(json.dumps("User not admin"), status=400, mimetype="application/json")
241
242 mycursor.execute(f"SELECT * FROM users WHERE id={requestUserid}")
243
244 user = mycursor.fetchone()
245
246 mycursor.execute(f"SELECT * FROM elevated_permissions WHERE userid={requestUserid}")
247
248 permission = mycursor.fetchone()
249
250 if(user == None):
251 return Response(json.dumps("User not found"), status=400, mimetype="application/json")
252
253 result = {
254 "id": user[0],
255 "username": user[1],
256 "email": user[2],
257 "registered": user[4],
258 "passwordchanged": user[5],
259 "permission": 0 if permission == None else permission[2]
260 }
261
262 return Response(json.dumps(result), status=200, mimetype="application/json")
263
264
265@user.route("/api/v1/user/delete", methods=["POST"])
266def userremove():
267 if request.json == None:
268 return Response(json.dumps("No body was provided"), status=400, mimetype="application/json")
269
270 requestSessionid = request.json.get("sessionid")
271
272 if requestSessionid == None:
273 return Response(json.dumps("No sessionid was provided"), status=400, mimetype="application/json")
274
275 requestUserID = request.json.get("removeuserid")
276
277 if requestUserID == None:
278 return Response(json.dumps("No removeuserid was provided"), status=400, mimetype="application/json")
279
280
281 mydb = mysql.connector.connect(
282 host="localhost",
283 user="willem",
284 password="Dinkel2006!",
285 database="shykeiichicom"
286 )
287
288 mycursor = mydb.cursor()
289
290 if(isValidSession(requestSessionid) == False):
291 return Response(json.dumps("Invalid sessionid"), status=400, mimetype="application/json")
292
293 if(getUserPermission(myresult[1]) != 1):
294 return Response(json.dumps("User not admin"), status=400, mimetype="application/json")
295
296 mycursor.execute(f"SELECT * FROM users WHERE id=\"{requestUserID}\"")
297
298 myresult = mycursor.fetchone()
299
300 if(myresult == None):
301 return Response(json.dumps("Userid to remove is not valid"), status=400, mimetype="application/json")
302
303 mycursor.execute(f"DELETE FROM users WHERE id={requestUserID}")
304
305 mydb.commit()
306
307 return Response(json.dumps("User removed"), status=200, mimetype="application/json")
308
309
310@user.route("/api/v1/admin/user/edit", methods=["POST"])
311def userupdate():
312 if request.json == None:
313 return Response(json.dumps("No body was provided"), status=400, mimetype="application/json")
314
315 requestSessionid = request.json.get("sessionid")
316
317 if requestSessionid == None:
318 return Response(json.dumps("No sessionid was provided"), status=400, mimetype="application/json")
319
320
321 requestEditUserIDOriginal = request.json.get("edituserid")
322
323 if requestEditUserIDOriginal == None:
324 return Response(json.dumps("No userid to edit was provided"), status=400, mimetype="application/json")
325
326 requestEditUserID = request.json.get("userid")
327 requestEditUsername = request.json.get("username")
328 requestEditEmail = request.json.get("email")
329 requestEditPermission = request.json.get("permission")
330 requestEditPassword = request.json.get("password")
331
332 mydb = mysql.connector.connect(
333 host="localhost",
334 user="willem",
335 password="Dinkel2006!",
336 database="shykeiichicom"
337 )
338
339 mycursor = mydb.cursor()
340
341 if(isValidSession(requestSessionid) == False):
342 return Response(json.dumps("Invalid sessionid"), status=400, mimetype="application/json")
343
344 if(getUserPermission(myresult[1]) != 1):
345 return Response(json.dumps("User not admin"), status=400, mimetype="application/json")
346
347 mycursor.execute(f"SELECT * FROM users WHERE id=\"{requestEditUserIDOriginal}\"")
348
349 myresult = mycursor.fetchone()
350
351 if(myresult == None):
352 return Response(json.dumps("Userid to edit is not valid"), status=400, mimetype="application/json")
353
354 if requestEditUsername != None:
355 mycursor.execute(f"UPDATE users SET username={requestEditUsername} where id={requestEditUserIDOriginal}")
356 if requestEditEmail != None:
357 mycursor.execute(f"UPDATE users SET email={requestEditEmail} where id={requestEditUserIDOriginal}")
358 if requestEditPassword != None:
359 curtime = int( time.time() )
360 mycursor.execute(f"UPDATE users SET password={requestEditPassword} where id={requestEditUserIDOriginal}")
361 mycursor.execute(f"UPDATE users SET passwordchanged={curtime} where id={requestEditUserIDOriginal}")
362 if requestEditUserID != None:
363 mycursor.execute(f"UPDATE users SET id={requestEditUserID} where id={requestEditUserIDOriginal}")
364
365 mydb.commit()
366
367 return Response(json.dumps("User edit"), status=200, mimetype="application/json")
368
369
370@user.route("/api/v1/user/forgotpassword", methods=["POST"])
371def userforgotpassword():
372 if request.json == None:
373 return Response(json.dumps("No body was provided"), status=400, mimetype="application/json")
374
375 requestSessionid = request.json.get("sessionid")
376
377 if requestSessionid == None:
378 return Response(json.dumps("No sessionid was provided"), status=400, mimetype="application/json")
379
380 requestUserID = request.json.get("userid")
381
382 if requestUserID == None:
383 return Response(json.dumps("No userid was provided"), status=400, mimetype="application/json")
384
385 mydb = mysql.connector.connect(
386 host="localhost",
387 user="willem",
388 password="Dinkel2006!",
389 database="shykeiichicom"
390 )
391
392 mycursor = mydb.cursor()
393
394 if(isValidSession(requestSessionid) == False):
395 return Response(json.dufmps("Invalid sessionid"), status=400, mimetype="application/json")
396
397 if(getUserPermission(myresult[1]) != 1):
398 return Response(json.dumps("User not admin"), status=400, mimetype="application/json")
399
400 mycursor.execute(f"SELECT * FROM users WHERE id=\"{requestUserID}\"")
401
402 myresult = mycursor.fetchone()
403
404 if(myresult == None):
405 return Response(json.dumps("Userid is not valid"), status=400, mimetype="application/json")
406
407 address = uuid.uuid4().hex
408 curtime = int( time.time() )
409 sql = f"INSERT INTO forgot_password (userid, address, timestamp) VALUES (\"{requestUserID}\", \"{address}\", \"{curtime}\")"
410 mycursor.execute(sql)
411
412 mydb.commit()
413
414 return Response(json.dumps(f"https://22widi.ssis.nu/forgotpasswd.html?id={address}"), status=200, mimetype="application/json")
415
416
417@user.route("/api/v1/user/changepassword", methods=["POST"])
418def userchangepassword():
419 if request.json == None:
420 return Response(json.dumps("No body was provided"), status=400, mimetype="application/json")
421
422 requestAddress = request.json.get("address")
423
424 if requestAddress == None:
425 return Response(json.dumps("No address was provided"), status=400, mimetype="application/json")
426
427 requestPassword = request.json.get("password")
428
429 if requestPassword == None:
430 return Response(json.dumps("No password was provided"), status=400, mimetype="application/json")
431
432 mydb = mysql.connector.connect(
433 host="localhost",
434 user="willem",
435 password="Dinkel2006!",
436 database="shykeiichicom"
437 )
438
439 mycursor = mydb.cursor()
440
441 mycursor.execute(f"SELECT * FROM forgot_password WHERE address=\"{requestAddress}\"")
442
443 forgot_password_object = mycursor.fetchone()
444
445 if forgot_password_object == None:
446 return Response(json.dumps("Invalid address"), status=400, mimetype="application/json")
447
448 curtime = int( time.time() )
449 mycursor.execute(f"UPDATE users SET password=\"{requestPassword}\" WHERE id=\"{forgot_password_object[1]}\"")
450 mycursor.execute(f"UPDATE users SET passwordchanged=\"{curtime}\" WHERE id=\"{forgot_password_object[1]}\"")
451 mycursor.execute(f"DELETE FROM forgot_password WHERE address=\"{requestAddress}\"")
452 mycursor.execute(f"DELETE FROM sessions WHERE userid=\"{forgot_password_object[1]}\"")
453
454 mydb.commit()
455
456 return Response(json.dumps("Password Update"), status=200, mimetype="application/json")