1 import base64
2 import datetime
3 import functools
4
5 import flask
6
7 from flask.ext.openid import OpenID
8
9 from coprs import app
10 from coprs import config
11 from coprs import db
12 from coprs import helpers
13 from coprs import models
14 from coprs import oid
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/', ask_for=['email', 'timezone'])
37
71
72
73 @misc.route('/logout/')
74 -def logout():
75 flask.session.pop('openid', None)
76 flask.flash(u'You were signed out')
77 return flask.redirect(oid.get_next_url())
78
81 @functools.wraps(f)
82 def decorated_function(*args, **kwargs):
83 token = None
84 username = None
85 if 'Authorization' in flask.request.headers:
86 base64string = flask.request.headers['Authorization']
87 base64string = base64string.split()[1].strip()
88 userstring = base64.b64decode(base64string)
89 (username, token) = userstring.split(':')
90 token_auth = False
91 if token and username:
92 user = models.User.query.filter(
93 models.User.api_login == username).first()
94 if user \
95 and user.api_token == token \
96 and user.api_token_expiration >= datetime.date.today():
97 token_auth = True
98 flask.g.user = user
99 if not token_auth:
100 output = {'output': 'notok', 'error': 'Login invalid/expired'}
101 jsonout = flask.jsonify(output)
102 jsonout.status_code = 500
103 return jsonout
104 return f(*args, **kwargs)
105 return decorated_function
106
109 def view_wrapper(f):
110 @functools.wraps(f)
111 def decorated_function(*args, **kwargs):
112 if flask.g.user is None:
113 return flask.redirect(flask.url_for('misc.login',
114 next = flask.request.url))
115 if role == helpers.RoleEnum('admin') and not flask.g.user.admin:
116 flask.flash('You are not allowed to access admin section.')
117 return flask.redirect(flask.url_for('coprs_ns.coprs_show'))
118 return f(*args, **kwargs)
119 return decorated_function
120
121
122
123
124
125 if callable(role):
126 return view_wrapper(role)
127 else:
128 return view_wrapper
129
133 @functools.wraps(f)
134 def decorated_function(*args, **kwargs):
135 auth = flask.request.authorization
136 if not auth or auth.password != app.config['BACKEND_PASSWORD']:
137 return 'You have to provide the correct password', 401
138 return f(*args, **kwargs)
139 return decorated_function
140