def fas_register(username, full_name, email):
    """
    Register a new user from FAS.

    This can raise `exc.IntegrityError` exceptions in
    case of conflics found.

    :returns: User
    """

    auth_data_model = apps.get_model("users", "AuthData")
    user_model = apps.get_model("users", "User")

    try:
        # Github user association exist?
        auth_data = auth_data_model.objects.get(key="fas-openid", value=username)
        user = auth_data.user
    except auth_data_model.DoesNotExist:
        try:
            # Is a user with the same email as the FAS user?
            user = user_model.objects.get(email=email)
            auth_data_model.objects.create(user=user, key="fas-openid", value=username, extra={})
        except user_model.DoesNotExist:
            # Create a new user
            user = user_model.objects.create(email=email,
                                             username=username,
                                             full_name=full_name)
            auth_data_model.objects.create(user=user, key="fas-openid", value=username, extra={})

            send_register_email(user)
            user_registered_signal.send(sender=user.__class__, user=user)

    return user
def github_register(username: str,
                    email: str,
                    full_name: str,
                    github_id: int,
                    bio: str,
                    token: str = None):
    """
    Register a new user from github.

    This can raise `exc.IntegrityError` exceptions in
    case of conflics found.

    :returns: User
    """
    auth_data_model = apps.get_model("users", "AuthData")
    user_model = apps.get_model("users", "User")

    try:
        # Github user association exist?
        auth_data = auth_data_model.objects.get(key="github", value=github_id)
        user = auth_data.user
    except auth_data_model.DoesNotExist:
        try:
            # Is a user with the same email as the github user?
            user = user_model.objects.get(email=email)
            auth_data_model.objects.create(user=user,
                                           key="github",
                                           value=github_id,
                                           extra={})
        except user_model.DoesNotExist:
            if settings.PUBLIC_REGISTER_ENABLED:
                # Create a new user
                username_unique = slugify_uniquely(username,
                                                   user_model,
                                                   slugfield="username")
                user = user_model.objects.create(email=email,
                                                 username=username_unique,
                                                 full_name=full_name,
                                                 bio=bio)
                auth_data_model.objects.create(user=user,
                                               key="github",
                                               value=github_id,
                                               extra={})

                send_register_email(user)
                user_registered_signal.send(sender=user.__class__, user=user)
            else:
                return None

    if token:
        membership = get_membership_by_token(token)

        try:
            membership.user = user
            membership.save(update_fields=["user"])
        except IntegrityError:
            raise exc.IntegrityError(
                _("This user is already a member of the project."))

    return user
Example #3
0
def gitlab_register(username:str, email:str, full_name:str, gitlab_id:int, bio:str):
    """
    Register a new user from gitlab.

    This can raise `exc.IntegrityError` exceptions in
    case of conflics found.

    :returns: User
    """
    auth_data_model = apps.get_model("users", "AuthData")
    user_model = apps.get_model("users", "User")

    try:
        # Gitlab user association exist?
        auth_data = auth_data_model.objects.get(key="gitlab", value=gitlab_id)
        user = auth_data.user
    except auth_data_model.DoesNotExist:
        try:
            # Is a user with the same email as the gitlab user?
            user = user_model.objects.get(email=email)
            auth_data_model.objects.create(user=user, key="gitlab", value=gitlab_id, extra={})
        except user_model.DoesNotExist:
            # Create a new user
            username_unique = slugify_uniquely(username, user_model, slugfield="username")
            user = user_model.objects.create(email=email,
                                             username=username_unique,
                                             full_name=full_name,
                                             bio=bio)
            auth_data_model.objects.create(user=user, key="gitlab", value=gitlab_id, extra={})

            send_register_email(user)
            user_registered_signal.send(sender=user.__class__, user=user)

    return user
Example #4
0
def register_or_update(username: str, email: str, full_name: str,
                       password: str):
    """
    Register new or update existing user in Django DB from LDAP data.

    Can raise `exc.IntegrityError` exceptions in case of conflict found.

    :returns: User
    """
    user_model = apps.get_model('users', 'User')

    username_unique = username
    if SLUGIFY:
        username_unique = SLUGIFY(username)

    if EMAIL_MAP:
        email = EMAIL_MAP(email)

    if NAME_MAP:
        full_name = NAME_MAP(full_name)

    # TODO https://github.com/Monogramm/taiga-contrib-ldap-auth-ext/issues/15
    # TODO https://github.com/Monogramm/taiga-contrib-ldap-auth-ext/issues/17
    superuser = False

    try:
        # has user logged in before?
        user = user_model.objects.get(username=username_unique)
    except user_model.DoesNotExist:
        # create a new user
        user = user_model.objects.create(username=username_unique,
                                         email=email,
                                         full_name=full_name,
                                         is_superuser=superuser)
        if SAVE_USER_PASSWD:
            # Set local password to match LDAP (issues/21)
            user.set_password(password)

        user.save()

        user_registered_signal.send(sender=user.__class__, user=user)
        send_register_email(user)
    else:
        if SAVE_USER_PASSWD:
            # Set local password to match LDAP (issues/21)
            user.set_password(password)
        else:
            user.set_password(None)

        user.save()
        # update DB entry if LDAP field values differ
        if user.email != email or user.full_name != full_name:
            user_object = user_model.objects.filter(pk=user.pk)
            user_object.update(email=email, full_name=full_name)
            user.refresh_from_db()

    return user
Example #5
0
def ping_federate_register(
    username: str,
    email: str,
    full_name: str,
    ping_federate_guid: int,
    token: str = None,
):
    """
    Register a new user from ping federate.

    This can raise `exc.IntegrityError` exceptions in
    case of conflics found.

    :returns: User
    """
    auth_data_model = apps.get_model("users", "AuthData")
    user_model = apps.get_model("users", "User")

    try:
        # Ping federate user association exist?
        auth_data = auth_data_model.objects.get(
            key=USER_KEY,
            value=ping_federate_guid,
        )
        user = auth_data.user
    except auth_data_model.DoesNotExist:
        try:
            # Is a user with the same email as the google user?
            user = user_model.objects.get(email=email)
            auth_data_model.objects.create(user=user,
                                           key=USER_KEY,
                                           value=ping_federate_guid,
                                           extra={})
        except user_model.DoesNotExist:
            # Create a new user
            username_unique = slugify_uniquely(username,
                                               user_model,
                                               slugfield="username")
            user = user_model.objects.create(
                email=email,
                username=username_unique,
                full_name=full_name,
            )
            auth_data_model.objects.create(user=user,
                                           key=USER_KEY,
                                           value=ping_federate_guid,
                                           extra={})

            send_register_email(user)
            user_registered_signal.send(sender=user.__class__, user=user)

    if token:
        membership = get_membership_by_token(token)
        membership.user = user
        membership.save(update_fields=["user"])

    return user
def slack_register(username:str, email:str, full_name:str, slack_id:int, bio:str, token:str=None):
    """
    Register a new user from slack.

    This can raise `exc.IntegrityError` exceptions in
    case of conflics found.

    :returns: User
    """
    auth_data_model = apps.get_model("users", "AuthData")
    user_model = apps.get_model("users", "User")

    try:
        # slack user association exist?
        auth_data = auth_data_model.objects.get(key="slack", value=slack_id)
        user = auth_data.user
    except auth_data_model.DoesNotExist:
        try:
            # Is a user with the same email as the slack user?
            user = user_model.objects.get(email=email)
            auth_data_model.objects.create(user=user, key="slack", value=slack_id, extra={})
        except user_model.DoesNotExist:
            # Create a new user
            username_unique = slugify_uniquely(username, user_model, slugfield="username")
            user = user_model.objects.create(email=email,
                                             username=username_unique,
                                             full_name=full_name,
                                             bio=bio)
            auth_data_model.objects.create(user=user, key="slack", value=slack_id, extra={})

            send_register_email(user)
            user_registered_signal.send(sender=user.__class__, user=user)

    if token:
        membership = get_membership_by_token(token)

        try:
            membership.user = user
            membership.save(update_fields=["user"])
        except IntegrityError:
            raise exc.IntegrityError(_("This user is already a member of the project."))

    return user
Example #7
0
def saml_register(saml_id, user_attributes, token=None):
    auth_data_model = apps.get_model('users', 'AuthData')
    user_model = apps.get_model('users', 'User')

    try:
        # SAML user association exist?
        auth_data = auth_data_model.objects.get(key="saml", value=saml_id)
        user = auth_data.user
    except auth_data_model.DoesNotExist:
        try:
            # Is a there a user with the same email as the SAML user?
            user = user_model.objects.get(email=user_attributes['email'])
            auth_data_model.objects.create(user=user,
                                           key='saml',
                                           value=saml_id,
                                           extra={})
        except user_model.DoesNotExist:
            # Create a new user
            user_attributes['username'] = slugify_uniquely(
                user_attributes['username'], user_model, slugfield='username')
            user = user_model.objects.create(**user_attributes)
            auth_data_model.objects.create(user=user,
                                           key='saml',
                                           value=saml_id,
                                           extra={})

            send_register_email(user)
            user_registered_signal.send(sender=user.__class__, user=user)

    if token:
        membership = get_membership_by_token(token)

        try:
            membership.user = user
            membership.save(update_fields=['user'])
        except IntegrityError:
            raise exc.IntegrityError(
                _("This user is already a member of the project."))

    return user
Example #8
0
    def create_user(self, claims):
        email = claims.get("email")
        if not email:
            return None

        username = self.get_username(claims)
        full_name = claims.get("name", username)

        AuthData = apps.get_model("users", "AuthData")
        try:
            # User association exist?
            auth_data = AuthData.objects.get(key=self.AUTHDATA_KEY,
                                             value=username)
            user = auth_data.user
        except AuthData.DoesNotExist:
            try:
                # Is a user with the same email?
                user = self.UserModel.objects.get(email=email)
                AuthData.objects.create(user=user,
                                        key=self.AUTHDATA_KEY,
                                        value=username,
                                        extra={})
            except self.UserModel.DoesNotExist:
                # Create a new user
                user = self.UserModel.objects.create(email=email,
                                                     username=username,
                                                     full_name=full_name)
                AuthData.objects.create(user=user,
                                        key=self.AUTHDATA_KEY,
                                        value=username,
                                        extra={})

                send_register_email(user)
                user_registered_signal.send(sender=self.UserModel, user=user)

        return user
def ping_federate_register(
        username: str,
        email: str,
        full_name: str,
        ping_federate_guid: int,
        token: str=None,
):
    """
    Register a new user from ping federate.

    This can raise `exc.IntegrityError` exceptions in
    case of conflics found.

    :returns: User
    """
    auth_data_model = apps.get_model("users", "AuthData")
    user_model = apps.get_model("users", "User")

    try:
        # Ping federate user association exist?
        auth_data = auth_data_model.objects.get(
            key=USER_KEY,
            value=ping_federate_guid,
        )
        user = auth_data.user
    except auth_data_model.DoesNotExist:
        try:
            # Is a user with the same email as the google user?
            user = user_model.objects.get(email=email)
            auth_data_model.objects.create(
                user=user,
                key=USER_KEY,
                value=ping_federate_guid,
                extra={}
            )
        except user_model.DoesNotExist:
            # Create a new user
            username_unique = slugify_uniquely(
                username,
                user_model,
                slugfield="username"
            )
            user = user_model.objects.create(
                email=email,
                username=username_unique,
                full_name=full_name,
            )
            auth_data_model.objects.create(
                user=user,
                key=USER_KEY,
                value=ping_federate_guid,
                extra={}
            )

            send_register_email(user)
            user_registered_signal.send(
                sender=user.__class__,
                user=user
            )

    if token:
        membership = get_membership_by_token(token)
        membership.user = user
        membership.save(update_fields=["user"])

    return user