This repository has been archived by the owner on Dec 10, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.py
108 lines (83 loc) · 2.7 KB
/
server.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
97
98
99
100
101
102
103
104
105
106
107
108
import binascii
import logging
import os
from cryptography import exceptions
from flask import current_app, request, jsonify
from sdc.crypto.decrypter import decrypt as sdc_decrypt
from sdc.crypto.exceptions import InvalidTokenException
from structlog import wrap_logger
from application import create_app, KEY_PURPOSE_SUBMISSION
import settings
__version__ = "1.9.5"
logging.basicConfig(format=settings.LOGGING_FORMAT,
datefmt="%Y-%m-%dT%H:%M:%S",
level=settings.LOGGING_LEVEL)
logger = wrap_logger(
logging.getLogger(__name__)
)
logger.info("START", version=__version__)
app = create_app()
@app.errorhandler(400)
def errorhandler_400(e):
return client_error(repr(e))
def client_error(error=None):
logger.error(repr(error))
message = {
'status': 400,
'message': repr(error),
'uri': request.url
}
resp = jsonify(message)
resp.status_code = 400
return resp
@app.errorhandler(500)
def server_error(e):
logger.error("Server Error", exception=repr(e))
message = {
'status': 500,
'message': "Internal server error: " + repr(e)
}
resp = jsonify(message)
resp.status_code = 500
return resp
@app.route('/decrypt', methods=['POST'])
def decrypt():
request.get_data()
if not request.data:
return client_error("Request payload was empty")
try:
logger.info("Received some data")
data_bytes = request.data.decode('UTF8')
decrypted_json = sdc_decrypt(
data_bytes, current_app.sdx['key_store'], KEY_PURPOSE_SUBMISSION)
except (
exceptions.UnsupportedAlgorithm,
exceptions.InvalidKey,
exceptions.AlreadyFinalized,
exceptions.InvalidSignature,
exceptions.NotYetFinalized,
exceptions.AlreadyUpdated):
return client_error("Decryption Failure")
except binascii.Error as e:
logger.exception(e)
return client_error("Request payload was not base64 encoded")
except InvalidTokenException as e:
logger.exception(repr(e))
return client_error(e)
except ValueError as e:
logger.exception(repr(e))
return server_error(e)
except Exception as e:
logger.exception(e)
return server_error(e)
else:
bound_logger = logger.bind(tx_id=decrypted_json.get("tx_id"))
bound_logger.info("Decrypted received data")
return jsonify(**decrypted_json)
@app.route('/info', methods=['GET'])
@app.route('/healthcheck', methods=['GET'])
def healthcheck():
return jsonify({'status': 'OK'})
if __name__ == '__main__':
port = int(os.getenv("PORT"))
app.run(debug=True, host='0.0.0.0', port=port)