-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.py
More file actions
143 lines (124 loc) · 4.66 KB
/
server.py
File metadata and controls
143 lines (124 loc) · 4.66 KB
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import json
import os
import logging
import re
from string import Template
import tornado.httpserver
import tornado.ioloop
import tornado.web
from tornado_json.requesthandlers import APIHandler
from unipath import Path
from tornado_json import schema
from hash import generate
from log import LogglyJSONFormatter
STATIC_PATH = Path(Path(__file__).parent, 'static')
WORKER_PATH = Path(Path(__file__).parent, '')
class MainHandler(tornado.web.RequestHandler):
def set_default_headers(self):
super(MainHandler, self).set_default_headers()
# Allow cross-origin Ajax requests (CORS)
self.set_header('Access-Control-Allow-Origin', '*')
self.set_header('Access-Control-Allow-Headers', 'x-requested-with')
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
@classmethod
def setup(cls):
logging.basicConfig(level=logging.WARNING)
logger = logging.getLogger('hashing')
logger.propagate = False
logger.setLevel(logging.WARNING)
handler = logging.StreamHandler()
handler.setFormatter(LogglyJSONFormatter())
logger.addHandler(handler)
return logger
def prepare(self):
if ('X-Forwarded-Proto' in self.request.headers and
self.request.headers['X-Forwarded-Proto'] != 'https'):
self.redirect(re.sub(r'^([^:]+)', 'https', self.request.full_url()))
def get(self):
self.get_landing_page()
return
def get_landing_page(self):
with open('index.html', 'r') as f:
html_template = f.read()
html = Template(html_template).safe_substitute({
'paycoin': '',
})
self.write(html)
class HashHandler(APIHandler):
HASH_ACTIONS = ['encrypt', 'decrypt']
@classmethod
def setup(cls):
logging.basicConfig(level=logging.WARNING)
logger = logging.getLogger('hash')
logger.propagate = False
logger.setLevel(logging.WARNING)
handler = logging.StreamHandler()
handler.setFormatter(LogglyJSONFormatter())
logger.addHandler(handler)
return logger
def set_default_headers(self):
super(HashHandler, self).set_default_headers()
# Allow cross-origin Ajax requests (CORS)
self.set_header('Access-Control-Allow-Origin', '*')
self.set_header('Access-Control-Allow-Headers', 'x-requested-with')
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
def prepare(self):
if ('X-Forwarded-Proto' in self.request.headers and
self.request.headers['X-Forwarded-Proto'] != 'https'):
self.redirect(re.sub(r'^([^:]+)', 'https', self.request.full_url()))
@schema.validate(
input_schema={
'title': 'HashObject',
'type': 'object',
'properties': {
'message': {'type': 'string'},
'password': {'type': 'string'},
'phrase': {'type': 'string'},
'action': {'type': 'string',
'enum': ['decrypt', 'encrypt']}
},
'required': ['message', 'password',
'phrase', 'action']
},
input_example={
'message': 'Very Important Post-It Note',
'password': 'Equally important message',
'phrase': '1221',
'action': 'decrypt'
},
output_schema={
'type': 'object',
'properties': {
'key': {'type': 'string'}
}
},
output_example={
'key': 'Very Important Post-It Note was posted.'
},
)
def post(self):
client_obj = json.loads(self.request.body)
logger = logging.getLogger('hash')
logger.warning('Request body value={}'.format(client_obj))
response_obj = generate(message=client_obj['message'],
password=client_obj['password'],
salt=client_obj['phrase'],
action=client_obj['action'])
return response_obj
def main():
MainHandler.setup()
application = tornado.web.Application([
(r'/', MainHandler),
(r'/hash', HashHandler),
(r'/static/(.*)', tornado.web.StaticFileHandler, {'path': STATIC_PATH}),
(r'/(service-worker.js)', tornado.web.StaticFileHandler,
{'path': WORKER_PATH}),
])
http_server = tornado.httpserver.HTTPServer(application)
port = int(os.environ.get('PORT', 5000))
http_server.xheaders = True
http_server.bind(port)
http_server.start(1)
tornado.ioloop.IOLoop.instance().start()
if __name__ == '__main__':
main()