fix(api): reject cloudflare api key in token field

- Add serializer validation for Cloudflare api_token values

- Reject 32-character hexadecimal values in token credentials

- Add serializer tests for valid token and api key-shaped token
This commit is contained in:
HugoPBrito
2026-02-27 14:02:46 +01:00
parent 288593d01e
commit 5ff6c3c35f
2 changed files with 28 additions and 1 deletions
+18 -1
View File
@@ -2,7 +2,7 @@ import pytest
from rest_framework.exceptions import ValidationError
from api.v1.serializer_utils.integrations import S3ConfigSerializer
from api.v1.serializers import ImageProviderSecret
from api.v1.serializers import CloudflareTokenProviderSecret, ImageProviderSecret
class TestS3ConfigSerializer:
@@ -133,3 +133,20 @@ class TestImageProviderSecret:
serializer = ImageProviderSecret(data={"registry_password": "pass"})
assert not serializer.is_valid()
assert "non_field_errors" in serializer.errors
class TestCloudflareProviderSecret:
"""Test cases for Cloudflare provider credential formats."""
def test_valid_api_token(self):
serializer = CloudflareTokenProviderSecret(
data={"api_token": "Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"}
)
assert serializer.is_valid(), serializer.errors
def test_invalid_api_token_with_api_key_format(self):
serializer = CloudflareTokenProviderSecret(
data={"api_token": "144c9defac04969c7bfad8efaa8ea194"}
)
assert not serializer.is_valid()
assert "api_token" in serializer.errors
+10
View File
@@ -1,5 +1,6 @@
import base64
import json
import re
from datetime import datetime, timedelta, timezone
from django.conf import settings
@@ -1704,6 +1705,15 @@ class OracleCloudProviderSecret(serializers.Serializer):
class CloudflareTokenProviderSecret(serializers.Serializer):
api_token = serializers.CharField()
def validate_api_token(self, value: str) -> str:
# Cloudflare Global API Key is 32 hex chars; reject it in token field.
if re.fullmatch(r"[a-fA-F0-9]{32}", (value or "").strip()):
raise serializers.ValidationError(
"This value matches Cloudflare API Key format. "
"Use 'api_key' and 'api_email' instead."
)
return value
class Meta:
resource_name = "provider-secrets"