diff options
Diffstat (limited to 'app/blueprints/github/__init__.py')
-rw-r--r-- | app/blueprints/github/__init__.py | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/app/blueprints/github/__init__.py b/app/blueprints/github/__init__.py new file mode 100644 index 0000000..8a04390 --- /dev/null +++ b/app/blueprints/github/__init__.py @@ -0,0 +1,74 @@ +# Content DB +# Copyright (C) 2018 rubenwardy +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +from flask import Blueprint + +bp = Blueprint("github", __name__) + +from flask import redirect, url_for, request, flash +from flask_user import current_user +from sqlalchemy import func +from flask_github import GitHub +from app import github +from app.models import db, User +from app.utils import loginUser + +@bp.route("/github/start/") +def start(): + return github.authorize("") + +@bp.route("/user/github/callback/") +@github.authorized_handler +def callback(oauth_token): + next_url = request.args.get("next") + if oauth_token is None: + flash("Authorization failed [err=gh-oauth-login-failed]", "danger") + return redirect(url_for("user.login")) + + import requests + + # Get Github username + url = "https://api.github.com/user" + r = requests.get(url, headers={"Authorization": "token " + oauth_token}) + username = r.json()["login"] + + # Get user by github username + userByGithub = User.query.filter(func.lower(User.github_username) == func.lower(username)).first() + + # If logged in, connect + if current_user and current_user.is_authenticated: + if userByGithub is None: + current_user.github_username = username + db.session.commit() + flash("Linked github to account", "success") + return redirect(url_for("homepage.home")) + else: + flash("Github account is already associated with another user", "danger") + return redirect(url_for("homepage.home")) + + # If not logged in, log in + else: + if userByGithub is None: + flash("Unable to find an account for that Github user", "danger") + return redirect(url_for("users.claim")) + elif loginUser(userByGithub): + if not current_user.hasPassword(): + return redirect(next_url or url_for("users.set_password", optional=True)) + else: + return redirect(next_url or url_for("homepage.home")) + else: + flash("Authorization failed [err=gh-login-failed]", "danger") + return redirect(url_for("user.login")) |