|
@@ -7,12 +7,14 @@ from werkzeug.wrappers import Response
|
|
|
import os
|
|
|
import jwt
|
|
|
import json
|
|
|
+import logging
|
|
|
|
|
|
RESOURCES_MAP = None
|
|
|
JWT_SECRET_KEY = '@MjSk$2016?'
|
|
|
JWT_HEADER = 'Authorization'
|
|
|
JWT_HEADER_PREFIX = 'JWT'
|
|
|
CRYPT_CONTEXT = CryptContext(['pbkdf2_sha512', 'md5_crypt'], deprecated=['md5_crypt'])
|
|
|
+LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
with open(os.path.dirname(__file__) + '/resources.json') as resources:
|
|
|
RESOURCES_MAP = json.load(resources)
|
|
@@ -31,9 +33,11 @@ class Auth(http.Controller):
|
|
|
user = request.env['res.users'].sudo().search([('login', '=', args['username']), ('active', '=', True)])
|
|
|
|
|
|
if not user:
|
|
|
+ self.make_warn_log('invalid user received')
|
|
|
return self.make_response({'error': 'invalid user'}, 400) # bad request
|
|
|
|
|
|
if not self.get_crypt_context().verify(args['password'], user.password_crypt):
|
|
|
+ self.make_warn_log('invalid password received')
|
|
|
return self.make_response({'error': 'invalid password'}, 400) # bad request
|
|
|
|
|
|
payload = {
|
|
@@ -45,8 +49,10 @@ class Auth(http.Controller):
|
|
|
|
|
|
user.write({'jwt_token': encoded})
|
|
|
|
|
|
+ self.make_info_log('to send token')
|
|
|
return self.make_response({'token': encoded})
|
|
|
except Exception, e:
|
|
|
+ self.make_error_log('Fields required to generate token')
|
|
|
return self.make_response({'error': 'fields required'}, 400) # bad request
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
@@ -58,15 +64,19 @@ class Auth(http.Controller):
|
|
|
user = request.env['res.users'].sudo().search([('jwt_token', '=', args['token'])])
|
|
|
|
|
|
if not user:
|
|
|
+ self.make_warn_log('Invalid token received')
|
|
|
return self.make_response({'error' : 'invalid token'}, 400) # bad request
|
|
|
|
|
|
decoded = jwt.decode(args['token'], JWT_SECRET_KEY, algorithms = ['HS256'])
|
|
|
|
|
|
if not self.get_crypt_context().verify(decoded['password'], user.password_crypt):
|
|
|
+ self.make_warn_log('Invalid token received')
|
|
|
return self.make_response({'error' : 'invalid token'}, 400) # bad request
|
|
|
|
|
|
+ self.make_info_log('Token received is valid')
|
|
|
return self.make_response({'token': 'valid'})
|
|
|
except Exception, e:
|
|
|
+ self.make_error_log('Token not received')
|
|
|
return self.make_response({'error': 'token required'}, 400) # bad request
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
@@ -81,6 +91,25 @@ class Auth(http.Controller):
|
|
|
def make_response(self, data, status = 200):
|
|
|
return Response(json.dumps(data), status = status, content_type = 'application/json')
|
|
|
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ # Make log for warnings
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ def make_warn_log(self, log):
|
|
|
+ LOGGER.warning(log)
|
|
|
+
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ # Make log for infos
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ def make_info_log(self, log):
|
|
|
+ LOGGER.error(log)
|
|
|
+
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ # Make log for errors
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ def make_error_log(self, log):
|
|
|
+ LOGGER.error(log)
|
|
|
+
|
|
|
+
|
|
|
'''
|
|
|
Class for manage rest api interaction
|
|
|
'''
|
|
@@ -117,6 +146,7 @@ class ApiManager(http.Controller):
|
|
|
if http_verb == 'DELETE':
|
|
|
return self.http_delete(resource, uid)
|
|
|
|
|
|
+ self.make_warn_log('Request method not allowed')
|
|
|
return self.make_response({'error': 'method not allowed'}, 405) # method not allowed
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
@@ -134,6 +164,7 @@ class ApiManager(http.Controller):
|
|
|
for item in result:
|
|
|
data.append(item.dump())
|
|
|
|
|
|
+ self.make_info_log('To send data response')
|
|
|
return self.make_response(data);
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
@@ -149,6 +180,7 @@ class ApiManager(http.Controller):
|
|
|
if not result.exists():
|
|
|
return self.make_response({'error': 'cannot be deleted'})
|
|
|
|
|
|
+ self.make_info_log('To delete object')
|
|
|
return self.make_response({'response': result.unlink()})
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
@@ -172,8 +204,10 @@ class ApiManager(http.Controller):
|
|
|
|
|
|
module = request.env['ir.module.module'].sudo().search([('name', '=', module_name)])
|
|
|
|
|
|
+ self.make_info_log('To check resource availability')
|
|
|
return True if module.state == 'installed' and len(module) != 0 else False
|
|
|
except Exception, e:
|
|
|
+ self.make_error_log('Requested resource is not available')
|
|
|
return False;
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
@@ -181,7 +215,7 @@ class ApiManager(http.Controller):
|
|
|
# --------------------------------------------------------------------------
|
|
|
def valid_token(self):
|
|
|
try:
|
|
|
- print request.httprequest.headers
|
|
|
+ # print request.httprequest.user_agent.browser
|
|
|
|
|
|
auth_header = request.httprequest.headers[JWT_HEADER]
|
|
|
|
|
@@ -203,9 +237,10 @@ class ApiManager(http.Controller):
|
|
|
if not self.get_crypt_context().verify(decoded['password'], user.password_crypt):
|
|
|
return False
|
|
|
|
|
|
+ self.make_info_log('Token is valid')
|
|
|
return True
|
|
|
except Exception, e:
|
|
|
- print e
|
|
|
+ self.make_error_log('Token is not valid')
|
|
|
return False
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
@@ -219,8 +254,10 @@ class ApiManager(http.Controller):
|
|
|
for i in range(len(RESOURCES_MAP[resource]['filters'])):
|
|
|
filters.append(tuple(RESOURCES_MAP[resource]['filters'][i]))
|
|
|
|
|
|
+ self.make_info_log('Successfully resource inflated')
|
|
|
return (model, filters)
|
|
|
except Exception, e:
|
|
|
+ self.make_error_log('Cannot inflate resource')
|
|
|
return (None, None)
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
@@ -228,3 +265,21 @@ class ApiManager(http.Controller):
|
|
|
# --------------------------------------------------------------------------
|
|
|
def get_crypt_context(self):
|
|
|
return CRYPT_CONTEXT
|
|
|
+
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ # Make log for warnings
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ def make_warn_log(self, log):
|
|
|
+ LOGGER.warning(log)
|
|
|
+
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ # Make log for infos
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ def make_info_log(self, log):
|
|
|
+ LOGGER.error(log)
|
|
|
+
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ # Make log for errors
|
|
|
+ # --------------------------------------------------------------------------
|
|
|
+ def make_error_log(self, log):
|
|
|
+ LOGGER.error(log)
|