Source code for pki.serializer.truststore

"""Serializers for Truststore-related API endpoints.

Defines classes that handle validation and transformation
of Truststore model instances to and from JSON.
"""

from typing import ClassVar, cast

from django.core.exceptions import ValidationError
from django.core.files.uploadedfile import UploadedFile
from rest_framework import serializers

from pki.models.truststore import TruststoreModel
from util.field import UniqueNameValidator


[docs] class TruststoreSerializer(serializers.ModelSerializer[TruststoreModel]): """Serializer for Certificate instances. Handles conversion between Certificate model objects and JSON representations. """
[docs] unique_name = serializers.CharField( max_length=256, required=False, allow_blank=True, help_text='Optional unique name', validators=[UniqueNameValidator()], )
[docs] intended_usage = serializers.ChoiceField( choices=TruststoreModel.IntendedUsage.choices, required=True, help_text='Intended usage for this truststore' )
[docs] trust_store_file = serializers.FileField(write_only=True, required=True)
[docs] class Meta: """Metadata for TruststoreSerializer, defining model and serialized fields."""
[docs] model = TruststoreModel
[docs] fields: ClassVar[list[str]] = ['id', 'unique_name', 'intended_usage', 'created_at', 'trust_store_file']
[docs] read_only_fields: ClassVar[list[str]] = ['id']
[docs] def validate_trust_store_file(self, file: UploadedFile) -> bytes: """Validate uploaded truststore file.""" if not file or not file.name: msg = 'Truststore file is required.' raise ValidationError(msg) if not file.name.lower().endswith(('.pem', '.p7b', '.p7c')): msg = 'File must be PEM or PKCS#7 format.' raise ValidationError(msg) try: return cast('bytes', file.read()) except (OSError, AttributeError) as original_exception: error_message = ( 'Unexpected error occurred while trying to get file contents. Please see logs for further details.' ) raise ValidationError(error_message, code='unexpected-error') from original_exception