Loading portal/__init__.py +1 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ from flask_cors import CORS from flask_jwt_extended import JWTManager from flask_migrate import Migrate from authlib.flask.client import OAuth from flask_sqlalchemy import SQLAlchemy from storage import Storage from portal import logger, rest Loading portal/async_celery/periodic_tasks.py +2 −1 Original line number Diff line number Diff line import datetime from portal.async_celery import celery_app from portal.service.rest import RestService @celery_app.on_after_configure.connect Loading Loading @@ -31,11 +30,13 @@ def abort_non_proc_submissions(**kwargs): @celery_app.task def delete_cancelled_submissions(): from portal.service.rest import RestService subm_service = RestService().submissions subm_service.delete_cancelled_submissions() @celery_app.task def archive_submissions_in_arch_project(): from portal.service.rest import RestService subm_service = RestService().submissions subm_service.archive_submissions() portal/rest/gitlab.py +33 −24 Original line number Diff line number Diff line Loading @@ -3,8 +3,10 @@ from typing import Union from flask import Flask, Response, make_response, redirect, request, session from flask_oauthlib.client import OAuthRemoteApp from flask_restplus import Namespace from gitlab import Gitlab from gitlab.v4.objects import User, CurrentUser from portal import logger, oauth from portal import gitlab_factory, logger, oauth from portal.rest import rest_api from portal.rest.custom_resource import CustomResource Loading @@ -13,16 +15,6 @@ log = logger.get_logger(__name__) oauth_namespace = Namespace('oauth') def extract_user_info(me: dict) -> dict: log.debug(f"[GITLAB] Received info: {me}") return dict( uco=None, name=me['name'], username=me['username'], email=me['email'] ) def gitlab_enabled(app: Flask) -> bool: return app.config.get('GITLAB_URL') and \ app.config.get('GITLAB_CLIENT_ID') and \ Loading @@ -34,8 +26,8 @@ def register_gitlab_app() -> Union[OAuthRemoteApp, None]: return base_url = oauth.app.config['GITLAB_URL'] client_id = oauth.app.app.config['GITLAB_CLIENT_ID'] client_secret = oauth.oauth_app.app.config['GITLAB_CLIENT_SECRET'] client_id = oauth.app.config['GITLAB_CLIENT_ID'] client_secret = oauth.app.config['GITLAB_CLIENT_SECRET'] api_base_url = base_url + '/api/v4/' params = dict( Loading @@ -57,7 +49,7 @@ register_gitlab_app() @oauth_namespace.route('/login') class OAuthLogin(CustomResource): def get(self): if gitlab_enabled(oauth.app): if not gitlab_enabled(oauth.app): return {'message': 'Gitlab OAuth is not enabled'}, 404 callback = rest_api.url_for(OAuthLoginAuthorized, _external=True) Loading @@ -72,6 +64,7 @@ class OAuthLoginAuthorized(CustomResource): if not gitlab_enabled(oauth.app): return {'message': 'Gitlab OAuth is not enabled'}, 404 resp = oauth.gitlab.authorize_access_token() log.debug(f"Access token get: {resp}") if resp is None: return 'Access denied: reason=%s error=%s' % ( request.args['error'], Loading @@ -89,19 +82,19 @@ def user_oauth_register(user_info): rest = RestService() new_user = rest.users.create( uco=None, username=user_info['username'], name=user_info['name'], email=user_info['email'], username=user_info.username, name=user_info.name, email=user_info.email, is_admin=False ) log.info(f"[GITLAB] Created user={new_user}") return new_user def user_login(user_info) -> Response: def user_login(user_info: CurrentUser) -> Response: from portal.service.rest import RestService rest = RestService() user = rest.find.user(user_info['username'], throws=False) user = rest.find.user(user_info.username, throws=False) if not user: user = user_oauth_register(user_info) resp = make_response(redirect(oauth.app.config.get('FRONTEND_URL'))) Loading @@ -116,9 +109,25 @@ def extract_token(resp): return token def gitlab_get_user(token) -> User: client: Gitlab = gitlab_factory.instance(oauth_token=token) try: client.auth() user = client.user return user except Exception as ex: log.error(f"[GITLAB] Error: {ex}") return None def login_to_gitlab_with_token(token): me = oauth.gitlab.get('/api/v4/user') user_info = extract_user_info(me.data) login = user_login(user_info) log.debug(f"Logging in to gitlab with token: {token}") try: me = gitlab_get_user(token) login = user_login(me) login.set_cookie('gitlab_token', token) return login except Exception as ex: log.error(f"[GITLAB] Error: {ex}") Loading
portal/__init__.py +1 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ from flask_cors import CORS from flask_jwt_extended import JWTManager from flask_migrate import Migrate from authlib.flask.client import OAuth from flask_sqlalchemy import SQLAlchemy from storage import Storage from portal import logger, rest Loading
portal/async_celery/periodic_tasks.py +2 −1 Original line number Diff line number Diff line import datetime from portal.async_celery import celery_app from portal.service.rest import RestService @celery_app.on_after_configure.connect Loading Loading @@ -31,11 +30,13 @@ def abort_non_proc_submissions(**kwargs): @celery_app.task def delete_cancelled_submissions(): from portal.service.rest import RestService subm_service = RestService().submissions subm_service.delete_cancelled_submissions() @celery_app.task def archive_submissions_in_arch_project(): from portal.service.rest import RestService subm_service = RestService().submissions subm_service.archive_submissions()
portal/rest/gitlab.py +33 −24 Original line number Diff line number Diff line Loading @@ -3,8 +3,10 @@ from typing import Union from flask import Flask, Response, make_response, redirect, request, session from flask_oauthlib.client import OAuthRemoteApp from flask_restplus import Namespace from gitlab import Gitlab from gitlab.v4.objects import User, CurrentUser from portal import logger, oauth from portal import gitlab_factory, logger, oauth from portal.rest import rest_api from portal.rest.custom_resource import CustomResource Loading @@ -13,16 +15,6 @@ log = logger.get_logger(__name__) oauth_namespace = Namespace('oauth') def extract_user_info(me: dict) -> dict: log.debug(f"[GITLAB] Received info: {me}") return dict( uco=None, name=me['name'], username=me['username'], email=me['email'] ) def gitlab_enabled(app: Flask) -> bool: return app.config.get('GITLAB_URL') and \ app.config.get('GITLAB_CLIENT_ID') and \ Loading @@ -34,8 +26,8 @@ def register_gitlab_app() -> Union[OAuthRemoteApp, None]: return base_url = oauth.app.config['GITLAB_URL'] client_id = oauth.app.app.config['GITLAB_CLIENT_ID'] client_secret = oauth.oauth_app.app.config['GITLAB_CLIENT_SECRET'] client_id = oauth.app.config['GITLAB_CLIENT_ID'] client_secret = oauth.app.config['GITLAB_CLIENT_SECRET'] api_base_url = base_url + '/api/v4/' params = dict( Loading @@ -57,7 +49,7 @@ register_gitlab_app() @oauth_namespace.route('/login') class OAuthLogin(CustomResource): def get(self): if gitlab_enabled(oauth.app): if not gitlab_enabled(oauth.app): return {'message': 'Gitlab OAuth is not enabled'}, 404 callback = rest_api.url_for(OAuthLoginAuthorized, _external=True) Loading @@ -72,6 +64,7 @@ class OAuthLoginAuthorized(CustomResource): if not gitlab_enabled(oauth.app): return {'message': 'Gitlab OAuth is not enabled'}, 404 resp = oauth.gitlab.authorize_access_token() log.debug(f"Access token get: {resp}") if resp is None: return 'Access denied: reason=%s error=%s' % ( request.args['error'], Loading @@ -89,19 +82,19 @@ def user_oauth_register(user_info): rest = RestService() new_user = rest.users.create( uco=None, username=user_info['username'], name=user_info['name'], email=user_info['email'], username=user_info.username, name=user_info.name, email=user_info.email, is_admin=False ) log.info(f"[GITLAB] Created user={new_user}") return new_user def user_login(user_info) -> Response: def user_login(user_info: CurrentUser) -> Response: from portal.service.rest import RestService rest = RestService() user = rest.find.user(user_info['username'], throws=False) user = rest.find.user(user_info.username, throws=False) if not user: user = user_oauth_register(user_info) resp = make_response(redirect(oauth.app.config.get('FRONTEND_URL'))) Loading @@ -116,9 +109,25 @@ def extract_token(resp): return token def gitlab_get_user(token) -> User: client: Gitlab = gitlab_factory.instance(oauth_token=token) try: client.auth() user = client.user return user except Exception as ex: log.error(f"[GITLAB] Error: {ex}") return None def login_to_gitlab_with_token(token): me = oauth.gitlab.get('/api/v4/user') user_info = extract_user_info(me.data) login = user_login(user_info) log.debug(f"Logging in to gitlab with token: {token}") try: me = gitlab_get_user(token) login = user_login(me) login.set_cookie('gitlab_token', token) return login except Exception as ex: log.error(f"[GITLAB] Error: {ex}")