-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathmyusers.py
More file actions
executable file
·159 lines (131 loc) · 4.44 KB
/
myusers.py
File metadata and controls
executable file
·159 lines (131 loc) · 4.44 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# coding=UTF-8
# !important The Following Code requires three basic HTML Files,
# login.html, signup.html, and activate.html
#
# SUAS: Simple User Authentication then Session
# User Session Management Library
# The following code creates a memcache/datastore session manager that simply
# tracks whether or not a user remains logged in, and mimics the
# google "users" service to the greatest extent possible
#
# Copyright Andrew Tutt 2010. MIT License.
#
# Modified by sysoev for WebApp2017, 24.09.2017
#
from google.appengine.ext import db
import webapp2
from google.appengine.ext.webapp import template
import os
import uuid
import time
class MyUser(db.Model):
fullname = db.StringProperty()
email = db.EmailProperty()
username = db.StringProperty()
password = db.StringProperty()
session_id = db.StringProperty()
active = db.BooleanProperty(default=False)
def updateUser(key, fullname, email, active):
user = MyUser.get(key)
if not user:
return
user.fullname = fullname
user.email = email
user.active = active
user.put()
def getPassword(key):
user = MyUser.get(key)
if not user:
return
return user.password
class session:
def __init__(self, handler):
"""Requires a webapp requesthandler passed as a constructor"""
self.handler = handler
self.session_id = None
def updatePassword(self, key, password):
user = MyUser.get(key)
if not user:
return False
user.password = password
self._sync_user(user)
user.put()
return True
def create_user(self, fullname, email, username, password):
"""Create a new user in the datastore"""
tmp = MyUser(key_name=username.lower())
tmp.fullname = fullname
tmp.username = username
tmp.email = email
tmp.password = password
tmp.active = True
self._sync_user(tmp)
return tmp.key()
def get_current_user(self):
"""Returns the currently logged in user or "None" if no session"""
return self._fetch_user_by_cookie()
def grab_login(self, username, password):
"""Generates a session for the user if user/pass match database"""
tmp = self._fetch_user_with_pass(username, password)
if tmp:
self._sync_user(tmp)
return tmp
def logout(self):
"""Logout the logged in user"""
user = self._fetch_user_by_cookie()
if user:
user.session_id = None
user.put()
def _gen_session_id(self):
return uuid.uuid4()
def _sync_user(self, _user):
sid = str(self._gen_session_id())
ssid = 'ssid=' + sid
self.handler.response.headers.add_header('Set-Cookie', ssid)
_user.session_id = sid
self.session_id = sid
_user.put()
def _fetch_user_by_cookie(self):
if not self.session_id:
try:
sid = self.handler.request.cookies['ssid']
except:
sid = ""
ssid = '='.join(('ssid', sid))
self.handler.response.headers.add_header('Set-Cookie', ssid)
else:
sid = self.session_id
data = MyUser.all().filter('session_id = ', sid).get()
return data
def _fetch_user_with_pass(self, u, p):
tmp = MyUser.get_by_key_name(u.lower())
if not tmp: return None
if tmp.password != p: return None
if tmp.active == False: return None
return tmp
class Login(webapp2.RequestHandler):
def get(self):
user = session(self).get_current_user()
if user:
self.redirect('/')
else:
variables = {}
path = os.path.join(os.path.dirname(__file__), 'login.html')
self.response.out.write(template.render(path, variables))
def post(self):
u = self.request.get('user')
p = self.request.get('pass')
tmp = session(self).grab_login(u, p)
if not tmp:
msg = u'Неверное имя пользователя или пароль.'
variables = {'message': msg}
path = os.path.join(os.path.dirname(__file__), 'login.html')
self.response.out.write(template.render(path, variables))
else:
time.sleep(1)
self.redirect('/')
class DoLogout(webapp2.RequestHandler):
def get(self):
session(self).logout()
time.sleep(1)
self.redirect('/login')