Package coprs :: Package views :: Module misc
[hide private]
[frames] | no frames]

Source Code for Module coprs.views.misc

  1  import base64 
  2  import datetime 
  3  import functools 
  4   
  5  import flask 
  6   
  7  from coprs import app 
  8  from coprs import db 
  9  from coprs import helpers 
 10  from coprs import models 
 11  from coprs import oid 
12 13 14 @app.before_request 15 -def lookup_current_user():
16 flask.g.user = None 17 if "openid" in flask.session: 18 flask.g.user = models.User.query.filter( 19 models.User.openid_name == flask.session["openid"]).first()
20
21 22 @app.errorhandler(404) 23 -def page_not_found(message):
24 return flask.render_template("404.html", message=message), 404
25 26 27 misc = flask.Blueprint("misc", __name__)
28 29 30 @misc.route("/login/", methods=["GET"]) 31 @oid.loginhandler 32 -def login():
33 if flask.g.user is not None: 34 return flask.redirect(oid.get_next_url()) 35 else: 36 return oid.try_login("https://id.fedoraproject.org/", 37 ask_for=["email", "timezone"])
38
39 40 @oid.after_login 41 -def create_or_login(resp):
42 flask.session["openid"] = resp.identity_url 43 fasusername = resp.identity_url.replace( 44 ".id.fedoraproject.org/", "").replace("http://", "") 45 46 # kidding me.. or not 47 if fasusername and ((app.config["USE_ALLOWED_USERS"] 48 and fasusername in app.config["ALLOWED_USERS"]) 49 or not app.config["USE_ALLOWED_USERS"]): 50 51 user = models.User.query.filter( 52 models.User.openid_name == resp.identity_url).first() 53 if not user: # create if not created already 54 expiration_date_token = datetime.date.today() + \ 55 datetime.timedelta( 56 days=flask.current_app.config["API_TOKEN_EXPIRATION"]) 57 58 copr64 = base64.b64encode("copr") + "##" 59 user = models.User(openid_name=resp.identity_url, mail=resp.email, 60 timezone=resp.timezone, 61 api_login=copr64 + helpers.generate_api_token( 62 app.config["API_TOKEN_LENGTH"] - len(copr64)), 63 api_token=helpers.generate_api_token( 64 app.config["API_TOKEN_LENGTH"]), 65 api_token_expiration=expiration_date_token) 66 else: 67 user.mail = resp.email 68 user.timezone = resp.timezone 69 70 db.session.add(user) 71 db.session.commit() 72 flask.flash(u"Welcome, {0}".format(user.name)) 73 flask.g.user = user 74 75 if flask.request.url_root == oid.get_next_url(): 76 return flask.redirect(flask.url_for("coprs_ns.coprs_by_owner", 77 username=user.name)) 78 return flask.redirect(oid.get_next_url()) 79 else: 80 flask.flash("User '{0}' is not allowed".format(user.name)) 81 return flask.redirect(oid.get_next_url())
82
83 84 @misc.route("/logout/") 85 -def logout():
86 flask.session.pop("openid", None) 87 flask.flash(u"You were signed out") 88 return flask.redirect(oid.get_next_url())
89
90 91 -def api_login_required(f):
92 @functools.wraps(f) 93 def decorated_function(*args, **kwargs): 94 token = None 95 username = None 96 if "Authorization" in flask.request.headers: 97 base64string = flask.request.headers["Authorization"] 98 base64string = base64string.split()[1].strip() 99 userstring = base64.b64decode(base64string) 100 (username, token) = userstring.split(":") 101 token_auth = False 102 if token and username: 103 user = models.User.query.filter( 104 models.User.api_login == username).first() 105 if (user and user.api_token == token and 106 user.api_token_expiration >= datetime.date.today()): 107 108 token_auth = True 109 flask.g.user = user 110 if not token_auth: 111 output = {"output": "notok", "error": "Login invalid/expired. " \ 112 "Please visit https://copr.fedoraproject.org/api " \ 113 "get or renew your API token."} 114 jsonout = flask.jsonify(output) 115 jsonout.status_code = 500 116 return jsonout 117 return f(*args, **kwargs)
118 return decorated_function 119
120 121 -def login_required(role=helpers.RoleEnum("user")):
122 def view_wrapper(f): 123 @functools.wraps(f) 124 def decorated_function(*args, **kwargs): 125 if flask.g.user is None: 126 return flask.redirect(flask.url_for("misc.login", 127 next=flask.request.url)) 128 129 if role == helpers.RoleEnum("admin") and not flask.g.user.admin: 130 flask.flash("You are not allowed to access admin section.") 131 return flask.redirect(flask.url_for("coprs_ns.coprs_show")) 132 133 return f(*args, **kwargs)
134 return decorated_function 135 # hack: if login_required is used without params, the "role" parameter 136 # is in fact the decorated function, so we need to return 137 # the wrapped function, not the wrapper 138 # proper solution would be to use login_required() with parentheses 139 # everywhere, even if they"re empty - TODO 140 if callable(role): 141 return view_wrapper(role) 142 else: 143 return view_wrapper 144
145 146 # backend authentication 147 -def backend_authenticated(f):
148 @functools.wraps(f) 149 def decorated_function(*args, **kwargs): 150 auth = flask.request.authorization 151 if not auth or auth.password != app.config["BACKEND_PASSWORD"]: 152 return "You have to provide the correct password", 401 153 154 return f(*args, **kwargs)
155 return decorated_function 156