From 8b85bc3dad63bc3cc41df8311ae1a44da2dabbd2 Mon Sep 17 00:00:00 2001 From: Robbe Van Herck Date: Thu, 12 Jul 2018 21:37:37 +0200 Subject: [PATCH] Added login, moved files, started /achievements --- .gitignore | 4 +++ achievements.py | 11 ++++++++ app.py | 3 +-- config.example.py | 9 +++++++ endorsement.py | 14 +++------- login.py | 26 ++++++++++++++++++ models.py | 16 +++++++++++ user.py | 15 +++++++++++ zeus.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 154 insertions(+), 13 deletions(-) create mode 100644 achievements.py create mode 100644 config.example.py create mode 100644 login.py create mode 100644 user.py create mode 100644 zeus.py diff --git a/.gitignore b/.gitignore index 894a44c..77199c8 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,7 @@ venv.bak/ # mypy .mypy_cache/ + +# Endorsment-related +config.py +endorsement.db diff --git a/achievements.py b/achievements.py new file mode 100644 index 0000000..e455199 --- /dev/null +++ b/achievements.py @@ -0,0 +1,11 @@ +from app import app +from models import Achievement + +import json + +@app.route("/achievement/") +def get_achievement(id): + achievement = Achievement.query.filter_by(id=id).first() + if not achievement: + return "{}" + return json.dumps(achievement.to_obj()) \ No newline at end of file diff --git a/app.py b/app.py index acbbeb9..d416235 100644 --- a/app.py +++ b/app.py @@ -2,6 +2,5 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' -app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +app.config.from_object('config.Configuration') db = SQLAlchemy(app) diff --git a/config.example.py b/config.example.py new file mode 100644 index 0000000..b389650 --- /dev/null +++ b/config.example.py @@ -0,0 +1,9 @@ +class Configuration(object): + SQLALCHEMY_DATABASE_URI = 'sqlite:///endorsement.db' + SQLALCHEMY_TRACK_MODIFICATIONS = False + DEBUG = True + SECRET_KEY = '' + SLACK_WEBHOOK = '' + LOGFILE = 'endorsement.log' + ZEUS_KEY = 'tomtest' + ZEUS_SECRET = 'blargh' \ No newline at end of file diff --git a/endorsement.py b/endorsement.py index 87f8d0a..b2a37d4 100644 --- a/endorsement.py +++ b/endorsement.py @@ -1,14 +1,6 @@ from app import app, db from models import User, Achievement -import json -@app.route("/users/") -def get_user(username): - user = User.query.filter_by(username=username).first() - if not user: - return "{}" - return json.dumps(user.to_obj()) - -@app.route("/users/") -def all_users(): - return json.dumps([user.to_obj() for user in User.query.all()]) \ No newline at end of file +from login import * +from user import * +from achievements import * \ No newline at end of file diff --git a/login.py b/login.py new file mode 100644 index 0000000..1d39873 --- /dev/null +++ b/login.py @@ -0,0 +1,26 @@ +from flask import redirect, session, url_for +from flask_login import LoginManager, logout_user + +from app import app +from models import User +from zeus import zeus_login + +login_manager = LoginManager() +login_manager.init_app(app) + +@login_manager.user_loader +def load_user(userid): + return User.query.filter_by(id=userid).first() + + +@app.route('/login') +def login(): + return zeus_login() + + +@app.route('/logout') +def logout(): + if 'zeus_token' in session: + session.pop('zeus_token', None) + logout_user() + return redirect(url_for('home')) \ No newline at end of file diff --git a/models.py b/models.py index f199945..8b6c812 100644 --- a/models.py +++ b/models.py @@ -16,6 +16,22 @@ class User(db.Model): def __repr__(self): return '' % self.username + + # For login + def is_authenticated(self): + return True + + def is_active(self): + return True + + def is_admin(self): + return self.admin + + def is_anonymous(self): + return False + + def get_id(self): + return str(self.username) class Achievement(db.Model): id = db.Column(db.Integer, primary_key=True) diff --git a/user.py b/user.py new file mode 100644 index 0000000..56344b0 --- /dev/null +++ b/user.py @@ -0,0 +1,15 @@ +from app import app +from models import User + +import json + +@app.route("/users/") +def get_user(username): + user = User.query.filter_by(username=username).first() + if not user: + return "{}" + return json.dumps(user.to_obj()) + +@app.route("/users/") +def all_users(): + return json.dumps([user.to_obj() for user in User.query.all()]) \ No newline at end of file diff --git a/zeus.py b/zeus.py new file mode 100644 index 0000000..db08526 --- /dev/null +++ b/zeus.py @@ -0,0 +1,69 @@ +from flask import redirect, url_for, session, jsonify, flash, request +from flask_login import login_user +from flask_oauthlib.client import OAuth, OAuthException +import json +import requests + + +from app import app, db +from models import User + +oauth = OAuth(app) + +zeus = oauth.remote_app( + 'zeus', + consumer_key=app.config['ZEUS_KEY'], + consumer_secret=app.config['ZEUS_SECRET'], + request_token_params={}, + base_url='https://adams.ugent.be/oauth/api/', + access_token_method='POST', + access_token_url='https://adams.ugent.be/oauth/oauth2/token/', + authorize_url='https://adams.ugent.be/oauth/oauth2/authorize/' +) + + +def zeus_login(): + return zeus.authorize(callback=url_for('authorized', _external=True)) + + +@app.route('/login/zeus/authorized') +def authorized(): + resp = zeus.authorized_response() + if resp is None: + return 'Access denied: reason=%s error=%s' % ( + request.args['error'], + request.args['error_description'] + ) + if isinstance(resp, OAuthException): + return 'Access denied: %s' % resp.message + '
' + str(resp.data) + + session['zeus_token'] = (resp['access_token'], '') + me = zeus.get('current_user/') + username = me.data.get('username', '').lower() + + user = User.query.filter_by(username=username).first() + if len(username) > 0 and user: + return login_and_redirect_user(user) + elif len(username) > 0: + user = create_user(username) + return login_and_redirect_user(user) + + flash("You're not allowed to enter, please contact a system administrator") + return redirect(url_for("all_users")) + + +@zeus.tokengetter +def get_zeus_oauth_token(): + return session.get('zeus_token') + + +def login_and_redirect_user(user): + login_user(user) + return redirect(url_for("all_users")) + + +def create_user(username): + user = User(username=username) + db.session.add(user) + db.session.commit() + return user \ No newline at end of file