[copr] master: Rework the login_required decorator to allow token login With the current mechanism, one can either login via the website or provide a "token" and "username" POST or GET parameters. (789c2f9)

bkabrda at fedoraproject.org bkabrda at fedoraproject.org
Tue Jan 8 12:34:19 UTC 2013


Repository : http://git.fedorahosted.org/cgit/copr.git

On branch  : master

>---------------------------------------------------------------

commit 789c2f94f2900315d04bf0aa91435b2c8839a491
Author: Pierre-Yves Chibon <pingou at pingoured.fr>
Date:   Tue Jan 8 11:42:08 2013 +0100

    Rework the login_required decorator to allow token login
    With the current mechanism, one can either login via the website or
    provide a "token" and "username" POST or GET parameters.
    
    By providing the "token" and "username" parameters, one can access
    to all the functions of coprs and pretty do as much as via the
    website (assuming the other needed parameters are also given).


>---------------------------------------------------------------

 coprs_frontend/coprs/views/misc.py |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/coprs_frontend/coprs/views/misc.py b/coprs_frontend/coprs/views/misc.py
index 430604d..b2fc08c 100644
--- a/coprs_frontend/coprs/views/misc.py
+++ b/coprs_frontend/coprs/views/misc.py
@@ -56,7 +56,7 @@ def create_or_login(resp):
             + datetime.timedelta(days=30)
         user = models.User(openid_name = resp.identity_url, mail = resp.email,
             api_token = generate_api_token(),
-                api_token_expiration = expiration_date_token)
+            api_token_expiration = expiration_date_token)
         db.session.add(user)
         db.session.commit()
     flask.flash(u'Welcome, {0}'.format(user.name))
@@ -74,8 +74,21 @@ def logout():
 def login_required(f):
     @functools.wraps(f)
     def decorated_function(*args, **kwargs):
-        if flask.g.user is None:
-            return flask.redirect(flask.url_for('misc.login', next = flask.request.url))
+        token = flask.request.form.get('token')
+        username = flask.request.form.get('username')
+        token_auth = False
+        if token and username:
+            user = models.User.query.filter(
+                models.User.openid_name == models.User.openidize_name(username)
+                ).first()
+            if user \
+                and user.api_token == token \
+                and user.api_token_expiration >= datetime.date.today():
+                token_auth = True
+                flask.g.user = user
+        if not token_auth and flask.g.user is None:
+            return flask.redirect(flask.url_for('misc.login',
+                next = flask.request.url))
         return f(*args, **kwargs)
     return decorated_function
 
@@ -97,7 +110,7 @@ def api():
                                  user=flask.g.user)
 
 
- at misc.route('/api/new')
+ at misc.route('/api/new/', methods = ["POST"])
 @login_required
 def api_new_token():
     user = flask.g.user



More information about the copr-devel mailing list