Skip to content

Commit

Permalink
Namecoin: Add support for ZeroNet DNS records
Browse files Browse the repository at this point in the history
  • Loading branch information
JeremyRand committed Dec 12, 2019
1 parent 2ea261a commit 94c0fdc
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
16 changes: 16 additions & 0 deletions electrum_nmc/electrum/gui/qt/configure_dns_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ def create_address_record(self):
"Tor": "tor",
"I2P": "i2p",
"Freenet": "freenet",
"ZeroNet": "zeronet",
}

address_type = address_type_dict[self.ui.comboHostType.currentText()]
Expand All @@ -136,6 +137,10 @@ def create_address_record(self):
self.show_error(domain + _(" already has a Freenet record."))
return

if address_type == "zeronet" and self.has_zeronet_record(domain):
self.show_error(domain + _(" already has a ZeroNet record."))
return

address = self.ui.editAHostname.text()

record = [domain, "address", [address_type, address]]
Expand All @@ -162,6 +167,15 @@ def has_freenet_record(self, domain):

return False

def has_zeronet_record(self, domain):
for record in self.get_records():
record_domain, record_type, data = record

if record_domain == domain and record_type == "address" and data[0] == "zeronet":
return True

return False

def insert_record(self, idx, record):
domain, record_type, data = record

Expand All @@ -179,6 +193,8 @@ def insert_record(self, idx, record):
formatted_data = "I2P: " + data[1]
elif data[0] == "freenet":
formatted_data = "Freenet: " + data[1]
elif data[0] == "zeronet":
formatted_data = "ZeroNet: " + data[1]
else:
raise Exception("Unknown address type")
elif record_type == "txt":
Expand Down
41 changes: 41 additions & 0 deletions electrum_nmc/electrum/names.py
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,12 @@ def get_domain_records_address(domain, value):
if value["freenet"] == None:
del value["freenet"]

if "zeronet" in value:
new_records, value["zeronet"] = get_domain_records_address_zeronet(domain, value["zeronet"])
records.extend(new_records)
if value["zeronet"] == None:
del value["zeronet"]

return records, value

def get_domain_records_address_ip4(domain, value):
Expand Down Expand Up @@ -637,6 +643,31 @@ def get_domain_records_address_freenet(domain, value):

return records, remaining

def get_domain_records_address_zeronet(domain, value):
records = []
remaining = None

# Parse the standards-compliant ZeroNet format
if type(value) == str:
records.append([domain, "address", ["zeronet", value]])

# Parse the old-style dict ZeroNet format
if type(value) == dict:
for label in value:
# Make sure the ZeroNet value is a string, bail if it's not
if type(value[label]) != str:
return [], value

# Special-case for empty ZeroNet key
if label == "":
single_domain = domain
else:
single_domain = label + "." + domain

records.append([single_domain, "address", ["zeronet", value[label]]])

return records, remaining

def get_domain_records_txt(domain, value):
# Process Tor specially
if domain.startswith("_tor."):
Expand Down Expand Up @@ -759,6 +790,8 @@ def add_domain_record_address(value, data):
add_domain_record_address_i2p(value, address_data)
elif address_type == "freenet":
add_domain_record_address_freenet(value, address_data)
elif address_type == "zeronet":
add_domain_record_address_zeronet(value, address_data)
else:
raise Exception("Unknown address type")

Expand Down Expand Up @@ -794,6 +827,14 @@ def add_domain_record_address_freenet(value, data):
# Add the record
value["freenet"] = data

def add_domain_record_address_zeronet(value, data):
# Make sure the field doesn't already exist
if "zeronet" in value:
raise Exception("Multiple ZeroNet records for one domain")

# Add the record
value["zeronet"] = data

def add_domain_record_txt(value, data):
# Make sure the field exists
if "txt" not in value:
Expand Down

0 comments on commit 94c0fdc

Please sign in to comment.