コード例 #1
0
def social_create_user(strategy: DjangoStrategy, details, backend, user=None, *args, **kwargs):
    if user:
        return {"is_new": False}
    user_email = details["email"][0] if isinstance(details["email"], (list, tuple)) else details["email"]
    user_name = details["fullname"]
    strategy.session_set("user_name", user_name)
    strategy.session_set("backend", backend.name)
    from_invite = False
    invite_id = strategy.session_get("invite_id")
    if not invite_id:
        company_name = strategy.session_get("company_name", None)
        email_opt_in = strategy.session_get("email_opt_in", None)
        if not company_name or email_opt_in is None:
            return redirect(finish_social_signup)
        _, _, user = User.objects.bootstrap(
            company_name=company_name, first_name=user_name, email=user_email, email_opt_in=email_opt_in, password=None
        )
    else:
        from_invite = True
        try:
            invite: Union[OrganizationInvite, TeamInviteSurrogate] = OrganizationInvite.objects.select_related(
                "organization"
            ).get(id=invite_id)
        except (OrganizationInvite.DoesNotExist, ValidationError):
            try:
                invite = TeamInviteSurrogate(invite_id)
            except Team.DoesNotExist:
                processed = render_to_string("auth_error.html", {"message": "Invalid invite link!"},)
                return HttpResponse(processed, status=401)

        try:
            invite.validate(user=None, email=user_email)
        except ValueError as e:
            processed = render_to_string("auth_error.html", {"message": str(e)},)
            return HttpResponse(processed, status=401)

        try:
            user = strategy.create_user(email=user_email, first_name=user_name, password=None)
        except Exception as e:
            capture_exception(e)
            processed = render_to_string(
                "auth_error.html",
                {
                    "message": "Account unable to be created. This account may already exist. Please try again or use different credentials!"
                },
            )
            return HttpResponse(processed, status=401)
        invite.use(user, prevalidated=True)

    posthoganalytics.capture(
        user.distinct_id,
        "user signed up",
        properties={
            "is_first_user": User.objects.count() == 1,
            "is_first_team_user": not from_invite,
            "login_provider": backend.name,
        },
    )

    return {"is_new": True, "user": user}
コード例 #2
0
ファイル: urls.py プロジェクト: dijinshopwise/posthog
def social_create_user(strategy: DjangoStrategy,
                       details,
                       backend,
                       request,
                       user=None,
                       *args,
                       **kwargs):
    if user:
        return {"is_new": False}
    user_email = details["email"][0] if isinstance(
        details["email"], (list, tuple)) else details["email"]
    user_name = details["fullname"]
    strategy.session_set("user_name", user_name)
    strategy.session_set("backend", backend.name)
    from_invite = False
    invite_id = strategy.session_get("invite_id")
    if not invite_id:
        company_name = strategy.session_get("company_name", None)
        email_opt_in = strategy.session_get("email_opt_in", None)
        if not company_name or email_opt_in is None:
            return redirect(finish_social_signup)

        serializer = OrganizationSignupSerializer(
            data=dict(
                company_name=company_name,
                email_opt_in=email_opt_in,
                first_name=user_name,
                email=user_email,
                password=None,
            ),
            context={"request": request},
        )

        serializer.is_valid(raise_exception=True)
        user = serializer.save()
    else:
        from_invite = True
        try:
            invite: Union[
                OrganizationInvite,
                TeamInviteSurrogate] = OrganizationInvite.objects.select_related(
                    "organization", ).get(id=invite_id)
        except (OrganizationInvite.DoesNotExist, ValidationError):
            try:
                invite = TeamInviteSurrogate(invite_id)
            except Team.DoesNotExist:
                processed = render_to_string(
                    "auth_error.html",
                    {"message": "Invalid invite link!"},
                )
                return HttpResponse(processed, status=401)

        try:
            invite.validate(user=None, email=user_email)
        except ValueError as e:
            processed = render_to_string(
                "auth_error.html",
                {"message": str(e)},
            )
            return HttpResponse(processed, status=401)

        try:
            user = strategy.create_user(email=user_email,
                                        first_name=user_name,
                                        password=None)
        except Exception as e:
            capture_exception(e)
            processed = render_to_string(
                "auth_error.html",
                {
                    "message":
                    "Account unable to be created. This account may already exist. Please try again or use different credentials!"
                },
            )
            return HttpResponse(processed, status=401)
        invite.use(user, prevalidated=True)

    report_user_signed_up(
        distinct_id=user.distinct_id,
        is_instance_first_user=User.objects.count() == 1,
        is_organization_first_user=not from_invite,
        new_onboarding_enabled=False,
        backend_processor="social_create_user",
        social_provider=backend.name,
    )

    return {"is_new": True, "user": user}
コード例 #3
0
ファイル: signup.py プロジェクト: PostHog/posthog
def social_create_user(strategy: DjangoStrategy, details, backend, request, user=None, *args, **kwargs):
    if user:
        return {"is_new": False}
    backend_processor = "social_create_user"
    user_email = details["email"][0] if isinstance(details["email"], (list, tuple)) else details["email"]
    user_name = (
        details["fullname"]
        or f"{details['first_name'] or ''} {details['last_name'] or ''}".strip()
        or details["username"]
    )
    strategy.session_set("user_name", user_name)
    strategy.session_set("backend", backend.name)
    from_invite = False
    invite_id = strategy.session_get("invite_id")

    if not user_email or not user_name:
        missing_attr = "email" if not user_email else "name"
        raise ValidationError(
            {missing_attr: "This field is required and was not provided by the IdP."}, code="required"
        )

    if invite_id:
        from_invite = True
        user = process_social_invite_signup(strategy, invite_id, user_email, user_name)

    else:
        # Domain whitelist?
        user = process_social_domain_whitelist_signup(user_email, user_name)
        if user:
            backend_processor = "domain_whitelist"

        # SAML
        if not user:
            user = process_social_saml_signup(backend, user_email, user_name)
            if user:
                backend_processor = "saml"

        if not user:
            organization_name = strategy.session_get("organization_name", None)
            email_opt_in = strategy.session_get("email_opt_in", None)
            if not organization_name or email_opt_in is None:
                return redirect(finish_social_signup)

            serializer = SignupSerializer(
                data={
                    "organization_name": organization_name,
                    "email_opt_in": email_opt_in,
                    "first_name": user_name,
                    "email": user_email,
                    "password": None,
                },
                context={"request": request},
            )

            serializer.is_valid(raise_exception=True)
            user = serializer.save()

    report_user_signed_up(
        user,
        is_instance_first_user=User.objects.count() == 1,
        is_organization_first_user=not from_invite,
        new_onboarding_enabled=False,
        backend_processor=backend_processor,
        social_provider=backend.name,
        user_analytics_metadata=user.get_analytics_metadata(),
        org_analytics_metadata=user.organization.get_analytics_metadata() if user.organization else None,
    )

    return {"is_new": True, "user": user}
コード例 #4
0
ファイル: signup.py プロジェクト: copyit/posthog
def social_create_user(strategy: DjangoStrategy,
                       details,
                       backend,
                       request,
                       user=None,
                       *args,
                       **kwargs):
    if user:
        return {"is_new": False}
    backend_processor = "social_create_user"
    user_email = details["email"][0] if isinstance(
        details["email"], (list, tuple)) else details["email"]
    user_name = details["fullname"] or details["username"]
    strategy.session_set("user_name", user_name)
    strategy.session_set("backend", backend.name)
    from_invite = False
    invite_id = strategy.session_get("invite_id")
    if not invite_id:

        domain_organization: Optional[Organization] = None

        # TODO: This feature is currently available only in self-hosted
        if not settings.MULTI_TENANCY:
            # Check if the user is on a whitelisted domain
            domain = user_email.split("@")[-1]
            # TODO: Handle multiple organizations with the same whitelisted domain
            domain_organization = Organization.objects.filter(
                domain_whitelist__contains=[domain]).first()

        if domain_organization:
            backend_processor = "domain_whitelist"
            user = User.objects.create_and_join(
                organization=domain_organization,
                email=user_email,
                password=None,
                first_name=user_name)

        else:
            organization_name = strategy.session_get("organization_name", None)
            email_opt_in = strategy.session_get("email_opt_in", None)
            if not organization_name or email_opt_in is None:
                return redirect(finish_social_signup)

            serializer = SignupSerializer(
                data={
                    "organization_name": organization_name,
                    "email_opt_in": email_opt_in,
                    "first_name": user_name,
                    "email": user_email,
                    "password": None,
                },
                context={"request": request},
            )

            serializer.is_valid(raise_exception=True)
            user = serializer.save()
    else:
        from_invite = True
        try:
            invite: Union[
                OrganizationInvite,
                TeamInviteSurrogate] = OrganizationInvite.objects.select_related(
                    "organization", ).get(id=invite_id)
        except (OrganizationInvite.DoesNotExist, ValidationError):
            try:
                invite = TeamInviteSurrogate(invite_id)
            except Team.DoesNotExist:
                return redirect(
                    f"/signup/{invite_id}?error_code=invalid_invite&source=social_create_user"
                )

        try:
            invite.validate(user=None, email=user_email)
        except exceptions.ValidationError as e:
            return redirect(
                f"/signup/{invite_id}?error_code={e.get_codes()[0]}&error_detail={e.args[0]}&source=social_create_user"
            )

        try:
            user = strategy.create_user(email=user_email,
                                        first_name=user_name,
                                        password=None)
        except Exception as e:
            capture_exception(e)
            message = "Account unable to be created. This account may already exist. Please try again"
            " or use different credentials."
            return redirect(
                f"/signup/{invite_id}?error_code=unknown&error_detail={message}&source=social_create_user"
            )

        invite.use(user, prevalidated=True)

    report_user_signed_up(
        distinct_id=user.distinct_id,
        is_instance_first_user=User.objects.count() == 1,
        is_organization_first_user=not from_invite,
        new_onboarding_enabled=False,
        backend_processor=backend_processor,
        social_provider=backend.name,
    )

    return {"is_new": True, "user": user}