forked from hami9x/Guss
-
Notifications
You must be signed in to change notification settings - Fork 0
/
user.py
102 lines (91 loc) · 3.83 KB
/
user.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
# Copyright 2012 Hai Thanh Nguyen
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from datetime import datetime, timedelta
from google.appengine.ext import ndb
from utils import generate_random_string
from webapp2_extras.i18n import _lazy as _
import model
class UserModel(model.FormModel):
username = ndb.StringProperty(verbose_name=_(u"Username"))
password = model.PasswordProperty(verbose_name=_(u"Password"))
email = ndb.StringProperty(verbose_name=_(u"Email"))
created = ndb.DateTimeProperty(auto_now_add=True)
verified = model.BooleanProperty(verbose_name=_(u"Verified"))
_password_confirm = model.UnsavedProperty(verbose_name=_(u"Confirm password"))
def __init__(self, *args, **kwds):
super(UserModel, self).__init__(*args, **kwds)
def _validation(self):
return {
"username": {"required": (), "word": (), "unique": ()},
"email": {"required": (), "email": (), "unique": ()},
"password": {"required": (), "password": (), "min_length": (8,)},
"_password_confirm": {"required": (), "confirm_password": (self.password,)},
}
def login(self):
q = ndb.gql("SELECT password, verified FROM UserModel WHERE username = :1",
self.username).get()
if not q: return 0
if (model.PasswordProperty.do_hash(self.password) == q.password):
if q.verified:
self.key = q.key
return 1
else:
return -1
else: return 0
class UserCookieModel(ndb.Model):
token = ndb.StringProperty()
"""Generate a random string for cookie validation"""
def generate_cookie_token():
return generate_random_string(50)
"""Save userid and the token for cookie validation to the cookie and database"""
def save_cookie(handler, userkey):
token = generate_cookie_token()
cookie_value = userkey.urlsafe() + "|" + token
expire = datetime.now() + timedelta(days=30)
handler.response.set_cookie("_", cookie_value, expires = expire, httponly=True, overwrite=True)
q = ndb.Key("UserCookieModel", userkey.id()).get()
if not q:
model = UserCookieModel(id=userkey.id(), token=token)
model.put()
else:
q.token = token
q.put()
"""A normal lightweight class, just to be used for the return of get_current_user"""
class UserInfo:
def __init__(self, userkey, username, email):
self.key = ndb.Key(urlsafe=userkey)
self.username = username
self.email = email
"""Get the current logged in user"""
def get_current_user(handler):
username = handler.session.get("username", None)
if username == None:
value = handler.request.cookies.get("_", None)
if value == None: return None
l = value.split("|")
key = l[0]
token = l[1]
userkey = ndb.Key(urlsafe=key)
userid = userkey.id()
q = ndb.Key("UserCookieModel", userid).get()
if (not q) or (q.token != token):
return None
else:
q = userkey.get()
handler.session["userkey"] = key
handler.session["username"] = q.username
handler.session["email"] = q.email
return UserInfo(key, q.username, q.email)
else:
return UserInfo(handler.session.get("userkey"), username, handler.session.get("email"))