"""This module contains validators that are used in several different apps in the trustpoint project."""from__future__importannotationsfromtypingimportTYPE_CHECKINGfromcryptographyimportx509fromcryptography.x509.oidimportNameOIDfromdjango.core.validatorsimportRegexValidatorfromdjango.utils.translationimportgettext_lazyas_ifTYPE_CHECKING:fromtypingimportAny
[docs]classUniqueNameValidator(RegexValidator):"""Validates unique names used in the trustpoint."""
[docs]form_label=_('(All UTF-8 characters are allowed except control characters (e.g., newline, tab).)')
def__init__(self,*args:Any,**kwargs:Any)->None:"""Initializes a UniqueNameValidator object. Args: args: Positional arguments are discarded. kwargs: Keyword arguments are discarded._ """delargsdelkwargsmsg=f'Enter a valid unique name. {self.form_label}.'trans_msg=_(msg)super().__init__(regex=r'^[^\x00-\x1F\x7F-\x9F]+$',message=trans_msg,code='invalid_unique_name',)
[docs]def__call__(self,value:Any)->None:"""Trim trailing spaces before validation."""ifisinstance(value,str):value=value.rstrip()super().__call__(value)
[docs]defget_certificate_name(cert:x509.Certificate)->str:"""Extracts a name from an x509 certificate to auto-populate model Unique Name fields. Args: cert: x509 Certificate. Priority: 1. CN (Common Name) from Subject DN 2. First SAN entry """# Try CN from Subject DNtry:cn=cert.subject.get_attributes_for_oid(NameOID.COMMON_NAME)[0].valueifcn:returncnexceptIndexError:pass# Try SAN extension (first entry)try:san=cert.extensions.get_extension_for_class(x509.SubjectAlternativeName)san_names=san.value.get_values_for_type(x509.DNSName)ifsan_names:returnsan_names[0]san_names=san.value.get_values_for_type(x509.UniformResourceIdentifier)ifsan_names:candidate=san_names[0]ifcandidate.startswith('dev-owner:'):# AOKI DevOwnerIDcandidate='Owner of SN: '+candidate.removeprefix('dev-owner:').split('.')[0]returncandidateexceptx509.ExtensionNotFound:pass# SAN not presentexc_msg='No valid CN or SAN found in the certificate. Unique name is required.'raiseValueError(exc_msg)