"""TLS setting specific views."""from__future__importannotationsfromtypingimportTYPE_CHECKING,Optionalfromdjango.contribimportmessagesfromdjango.core.exceptionsimportObjectDoesNotExistfromdjango.urlsimportreverse_lazyfromdjango.utils.translationimportgettextas_fromdjango.views.genericimportFormViewfrompki.modelsimportGeneralNameIpAddressfrompki.models.truststoreimportActiveTrustpointTlsServerCredentialModelfrommanagement.formsimportIPv4AddressFormfrommanagement.modelsimportTlsSettingsifTYPE_CHECKING:fromtypingimportAny,ClassVarfromdjango.httpimportHttpResponse
[docs]classTlsSettingsContextMixin:"""Mixin which adds data to the context for the TLS settings application."""
[docs]classTlsView(TlsSettingsContextMixin,FormView[IPv4AddressForm]):"""View to display certificate details, including Subject Alternative Name (SAN) and associated IP addresses."""
[docs]defget_form_kwargs(self)->dict[str,Any]:"""Pass additional arguments (e.g., SAN IPs) to the form."""kwargs=super().get_form_kwargs()try:network_settings=TlsSettings.objects.get(id=1)saved_ipv4_address=network_settings.ipv4_addressexceptTlsSettings.DoesNotExist:saved_ipv4_address=Nonesan_ips=self.get_san_ips()kwargs['data']=self.request.POSTorNonekwargs['initial']={'ipv4_address':saved_ipv4_addressor(san_ips[0]ifsan_ipselse'')}kwargs['san_ips']=san_ipsreturnkwargs
[docs]defget_context_data(self,**kwargs:dict[str,Any])->dict[str,Any]:"""Add certificate information, including SAN data and issuer details, to the context for display."""context=super().get_context_data(**kwargs)try:active_credential=ActiveTrustpointTlsServerCredentialModel.objects.select_related('credential').get(id=1)exceptActiveTrustpointTlsServerCredentialModel.DoesNotExist:active_credential=Nonecertificate=Noneifactive_credentialandactive_credential.credential:certificate=active_credential.credential.certificatesan_ips=[]san_dns_names=[]issuer_details:dict[str,Optional[str]]={'country':None,'organization':None,'common_name':None,}ifcertificateandcertificate.subject_alternative_name_extension:san_model=certificate.subject_alternative_name_extension.subject_alt_nameifsan_model:san_ips=[str(ip_entry.value)forip_entryinsan_model.ip_addresses.all()]san_dns_names=[dns_entry.valuefordns_entryinsan_model.dns_names.all()]ifcertificateandcertificate.issuer.exists():issuer_mapping={'2.5.4.6':'country','2.5.4.10':'organization','2.5.4.3':'common_name',}forattributeincertificate.issuer.all():ifattribute.oidinissuer_mapping:field=issuer_mapping[attribute.oid]issuer_details[field]=attribute.valuecontext.update({'certificate':certificate,'san_ips':san_ips,'san_dns_names':san_dns_names,'issuer_details':issuer_details,})returncontext
[docs]defform_valid(self,form:IPv4AddressForm)->HttpResponse:"""Handle valid form submissions."""ipv4_address=form.cleaned_data.get('ipv4_address')TlsSettings.objects.update_or_create(id=1,defaults={'ipv4_address':ipv4_address},)messages.success(self.request,'IPv4 address saved successfully.')returnsuper().form_valid(form)
[docs]defform_invalid(self,form:IPv4AddressForm)->HttpResponse:"""Handle invalid form submissions."""messages.error(self.request,'Invalid IPv4 address selected.')returnsuper().form_invalid(form)
[docs]defget_san_ips(self)->list[str]:"""Fetches IPv4 addresses from the Subject Alternative Name (SAN) extension of the active TLS certificate. Returns: A list of IPv4 addresses (as strings) or an empty list if none are found. """try:try:active_credential=ActiveTrustpointTlsServerCredentialModel.objects.select_related('credential').get(id=1)exceptActiveTrustpointTlsServerCredentialModel.DoesNotExist:active_credential=Nonecertificate=Noneifactive_credentialandactive_credential.credential:certificate=active_credential.credential.certificateifnotcertificateornotcertificate.subject_alternative_name_extension:return[]san_model=certificate.subject_alternative_name_extension.subject_alt_nameifnotsan_model:return[]ipv4_addresses=GeneralNameIpAddress.objects.filter(general_names_set=san_model,ip_type=GeneralNameIpAddress.IpType.IPV4_ADDRESS).values_list('value',flat=True)returnlist(ipv4_addresses)exceptObjectDoesNotExist:return[]