-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaccount.py
51 lines (43 loc) · 2.53 KB
/
account.py
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
import uuid as uid
import random, hashlib, time
from string import ascii_letters, digits
from validate_email import validate_email
class Account:
def __init__(self, dbObject, jwtObject):
self.database = dbObject
self.jwt = jwtObject
def profileExist(self, username):
profile = self.database.selectOne('users', 'username', username)
if profile is None:
return(False)
else:
return(True)
def registerUser(self, username, email, password, firstName, lastName, dob, country, ipAddr):
if self.profileExist(username):
return({"error":{"Username already used."}})
if ((username.isalnum()) and (firstName.isalpha()) and (lastName.isalpha()) and (validate_email(email))):
salt,unixjoin = [''.join(random.sample(ascii_letters+digits, 8)), int(time.time())]
passhash = hashlib.blake2b((password+salt).encode()).hexdigest()
self.database.insertOne('users', '(?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [str(uid.uuid4()), email, username, passhash, salt, None, firstName, lastName, dob, country, None, None, ipAddr, unixjoin])
return({"success":{"username":username, "email":email}})
else:
return({"error":{"One or more fields were invalid."}})
def login(self, username, password):
if (not self.profileExist(username)) and username.isalnum():
return({"error":"Incorrect credentials"})
profile = self.database.selectOne('users', 'username', username)
if (hashlib.blake2b((password+profile['salt']).encode()).hexdigest()) == profile['passhash']:
return({"success":{"token":self.jwt.generateToken('PrivateKey.pem', profile['uuid'], 20160)}}) #14days
else:
return({"error":"Incorrect credentials"})
def changePassword(self, token, pwFrom, pwTo):
token = self.jwt.verifyToken('PrivateKey.pem', token)
profile = self.database.selectOne('users', 'uuid', token[1]['uuid'])
if (hashlib.blake2b((pwFrom+profile['salt']).encode()).hexdigest()) == profile['passhash']:
newSalt = ''.join(random.sample(ascii_letters+digits, 8))
newPassword = hashlib.blake2b((pwTo+newSalt).encode()).hexdigest()
self.database.updateOne('users', 'passhash', newPassword, 'uuid', profile['uuid'])
self.database.updateOne('users', 'salt', newSalt, 'uuid', profile['uuid'])
return({"success":{"uuid":profile['uuid'], "action":"PasswordChange"}})
else:
return({"error":"Incorrect credentials"})