Unverified Commit d3fe4261 authored by Peter Stanko's avatar Peter Stanko
Browse files

Fixes in the imports and periodic tasks

parent adcc7f15
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+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
@@ -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()
+33 −24
Original line number Diff line number Diff line
@@ -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

@@ -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 \
@@ -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(
@@ -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)
@@ -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'],
@@ -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')))
@@ -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}")