mirror of
				https://github.com/mail-in-a-box/mailinabox.git
				synced 2025-11-03 19:30:54 +00:00 
			
		
		
		
	dns: move the quoting of TXT records to when we write the zone file so that we can display it unquoted in the External DNS instructions
This commit is contained in:
		
							parent
							
								
									954a234aa9
								
							
						
					
					
						commit
						110e0f90d9
					
				@ -169,7 +169,7 @@ def build_zone(domain, all_domains, additional_records, env, is_zone=True):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	# SPF record: Permit the box ('mx', see above) to send mail on behalf of
 | 
						# SPF record: Permit the box ('mx', see above) to send mail on behalf of
 | 
				
			||||||
	# the domain, and no one else.
 | 
						# the domain, and no one else.
 | 
				
			||||||
	records.append((None,  "TXT", '"v=spf1 mx -all"', "Recommended. Specifies that only the box is permitted to send @%s mail." % domain))
 | 
						records.append((None,  "TXT", 'v=spf1 mx -all', "Recommended. Specifies that only the box is permitted to send @%s mail." % domain))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Add DNS records for any subdomains of this domain. We should not have a zone for
 | 
						# Add DNS records for any subdomains of this domain. We should not have a zone for
 | 
				
			||||||
	# both a domain and one of its subdomains.
 | 
						# both a domain and one of its subdomains.
 | 
				
			||||||
@ -213,11 +213,12 @@ def build_zone(domain, all_domains, additional_records, env, is_zone=True):
 | 
				
			|||||||
	if os.path.exists(opendkim_record_file):
 | 
						if os.path.exists(opendkim_record_file):
 | 
				
			||||||
		# Append the DKIM TXT record to the zone as generated by OpenDKIM, after string formatting above.
 | 
							# Append the DKIM TXT record to the zone as generated by OpenDKIM, after string formatting above.
 | 
				
			||||||
		with open(opendkim_record_file) as orf:
 | 
							with open(opendkim_record_file) as orf:
 | 
				
			||||||
			m = re.match(r"(\S+)\s+IN\s+TXT\s+(\(.*\))\s*;", orf.read(), re.S)
 | 
								m = re.match(r'(\S+)\s+IN\s+TXT\s+\( "([^"]+)"\s+"([^"]+)"\s*\)', orf.read(), re.S)
 | 
				
			||||||
			records.append((m.group(1), "TXT", m.group(2), "Recommended. Provides a way for recipients to verify that this machine sent @%s mail." % domain))
 | 
								val = m.group(2) + m.group(3)
 | 
				
			||||||
 | 
								records.append((m.group(1), "TXT", val, "Recommended. Provides a way for recipients to verify that this machine sent @%s mail." % domain))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Append a DMARC record.
 | 
							# Append a DMARC record.
 | 
				
			||||||
		records.append(("_dmarc", "TXT", '"v=DMARC1; p=quarantine"', "Optional. Specifies that mail that does not originate from the box but claims to be from @%s is suspect and should be quarantined by the recipient's mail system." % domain))
 | 
							records.append(("_dmarc", "TXT", 'v=DMARC1; p=quarantine', "Optional. Specifies that mail that does not originate from the box but claims to be from @%s is suspect and should be quarantined by the recipient's mail system." % domain))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Sort the records. The None records *must* go first in the nsd zone file. Otherwise it doesn't matter.
 | 
						# Sort the records. The None records *must* go first in the nsd zone file. Otherwise it doesn't matter.
 | 
				
			||||||
	records.sort(key = lambda rec : list(reversed(rec[0].split(".")) if rec[0] is not None else ""))
 | 
						records.sort(key = lambda rec : list(reversed(rec[0].split(".")) if rec[0] is not None else ""))
 | 
				
			||||||
@ -261,11 +262,6 @@ def get_custom_records(domain, additional_records, env):
 | 
				
			|||||||
			if rtype == "AAAA" and value2 == "local":
 | 
								if rtype == "AAAA" and value2 == "local":
 | 
				
			||||||
				if "PUBLIC_IPV6" not in env: continue # no IPv6 address is available so don't set anything
 | 
									if "PUBLIC_IPV6" not in env: continue # no IPv6 address is available so don't set anything
 | 
				
			||||||
				value2 = env["PUBLIC_IPV6"]
 | 
									value2 = env["PUBLIC_IPV6"]
 | 
				
			||||||
 | 
					 | 
				
			||||||
			# For typical zone file output, quote a text record.
 | 
					 | 
				
			||||||
			if rtype == "TXT":
 | 
					 | 
				
			||||||
				value2 = "\"" + value2 + "\""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			yield (qname, rtype, value2)
 | 
								yield (qname, rtype, value2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
########################################################################
 | 
					########################################################################
 | 
				
			||||||
@ -363,6 +359,10 @@ $TTL 1800           ; default time to live
 | 
				
			|||||||
		if subdomain:
 | 
							if subdomain:
 | 
				
			||||||
			zone += subdomain
 | 
								zone += subdomain
 | 
				
			||||||
		zone += "\tIN\t" + querytype + "\t"
 | 
							zone += "\tIN\t" + querytype + "\t"
 | 
				
			||||||
 | 
							if querytype == "TXT":
 | 
				
			||||||
 | 
								value = value.replace('\\', '\\\\') # escape backslashes
 | 
				
			||||||
 | 
								value = value.replace('"', '\\"') # escape quotes
 | 
				
			||||||
 | 
								value = '"' + value + '"' # wrap in quotes
 | 
				
			||||||
		zone += value + "\n"
 | 
							zone += value + "\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# DNSSEC requires re-signing a zone periodically. That requires
 | 
						# DNSSEC requires re-signing a zone periodically. That requires
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user