|
| 1 | +from allauth.account.adapter import get_adapter |
1 | 2 | from allauth.account.forms import LoginForm as _LoginForm |
2 | 3 | from allauth.account.forms import ResetPasswordForm |
3 | 4 | from allauth.account.forms import SignupForm as _SignupForm |
@@ -46,6 +47,17 @@ def get_user(self): |
46 | 47 | class UserFormMixin: |
47 | 48 | def __init__(self, request, *args, **kwargs): |
48 | 49 | super().__init__(*args, **kwargs) |
| 50 | + self.fields[settings.HONEYPOT_FIELD_NAME] = forms.CharField( |
| 51 | + label=False, |
| 52 | + required=False, |
| 53 | + widget=forms.TextInput( |
| 54 | + attrs={ |
| 55 | + "style": "position: absolute; right: -99999px;", |
| 56 | + "tabindex": "-1", |
| 57 | + "autocomplete": "nope", |
| 58 | + } |
| 59 | + ), |
| 60 | + ) |
49 | 61 | for field in request.tenant.clientsetting.user_registration_fields: |
50 | 62 | field_settings = settings.USER_REGISTRATION_FORM_FIELDS.get(field) |
51 | 63 | self.fields[field] = forms.CharField(**field_settings) |
@@ -80,6 +92,7 @@ def __init__(self, request, *args, **kwargs): |
80 | 92 | self.helper.disable_csrf = False |
81 | 93 | self.helper.layout = Layout( |
82 | 94 | "email", |
| 95 | + settings.HONEYPOT_FIELD_NAME, |
83 | 96 | "password1", |
84 | 97 | "point_of_sale", |
85 | 98 | "first_name", |
@@ -133,6 +146,17 @@ def save(self, request): |
133 | 146 | self.update_customer(user, request) |
134 | 147 | return user |
135 | 148 |
|
| 149 | + def try_save(self, request): |
| 150 | + if self.cleaned_data[settings.HONEYPOT_FIELD_NAME]: |
| 151 | + user = None |
| 152 | + adapter = get_adapter() |
| 153 | + # honeypot fields work best when you do not report to the bot |
| 154 | + # that anything went wrong. So we return a fake email verification |
| 155 | + # sent response but without creating a user |
| 156 | + resp = adapter.respond_email_verification_sent(request, None) |
| 157 | + return user, resp |
| 158 | + return super().try_save(request) |
| 159 | + |
136 | 160 |
|
137 | 161 | class SignupForm(UserFormMixin, _SignupForm): |
138 | 162 | email = forms.EmailField( |
|
0 commit comments