Skip to content

Commit 206345b

Browse files
author
prashantramangupta
committed
code added to register and validate daemon
1 parent 6d5c5d7 commit 206345b

File tree

5 files changed

+209
-0
lines changed

5 files changed

+209
-0
lines changed

auth_token.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import calendar
2+
import secrets
3+
import time
4+
from datetime import datetime as dt
5+
6+
from repository import Repository
7+
8+
9+
class Token:
10+
def __init__(self, net_id):
11+
self.net_id = net_id
12+
self.repo = Repository(net_id)
13+
14+
def process_token(self, daemon_id):
15+
print("process_token::daemon_id: ", daemon_id);
16+
result = {}
17+
token = secrets.token_urlsafe(64)
18+
exist_info = self.daemon_id_exist(daemon_id=daemon_id)
19+
if exist_info.get('status', False):
20+
qry = "UPDATE daemon_token set token = %s WHERE daemon_id = %s "
21+
updt_info = self.repo.execute(qry, [token, daemon_id])
22+
print(updt_info)
23+
if updt_info[0] > 0:
24+
return {"token": token}
25+
else:
26+
return {"error": "unable to generate token"}
27+
ctime_epoch = calendar.timegm(time.gmtime())
28+
expiration = ctime_epoch + (6 * 60 * 60)
29+
qry = "INSERT INTO daemon_token (daemon_id, token, expiration, row_updated, row_created) " \
30+
"VALUES(%s, %s, %s, %s, %s)"
31+
res = self.repo.execute(qry, [daemon_id, token, expiration, dt.utcnow(), dt.utcnow()])
32+
if len(res) > 0 and res[0] > 0:
33+
result["token"] = token
34+
return result
35+
36+
def validate_token(self, daemon_id, token):
37+
print("validate_token::daemon_id: ", daemon_id);
38+
qry = "SELECT * FROM daemon_token WHERE daemon_id = %s and token = %s "
39+
res = self.repo.execute(qry, [daemon_id, token])
40+
if len(res) > 0:
41+
return {'validated': True}
42+
return {'validated': False}
43+
44+
45+
def daemon_id_exist(self, daemon_id):
46+
print("daemon_id_exist::daemon_id: ", daemon_id);
47+
qry = "SELECT * FROM daemon_token WHERE daemon_id = %s"
48+
res = self.repo.execute(qry, [daemon_id])
49+
if len(res) > 0:
50+
return {'status': True, "token": res[0]['token']}
51+
return {'status': False}

build.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
rm daemon_authenticate.zip
2+
zip -r daemon_authenticate.zip * -x \*venv\*

lambda_handler.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import json
2+
import os
3+
4+
from auth_token import Token
5+
from constant import DEFAULT_NETWORK_ID
6+
7+
def request_handler(event, context):
8+
print(event)
9+
if 'path' not in event:
10+
return get_response("400", {"status": "failed", "error": "Bad Request"})
11+
try:
12+
path = event['path'].lower()
13+
data = None
14+
if "/register" == path:
15+
payload = event['body']
16+
payload_dict = payload_check(payload=payload, path=path)
17+
net_id = DEFAULT_NETWORK_ID
18+
token_instance = Token(net_id)
19+
data = token_instance.process_token(daemon_id=payload_dict['daemonId'])
20+
if data is None:
21+
response = get_response("400", {"status": "failed", "error": "Bad Request"})
22+
else:
23+
if data.get('error', '') == '':
24+
print(data)
25+
response = get_response("200", {"status": "success", "data": data})
26+
else:
27+
error = data['error']
28+
data.pop('error')
29+
response = get_response("200", {"status": "failed", "data": data, "error": error})
30+
elif "/event" == path:
31+
try:
32+
payload_dict = event['headers']
33+
print("Processing [" + str(path) + "] with body [" + str(payload_dict) + "]")
34+
net_id = 42
35+
token_instance = Token(net_id)
36+
data = token_instance.validate_token(daemon_id=payload_dict['x-daemonid'], token=payload_dict['x-token'])
37+
response = get_lambda_authorizer_response_format(event=event, allow=data['validated'])
38+
except Exception as e:
39+
print(repr(e))
40+
response = get_lambda_authorizer_response_format(event=event, allow=False)
41+
42+
except Exception as e:
43+
response = get_response(500, {"status": "failed",
44+
"error": repr(e)})
45+
46+
return response
47+
48+
49+
def payload_check(payload, path):
50+
payload_dict = None
51+
if payload is not None and len(payload) > 0:
52+
payload_dict = json.loads(payload)
53+
print("Processing [" + str(path) + "] with body [" + str(payload) + "]")
54+
return payload_dict
55+
56+
57+
# Generate response JSON that API gateway expects from the lambda function
58+
def get_response(status_code, message):
59+
return {
60+
'statusCode': status_code,
61+
'body': json.dumps(message),
62+
'headers': {
63+
'Content-Type': 'application/json',
64+
"X-Requested-With": '*',
65+
"Access-Control-Allow-Headers": 'Access-Control-Allow-Origin, Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with',
66+
"Access-Control-Allow-Origin": '*',
67+
"Access-Control-Allow-Methods": 'GET,OPTIONS,POST'
68+
}
69+
}
70+
71+
72+
def get_lambda_authorizer_response_format(event, allow):
73+
print(allow)
74+
response = {
75+
"principalId": os.environ['principalId'],
76+
"policyDocument": {
77+
"Version": '2012-10-17',
78+
"Statement": [
79+
{
80+
"Action": 'execute-api:Invoke',
81+
"Resource": event['methodArn']
82+
}
83+
]
84+
}
85+
}
86+
if allow:
87+
response["policyDocument"]["Statement"][0]["Effect"] = 'Allow'
88+
else:
89+
response["policyDocument"]["Statement"][0]["Effect"] = 'Deny'
90+
91+
print(response)
92+
return response

repository.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import pymysql
2+
from constant import NETWORKS
3+
4+
5+
class Repository:
6+
connection = None
7+
8+
def __init__(self, netId):
9+
self.DB_HOST = NETWORKS[netId]['db']['DB_HOST']
10+
self.DB_USER = NETWORKS[netId]['db']['DB_USER']
11+
self.DB_PASSWORD = NETWORKS[netId]['db']['DB_PASSWORD']
12+
self.DB_NAME = NETWORKS[netId]['db']['DB_NAME']
13+
self.DB_PORT = 3306
14+
self.connection = self.__get_connection()
15+
self.auto_commit = True
16+
17+
def execute(self, query, params=None):
18+
return self.__execute_query(query, params)
19+
20+
def __get_connection(self):
21+
open = True
22+
if self.connection is not None:
23+
try:
24+
self.execute("select 1")
25+
open = False
26+
except Exception as e:
27+
open = True
28+
29+
if open:
30+
self.connection = pymysql.connect(self.DB_HOST, user=self.DB_USER,
31+
passwd=self.DB_PASSWORD, db=self.DB_NAME, port=self.DB_PORT)
32+
return self.connection
33+
34+
def __execute_query(self, query, params=None):
35+
result = list()
36+
try:
37+
with self.connection.cursor() as cursor:
38+
qry_resp = cursor.execute(query, params)
39+
db_rows = cursor.fetchall()
40+
if cursor.description is not None:
41+
field_name = [field[0] for field in cursor.description]
42+
for values in db_rows:
43+
row = dict(zip(field_name, values))
44+
result.append(row)
45+
else:
46+
result.append(qry_resp)
47+
result.append({'last_row_id': cursor.lastrowid})
48+
if self.auto_commit:
49+
self.connection.commit()
50+
except Exception as e:
51+
self.connection.rollback()
52+
print("DB Error in %s, error: %s" % (str(query), repr(e)))
53+
return result
54+
55+
def bulk_query(self, query, params=None):
56+
try:
57+
with self.connection.cursor() as cursor:
58+
result = cursor.executemany(query, params)
59+
self.connection.commit()
60+
return result
61+
except Exception as err:
62+
self.connection.rollback()
63+
print("DB Error in %s, error: %s" % (str(query), repr(err)))

requirement.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pymysql==0.9.2

0 commit comments

Comments
 (0)