diff --git a/src/registrar/forms/domain.py b/src/registrar/forms/domain.py index 4ee17a72d..41b15e688 100644 --- a/src/registrar/forms/domain.py +++ b/src/registrar/forms/domain.py @@ -169,6 +169,7 @@ class DomainDsdataForm(forms.Form): algorithm = forms.TypedChoiceField( required=True, label="Algorithm", + coerce=int, # need to coerce into int so dsData objects can be compared choices=[(None, "--Select--")] + ALGORITHM_CHOICES, # type: ignore error_messages={"required": ("Algorithm is required.")}, ) @@ -176,6 +177,7 @@ class DomainDsdataForm(forms.Form): digest_type = forms.TypedChoiceField( required=True, label="Digest Type", + coerce=int, # need to coerce into int so dsData objects can be compared choices=[(None, "--Select--")] + DIGEST_TYPE_CHOICES, # type: ignore error_messages={"required": ("Digest Type is required.")}, ) @@ -201,6 +203,7 @@ class DomainKeydataForm(forms.Form): flag = forms.TypedChoiceField( required=True, label="Flag", + coerce=int, choices=FLAG_CHOICES, error_messages={"required": ("Flag is required.")}, ) @@ -208,6 +211,7 @@ class DomainKeydataForm(forms.Form): protocol = forms.TypedChoiceField( required=True, label="Protocol", + coerce=int, choices=PROTOCOL_CHOICES, error_messages={"required": ("Protocol is required.")}, ) @@ -215,6 +219,7 @@ class DomainKeydataForm(forms.Form): algorithm = forms.TypedChoiceField( required=True, label="Algorithm", + coerce=int, choices=[(None, "--Select--")] + ALGORITHM_CHOICES, # type: ignore error_messages={"required": ("Algorithm is required.")}, ) diff --git a/src/registrar/models/domain.py b/src/registrar/models/domain.py index 90a0168c4..2188a1764 100644 --- a/src/registrar/models/domain.py +++ b/src/registrar/models/domain.py @@ -291,7 +291,7 @@ class Domain(TimeStampedModel, DomainHelper): # TODO - 433 error handling ticket should address this logger.info("Domain does not have dnssec data defined %s" % err) return None - + def getDnssecdataChanges( self, _dnssecdata: dict ) -> tuple[dict, dict]: @@ -312,33 +312,37 @@ class Domain(TimeStampedModel, DomainHelper): """ oldDnssecdata = self.dnssecdata - addDnssecdata = {} - remDnssecdata = {} + addDnssecdata = {"dsData": [], "keyData": [],} + remDnssecdata = {"dsData": [], "keyData": [],} + + if _dnssecdata and len(_dnssecdata["dsData"]) > 0: - if len(_dnssecdata["dsData"]) > 0: # initialize addDnssecdata and remDnssecdata for dsData - addDnssecdata["dsData"] = [] + addDnssecdata["dsData"] = _dnssecdata["dsData"] remDnssecdata["dsData"] = [] - # if existing dsData not in new dsData, mark for removal - remDnssecdata["dsData"] = [dsData for dsData in oldDnssecdata["dsData"] if dsData not in _dnssecdata["dsData"]] + if oldDnssecdata and len(oldDnssecdata.dsData) > 0: + # if existing dsData not in new dsData, mark for removal + remDnssecdata["dsData"] = [dsData for dsData in oldDnssecdata.dsData if dsData not in _dnssecdata["dsData"]] - # if new dsData not in existing dsData, mark for add - addDnssecdata["dsData"] = [dsData for dsData in _dnssecdata["dsData"] if dsData not in oldDnssecdata["dsData"]] - elif len(_dnssecdata["keyData"]) > 0: + # if new dsData not in existing dsData, mark for add + addDnssecdata["dsData"] = [dsData for dsData in _dnssecdata["dsData"] if dsData not in oldDnssecdata.dsData] + + elif _dnssecdata and len(_dnssecdata["keyData"]) > 0: # initialize addDnssecdata and remDnssecdata for keyData - addDnssecdata["keyData"] = [] + addDnssecdata["keyData"] = _dnssecdata["keyData"] remDnssecdata["keyData"] = [] - # if existing keyData not in new keyData, mark for removal - remDnssecdata["keyData"] = [keyData for keyData in oldDnssecdata["keyData"] if keyData not in _dnssecdata["keyData"]] + if oldDnssecdata and len(oldDnssecdata.keyData) > 0: + # if existing keyData not in new keyData, mark for removal + remDnssecdata["keyData"] = [keyData for keyData in oldDnssecdata.keyData if keyData not in _dnssecdata["keyData"]] - # if new keyData not in existing keyData, mark for add - addDnssecdata["keyData"] = [keyData for keyData in _dnssecdata["keyData"] if keyData not in oldDnssecdata["keyData"]] + # if new keyData not in existing keyData, mark for add + addDnssecdata["keyData"] = [keyData for keyData in _dnssecdata["keyData"] if keyData not in oldDnssecdata.keyData] else: # there are no new dsData or keyData, remove all - remDnssecdata["dsData"] = oldDnssecdata["dsData"] - remDnssecdata["keyData"] = oldDnssecdata["keyData"] + remDnssecdata["dsData"] = getattr(oldDnssecdata, "dsData", None) + remDnssecdata["keyData"] = getattr(oldDnssecdata, "keyData", None) return addDnssecdata, remDnssecdata @@ -346,14 +350,14 @@ class Domain(TimeStampedModel, DomainHelper): def dnssecdata(self, _dnssecdata: dict): _addDnssecdata, _remDnssecdata = self.getDnssecdataChanges(_dnssecdata) addParams = { - "maxSigLife": _dnssecdata.get("maxSigLife", None), - "dsData": _dnssecdata.get("dsData", None), - "keyData": _dnssecdata.get("keyData", None), + "maxSigLife": _addDnssecdata.get("maxSigLife", None), + "dsData": _addDnssecdata.get("dsData", None), + "keyData": _addDnssecdata.get("keyData", None), } remParams = { - "maxSigLife": _dnssecdata.get("maxSigLife", None), - "dsData": _dnssecdata.get("dsData", None), - "keyData": _dnssecdata.get("keyData", None), + "maxSigLife": _remDnssecdata.get("maxSigLife", None), + "remDsData": _remDnssecdata.get("dsData", None), + "remKeyData": _remDnssecdata.get("keyData", None), } addRequest = commands.UpdateDomain(name=self.name) addExtension = commands.UpdateDomainDNSSECExtension(**addParams) @@ -362,8 +366,10 @@ class Domain(TimeStampedModel, DomainHelper): remExtension = commands.UpdateDomainDNSSECExtension(**remParams) remRequest.add_extension(remExtension) try: - registry.send(addRequest, cleaned=True) - registry.send(remRequest, cleaned=True) + if len(_addDnssecdata.get("dsData", [])) > 0 or len(_addDnssecdata.get("keyData",[])) > 0: + registry.send(addRequest, cleaned=True) + if len(_remDnssecdata.get("dsData", [])) > 0 or len(_remDnssecdata.get("keyData", [])) > 0: + registry.send(remRequest, cleaned=True) except RegistryError as e: logger.error("Error updating DNSSEC, code was %s error was %s" % (e.code, e)) raise e diff --git a/src/registrar/views/domain.py b/src/registrar/views/domain.py index e51395ba3..b4509b162 100644 --- a/src/registrar/views/domain.py +++ b/src/registrar/views/domain.py @@ -371,8 +371,8 @@ class DomainDsdataView(DomainPermissionView, FormMixin): # or form.cleaned_data['delete'] == False: dsrecord = { "keyTag": form.cleaned_data["key_tag"], - "alg": form.cleaned_data["algorithm"], - "digestType": form.cleaned_data["digest_type"], + "alg": int(form.cleaned_data["algorithm"]), + "digestType": int(form.cleaned_data["digest_type"]), "digest": form.cleaned_data["digest"], } dnssecdata["dsData"].append(common.DSData(**dsrecord)) @@ -490,9 +490,9 @@ class DomainKeydataView(DomainPermissionView, FormMixin): # if 'delete' not in form.cleaned_data # or form.cleaned_data['delete'] == False: keyrecord = { - "flags": form.cleaned_data["flag"], - "protocol": form.cleaned_data["protocol"], - "alg": form.cleaned_data["algorithm"], + "flags": int(form.cleaned_data["flag"]), + "protocol": int(form.cleaned_data["protocol"]), + "alg": int(form.cleaned_data["algorithm"]), "pubKey": form.cleaned_data["pub_key"], } dnssecdata["keyData"].append(common.DNSSECKeyData(**keyrecord))