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 |
|
-
|