Преглед на файлове

fix(api): don't raise when domains/?owns_qname is invalid

Peter Thomassen преди 3 години
родител
ревизия
6c02d0ba56
променени са 2 файла, в които са добавени 6 реда и са изтрити 7 реда
  1. 3 3
      api/desecapi/models.py
  2. 3 4
      api/desecapi/tests/test_domains.py

+ 3 - 3
api/desecapi/models.py

@@ -211,14 +211,14 @@ validate_domain_name = [
 
 class DomainManager(Manager):
     def filter_qname(self, qname: str, **kwargs) -> models.query.QuerySet:
+        qs = self.annotate(name_length=Length('name'))  # callers expect this to be present after returning
         try:
             Domain._meta.get_field('name').run_validators(qname.removeprefix('*.').lower())
         except ValidationError:
-            raise ValueError
-        return self.annotate(
+            return qs.none()
+        return qs.annotate(
             dotted_name=Concat(Value('.'), 'name', output_field=CharField()),
             dotted_qname=Value(f'.{qname}', output_field=CharField()),
-            name_length=Length('name'),
         ).filter(dotted_qname__endswith=F('dotted_name'), **kwargs)
 
 

+ 3 - 4
api/desecapi/tests/test_domains.py

@@ -208,7 +208,7 @@ class DomainOwnerTestCase1(DomainOwnerTestCase):
 
     def test_list_domains_owns_qname(self):
         # Domains outside this account or non-existent
-        for domain in ['non-existent.net', self.other_domain.name]:
+        for domain in ['non-existent.net', self.other_domain.name, 'domain.invalid/']:
             for name in [domain, f'foo.bar.{domain}']:
                 response = self.client.get(self.reverse('v1:domain-list'), data={'owns_qname': name})
                 self.assertStatus(response, status.HTTP_200_OK)
@@ -735,6 +735,5 @@ class DomainManagerTestCase(DesecTestCase):
                     self.assertListEqual(list(qs), expected)
 
     def test_filter_qname_invalid(self):
-        for qname in ['foo@bar.com', '*.*.example.com', '*foo.example.com', 'foo.*.example.com']:
-            with self.assertRaises(ValueError):
-                Domain.objects.filter_qname(qname)
+        for qname in ['foo@bar.com', '*.*.a.example', '*foo.b.example', 'foo.*.example', 'example.com/', 'a_B_example']:
+            self.assertFalse(Domain.objects.filter_qname(qname))