· 9 years ago · Feb 06, 2017, 05:38 AM
1#API to work with user login and password data base
2import hashlib
3import sqlite3
4
5DB_PATH = 'C:\\Users\\user\\Desktop\\users.sqlite'
6TABLE_NAME = 'users'
7ID = 'id'
8LOGIN = 'login'
9PASSWORD = 'password'
10VOTED = 'voted'
11ERR_PASSWORD_TOO_SHORT = 'Password is too short!'
12ERR_LOGIN_EXISTS = 'Login already exists!'
13MIN_PASS = 6
14MAX_PASS = 20
15TABLE_DICT = \
16 {
17 ID: 0,
18 LOGIN: 1,
19 PASSWORD: 2,
20 VOTED: 3
21 }
22CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS '\
23 +TABLE_NAME+'(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, '\
24 +LOGIN+' varchar, '\
25 +PASSWORD+' varchar, '+VOTED+' INTEGER)'
26ADD_USER = "INSERT INTO "+TABLE_NAME+" ("+LOGIN+","+PASSWORD+","+VOTED+") VALUES ('%s','%s', 0)"
27MARK_AS_VOTED = "UPDATE "+TABLE_NAME+" SET "+VOTED+" = 1 WHERE "+LOGIN+" = '%s'"
28NULL_VOTES = "UPDATE "+TABLE_NAME+" SET "+VOTED+" = 0 WHERE "+ID+" = '%i'"
29
30def _checkPassLength_(password):
31 length = len(password)
32 return length >= MIN_PASS or length <= MAX_PASS
33
34def _checkLoginUniqueness_(c, login):
35 # TODO: simplify the query
36 c.execute("SELECT * FROM " + TABLE_NAME)
37 for row in c:
38 if (login == row[TABLE_DICT[LOGIN]]):
39 return False
40 return True
41
42def _str2hashstr_(string):
43 tNumber = string
44 hashObj = hashlib.sha256()
45 byteArray = str.encode(string)
46 hashObj.update(byteArray)
47 return hashObj.hexdigest()
48
49def _initDB_():
50 conn = sqlite3.connect(DB_PATH)
51 c = conn.cursor()
52 c.execute(CREATE_TABLE)
53 return (conn, c)
54
55def _closeDB_(conn, c):
56 conn.commit()
57 c.close()
58 conn.close()
59
60def createAccount(login, password):
61 if not _checkPassLength_(password):
62 print(ERR_PASSWORD_TOO_SHORT)
63 return False
64 conn, c = _initDB_()
65 if not _checkLoginUniqueness_(c, login):
66 print(ERR_LOGIN_EXISTS)
67 return False
68 hash = _str2hashstr_(password)
69 c.execute(ADD_USER%(login,hash))
70 _closeDB_(conn, c)
71 return True
72
73def authentification(login, password):
74 conn, c = _initDB_()
75 # TODO: simplify the query
76 c.execute("SELECT * FROM " + TABLE_NAME)
77 for row in c:
78 if login == row[TABLE_DICT[LOGIN]]:
79 _closeDB_(conn, c)
80 return _str2hashstr_(password) == row[TABLE_DICT[PASSWORD]]
81 #print('Login not found!')
82 _closeDB_(conn, c)
83
84def markAsVoted(login):
85 ret = False
86 conn, c = _initDB_()
87 # TODO: simplify the query
88 c.execute("SELECT * FROM " + TABLE_NAME)
89 for row in c:
90 if row[TABLE_DICT[LOGIN]] == login:
91 c.execute(MARK_AS_VOTED%login)
92 ret = True
93 _closeDB_(conn, c)
94 return ret
95
96def checkIfVoted(login):
97 conn, c = _initDB_()
98 # TODO: simplify the query
99 c.execute("SELECT * FROM " + TABLE_NAME)
100 for row in c:
101 if row[TABLE_DICT[LOGIN]] == login:
102 return bool(row[TABLE_DICT[VOTED]])
103 _closeDB_(conn, c)
104
105def nullVotes():
106 conn, c = _initDB_()
107 c.execute("SELECT * FROM " + TABLE_NAME)
108 for row in c:
109 c.execute(NULL_VOTES%row[TABLE_DICT[ID]])
110 _closeDB_(conn, c)