From ccb635733e71764a4c545b9c2a9d9f29304e7305 Mon Sep 17 00:00:00 2001 From: Alexander Sheehan Date: Mon, 9 May 2022 09:22:03 -0400 Subject: [PATCH] fix: improvments to the saml config and data endpoints --- .../samlproviderconfig/views.py | 18 ++++++++++++++++++ .../third_party_auth/samlproviderdata/views.py | 10 ++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/common/djangoapps/third_party_auth/samlproviderconfig/views.py b/common/djangoapps/third_party_auth/samlproviderconfig/views.py index a8cdb40d7d..7835017ad0 100644 --- a/common/djangoapps/third_party_auth/samlproviderconfig/views.py +++ b/common/djangoapps/third_party_auth/samlproviderconfig/views.py @@ -61,6 +61,24 @@ class SAMLProviderConfigViewSet(PermissionRequiredMixin, SAMLProviderMixin, view return SAMLProviderConfig.objects.current_set().filter( slug=convert_saml_slug_provider_id(enterprise_customer_idp.provider_id)) + def destroy(self, request, *args, **kwargs): + saml_provider_config = self.get_object() + config_id = saml_provider_config.id + provider_config_provider_id = saml_provider_config.provider_id + customer_uuid = self.requested_enterprise_uuid + try: + enterprise_customer = EnterpriseCustomer.objects.get(pk=customer_uuid) + except EnterpriseCustomer.DoesNotExist: + raise ValidationError(f'Enterprise customer not found at uuid: {customer_uuid}') # lint-amnesty, pylint: disable=raise-missing-from + + enterprise_saml_provider = EnterpriseCustomerIdentityProvider.objects.filter( + enterprise_customer=enterprise_customer, + provider_id=provider_config_provider_id, + ) + enterprise_saml_provider.delete() + saml_provider_config.delete() + return Response(data=config_id, status=status.HTTP_200_OK) + @property def requested_enterprise_uuid(self): """ diff --git a/common/djangoapps/third_party_auth/samlproviderdata/views.py b/common/djangoapps/third_party_auth/samlproviderdata/views.py index c3551cd656..59439fcd38 100644 --- a/common/djangoapps/third_party_auth/samlproviderdata/views.py +++ b/common/djangoapps/third_party_auth/samlproviderdata/views.py @@ -2,6 +2,7 @@ Viewset for auth/saml/v0/samlproviderdata """ import logging +from requests.exceptions import SSLError, MissingSchema from django.http import Http404 from django.shortcuts import get_object_or_404 @@ -94,7 +95,7 @@ class SAMLProviderDataViewSet(PermissionRequiredMixin, SAMLProviderDataMixin, vi """ return self.requested_enterprise_uuid - @action(detail=False, methods=['post']) + @action(detail=False, methods=['post', 'put']) def sync_provider_data(self, request): """ Creates or updates a SAMProviderData record using info fetched from remote SAML metadata @@ -110,7 +111,12 @@ class SAMLProviderDataViewSet(PermissionRequiredMixin, SAMLProviderDataMixin, vi return Response('metadata_url is required!', status.HTTP_400_BAD_REQUEST) # part 1: fetch information from remote metadata based on metadataUrl in samlproviderconfig - xml = fetch_metadata_xml(metadata_url) + try: + xml = fetch_metadata_xml(metadata_url) + except (SSLError, MissingSchema) as ex: + msg = f'Could not verify provider metadata url. Exc type: {type(ex).__name__}' + log.warning(msg) + return Response(msg, status.HTTP_406_NOT_ACCEPTABLE) # part 2: create/update samlproviderdata log.info("Processing IdP with entityID %s", entity_id)