diff --git a/src/storage/zone.cr b/src/storage/zone.cr index 2d44866..fe9e0b1 100644 --- a/src/storage/zone.cr +++ b/src/storage/zone.cr @@ -260,6 +260,22 @@ class DNSManager::Storage::Zone # baguette.netlib.re. 3600 IN TXT "v=spf1 a mx ip4: a:mail.baguette.netlib.re ~all" class SPF < ResourceRecord + def qualifier_to_char(qualifier : Qualifier) : Char + case qualifier + when .pass? + '+' + when .none? + '?' + when .soft_fail? + '~' + # when .hard_fail? + else '-' + end + end + def qualifier_to_string(qualifier : Qualifier) : String + "#{qualifier_to_char qualifier}all" + end + # SPF mechanisms are about policy, which comes with the form of a single character: # - '?' means no policy (neutral), # - '+' means PASS result. Default behavior for any mechanism except `all`. @@ -309,6 +325,10 @@ class DNSManager::Storage::Zone errors = [] of Error errors end + + def to_s + "#{@t}=#{v}" + end end class Mechanism @@ -333,7 +353,7 @@ class DNSManager::Storage::Zone # TODO def get_errors : Array(Error) errors = [] of Error - case @q + case @t when Mechanism::Type::A when Mechanism::Type::IP4 when Mechanism::Type::IP6 @@ -344,6 +364,10 @@ class DNSManager::Storage::Zone end errors end + + def to_s + "#{qualifier_to_char @q}#{@t}=#{v}" + end end property v : String = "spf1" @@ -363,11 +387,11 @@ class DNSManager::Storage::Zone errors = [] of Error unless Zone.is_subdomain_valid? @name - errors << "CNAME invalid subdomain: #{@name}" + errors << "SPF invalid subdomain: #{@name}" end if @ttl < Zone.ttl_limit_min - errors << "CNAME invalid ttl: #{@ttl}, shouldn't be less than #{Zone.ttl_limit_min}" + errors << "SPF invalid ttl: #{@ttl}, shouldn't be less than #{Zone.ttl_limit_min}" end @mechanisms.each do |m| @@ -388,11 +412,40 @@ class DNSManager::Storage::Zone end def to_s(io : IO) - io << "TODO" + io << "(#{ "%4d" % @rrid }) " + io << "#{ "%30s" % @name} #{ "%6d" % @ttl} IN SPF " + io << '"' + @mechanisms.each do |m| + io << m + io << ' ' + end + if mod = @modifiers + mod.each do |m| + io << m + io << ' ' + end + end + io << qualifier_to_string @q + io << '"' + io << "\n" end def to_bind9(io : IO) - io << "TODO" + io << "#{@name} #{@ttl} IN TXT " + io << '"' + @mechanisms.each do |m| + io << m + io << ' ' + end + if mod = @modifiers + mod.each do |m| + io << m + io << ' ' + end + end + io << qualifier_to_string @q + io << '"' + io << "\n" end end