-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathvalidator.py
96 lines (77 loc) · 2.75 KB
/
validator.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
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
import logging
import jwt
import re
import datetime
import traceback
import os
from odoo import http, service, registry, SUPERUSER_ID
from odoo.http import request
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
_logger = logging.getLogger(__name__)
regex = r"^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
class Validator:
def is_valid_email(self, email):
return re.search(regex, email)
def key(self):
return os.environ.get('ODOO_JWT_KEY')
def create_token(self, user):
try:
exp = datetime.datetime.utcnow() + datetime.timedelta(days=30)
payload = {
'exp': exp,
'iat': datetime.datetime.utcnow(),
'sub': user['id'],
'lgn': user['login'],
}
token = jwt.encode(
payload,
self.key(),
algorithm='HS256'
)
self.save_token(token, user['id'], exp)
return token.decode('utf-8')
except Exception as ex:
_logger.error(ex)
raise
def save_token(self, token, uid, exp):
request.env['jwt_provider.access_token'].sudo().create({
'user_id': uid,
'expires': exp.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
'token': token,
})
def verify(self, token):
record = request.env['jwt_provider.access_token'].sudo().search([
('token', '=', token)
])
if len(record) != 1:
_logger.info('not found %s' % token)
return False
if record.is_expired:
return False
return record.user_id
def verify_token(self, token):
try:
result = {
'status': False,
'message': None,
}
payload = jwt.decode(token, self.key())
if not self.verify(token):
result['message'] = 'Token invalid or expired'
result['code'] = 498
_logger.info('11111')
return result
uid = request.session.authenticate(request.session.db, uid=payload['sub'], password=token)
if not uid:
result['message'] = 'Token invalid or expired'
result['code'] = 498
_logger.info('2222')
return result
result['status'] = True
return result
except (jwt.ExpiredSignatureError, jwt.InvalidTokenError, Exception) as e:
result['code'] = 498
result['message'] = 'Token invalid or expired'
_logger.error(traceback.format_exc())
return result
validator = Validator()