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 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 
15 16 @app.before_request 17 -def lookup_current_user():
18 flask.g.user = None 19 if 'openid' in flask.session: 20 flask.g.user = models.User.query.filter(models.User.openid_name==flask.session['openid']).first()
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
38 @oid.after_login 39 -def create_or_login(resp):
40 flask.session['openid'] = resp.identity_url 41 fasusername = resp.identity_url.replace('.id.fedoraproject.org/', '').replace('http://', '') 42 if fasusername and ((app.config['USE_ALLOWED_USERS'] \ 43 and fasusername in app.config['ALLOWED_USERS']) \ 44 or not app.config['USE_ALLOWED_USERS']): 45 user = models.User.query.filter( 46 models.User.openid_name == resp.identity_url).first() 47 if not user: # create if not created already 48 expiration_date_token = datetime.date.today() \ 49 + datetime.timedelta(days=flask.current_app.config['API_TOKEN_EXPIRATION']) 50 copr64 = base64.b64encode('copr') + '##' 51 user = models.User(openid_name = resp.identity_url, mail = resp.email, 52 timezone = resp.timezone, 53 api_login = copr64 + helpers.generate_api_token( 54 app.config['API_TOKEN_LENGTH'] - len(copr64)), 55 api_token = helpers.generate_api_token(app.config['API_TOKEN_LENGTH']), 56 api_token_expiration = expiration_date_token) 57 else: 58 user.mail = resp.email 59 user.timezone = resp.timezone 60 db.session.add(user) 61 db.session.commit() 62 flask.flash(u'Welcome, {0}'.format(user.name)) 63 flask.g.user = user 64 redirect_to = oid.get_next_url() 65 if flask.request.url_root == oid.get_next_url(): 66 return flask.redirect(flask.url_for('coprs_ns.coprs_by_owner', username=user.name)) 67 return flask.redirect(oid.get_next_url()) 68 else: 69 flask.flash('User "{0}" is not allowed'.format(user.name)) 70 return flask.redirect(oid.get_next_url())
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
79 80 -def api_login_required(f):
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
107 108 -def login_required(role=helpers.RoleEnum('user')):
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 # hack: if login_required is used without params, the "role" parameter 121 # is in fact the decorated function, so we need to return 122 # the wrapped function, not the wrapper 123 # proper solution would be to use login_required() with parentheses 124 # everywhere, even if they're empty - TODO 125 if callable(role): 126 return view_wrapper(role) 127 else: 128 return view_wrapper 129
130 131 # backend authentication 132 -def backend_authenticated(f):
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