aboutsummaryrefslogtreecommitdiff
path: root/app/views/githublogin.py
diff options
context:
space:
mode:
authorrubenwardy <rw@rubenwardy.com>2018-03-18 18:05:53 +0000
committerrubenwardy <rw@rubenwardy.com>2018-03-18 18:05:53 +0000
commit7d20c49ebb2a59e54a77ab92f268acd7fe069383 (patch)
tree6d28dfd1eeb8c13cfa82ff965b138e4b3634292b /app/views/githublogin.py
parent7f4faf21fae08c5e661c8f45ebda570dec3e8996 (diff)
downloadcheatdb-7d20c49ebb2a59e54a77ab92f268acd7fe069383.tar.xz
Add Github login
Diffstat (limited to 'app/views/githublogin.py')
-rw-r--r--app/views/githublogin.py100
1 files changed, 100 insertions, 0 deletions
diff --git a/app/views/githublogin.py b/app/views/githublogin.py
new file mode 100644
index 0000000..327fa8e
--- /dev/null
+++ b/app/views/githublogin.py
@@ -0,0 +1,100 @@
+from flask import *
+from flask_user import *
+from flask_login import login_user, logout_user
+import flask_menu as menu
+from flask_github import GitHub
+from app import app, github
+from app.models import *
+
+
+@app.route('/user/github/start/')
+def github_signin_page():
+ return github.authorize("public_repo,repo")
+
+
+def _do_login_user(user, remember_me=False):
+ def _call_or_get(v):
+ if callable(v):
+ return v()
+ else:
+ return v
+
+ # User must have been authenticated
+ if not user:
+ return False
+
+ user.active = True
+ db.session.commit()
+
+ # Check if user account has been disabled
+ if not _call_or_get(user.is_active):
+ flash('Your account has not been enabled.', 'error')
+ return False
+
+ # Check if user has a confirmed email address
+ user_manager = current_app.user_manager
+ if user_manager.enable_email and user_manager.enable_confirm_email \
+ and not current_app.user_manager.enable_login_without_confirm_email \
+ and not user.has_confirmed_email():
+ url = url_for('user.resend_confirm_email')
+ flash("Your email address has not yet been confirmed", 'error')
+ return False
+
+ # Use Flask-Login to sign in user
+ login_user(user, remember=remember_me)
+ signals.user_logged_in.send(current_app._get_current_object(), user=user)
+
+ flash('You have signed in successfully.', 'success')
+
+ return True
+
+
+
+def _login_user(user):
+ user_mixin = None
+ if user_manager.enable_username:
+ user_mixin = user_manager.find_user_by_username(user.username)
+
+ return _do_login_user(user_mixin, False)
+
+
+
+@app.route('/user/github/callback/')
+@github.authorized_handler
+def github_authorized(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_by(github_username=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.add(auth)
+ db.session.commit()
+ return redirect(url_for("gitAccount", id=auth.id))
+ else:
+ flash("Github account is already associated with another user", "danger")
+ return redirect(url_for("home_page"))
+
+ # If not logged in, log in
+ else:
+ if userByGithub is None:
+ flash("Authorization failed [err=gh-no-such-account]", "danger")
+ return redirect(url_for("user.login"))
+ elif _login_user(userByGithub):
+ return redirect(next_url or url_for("home_page"))
+ else:
+ flash("Authorization failed [err=gh-login-failed]", "danger")
+ return redirect(url_for("user.login"))