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
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
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
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
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
136
137
138
139
140 if callable(role):
141 return view_wrapper(role)
142 else:
143 return view_wrapper
144
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