Blame pagure/ui/fas_login.py

Pierre-Yves Chibon b130e5
# -*- coding: utf-8 -*-
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
"""
Pierre-Yves Chibon b130e5
 (c) 2014-2017 - Copyright Red Hat Inc
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
 Authors:
Pierre-Yves Chibon b130e5
   Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
"""
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon 67d1cc
from __future__ import unicode_literals, absolute_import
Aurélien Bompard dcf6f6
Pierre-Yves Chibon b130e5
import logging
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
import flask
Mary Kate Fain a16918
from flask import Markup
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
from sqlalchemy.exc import SQLAlchemyError
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon 930073
import pagure.lib.query
Pierre-Yves Chibon f00f95
import pagure.utils
Pierre-Yves Chibon b130e5
from pagure.flask_app import logout
Clement Verna 3fd9df
from pagure.config import config as pagure_config
Pierre-Yves Chibon b130e5
import flask_fas_openid
Pierre-Yves Chibon 9c2953
Pierre-Yves Chibon b130e5
FAS = flask_fas_openid.FAS()
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
_log = logging.getLogger(__name__)
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
@FAS.postlogin
Pierre-Yves Chibon b130e5
def set_user(return_url):
Pierre-Yves Chibon 9c2953
    """ After login method. """
Pierre-Yves Chibon b130e5
    if flask.g.fas_user.username is None:
Pierre-Yves Chibon b130e5
        flask.flash(
Pierre-Yves Chibon 9c2953
            "It looks like your OpenID provider did not provide an "
Pierre-Yves Chibon 9c2953
            "username we could retrieve, username being needed we cannot "
Pierre-Yves Chibon 9c2953
            "go further.",
Pierre-Yves Chibon 9c2953
            "error",
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon b130e5
        logout()
Pierre-Yves Chibon b130e5
        return flask.redirect(return_url)
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon 9c2953
    flask.session["_new_user"] = False
Pierre-Yves Chibon 930073
    user = pagure.lib.query.search_user(
Pierre-Yves Chibon 9c2953
        flask.g.session, username=flask.g.fas_user.username
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 1fef46
    if not user:
Pierre-Yves Chibon 9c2953
        flask.session["_new_user"] = True
Pierre-Yves Chibon 1fef46
    else:
Pierre-Yves Chibon 930073
        user_email = pagure.lib.query.search_user(
Pierre-Yves Chibon 9c2953
            flask.g.session, email=flask.g.fas_user.email
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 1fef46
        if user_email and user_email.user != user.user:
Pierre-Yves Chibon 1fef46
            flask.flash(
Pierre-Yves Chibon 9c2953
                "This email address seems to already be associated with "
Pierre-Yves Chibon 9c2953
                "another account and thus can not be associated with yours",
Pierre-Yves Chibon 9c2953
                "error",
Pierre-Yves Chibon 9c2953
            )
Pierre-Yves Chibon 1fef46
            logout()
Pierre-Yves Chibon 1fef46
            return flask.redirect(return_url)
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
    try:
Pierre-Yves Chibon 5acd44
        try:
Pierre-Yves Chibon 5acd44
            pagure.lib.query.set_up_user(
Pierre-Yves Chibon 5acd44
                session=flask.g.session,
Pierre-Yves Chibon 5acd44
                username=flask.g.fas_user.username,
Pierre-Yves Chibon 5acd44
                fullname=flask.g.fas_user.fullname,
Pierre-Yves Chibon 5acd44
                default_email=flask.g.fas_user.email,
Pierre-Yves Chibon 5acd44
                ssh_key=flask.g.fas_user.get("ssh_key"),
Pierre-Yves Chibon 5acd44
                keydir=pagure_config.get("GITOLITE_KEYDIR", None),
Pierre-Yves Chibon 5acd44
            )
Pierre-Yves Chibon 5acd44
        except pagure.exceptions.PagureException as err:
Pierre-Yves Chibon 5acd44
            message = str(err)
Pierre-Yves Chibon 5acd44
            if message == "SSH key invalid.":
Pierre-Yves Chibon 5acd44
                flask.flash(message, "error")
Pierre-Yves Chibon 5acd44
            else:
Pierre-Yves Chibon 5acd44
                raise
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
        # If groups are managed outside pagure, set up the user at login
Pierre-Yves Chibon 9c2953
        if not pagure_config.get("ENABLE_GROUP_MNGT", False):
Pierre-Yves Chibon 930073
            user = pagure.lib.query.search_user(
Pierre-Yves Chibon 9c2953
                flask.g.session, username=flask.g.fas_user.username
Pierre-Yves Chibon 9c2953
            )
Pierre-Yves Chibon b130e5
            groups = set(user.groups)
Pierre-Yves Chibon b130e5
            fas_groups = set(flask.g.fas_user.groups)
Pierre-Yves Chibon b130e5
            # Add the new groups
Pierre-Yves Chibon b130e5
            for group in fas_groups - groups:
Pierre-Yves Chibon b130e5
                groupobj = None
Pierre-Yves Chibon b130e5
                if group:
Pierre-Yves Chibon 930073
                    groupobj = pagure.lib.query.search_groups(
Pierre-Yves Chibon 9c2953
                        flask.g.session, group_name=group
Pierre-Yves Chibon 9c2953
                    )
Pierre-Yves Chibon b130e5
                if groupobj:
Pierre-Yves Chibon b130e5
                    try:
Pierre-Yves Chibon 930073
                        pagure.lib.query.add_user_to_group(
Pierre-Yves Chibon b130e5
                            session=flask.g.session,
Pierre-Yves Chibon b130e5
                            username=flask.g.fas_user.username,
Pierre-Yves Chibon b130e5
                            group=groupobj,
Pierre-Yves Chibon b130e5
                            user=flask.g.fas_user.username,
Pierre-Yves Chibon f00f95
                            is_admin=pagure.utils.is_admin(),
Pierre-Yves Chibon b130e5
                            from_external=True,
Pierre-Yves Chibon b130e5
                        )
Pierre-Yves Chibon b130e5
                    except pagure.exceptions.PagureException as err:
Pierre-Yves Chibon b130e5
                        _log.error(err)
Pierre-Yves Chibon b130e5
            # Remove the old groups
Pierre-Yves Chibon b130e5
            for group in groups - fas_groups:
Pierre-Yves Chibon b130e5
                if group:
Pierre-Yves Chibon b130e5
                    try:
Pierre-Yves Chibon 930073
                        pagure.lib.query.delete_user_of_group(
Pierre-Yves Chibon b130e5
                            session=flask.g.session,
Pierre-Yves Chibon b130e5
                            username=flask.g.fas_user.username,
Pierre-Yves Chibon b130e5
                            groupname=group,
Pierre-Yves Chibon b130e5
                            user=flask.g.fas_user.username,
Pierre-Yves Chibon f00f95
                            is_admin=pagure.utils.is_admin(),
Pierre-Yves Chibon b130e5
                            force=True,
Pierre-Yves Chibon b130e5
                            from_external=True,
Pierre-Yves Chibon b130e5
                        )
Pierre-Yves Chibon b130e5
                    except pagure.exceptions.PagureException as err:
Pierre-Yves Chibon b130e5
                        _log.error(err)
Pierre-Yves Chibon b130e5
Pierre-Yves Chibon b130e5
        flask.g.session.commit()
Pierre-Yves Chibon b130e5
    except SQLAlchemyError as err:
Pierre-Yves Chibon b130e5
        flask.g.session.rollback()
Pierre-Yves Chibon b130e5
        _log.exception(err)
Mary Kate Fain a16918
        message = Markup(
Mary Kate Fain a16918
            "Could not set up you as a user properly,"
Mary Kate Fain a16918
            ' please contact an administrator'
Pierre-Yves Chibon 9c2953
        )
Mary Kate Fain a16918
        flask.flash(message, "error")
Pierre-Yves Chibon b130e5
        # Ensure the user is logged out if we cannot set them up
Pierre-Yves Chibon b130e5
        # correctly
Pierre-Yves Chibon b130e5
        logout()
Pierre-Yves Chibon 5acd44
    except pagure.exceptions.PagureException as err:
Pierre-Yves Chibon 5acd44
        flask.flash(str(err), "error")
Pierre-Yves Chibon 5acd44
Pierre-Yves Chibon b130e5
    return flask.redirect(return_url)