-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdb_api.py
More file actions
229 lines (196 loc) · 6.23 KB
/
Copy pathdb_api.py
File metadata and controls
229 lines (196 loc) · 6.23 KB
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
import sqlite3
import random
import re
import CustomExceptions
import hashlib
from fuzzywuzzy import fuzz
db_file = "database.db"
email_regex = "(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
def GenerateSaltedHash(str):
saltValue = hex(random.randint(64,256))
return saltValue[2:]+hashlib.sha256((str+saltValue[2:]).encode()).hexdigest()
def CheckPass(password, storedHash):
saltValue = storedHash[0:2]
if(hashlib.sha256((password+saltValue).encode()).hexdigest()==storedHash[2:]):
return True
return False
def userLogin(username,password):
try:
hash = getClientPassword(username)
if(CheckPass(password,hash)):
return getClientID(username)
else:
raise CustomExceptions.IncorrectLogin()
except CustomExceptions.MatchNotFound as e:
raise CustomExceptions.IncorrectLogin()
def getClientID(username):
conn = None
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("SELECT user_id FROM users WHERE username = '%s'" % username)
id = cursor.fetchall()[0][0]
conn.close()
return id
except Error as e:
print(e)
finally:
if conn:
conn.close()
def AddClient(name,password,email):
foundID = False
while (not foundID):
id = random.randint(1000000,9999999)
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("INSERT INTO users VALUES ('%s','%s',%d,'%s')" % (name,password,id,email))
conn.commit()
foundID = True
except sqlite3.Error as er:
if("username" in str( (' '.join(er.args)))):
raise CustomExceptions.NonUniqueValue('username')
elif("email" in str( (' '.join(er.args)))):
raise CustomExceptions.NonUniqueValue('email address')
finally:
conn.close()
def fuzzyMatchSite(userID, name):
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("SELECT site_name FROM Logins WHERE user_id = %d" % (userID))
siteNames = cursor.fetchall()
site_list =[]
except sqlite3.Error as er:
print(er)
finally:
if(conn):
conn.close()
for t in siteNames:
if(fuzz.ratio(t[0],name)>=60):
site_list.append(t[0])
return site_list
def getUserPasswords(userID):
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("SELECT password FROM Logins WHERE user_id = %d" % (userID))
passwords = cursor.fetchall()
except sqlite3.Error as er:
print(er)
finally:
conn.close()
return passwords
def retrieveLoginInfo(userID,name):
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("SELECT username, password FROM Logins WHERE user_id = %d AND site_name = '%s'" % (userID,name))
loginInfo = cursor.fetchall()
except sqlite3.Error as er:
print(er)
finally:
conn.close()
if(len(loginInfo)==0):
raise CustomExceptions.MatchNotFound("no site")
return loginInfo[0]
def saveLoginInfo(userID,sitename,username,password):
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("INSERT INTO Logins VALUES (%d,'%s','%s','%s')" % (userID,sitename,username,password))
conn.commit()
except sqlite3.Error as er:
print(er)
finally:
conn.close()
def deleteLoginInfo(userID,sitename):
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("DELETE FROM Logins WHERE user_id = %d AND site_name = '%s'" % (userID,sitename))
conn.commit()
except sqlite3.Error as er:
print(er)
finally:
conn.close()
def isSiteNameUnique(userID,sitename):
conn = None
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("SELECT site_name FROM Logins WHERE user_id = %d AND site_name = '%s'" % (userID,sitename))
t = cursor.fetchall()
except Error as e:
print(e)
finally:
if conn:
conn.close()
if(len(t)>0):
return False
else:
return True
def isUsernameUnique(username):
conn = None
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("SELECT username FROM users WHERE username = '%s'" % (username))
users = cursor.fetchall()
except sqlite3.Error as e:
print(e)
finally:
if conn:
conn.close()
if(len(users)>0):
return False
else:
return True
def isEmailUnique(email):
conn = None
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("SELECT email FROM users WHERE email = '%s'" % (email))
emails = cursor.fetchall()
except sqlite3.Error as e:
print(e)
finally:
if conn:
conn.close()
if(len(emails)>0):
return False
else:
return True
def TestDBConnection():
conn = None
try:
conn = sqlite3.connect(db_file)
print("connected to db successfully")
except Error as e:
print(e)
finally:
if conn:
conn.close()
def getClientPassword(username):
conn = None
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute("SELECT password FROM users WHERE username = '%s'" % (username))
password = cursor.fetchall()
if(len(password) == 1):
return password[0][0]
elif(len(password) > 1):
raise Exception("Multiple Clients found with this username")
else:
raise CustomExceptions.MatchNotFound(username)
except sqlite3.Error as e:
print(e)
finally:
if conn:
conn.close()
def main():
TestDBConnection()
if __name__ == '__main__':
main()