aboutsummaryrefslogtreecommitdiff
path: root/wqflask
diff options
context:
space:
mode:
Diffstat (limited to 'wqflask')
-rw-r--r--wqflask/wqflask/user_manager.py60
1 files changed, 57 insertions, 3 deletions
diff --git a/wqflask/wqflask/user_manager.py b/wqflask/wqflask/user_manager.py
index 15eaf8cc..d652f2e9 100644
--- a/wqflask/wqflask/user_manager.py
+++ b/wqflask/wqflask/user_manager.py
@@ -13,6 +13,7 @@ import urlparse
import simplejson as json
+#from redis import StrictRedis
import redis # used for collections
Redis = redis.StrictRedis()
@@ -41,6 +42,7 @@ from smtplib import SMTP
from utility.tools import SMTP_CONNECT, SMTP_USERNAME, SMTP_PASSWORD, LOG_SQL_ALCHEMY
THREE_DAYS = 60 * 60 * 24 * 3
+#THREE_DAYS = 45
def timestamp():
return datetime.datetime.utcnow().isoformat()
@@ -64,6 +66,16 @@ class AnonUser(object):
def set_cookie(response):
response.set_cookie(self.cookie_name, self.cookie)
+ def add_collection(self, new_collection):
+ collection_dict = dict(name = new_collection.name,
+ created_timestamp = datetime.datetime.utcnow().strftime('%b %d %Y %I:%M%p'),
+ changed_timestamp = datetime.datetime.utcnow().strftime('%b %d %Y %I:%M%p'),
+ num_members = new_collection.num_members,
+ members = new_collection.get_members())
+
+ Redis.set(self.key, json.dumps(collection_dict))
+ Redis.expire(self.key, 60 * 60 * 24 * 5)
+
def delete_collection(self, collection_name):
existing_collections = self.get_collections()
updated_collections = []
@@ -159,11 +171,19 @@ class UserSession(object):
self.session_id = session_id
self.record = Redis.hgetall(self.redis_key)
+
if not self.record:
# This will occur, for example, when the browser has been left open over a long
# weekend and the site hasn't been visited by the user
self.logged_in = False
+ ########### Grrr...this won't work because of the way flask handles cookies
+ # Delete the cookie
+ #response = make_response(redirect(url_for('login')))
+ #response.set_cookie(self.cookie_name, '', expires=0)
+ #flash(
+ # "Due to inactivity your session has expired. If you'd like please login again.")
+ #return response
return
if Redis.ttl(self.redis_key) < THREE_DAYS:
@@ -198,6 +218,7 @@ class UserSession(object):
self.db_object = model.User.query.get(self.user_id)
return self.db_object
+
def delete_session(self):
# And more importantly delete the redis record
Redis.delete(self.cookie_name)
@@ -213,10 +234,12 @@ class UsersManager(object):
self.users = model.User.query.all()
logger.debug("Users are:", self.users)
+
class UserManager(object):
def __init__(self, kw):
self.user_id = kw['user_id']
logger.debug("In UserManager locals are:", pf(locals()))
+ #self.user = model.User.get(user_id)
#logger.debug("user is:", user)
self.user = model.User.query.get(self.user_id)
logger.debug("user is:", self.user)
@@ -230,8 +253,10 @@ class UserManager(object):
logger.debug(" Confidential:", dataset.check_confidentiality())
#logger.debug(" ---> self.datasets:", self.datasets)
+
class RegisterUser(object):
def __init__(self, kw):
+ self.thank_you_mode = False
self.errors = []
self.user = Bunch()
es = kw.get('es_connection', None)
@@ -279,6 +304,7 @@ def set_password(password, user):
pwfields.algorithm = "pbkdf2"
pwfields.hashfunc = "sha256"
+ #hashfunc = getattr(hashlib, pwfields.hashfunc)
# Encoding it to base64 makes storing it in json much easier
pwfields.salt = base64.b64encode(os.urandom(32))
@@ -307,6 +333,7 @@ def set_password(password, user):
sort_keys=True,
)
+
class VerificationEmail(object):
template_name = "email/verification.txt"
key_prefix = "verification_code"
@@ -321,6 +348,7 @@ class VerificationEmail(object):
)
Redis.set(key, data)
+ #two_days = 60 * 60 * 24 * 2
Redis.expire(key, THREE_DAYS)
to = user.email_address
subject = self.subject
@@ -435,6 +463,7 @@ def password_reset_step2():
logger.debug("locals are:", locals())
+
user = Bunch()
password = request.form['password']
set_password(password, user)
@@ -460,6 +489,8 @@ class DecodeUser(object):
def __init__(self, code_prefix):
verify_url_hmac(request.url)
+ #params = urlparse.parse_qs(url)
+
self.verification_code = request.args['code']
self.user = self.actual_get_user(code_prefix, self.verification_code)
@@ -631,6 +662,8 @@ class LoginUser(object):
else:
import_col = "false"
+ #g.cookie_session.import_traits_to_user()
+
return self.actual_login(user, import_collections=import_col)
else:
@@ -658,6 +691,7 @@ class LoginUser(object):
login_rec.successful = True
login_rec.session_id = str(uuid.uuid4())
login_rec.assumed_by = assumed_by
+ #session_id = "session_id:{}".format(login_rec.session_id)
session_id_signature = actual_hmac_creation(login_rec.session_id)
session_id_signed = login_rec.session_id + ":" + session_id_signature
logger.debug("session_id_signed:", session_id_signed)
@@ -692,12 +726,13 @@ def logout():
response.set_cookie(UserSession.cookie_name, '', expires=0)
return response
+
@app.route("/n/forgot_password", methods=['GET'])
def forgot_password():
"""Entry point for forgotten password"""
- logger.debug("ARGS: ", request.args)
+ print("ARGS: ", request.args)
errors = {"no-email": request.args.get("no-email")}
- logger.debug("ERRORS: ", errors)
+ print("ERRORS: ", errors)
return render_template("new_security/forgot_password.html", errors=errors)
@app.route("/n/forgot_password_submit", methods=('POST',))
@@ -733,6 +768,8 @@ def super_only():
flash("You must be a superuser to access that page.", "alert-error")
abort(401)
+
+
@app.route("/manage/users")
def manage_users():
super_only()
@@ -773,11 +810,13 @@ def assume_identity():
assumed_by = g.user_session.user_id
return LoginUser().actual_login(user, assumed_by=assumed_by)
+
@app.route("/n/register", methods=('GET', 'POST'))
def register():
params = None
errors = None
+
params = request.form if request.form else request.args
params = params.to_dict(flat=True)
es = get_elasticsearch_connection()
@@ -794,6 +833,7 @@ def register():
return render_template("new_security/register_user.html", values=params, errors=errors)
+
################################# Sign and unsign #####################################
def url_for_hmac(endpoint, **values):
@@ -812,6 +852,7 @@ def data_hmac(stringy):
"""Takes arbitray data string and appends :hmac so we know data hasn't been tampered with"""
return stringy + ":" + actual_hmac_creation(stringy)
+
def verify_url_hmac(url):
"""Pass in a url that was created with url_hmac and this assures it hasn't been tampered with"""
logger.debug("url passed in to verify is:", url)
@@ -846,6 +887,13 @@ app.jinja_env.globals.update(url_for_hmac=url_for_hmac,
#######################################################################################
+# def send_email(to, subject, body):
+# msg = json.dumps(dict(From="no-reply@genenetwork.org",
+# To=to,
+# Subject=subject,
+# Body=body))
+# Redis.rpush("mail_queue", msg)
+
def send_email(toaddr, msg, fromaddr="no-reply@genenetwork.org"):
"""Send an E-mail through SMTP_CONNECT host. If SMTP_USERNAME is not
'UNKNOWN' TLS is used
@@ -870,4 +918,10 @@ def send_email(toaddr, msg, fromaddr="no-reply@genenetwork.org"):
class GroupsManager(object):
def __init__(self, kw):
- self.datasets = create_datasets_list() \ No newline at end of file
+ self.datasets = create_datasets_list()
+
+
+class RolesManager(object):
+ def __init__(self):
+ self.roles = model.Role.query.all()
+ logger.debug("Roles are:", self.roles)