database.py (4084B)
1 import sqlite3 2 from blueprints.utils import crypto 3 4 connection = sqlite3.connect('db/database.db', check_same_thread=False) 5 cursor = connection.cursor() 6 7 def user_exists(username): 8 cursor.execute("SELECT * FROM users WHERE username = ?", (username,)) 9 user = cursor.fetchone() 10 if user is None: 11 return False 12 return True 13 14 def register_user(username, password): 15 if user_exists(username): 16 return False 17 18 cursor.execute("INSERT INTO users (username, password) VALUES (?, ?)", (username, crypto.hash_string(password))) 19 connection.commit() 20 return True 21 22 def login_user(username, password): 23 cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, crypto.hash_string(password))) 24 user = cursor.fetchone() 25 if user is None: 26 return False 27 cursor.execute("UPDATE users SET isLoggedIn = 1 WHERE username = ?", (username,)) 28 connection.commit() 29 return True 30 31 def logout_user(username): 32 cursor.execute("UPDATE users SET isLoggedIn = 0 WHERE username = ?", (username,)) 33 connection.commit() 34 return True 35 36 def is_banned(username): 37 cursor.execute("SELECT * FROM users WHERE username = ?", (username,)) 38 user = cursor.fetchone() 39 if user is None: 40 return False 41 return user[5] == 1 42 43 def get_user_id(username): 44 cursor.execute("SELECT * FROM users WHERE username = ?", (username,)) 45 user = cursor.fetchone() 46 if user is None: 47 return None 48 49 return user[0] 50 51 def check_challenge(challenge_id, flag, username): 52 cursor.execute("SELECT * FROM challenges WHERE id = ? AND flag = ?", (challenge_id, flag)) 53 challenge = cursor.fetchone() 54 if challenge is None: 55 return "Wrong flag!" 56 57 user_id = get_user_id(username) 58 if user_id is None: 59 return "User does not exist!" 60 61 cursor.execute("SELECT * FROM solved WHERE user_id = ? AND challenge_id = ?", (user_id, challenge_id)) 62 solved = cursor.fetchone() 63 if solved is not None: 64 return "Challenge already solved!" 65 66 cursor.execute("INSERT INTO solved (user_id, challenge_id) VALUES (?, ?)", (user_id, challenge_id)) 67 connection.commit() 68 return "Challenge solved!" 69 70 def get_all_logged_in_users(): 71 cursor.execute("SELECT * FROM users WHERE isLoggedIn = 1") 72 users = cursor.fetchall() 73 return users 74 75 def get_all_users(): 76 cursor.execute("SELECT * FROM users") 77 users = cursor.fetchall() 78 return users 79 80 def ban_user(user_id): 81 cursor.execute("UPDATE users SET isBanned = 1 WHERE id = ?", (user_id,)) 82 connection.commit() 83 84 def unban_user(user_id): 85 cursor.execute("UPDATE users SET isBanned = 0 WHERE id = ?", (user_id,)) 86 connection.commit() 87 88 def get_all_challenges(): 89 cursor.execute("SELECT * FROM challenges") 90 challenges = cursor.fetchall() 91 return challenges 92 93 def enable_challenge(challenge_id): 94 cursor.execute("UPDATE challenges SET enabled = 1 WHERE id = ?", (challenge_id,)) 95 connection.commit() 96 97 def disable_challenge(challenge_id): 98 cursor.execute("UPDATE challenges SET enabled = 0 WHERE id = ?", (challenge_id,)) 99 connection.commit() 100 101 def is_admin(username): 102 cursor.execute("SELECT * FROM users WHERE username = ?", (username,)) 103 user = cursor.fetchone() 104 105 if user is None: 106 return False 107 108 return user[3] == 1 109 110 def get_flag(challenge_id): 111 cursor.execute("SELECT * FROM challenges WHERE id = ?", (challenge_id,)) 112 challenge = cursor.fetchone() 113 if challenge is None: 114 return None 115 116 return challenge[2] 117 118 def add_solve(challenge_id, user_id): 119 try: 120 cursor.execute("INSERT INTO solves (userId, challengeId) VALUES (?, ?)", (user_id, challenge_id)) 121 connection.commit() 122 except: 123 pass 124 125 def challenge_disabled(challenge_id): 126 cursor.execute("SELECT * FROM challenges WHERE id = ?", (challenge_id,)) 127 challenge = cursor.fetchone() 128 if challenge is None: 129 return True 130 131 return challenge[3] == 0 132 133 134 def get_solved_challenges(): 135 cursor.execute("SELECT * FROM solves") 136 solves = cursor.fetchall() 137 return solves