From 0c45718846bcba423391515b2cdd461ffb1e0fa4 Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Fri, 9 May 2025 18:51:54 +0200 Subject: [PATCH 1/3] enterprise: fix expired license's users being counted Signed-off-by: Jens Langhammer --- authentik/enterprise/license.py | 7 ++++--- authentik/enterprise/models.py | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/authentik/enterprise/license.py b/authentik/enterprise/license.py index 1bc92bdf5c9a..346cfe6438fe 100644 --- a/authentik/enterprise/license.py +++ b/authentik/enterprise/license.py @@ -132,13 +132,14 @@ def get_total() -> "LicenseKey": """Get a summarized version of all (not expired) licenses""" total = LicenseKey(get_license_aud(), 0, "Summarized license", 0, 0) for lic in License.objects.all(): - total.internal_users += lic.internal_users - total.external_users += lic.external_users + if lic.is_valid: + total.internal_users += lic.internal_users + total.external_users += lic.external_users + total.license_flags.extend(lic.status.license_flags) exp_ts = int(mktime(lic.expiry.timetuple())) if total.exp == 0: total.exp = exp_ts total.exp = max(total.exp, exp_ts) - total.license_flags.extend(lic.status.license_flags) return total @staticmethod diff --git a/authentik/enterprise/models.py b/authentik/enterprise/models.py index 2ef24311b821..1ac43a025af1 100644 --- a/authentik/enterprise/models.py +++ b/authentik/enterprise/models.py @@ -39,6 +39,10 @@ class License(SerializerModel): internal_users = models.BigIntegerField() external_users = models.BigIntegerField() + @property + def is_valid(self) -> bool: + return self.expiry <= now() + @property def serializer(self) -> type[BaseSerializer]: from authentik.enterprise.api import LicenseSerializer From bc713d45b7580aef2836e301566d72db85475d84 Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Sat, 10 May 2025 01:00:56 +0200 Subject: [PATCH 2/3] tests to the rescue Signed-off-by: Jens Langhammer --- authentik/enterprise/models.py | 2 +- authentik/enterprise/tests/test_license.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/authentik/enterprise/models.py b/authentik/enterprise/models.py index 1ac43a025af1..0b96c9754bba 100644 --- a/authentik/enterprise/models.py +++ b/authentik/enterprise/models.py @@ -41,7 +41,7 @@ class License(SerializerModel): @property def is_valid(self) -> bool: - return self.expiry <= now() + return self.expiry >= now() @property def serializer(self) -> type[BaseSerializer]: diff --git a/authentik/enterprise/tests/test_license.py b/authentik/enterprise/tests/test_license.py index c76f141f1057..2b8236dd3ca7 100644 --- a/authentik/enterprise/tests/test_license.py +++ b/authentik/enterprise/tests/test_license.py @@ -71,9 +71,9 @@ def test_invalid(self): ) def test_valid_multiple(self): """Check license verification""" - lic = License.objects.create(key=generate_id()) + lic = License.objects.create(key=generate_id(), expiry=expiry_valid) self.assertTrue(lic.status.status().is_valid) - lic2 = License.objects.create(key=generate_id()) + lic2 = License.objects.create(key=generate_id(), expiry=expiry_valid) self.assertTrue(lic2.status.status().is_valid) total = LicenseKey.get_total() self.assertEqual(total.internal_users, 200) From 2d686c7d6f78591528573577263107a2a9c7271d Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Sat, 10 May 2025 01:17:06 +0200 Subject: [PATCH 3/3] hmm Signed-off-by: Jens Langhammer --- authentik/enterprise/tests/test_license.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/authentik/enterprise/tests/test_license.py b/authentik/enterprise/tests/test_license.py index 2b8236dd3ca7..6ab2ced0c78d 100644 --- a/authentik/enterprise/tests/test_license.py +++ b/authentik/enterprise/tests/test_license.py @@ -8,6 +8,7 @@ from django.utils.timezone import now from rest_framework.exceptions import ValidationError +from authentik.core.models import User from authentik.enterprise.license import LicenseKey from authentik.enterprise.models import ( THRESHOLD_READ_ONLY_WEEKS, @@ -232,7 +233,9 @@ def test_expiry_read_only(self): ) def test_expiry_expired(self): """Check license verification""" - License.objects.create(key=generate_id()) + User.objects.all().delete() + License.objects.all().delete() + License.objects.create(key=generate_id(), expiry=expiry_expired) self.assertEqual(LicenseKey.get_total().summary().status, LicenseUsageStatus.EXPIRED) @patch(