Class Dnsruby::RR::TXT
In: lib/Dnsruby/resource/TXT.rb
Parent: RR
Message Update ResolvError EncodeError OtherResolvError ServFail FormErr DecodeError NXRRSet YXDomain NotImp NXDomain VerifyError NotAuth YXRRSet NotZone Refused TsigError CodeMapper Types MetaTypes QTypes Nsec3HashAlgorithms Algorithms OpCode Classes ExtendedRCode Modes RCode Comparable Name RRSet TsigNotSignedResponseError Resolver SingleResolver StandardError TimeoutError ResolvTimeout DNS Dnssec Hosts RR\n[lib/Dnsruby/resource/A.rb\nlib/Dnsruby/resource/AAAA.rb\nlib/Dnsruby/resource/AFSDB.rb\nlib/Dnsruby/resource/CERT.rb\nlib/Dnsruby/resource/DHCID.rb\nlib/Dnsruby/resource/DLV.rb\nlib/Dnsruby/resource/DNSKEY.rb\nlib/Dnsruby/resource/DS.rb\nlib/Dnsruby/resource/HINFO.rb\nlib/Dnsruby/resource/HIP.rb\nlib/Dnsruby/resource/IN.rb\nlib/Dnsruby/resource/IPSECKEY.rb\nlib/Dnsruby/resource/ISDN.rb\nlib/Dnsruby/resource/KX.rb\nlib/Dnsruby/resource/LOC.rb\nlib/Dnsruby/resource/MINFO.rb\nlib/Dnsruby/resource/MX.rb\nlib/Dnsruby/resource/NAPTR.rb\nlib/Dnsruby/resource/NSAP.rb\nlib/Dnsruby/resource/NSEC.rb\nlib/Dnsruby/resource/NSEC3.rb\nlib/Dnsruby/resource/NSEC3PARAM.rb\nlib/Dnsruby/resource/OPT.rb\nlib/Dnsruby/resource/PX.rb\nlib/Dnsruby/resource/RP.rb\nlib/Dnsruby/resource/RRSIG.rb\nlib/Dnsruby/resource/RT.rb\nlib/Dnsruby/resource/SOA.rb\nlib/Dnsruby/resource/SPF.rb\nlib/Dnsruby/resource/SRV.rb\nlib/Dnsruby/resource/SSHFP.rb\nlib/Dnsruby/resource/TKEY.rb\nlib/Dnsruby/resource/TSIG.rb\nlib/Dnsruby/resource/TXT.rb\nlib/Dnsruby/resource/X25.rb\nlib/Dnsruby/resource/domain_name.rb\nlib/Dnsruby/resource/generic.rb\nlib/Dnsruby/resource/resource.rb] Recursor IPv6 IPv4 ZoneTransfer MessageDecoder MessageEncoder Question Header TheLog ValidatorThread PacketSender ResolverRuby Config KeyCache Cache SingleVerifier SelectThread Resolv ZoneReader lib/Dnsruby/DNS.rb lib/Dnsruby/dnssec.rb lib/Dnsruby/Hosts.rb lib/Dnsruby/resource/generic.rb lib/Dnsruby/Recursor.rb lib/Dnsruby/update.rb lib/Dnsruby/ipv6.rb lib/Dnsruby/ipv4.rb lib/Dnsruby/code_mapper.rb lib/Dnsruby/zone_transfer.rb lib/Dnsruby/message.rb lib/Dnsruby/TheLog.rb lib/Dnsruby/resource/resource.rb lib/Dnsruby/validator_thread.rb lib/Dnsruby/PacketSender.rb lib/Dnsruby/Resolver.rb lib/Dnsruby/Config.rb lib/Dnsruby/key_cache.rb lib/Dnsruby/Cache.rb lib/Dnsruby/single_verifier.rb lib/Dnsruby/SingleResolver.rb lib/Dnsruby/select_thread.rb lib/Dnsruby/name.rb lib/dnsruby.rb lib/Dnsruby/resource/TKEY.rb lib/Dnsruby/zone_reader.rb Dnsruby dot/m_61_0.png

Class for DNS Text (TXT) resource records. RFC 1035 Section 3.3.14

Methods

Constants

TypeValue = Types::TXT #:nodoc: all
ESCAPE_CHARS = {"b" => 8, "t" => 9, "n" => 10, "v" => 11, "f" => 12, "r" => 13}
ESCAPE_CODES = ESCAPE_CHARS.invert

Attributes

strings  [RW]  List of the individual elements

Public Class methods

[Source]

     # File lib/Dnsruby/resource/TXT.rb, line 138
138:       def TXT.display(str, do_escapes = true)
139:         output = ""
140:         # Probably need to scan through each string manually

141:         # Make sure to remember to escape binary characters.

142:         # Go through copying to output, and adding "\" characters as necessary?

143:         str.each_byte {|c|
144:           if (c == 34) || (c == 92) # || (c == 59)

145:             if (do_escapes)
146:             output+='\\'
147:             end
148:             output+=c.chr
149:           elsif (c < 32) # c is binary

150:             if (ESCAPE_CODES[c])
151:               output +=  c.chr
152:             else
153:               output+= '\\'
154:               num = c.to_i.to_s
155:               (3-num.length).times {|i|
156:                 num="0"+num
157:               }
158:               output+= num # Need a 3 digit number here.

159:             end
160: 
161:           else
162:             output += c.chr
163:           end
164:         }
165:         return output
166:       end

[Source]

     # File lib/Dnsruby/resource/TXT.rb, line 52
 52:       def TXT.parse(input)
 53:         # Need to look out for special characters.

 54:         # Need to split the input up into strings (which are defined by non-escaped " characters)

 55:         # Then need to fix up any \ escape characters (should just be " and ; and binary?)

 56:         # Sadly, it's going to be easiest just to scan through this character by character...

 57:         in_escaped = false
 58:         in_string = false
 59:         count = -1
 60:         strings = []
 61:         current_binary = ""
 62:         current_quote_char = '"'
 63:         unquoted = false
 64:         seen_strings = false
 65:         pos = 0
 66:         input.each_char {|c|
 67:           if (((c == "'") || (c == '"')) && (!in_escaped) && (!unquoted))
 68:             if (!in_string)
 69:               seen_strings = true
 70:               current_quote_char = c
 71:               in_string = true
 72:               count+=1
 73:               strings[count] = ""
 74:             else
 75:               if (c == current_quote_char)
 76:                 in_string = false
 77:               else
 78:                 strings[count]+=c
 79:               end
 80:             end
 81:           else
 82:             if (seen_strings && !in_string)
 83:               next
 84:             end
 85:             if (pos == 0)
 86:               unquoted = true
 87:               count+=1
 88:               strings[count] = ""
 89:             elsif (unquoted)
 90:               if (c == " ")
 91:                 count+=1
 92:                 strings[count] = ""
 93:                 pos += 1
 94:                 next
 95:               end
 96:             end
 97: 
 98:             if (c == "\\")
 99:               if (in_escaped)
100:                 in_escaped = false
101:                 strings[count]+=(c)
102:               else
103:                 in_escaped = true
104:               end
105:             else
106:               if (in_escaped)
107:                 # Build up the binary

108:                 if (c == ";") || (c == '"')
109:                   strings[count]+=c
110:                   in_escaped = false
111:                 elsif (ESCAPE_CHARS[c])
112:                   in_escaped=false
113:                   strings[count]+=ESCAPE_CHARS[c].chr
114:                 elsif (c<"0" || c>"9")
115:                   in_escaped = false
116:                   strings[count]+=c
117:                 else
118:                   # Must be building up three digit string to identify binary value?

119: #                  if (c >= "0" && c <= "9")

120:                     current_binary += c
121: #                  end

122:                   if ((current_binary.length == 3) ) # || (c < "0" || c > "9"))

123:                     strings[count]+=current_binary.to_i.chr
124:                     in_escaped = false
125:                     current_binary = ""
126:                   end
127:                 end
128:               else
129:                 strings[count]+=(c)
130:               end
131:             end
132:           end
133:           pos += 1
134:         }
135:         return strings
136:       end

Public Instance methods

[Source]

    # File lib/Dnsruby/resource/TXT.rb, line 31
31:       def data
32:         @strings[0]
33:       end

[Source]

    # File lib/Dnsruby/resource/TXT.rb, line 35
35:       def from_data(data)
36:         @strings = data
37:       end

[Source]

    # File lib/Dnsruby/resource/TXT.rb, line 39
39:       def from_hash(hash)
40:         if (hash.has_key?:strings)
41:           from_string(hash[:strings])
42:         end
43:       end

[Source]

    # File lib/Dnsruby/resource/TXT.rb, line 48
48:       def from_string(input)
49:         @strings = TXT.parse(input)
50:       end

[Source]

     # File lib/Dnsruby/resource/TXT.rb, line 168
168:       def rdata_to_string
169:         if (defined?@strings)
170:           temp = []
171:           @strings.each {|str|
172:             output = TXT.display(str)
173:             temp.push("\"#{output}\"")
174:           }
175:           return temp.join(' ')
176:         end
177:         return ''
178:       end

[Validate]