diff --git a/pretix_keycloak_create_user/signals.py b/pretix_keycloak_create_user/signals.py index aaecbe2d81eb948c65712ef2ac59fc82e1da46a3..4d8ea44ac6a48e46ca295df4e1adc6fa471c8f49 100644 --- a/pretix_keycloak_create_user/signals.py +++ b/pretix_keycloak_create_user/signals.py @@ -1,4 +1,5 @@ import json +import requests from django import forms from django.dispatch import receiver from django.urls import resolve, reverse @@ -8,10 +9,13 @@ from pretix.base.settings import settings_hierarkey from pretix.base.signals import ( order_modified, order_placed, + validate_order, ) from pretix.base.templatetags.rich_text import rich_text_snippet from pretix.control.signals import nav_event_settings from pretix.presale.signals import question_form_fields +from pretix.base.services.orders import OrderError + from .tasks import keycloak_create_user @@ -103,3 +107,47 @@ def navbar_settings(sender, request=None, **kwargs): and url.url_name == "settings", } ] + +@receiver(validate_order, dispatch_uid="keycloak_create_user_validate_order") +def validate_order(sender, positions, **kwargs): + if ( + not sender.settings.keycloak_create_user_authorization_token + and not sender.settings.keycloak_create_user_realm_url + ): + return + + for order_position in positions.all(): + if str(order_position.item.pk) not in sender.settings.get( + "keycloak_create_user_items" + ): + continue + + if not order_position.meta_info_data.get("question_form_data", {}).get( + "keycloak_create_user_keycloak_username" + ): + continue + + event = sender + server = event.settings.keycloak_create_user_realm_url + token = event.settings.keycloak_create_user_authorization_token + + username = order_position.meta_info_data.get("question_form_data", {}).get( + "keycloak_create_user_keycloak_username" + ) + + response = requests.get( + "{}/users/count?username={}".format( + server, + username # TODO verify that this is not a security issue + ), + headers={ + "Authorization": "Bearer {}".format(token), + }, + ) + + if response.status_code == 200: + if json.loads(response.text) > 0: + raise OrderError( + _("Username already taken. Please choose another username.") + ) +