fix: accounting for only current configs when checking for uniqueness

This commit is contained in:
Alexander Sheehan
2022-06-27 11:25:12 -04:00
parent 6ae76816f7
commit 605a328f24
5 changed files with 62 additions and 4 deletions

View File

@@ -739,7 +739,7 @@ class SAMLProviderConfig(ProviderConfig):
# creating configs that share entity ID's with other enterprises
# One consequence of this is that once a provider configuration is created, the slug is essentially locked in
# and unchangeable. But I blame that on bad old architecture.
existing_provider_configs = SAMLProviderConfig.objects.filter(
existing_provider_configs = SAMLProviderConfig.objects.current_set().filter(
entity_id=self.entity_id,
archived=False,
).exclude(slug=self.slug)

View File

@@ -22,7 +22,10 @@ class SAMLProviderConfigSerializer(serializers.ModelSerializer): # lint-amnesty
# are not archived, raise a validation error. We do this to prevent provider configs from sharing entity ID's
# which link a provider config to provider data (SAML certificates). An entity ID therefore, is uniquely linked
# to a single slug/provider config (which in the case of enterprise provider slug == customer slug).
if SAMLProviderConfig.objects.filter(entity_id=data['entity_id'], archived=False).exclude(slug=data['slug']):
if SAMLProviderConfig.objects.current_set().filter(
entity_id=data['entity_id'],
archived=False,
).exclude(slug=data['slug']):
raise serializers.ValidationError(f"Entity ID: {data['entity_id']} already taken")
return data

View File

@@ -0,0 +1,40 @@
"""
Tests for third_party_auth/models.py.
"""
import pytest
from django.test import TestCase
from django.db.utils import IntegrityError
from .factories import SAMLProviderConfigFactory
from ..models import SAMLProviderConfig
class TestSamlProviderConfigModel(TestCase):
"""
Test model operations for the saml provider config model.
"""
def setUp(self):
super().setUp()
self.saml_provider_config = SAMLProviderConfigFactory()
def test_unique_entity_id_enforcement_for_non_current_configs(self):
"""
Test that the unique entity ID enforcement does not apply to noncurrent configs
"""
assert len(SAMLProviderConfig.objects.all()) == 1
old_entity_id = self.saml_provider_config.entity_id
self.saml_provider_config.entity_id = f'{self.saml_provider_config.entity_id}-ayylmao'
self.saml_provider_config.save()
# check that we now have two records, one non-current
assert len(SAMLProviderConfig.objects.all()) == 2
assert len(SAMLProviderConfig.objects.current_set()) == 1
# Make sure we can use that old entity id
SAMLProviderConfigFactory(entity_id=old_entity_id)
# Now if we try and create a new model using a current entity ID then it should throw the integrity error
with pytest.raises(IntegrityError):
bad_config = SAMLProviderConfig(entity_id=self.saml_provider_config.entity_id)
bad_config.save()