Projet

Général

Profil

0008-use-phone-number-as-registration-means-in-form-valid.patch

Paul Marillonnet, 13 octobre 2022 14:06

Télécharger (4,62 ko)

Voir les différences:

Subject: [PATCH 08/10] use phone number as registration means in form
 validation (#69223)

 src/authentic2/views.py | 84 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 82 insertions(+), 2 deletions(-)
src/authentic2/views.py
1021 1021

  
1022 1022
        self.token = {}
1023 1023
        self.ou = get_default_ou()
1024
        # load pre-filled values
1024
        # load pre-filled values when registering with email address
1025 1025
        if request.GET.get('token'):
1026 1026
            try:
1027 1027
                self.token = crypto.loads(
......
1047 1047
                },
1048 1048
            )
1049 1049
        email = form.cleaned_data.pop('email')
1050
        if email:
1051
            return self.perform_email_registration(form, email)
1050 1052

  
1053
        if settings.A2_ACCEPT_PHONE_AUTHENTICATION:
1054
            phone = form.cleaned_data.pop('phone')
1055
            return self.perform_phone_registration(form, phone)
1056

  
1057
        return ValidationError(_('No means of registration provided.'))
1058

  
1059
    def perform_phone_registration(self, form, phone):
1060
        code_exists = models.SMSCode.objects.filter(
1061
            kind=models.SMSCode.KIND_REGISTRATION, phone=phone, expires__gt=timezone.now()
1062
        ).exists()
1063
        resend_key = 'registration-allow-sms-resend'
1064
        if (
1065
            app_settings.A2_SMS_CODE_EXISTS_WARNING
1066
            and code_exists
1067
            and not self.request.session.get(resend_key)
1068
        ):
1069
            self.request.session[resend_key] = True
1070
            form.add_error(
1071
                'phone',
1072
                _(
1073
                    'An SMS code has already been sent to %s. Click "Validate" again if you really want it to be'
1074
                    ' sent again.'
1075
                )
1076
                % phone,
1077
            )
1078
            return self.form_invalid(form)
1079
        self.request.session[resend_key] = False
1080

  
1081
        if is_ratelimited(
1082
            self.request,
1083
            key='post:sms',
1084
            group='registration-sms',
1085
            rate=app_settings.A2_SMS_RATELIMIT,
1086
            increment=True,
1087
        ):
1088
            form.add_error(
1089
                'phone',
1090
                (
1091
                    'Multiple SMSs have already been sent to this number. Further attempts are blocked,'
1092
                    ' try again later.'
1093
                ),
1094
            )
1095
            return self.form_invalid(form)
1096
        if is_ratelimited(
1097
            self.request,
1098
            key='ip',
1099
            group='registration-sms',
1100
            rate=app_settings.A2_SMS_IP_RATELIMIT,
1101
            increment=True,
1102
        ):
1103
            form.add_error(
1104
                'email',
1105
                _(
1106
                    'Multiple registration attempts have already been made from this IP address. No further'
1107
                    ' SMS will be sent for now, try again later.'
1108
                ),
1109
            )
1110
            return self.form_invalid(form)
1111
        try:
1112
            code = utils_misc.send_registration_sms(self.request, phone, ou=self.ou, **self.token)
1113
        except utils_misc.SMSError:
1114
            messages.warning(
1115
                self.request,
1116
                _(
1117
                    'Something went wrong while trying to send the SMS registration code to you.'
1118
                    ' Please contact your administrator and try again later.'
1119
                ),
1120
            )
1121
            return utils_misc.redirect(self.request, reverse('auth_homepage'))
1122

  
1123
        self.request.session['registered_phone'] = phone
1124
        return utils_misc.redirect(
1125
            self.request,
1126
            reverse('input_registration_code', kwargs={'token': code.url_token}),
1127
            params={REDIRECT_FIELD_NAME: self.next_url, 'token': code.url_token},
1128
        )
1129

  
1130
    def perform_email_registration(self, form, email):
1051 1131
        # if an email has already been sent, warn once before allowing resend
1052 1132
        token = models.Token.objects.filter(
1053 1133
            kind='registration', content__email__iexact=email, expires__gt=timezone.now()
1054 1134
        ).exists()
1055
        resend_key = 'registration-allow-resend'
1135
        resend_key = 'registration-allow-email-resend'
1056 1136
        if app_settings.A2_TOKEN_EXISTS_WARNING and token and not self.request.session.get(resend_key):
1057 1137
            self.request.session[resend_key] = True
1058 1138
            form.add_error(
1059
-