diff --git a/common/djangoapps/third_party_auth/samlproviderconfig/views.py b/common/djangoapps/third_party_auth/samlproviderconfig/views.py index ac4832f4ef..983fe6bf5b 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 slug_list = [idp.provider_id for idp in enterprise_customer_idps] return [config for config in SAMLProviderConfig.objects.current_set() if config.provider_id in slug_list] + 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)