aboutsummaryrefslogtreecommitdiff
path: root/app/blueprints/github/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/blueprints/github/__init__.py')
-rw-r--r--app/blueprints/github/__init__.py74
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"))