diff --git a/CTFd/auth.py b/CTFd/auth.py index 44aa40ea..2f801f03 100644 --- a/CTFd/auth.py +++ b/CTFd/auth.py @@ -206,6 +206,31 @@ def register(): valid_email = validators.validate_email(email_address) team_name_email_check = validators.validate_email(name) + # Process additional user fields + fields = {} + for field in UserFields.query.all(): + fields[field.id] = field + + entries = {} + for field_id, field in fields.items(): + value = request.form.get(f"fields[{field_id}]", "").strip() + if field.required is True and (value is None or value == ""): + errors.append("Please provide all required fields") + break + + # Handle special casing of existing profile fields + if field.name.lower() == "affiliation": + affiliation = value + break + elif field.name.lower() == "website": + website = value + break + + if field.field_type == "boolean": + entries[field_id] = bool(value) + else: + entries[field_id] = value + if country: try: validators.validate_country_code(country) @@ -252,21 +277,6 @@ def register(): if valid_affiliation is False: errors.append("Please provide a shorter affiliation") - fields = {} - for field in UserFields.query.all(): - fields[field.id] = field - - entries = {} - for field_id, field in fields.items(): - value = request.form.get(f"fields[{field_id}]", "").strip() - if field.required is True and (value is None or value == ""): - errors.append("Please provide all required fields") - break - if field.field_type == "boolean": - entries[field_id] = bool(value) - else: - entries[field_id] = value - if len(errors) > 0: return render_template( "register.html", diff --git a/CTFd/forms/auth.py b/CTFd/forms/auth.py index 77c4e1ec..b0c70402 100644 --- a/CTFd/forms/auth.py +++ b/CTFd/forms/auth.py @@ -16,7 +16,9 @@ def RegistrationForm(*args, **kwargs): @property def extra(self): - return build_custom_user_fields(self, include_entries=False) + return build_custom_user_fields( + self, include_entries=False, blacklisted_items=() + ) attach_custom_user_fields(_RegistrationForm) diff --git a/CTFd/forms/users.py b/CTFd/forms/users.py index 7dc79e63..55627171 100644 --- a/CTFd/forms/users.py +++ b/CTFd/forms/users.py @@ -9,7 +9,11 @@ from CTFd.utils.countries import SELECT_COUNTRIES_LIST def build_custom_user_fields( - form_cls, include_entries=False, fields_kwargs=None, field_entries_kwargs=None + form_cls, + include_entries=False, + fields_kwargs=None, + field_entries_kwargs=None, + blacklisted_items=("affiliation", "website"), ): """ Function used to reinject values back into forms for accessing by themes @@ -29,6 +33,9 @@ def build_custom_user_fields( user_fields[f.field_id] = f.value for field in new_fields: + if field.name.lower() in blacklisted_items: + continue + form_field = getattr(form_cls, f"fields[{field.id}]") # Add the field_type to the field so we know how to render it