|
1
|
|
|
import jwt, secrets |
|
2
|
|
|
|
|
3
|
|
|
from flask_bcrypt import generate_password_hash, check_password_hash |
|
4
|
|
|
from datetime import date, datetime, timedelta |
|
|
|
|
|
|
5
|
|
|
from sqlalchemy.orm.exc import NoResultFound |
|
6
|
|
|
from sqlalchemy import desc |
|
7
|
|
|
|
|
8
|
|
|
from skf import settings |
|
9
|
|
|
from skf.database import db |
|
10
|
|
|
from skf.database.users import users |
|
11
|
|
|
from skf.database.groupmembers import groupmembers |
|
12
|
|
|
from skf.database.privileges import privileges |
|
13
|
|
|
from skf.api.security import log, val_num, val_alpha, val_alpha_num |
|
14
|
|
|
|
|
15
|
|
|
|
|
16
|
|
|
def activate_user(user_id, data): |
|
17
|
|
|
log("User is activated", "HIGH", "PASS") |
|
18
|
|
|
val_num(user_id) |
|
19
|
|
|
val_num(data.get('accessToken')) |
|
20
|
|
|
val_alpha_num(data.get('username')) |
|
21
|
|
|
username = data.get('username') |
|
22
|
|
|
username = username.replace(" ", "") |
|
23
|
|
|
result = users.query.filter(users.userID == user_id).one() |
|
24
|
|
|
if result.activated == "False": |
|
25
|
|
|
if result.email == data.get('email'): |
|
26
|
|
|
if data.get('password') == data.get('repassword'): |
|
27
|
|
|
if data.get('accessToken') == result.accessToken: |
|
28
|
|
|
pw_hash = generate_password_hash(data.get('password')).decode('utf-8') |
|
29
|
|
|
result.password = pw_hash |
|
30
|
|
|
result.access = "True" |
|
31
|
|
|
result.activated = "True" |
|
32
|
|
|
result.userName = username |
|
33
|
|
|
db.session.add(result) |
|
34
|
|
|
db.session.commit() |
|
35
|
|
|
return {'message': 'User successfully activated'} |
|
36
|
|
|
else: |
|
37
|
|
|
log("User triggered error activation failed", "HIGH", "FAIL") |
|
38
|
|
|
return {'message': 'User could not be activated'} |
|
39
|
|
|
|
|
40
|
|
|
|
|
41
|
|
|
def login_user(data): |
|
42
|
|
|
log("User successfully logedin", "HIGH", "PASS") |
|
43
|
|
|
val_alpha_num(data.get('username')) |
|
44
|
|
|
username = data.get('username') |
|
45
|
|
|
try: |
|
46
|
|
|
if (users.query.filter(users.userName == username).one()): |
|
47
|
|
|
user = users.query.filter(users.userName == username).one() |
|
48
|
|
|
if (user.activated == "True"): |
|
49
|
|
|
if (user.access == "True"): |
|
50
|
|
|
if check_password_hash(user.password, data.get('password')): |
|
51
|
|
|
priv_user = privileges.query.filter(privileges.privilegeID == str(user.privilegeID)).first() |
|
52
|
|
|
payload = { |
|
53
|
|
|
# userid |
|
54
|
|
|
'UserId': user.userID, |
|
55
|
|
|
#issued at |
|
56
|
|
|
'iat': datetime.utcnow(), |
|
57
|
|
|
#privileges |
|
58
|
|
|
'privilege': priv_user.privilege, |
|
59
|
|
|
#expiry |
|
60
|
|
|
'exp': datetime.utcnow() + timedelta(minutes=120) |
|
61
|
|
|
#claims for access api calls |
|
62
|
|
|
#'claims': 'kb/items/update,project/items,non/existing/bla,' |
|
63
|
|
|
} |
|
64
|
|
|
token_raw = jwt.encode(payload, settings.JWT_SECRET, algorithm='HS256') |
|
65
|
|
|
token = str(token_raw,'utf-8') |
|
66
|
|
|
return {'Authorization token': token, 'username': username} |
|
67
|
|
|
else: |
|
68
|
|
|
log("User triggered error login failed", "HIGH", "FAIL") |
|
69
|
|
|
return {'Authorization token': ''} |
|
70
|
|
|
else: |
|
71
|
|
|
log("User triggered error login failed", "HIGH", "FAIL") |
|
72
|
|
|
return {'Authorization token': ''} |
|
73
|
|
|
else: |
|
74
|
|
|
log("User triggered error login failed", "HIGH", "FAIL") |
|
75
|
|
|
return {'Authorization token': ''} |
|
76
|
|
|
except NoResultFound: |
|
77
|
|
|
log("User triggered error login failed", "HIGH", "FAIL") |
|
78
|
|
|
return {'Authorization token': ''} |
|
79
|
|
|
|
|
80
|
|
|
|
|
81
|
|
|
def list_privileges(): |
|
82
|
|
|
log("User requested privileges items", "MEDIUM", "PASS") |
|
83
|
|
|
result = privileges.query.filter(privileges.privilegeID != "1").paginate(1, 500, False) |
|
84
|
|
|
return result |
|
85
|
|
|
|
|
86
|
|
|
|
|
87
|
|
|
def create_user(data): |
|
88
|
|
|
log("A new user created", "MEDIUM", "PASS") |
|
89
|
|
|
my_secure_rng = secrets.SystemRandom() |
|
90
|
|
|
val_num(data.get('privilege')) |
|
91
|
|
|
pincode = my_secure_rng.randrange(10000000, 99999999) |
|
92
|
|
|
username = pincode |
|
93
|
|
|
email = data.get('email') |
|
94
|
|
|
access = "False" |
|
95
|
|
|
activated = "False" |
|
96
|
|
|
privilege_id = 0 |
|
97
|
|
|
# New users can only edit:read:delete |
|
98
|
|
|
if data.get('privilege') == 1: |
|
99
|
|
|
log("User triggered error creating new user", "MEDIUM", "FAIL") |
|
100
|
|
|
return {'message': 'User could not be created'} |
|
101
|
|
|
else: |
|
102
|
|
|
privilege_id = data.get('privilege') |
|
103
|
|
|
password = "" |
|
104
|
|
|
user = users(privilege_id, pincode, username, password, access, activated, email) |
|
105
|
|
|
db.session.add(user) |
|
106
|
|
|
db.session.commit() |
|
107
|
|
|
result = users.query.filter(users.email == email).one() |
|
108
|
|
|
|
|
109
|
|
|
# Add user to default groupmember issue #422 |
|
110
|
|
|
groupmember = groupmembers.query.order_by(desc(groupmembers.memberID)).first() |
|
111
|
|
|
groupmemberUser = groupmembers(groupmember.memberID + 1, result.userID, groupmember.groupID, groupmember.ownerID, None) |
|
112
|
|
|
db.session.add(groupmemberUser) |
|
113
|
|
|
db.session.commit() |
|
114
|
|
|
|
|
115
|
|
|
return result |
|
116
|
|
|
|
|
117
|
|
|
|
|
118
|
|
|
def manage_user(user_id, data): |
|
119
|
|
|
log("Manage user triggered", "HIGH", "PASS") |
|
120
|
|
|
val_num(user_id) |
|
121
|
|
|
val_alpha(data.get('active')) |
|
122
|
|
|
status_activated = data.get('active') |
|
123
|
|
|
result = users.query.filter(users.userID == user_id).one() |
|
124
|
|
|
if users.query.filter(users.userID == user_id).one(): |
|
125
|
|
|
result.access = status_activated |
|
126
|
|
|
db.session.add(result) |
|
127
|
|
|
db.session.commit() |
|
128
|
|
|
return {'message': 'User successfully managed'} |
|
129
|
|
|
else: |
|
130
|
|
|
log("User triggered error managing failed", "HIGH", "FAIL") |
|
131
|
|
|
return {'message': 'User could not be managed'} |
|
132
|
|
|
|
|
133
|
|
|
|
|
134
|
|
|
def list_users(): |
|
135
|
|
|
log("Overview of list users triggered", "HIGH", "PASS") |
|
136
|
|
|
result = users.query.paginate(1, 50, False) |
|
137
|
|
|
return result |
|
138
|
|
|
|
|
139
|
|
|
|