From 1a9666df233e6537e33c61c5981f5abd7ada4a63 Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Mon, 11 Mar 2024 21:24:23 +0100 Subject: [PATCH] WIP: DKIM. --- src/storage/zone.cr | 56 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/src/storage/zone.cr b/src/storage/zone.cr index 4990e90..d2429ec 100644 --- a/src/storage/zone.cr +++ b/src/storage/zone.cr @@ -66,7 +66,7 @@ class DNSManager::Storage::Zone def to_s(io : IO) io << "(#{ "%4d" % @rrid }) " - io << "#{ "%30s" % @name} #{ "%6d" % @ttl} IN #{ "%10s" % @rrtype } #{ "%30s" % @target}\n" + io << "#{ "%30s" % @name} #{ "%6d" % @ttl} #{ "%10s" % @rrtype } #{ "%30s" % @target}\n" end def to_bind9(io : IO) @@ -96,7 +96,7 @@ class DNSManager::Storage::Zone def to_s(io : IO) io << "(#{ "%4d" % @rrid }) " - io << "#{name} #{ttl} IN SOA (#{mname} #{rname}\n" + io << "#{name} #{ttl} SOA (#{mname} #{rname}\n" io << "\t\t#{ "%10d" % serial } ; serial\n" io << "\t\t#{ "%10d" % refresh } ; refresh\n" io << "\t\t#{ "%10d" % retry } ; retry\n" @@ -414,7 +414,7 @@ class DNSManager::Storage::Zone def to_s(io : IO) io << "(#{ "%4d" % @rrid }) " - io << "#{ "%30s" % @name} #{ "%6d" % @ttl} IN SPF " + io << "#{ "%30s" % @name} #{ "%6d" % @ttl} SPF " io << '"' @mechanisms.each do |m| io << m @@ -454,10 +454,19 @@ class DNSManager::Storage::Zone # TODO class DKIM < ResourceRecord - property v : String = "DKIM1" # DKIM version - property h : String = "sha256" # encrypting cryptographic algorithm - property k : String = "rsa" # signing cryptographic algorithm - property p : String # public key + enum Version + DKIM1 + end + enum SignatureAlgorithm + RSA + end + enum HashAlgorithm + SHA256 + end + property v : Version = Version::DKIM1 + property h : HashAlgorithm = HashAlgorithm::SHA256 + property k : SignatureAlgorithm = SignatureAlgorithm::RSA + property p : String # public key def initialize(@name, @ttl, @target, @v, @h, @k, @p) @rrtype = "DKIM" end @@ -474,6 +483,21 @@ class DNSManager::Storage::Zone end errors end + + def to_s(io : IO) + io << "(#{ "%4d" % @rrid }) " + io << "#{ "%30s" % @name} #{ "%6d" % @ttl} DKIM " + io << "( " + io << split_line "v=#{v};h=#{h};k=#{k};p=#{p}" + io << " )" + end + + def to_bind9(io : IO) + io << "#{@name} #{@ttl} IN TXT " + io << "( " + io << split_line "v=#{v};h=#{h};k=#{k};p=#{p}" + io << " )" + end end # TODO @@ -504,7 +528,7 @@ class DNSManager::Storage::Zone def to_s(io : IO) io << "(#{ "%4d" % @rrid }) " - io << "#{ "%30s" % @name} #{ "%6d" % @ttl} IN MX #{ "%3d" % @priority} #{ "%30s" % @target}\n" + io << "#{ "%30s" % @name} #{ "%6d" % @ttl} MX #{ "%3d" % @priority} #{ "%30s" % @target}\n" end def to_bind9(io : IO) @@ -562,7 +586,7 @@ class DNSManager::Storage::Zone def to_s(io : IO) io << "(#{ "%4d" % @rrid }) " io << "#{ "%30s" % @name} " - io << "#{ "%6d" % @ttl} IN SRV " + io << "#{ "%6d" % @ttl} SRV " io << "#{ "%3d" % @priority} " io << "#{ "%3d" % @weight} " io << "#{ "%5d" % @port} " @@ -733,3 +757,17 @@ end def qualifier_to_string(qualifier : DNSManager::Storage::Zone::SPF::Qualifier) : String "#{qualifier_to_char qualifier}all" end + +def split_line(line : String) : String + iostr = IO::Memory.new line + slice = Bytes.new(50) + lines = "" + while rbytes = iostr.read slice + lines += '"' + lines += String.new slice[0..rbytes] + lines += '"' + lines += "\n\t" + end + + lines +end