Advertisement
Guest User

Untitled

a guest
Nov 17th, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.58 KB | None | 0 0
  1. import boto3
  2. import json
  3. import uuid
  4. import time
  5. import hashlib
  6. import urllib
  7. from boto3.dynamodb.conditions import Key
  8. from string import Template
  9.  
  10. dynamodb_client = boto3.client('dynamodb')
  11.  
  12. def lambda_handler(event, context):
  13. try:
  14. return run(event)
  15. except Exception as e:
  16. return page(repr(e))
  17.  
  18.  
  19. def run(event):
  20. path = event.get('path', '')
  21.  
  22. if path == '/':
  23. return main_handle(event)
  24. elif path == '/register':
  25. return page(template('register.html', {'title': 'Регистрация'}))
  26. elif path == '/registerHandle':
  27. return register_handle(event)
  28. elif path == '/login':
  29. return page(template('login.html', {'title': 'Вход'}))
  30. elif path == '/loginHandle':
  31. return login_handle(event)
  32. elif path == '/profile':
  33. return profile_handle(event)
  34. elif path == '/logout':
  35. return logout_handle(event)
  36. elif path == '/gifts':
  37. return gifts_handle(event)
  38. elif path == '/friends':
  39. return friends_handle(event)
  40. elif path == '/test':
  41. return page(repr(event))
  42. else:
  43. return page(template('404.html', {'title': 'Страница не найдена!'}))
  44.  
  45.  
  46. def page(html='', status_code=200):
  47. return {
  48. 'statusCode': status_code,
  49. 'headers': {
  50. 'Content-Type': 'text/html',
  51. },
  52. 'body': html
  53. }
  54.  
  55.  
  56. def with_cookie(response, cookie):
  57. response['headers']['Set-Cookie'] = str(cookie) + '; Path=/'
  58. return response
  59.  
  60.  
  61. def get_html(page_name, params={}):
  62. html_top = read_file('html/header.html')
  63. html_mid = read_file('html/' + page_name)
  64. html_bot = read_file('html/footer.html')
  65. html = html_top + html_mid + html_bot
  66. return html
  67.  
  68.  
  69. def template(page_name, params={}):
  70. s = get_html(page_name)
  71. if params:
  72. t = Template(s)
  73. s = t.safe_substitute(params)
  74. return s
  75.  
  76.  
  77. def read_file(file_name):
  78. file = open(file_name,'r')
  79. html = file.read()
  80. file.close()
  81. return html
  82.  
  83.  
  84. def redirect(url):
  85. return {
  86. 'statusCode': 302,
  87. 'headers': {
  88. 'Location': url
  89. },
  90. 'body': ''
  91. }
  92.  
  93.  
  94. def register_handle(event):
  95. get_params = event.get('queryStringParameters')
  96.  
  97. login = get_params.get('login')
  98. email = get_params.get('email')
  99. password = get_params.get('password')
  100. name = get_params.get('name')
  101. surname = get_params.get('surname')
  102.  
  103. if login and email and password and name and surname:
  104. same_user = find_user(login)
  105. if same_user:
  106. return page(template('error.html', {
  107. 'error': 'Такой логин уже занят.',
  108. 'backLink': '<a href="/default/register">Вернуться назад</a>'
  109. }))
  110. else:
  111. response = dynamodb_client.put_item(
  112. TableName='users',
  113. Item={
  114. 'login': {
  115. 'S': login,
  116. },
  117. 'email': {
  118. 'S': email,
  119. },
  120. 'password': {
  121. 'S': hash_password(password),
  122. },
  123. 'name': {
  124. 'S': name,
  125. },
  126. 'surname': {
  127. 'S': surname,
  128. },
  129. 'friends': {
  130. 'L': [],
  131. },
  132. 'wantedGifts': {
  133. 'L': [],
  134. },
  135. }
  136. )
  137. auth_token = make_auth(login)
  138. return with_cookie(redirect('/default/gifts'), 'auth='+auth_token)
  139. else:
  140. return page(template('error.html', {
  141. 'error': 'Введенные данные некорректны!',
  142. 'backLink': '<a href="/default/register">Вернуться назад</a>'
  143. }))
  144.  
  145.  
  146. def login_handle(event):
  147. get_params = event.get('queryStringParameters')
  148.  
  149. login = get_params.get('login')
  150. password = get_params.get('password')
  151.  
  152. auth_token = None
  153.  
  154. if login and password:
  155. user = find_user(login)
  156. if user:
  157. real_password_hash = user.get('password').get('S')
  158. if real_password_hash == hash_password(password):
  159. auth_token = make_auth(login)
  160.  
  161. if auth_token:
  162. return with_cookie(redirect('/default/profile'), 'auth='+auth_token)
  163. else:
  164. return page(template('error.html', {
  165. 'error': 'Пользователь с такими данными не найден или данные введены неверно',
  166. 'backLink': '<a href="/default/login">Вернуться назад</a>'
  167. }))
  168.  
  169.  
  170. def make_auth(login):
  171. new_token = str(uuid.uuid4().hex)
  172. response = dynamodb_client.put_item(
  173. TableName='auths',
  174. Item={
  175. 'token': {
  176. 'S': new_token,
  177. },
  178. 'login': {
  179. 'S': login,
  180. },
  181. 'login_time': {
  182. 'S': str(time.time()),
  183. },
  184. }
  185. )
  186. return new_token
  187.  
  188.  
  189. def find_user(login):
  190. response = dynamodb_client.get_item(
  191. TableName='users',
  192. Key={'login': {'S': login}}
  193. )
  194. item = response.get('Item')
  195. return item
  196.  
  197.  
  198. def get_auth_token(event):
  199. auth_token = None
  200. headers = event.get('headers')
  201. cookie_header = headers.get('cookie')
  202. if (cookie_header):
  203. cookies = cookie_header.split('; ')
  204. for ck in cookies:
  205. ind = ck.index('=')
  206. ckName = ck[0:ind]
  207. ckVal = ck[ind+1:]
  208. if ckName == 'auth' and ckVal:
  209. auth_token = str(ckVal)
  210. return auth_token
  211.  
  212.  
  213. def get_auth_user(event):
  214. auth_user = None
  215. auth_token = get_auth_token(event)
  216. if auth_token:
  217. response = dynamodb_client.get_item(
  218. TableName='auths',
  219. Key={'token': {'S': auth_token}}
  220. )
  221. item = response.get('Item')
  222. if item:
  223. auth_user = item.get('login').get('S')
  224. return auth_user
  225.  
  226.  
  227. def profile_handle(event):
  228. login = get_auth_user(event)
  229. if not login:
  230. return redirect('/default/')
  231.  
  232. get_params = event.get('queryStringParameters')
  233. userid = None
  234. if get_params:
  235. userid = get_params.get('id')
  236.  
  237. if userid:
  238. user = find_user(userid)
  239. if not user:
  240. return redirect('/default/404')
  241.  
  242. name = user.get('name').get('S')
  243. surname = user.get('surname').get('S')
  244. email = user.get('email').get('S')
  245. return page(template('other_profile.html', {
  246. 'title': 'Профиль',
  247. 'name': name,
  248. 'surname': surname,
  249. 'email': email,
  250. 'login': userid,
  251. }))
  252. else:
  253. user = find_user(login)
  254. if not user:
  255. return redirect('/default/')
  256.  
  257. name = user.get('name').get('S')
  258. surname = user.get('surname').get('S')
  259. email = user.get('email').get('S')
  260. friends_html = ''
  261. gifts_html = ''
  262.  
  263. return page(template('my_profile.html', {
  264. 'title': 'Профиль',
  265. 'name': name,
  266. 'surname': surname,
  267. 'email': email,
  268. 'login': login,
  269. 'friends_html': friends_html,
  270. 'gifts_html': gifts_html,
  271. 'profile_url_encoded': urllib.parse.quote(make_profile_link(login)),
  272. }))
  273.  
  274.  
  275. def make_profile_link(login):
  276. return 'https://adfx152135.execute-api.us-east-1.amazonaws.com/default/profile?id='+str(login)
  277.  
  278.  
  279. def logout_handle(event):
  280. token = get_auth_token(event)
  281. if token:
  282. dynamodb_client.delete_item(
  283. TableName='auths',
  284. Key={'token': {'S': token}}
  285. )
  286. return with_cookie(redirect('/default/'), 'auth=')
  287.  
  288.  
  289. def main_handle(event):
  290. login = get_auth_user(event)
  291. if login:
  292. return redirect('/default/profile')
  293. else:
  294. return page(template('index.html', {'title': 'Главная страница'}))
  295.  
  296.  
  297. def md5(s):
  298. return hashlib.md5(s.encode('utf-8')).hexdigest()
  299.  
  300.  
  301. def hash_password(passwd):
  302. s = passwd + '_z04a02b14c'
  303. hash = md5(s)
  304. return hash
  305.  
  306.  
  307. def gifts_handle(event):
  308. return page(template('gifts.html'))
  309.  
  310.  
  311. def friends_handle(event):
  312. return page('<h2>Friends</h2>')
  313.  
  314.  
  315. def get_gifts(event):
  316. pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement