dnsruby 1.60.1 → 1.60.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cfb5e0f9d0b657bba3a0ad8d8edde456e253d638
4
- data.tar.gz: 4c80209c7c2e6823e1958e9c79c0665805c0f9a0
3
+ metadata.gz: 286d5426865cf680082a434f91ceb9004ef616ca
4
+ data.tar.gz: b6dfef1f6420e1246c074c86de4ddac5260ba02a
5
5
  SHA512:
6
- metadata.gz: 2f53ebb527626d922813c53b4c8cd8daa73ff22721a812ea55963c28201b44da43c7be779316fb9e3041a7183e0c7c3ef99faf73a69fb9fb9845b70ce428f31f
7
- data.tar.gz: b93907dc484ddd07a0fcd2b8eaeebbc92d261c23bd2046ce7c6159c75a3fe350eae485977b6afcac44bcdf999501d2eb4255f92118f1e8f0e682193d74db9dfa
6
+ metadata.gz: d447b1b997edfad80524e859f7088143e6b48dc3da6fdbf942777ff8d1f8ad40d09944b8679965ea1623804ecc92c54814d271d7faec73e858a5836d14196173
7
+ data.tar.gz: 5f4c06324994a7c07b2257cfaef48b2f482305189fad014a846cf88ccd91988e480949c3279f824e401724a1be7fd83d8427fc766a2b486f898c04430bcdab51
@@ -1,5 +1,13 @@
1
1
  # Release Notes
2
2
 
3
+ ## v1.60.2
4
+
5
+ * Fix deletion of TXT records with spaces in dynamic updates (thanks Sean Dilda)
6
+ * Fix use of non-default ports in Dnsruby::Resolver (thanks Thomas Morgan)
7
+ * Fix NAPTR encoding for null rdata dynamic update packets
8
+ * Fix CAA resource record encoding
9
+ * Avoid changing ruby global thread abort behavior (thanks Brent Cook)
10
+
3
11
  ## v1.60.1
4
12
 
5
13
  * DNSSEC validation switched OFF by default (but can still be switched on)
@@ -487,6 +487,7 @@ module Dnsruby
487
487
  @config.nameserver.each do |ns|
488
488
  res = PacketSender.new({
489
489
  server: ns,
490
+ port: @port,
490
491
  dnssec: @dnssec,
491
492
  use_tcp: @use_tcp,
492
493
  no_tcp: @no_tcp,
@@ -54,15 +54,17 @@ module Dnsruby
54
54
  end
55
55
 
56
56
  def encode_rdata(msg, canonical=false) #:nodoc: all
57
- msg.put_pack('n', flag)
57
+ msg.put_pack('C', flag)
58
58
  msg.put_string(@property_tag)
59
- msg.put_string(@property_value)
59
+ # We don't put a length byte on the final string.
60
+ msg.put_bytes(@property_value)
60
61
  end
61
62
 
62
63
  def self.decode_rdata(msg) #:nodoc: all
63
- flag, = msg.get_unpack('n')
64
+ flag, = msg.get_unpack('C')
64
65
  property_tag = msg.get_string
65
- property_value = msg.get_string
66
+ # The final string has no length byte - its length is implicit as the remainder of the packet length
67
+ property_value = msg.get_bytes
66
68
  return self.new("#{flag} #{property_tag} \"#{property_value}\"")
67
69
  end
68
70
  end
@@ -52,7 +52,7 @@ module Dnsruby
52
52
  end
53
53
 
54
54
  def from_string(input) #:nodoc: all
55
- if (input.length > 0)
55
+ if (input.strip.length > 0)
56
56
  values = input.split(" ")
57
57
  @order = values [0].to_i
58
58
  @preference = values [1].to_i
@@ -76,12 +76,14 @@ module Dnsruby
76
76
  end
77
77
 
78
78
  def encode_rdata(msg, canonical=false) #:nodoc: all
79
- msg.put_pack('n', @order)
80
- msg.put_pack('n', @preference)
81
- msg.put_string(@flags)
82
- msg.put_string(@service)
83
- msg.put_string(@regexp)
84
- msg.put_name(@replacement, true)
79
+ if (@order != nil)
80
+ msg.put_pack('n', @order)
81
+ msg.put_pack('n', @preference)
82
+ msg.put_string(@flags)
83
+ msg.put_string(@service)
84
+ msg.put_string(@regexp)
85
+ msg.put_name(@replacement, true)
86
+ end
85
87
  end
86
88
 
87
89
  def self.decode_rdata(msg) #:nodoc: all
@@ -24,7 +24,6 @@ require 'set'
24
24
  require 'singleton'
25
25
  require 'dnsruby/validator_thread.rb'
26
26
  module Dnsruby
27
- Thread::abort_on_exception = true
28
27
  class SelectThread #:nodoc: all
29
28
  class SelectWakeup < RuntimeError; end
30
29
  include Singleton
@@ -1,12 +1,12 @@
1
1
  # --
2
2
  # Copyright 2007 Nominet UK
3
- #
3
+ #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
6
6
  # You may obtain a copy of the License at
7
- #
7
+ #
8
8
  # http://www.apache.org/licenses/LICENSE-2.0
9
- #
9
+ #
10
10
  # Unless required by applicable law or agreed to in writing, software
11
11
  # distributed under the License is distributed on an "AS IS" BASIS,
12
12
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,81 +20,81 @@ module Dnsruby
20
20
 
21
21
  # The first example below shows a complete program; subsequent examples
22
22
  # show only the creation of the update packet.
23
- #
23
+ #
24
24
  # == Add a new host
25
- #
25
+ #
26
26
  # require 'Dnsruby'
27
- #
27
+ #
28
28
  # # Create the update packet.
29
29
  # update = Dnsruby::Update.new('example.com')
30
- #
30
+ #
31
31
  # # Prerequisite is that no A records exist for the name.
32
32
  # update.absent('foo.example.com.', 'A')
33
- #
33
+ #
34
34
  # # Add two A records for the name.
35
35
  # update.add('foo.example.com.', 'A', 86400, '192.168.1.2')
36
36
  # update.add('foo.example.com.', 'A', 86400, '172.16.3.4')
37
- #
37
+ #
38
38
  # # Send the update to the zone's primary master.
39
39
  # res = Dnsruby::Resolver.new({:nameserver => 'primary-master.example.com'})
40
- #
40
+ #
41
41
  # begin
42
42
  # reply = res.send_message(update)
43
43
  # print "Update succeeded\n"
44
44
  # rescue Exception => e
45
45
  # print 'Update failed: #{e}\n'
46
46
  # end
47
- #
47
+ #
48
48
  # == Add an MX record for a name that already exists
49
- #
49
+ #
50
50
  # update = Dnsruby::Update.new('example.com')
51
51
  # update.present('example.com')
52
- # update.add('example.com', Dnsruby::Types.MX, 10, 'mailhost.example.com')
53
- #
52
+ # update.add('example.com', Dnsruby::Types.MX, 86400, 10, 'mailhost.example.com')
53
+ #
54
54
  # == Add a TXT record for a name that doesn't exist
55
- #
55
+ #
56
56
  # update = Dnsruby::Update.new('example.com')
57
57
  # update.absent('info.example.com')
58
58
  # update.add('info.example.com', Types.TXT, 86400, "yabba dabba doo"')
59
- #
59
+ #
60
60
  # == Delete all A records for a name
61
- #
61
+ #
62
62
  # update = Dnsruby::Update.new('example.com')
63
63
  # update.present('foo.example.com', 'A')
64
64
  # update.delete('foo.example.com', 'A')
65
- #
65
+ #
66
66
  # == Delete all RRs for a name
67
- #
67
+ #
68
68
  # update = Dnsruby::Update.new('example.com')
69
69
  # update.present('byebye.example.com')
70
70
  # update.delete('byebye.example.com')
71
- #
71
+ #
72
72
  # == Perform a signed update
73
- #
73
+ #
74
74
  # key_name = 'tsig-key'
75
75
  # key = 'awwLOtRfpGE+rRKF2+DEiw=='
76
- #
76
+ #
77
77
  # update = Dnsruby::Update.new('example.com')
78
- # update.add('foo.example.com', 'A', 86400, 10.1.2.3'))
79
- # update.add('bar.example.com', 'A', 86400, 10.4.5.6'))
78
+ # update.add('foo.example.com', 'A', 86400, '10.1.2.3'))
79
+ # update.add('bar.example.com', 'A', 86400, '10.4.5.6'))
80
80
  # res.tsig=(key_name,key)
81
- #
81
+ #
82
82
  class Update < Message
83
83
  # Returns a Dnsruby::Update object suitable for performing a DNS
84
84
  # dynamic update. Specifically, it creates a message with the header
85
85
  # opcode set to UPDATE and the zone record type to SOA (per RFC 2136,
86
86
  # Section 2.3).
87
- #
87
+ #
88
88
  # Programs must use the push method to add RRs to the prerequisite,
89
89
  # update, and additional sections before performing the update.
90
- #
90
+ #
91
91
  # Arguments are the zone name and the class. If the zone is omitted,
92
92
  # the default domain will be taken from the resolver configuration.
93
93
  # If the class is omitted, it defaults to IN.
94
94
  # packet = Dnsruby::Update.new
95
95
  # packet = Dnsruby::Update.new('example.com')
96
96
  # packet = Dnsruby::Update.new('example.com', 'HS')
97
- #
97
+ #
98
98
  def initialize(zone=nil, klass=nil)
99
99
 
100
100
  # sort out the zone section (RFC2136, section 2.3)
@@ -115,25 +115,25 @@ module Dnsruby
115
115
  end
116
116
 
117
117
  # Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
118
- #
118
+ #
119
119
  # (1) RRset exists (value independent). At least one RR with a
120
120
  # specified NAME and TYPE (in the zone and class specified by
121
121
  # the Zone Section) must exist.
122
- #
122
+ #
123
123
  # update.present(name, type)
124
- #
124
+ #
125
125
  # (2) RRset exists (value dependent). A set of RRs with a
126
126
  # specified NAME and TYPE exists and has the same members
127
127
  # with the same RDATAs as the RRset specified here in this
128
128
  # Section.
129
- #
129
+ #
130
130
  # update.present(name, type, rdata)
131
- #
131
+ #
132
132
  # (4) Name is in use. At least one RR with a specified NAME (in
133
133
  # the zone and class specified by the Zone Section) must exist.
134
134
  # Note that this prerequisite is NOT satisfied by empty
135
135
  # nonterminals.
136
- #
136
+ #
137
137
  # update.present(name)
138
138
  def present(*args)
139
139
  ttl = 0
@@ -159,18 +159,18 @@ module Dnsruby
159
159
 
160
160
  # Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4)
161
161
  # Can be called with one arg :
162
- #
162
+ #
163
163
  # update.absent(name)
164
164
  # (5) Name is not in use. No RR of any type is owned by a
165
165
  # specified NAME. Note that this prerequisite IS satisfied by
166
166
  # empty nonterminals.
167
- #
167
+ #
168
168
  # Or with two :
169
- #
169
+ #
170
170
  # update.absent(name, type)
171
171
  # (3) RRset does not exist. No RRs with a specified NAME and TYPE
172
172
  # (in the zone and class denoted by the Zone Section) can exist.
173
- #
173
+ #
174
174
  def absent(*args)
175
175
  ttl = 0
176
176
  rdata = ""
@@ -191,16 +191,16 @@ module Dnsruby
191
191
 
192
192
  # Ways to create the update records (add, delete, RFC2136, section 2.5)
193
193
  # " 2.5.1 - Add To An RRset
194
- #
194
+ #
195
195
  # RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH
196
196
  # and RDATA are those being added, and CLASS is the same as the zone
197
197
  # class. Any duplicate RRs will be silently ignored by the primary
198
198
  # master."
199
- #
199
+ #
200
200
  # update.add(rr)
201
201
  # update.add([rr1, rr2])
202
202
  # update.add(name, type, ttl, rdata)
203
- #
203
+ #
204
204
  def add(*args)
205
205
  zoneclass=zone()[0].zclass
206
206
  case args[0]
@@ -244,17 +244,17 @@ module Dnsruby
244
244
  end
245
245
 
246
246
  # Ways to create the update records (add, delete, RFC2136, section 2.5)
247
- #
247
+ #
248
248
  # 2.5.2 - Delete An RRset
249
249
  # update.delete(name, type)
250
- #
251
- #
250
+ #
251
+ #
252
252
  # 2.5.3 - Delete All RRsets From A Name
253
253
  # update.delete(name)
254
- #
254
+ #
255
255
  # 2.5.4 - Delete An RR From An RRset
256
256
  # update.delete(name, type, rdata)
257
- #
257
+ #
258
258
  def delete(*args)
259
259
  ttl = 0
260
260
  klass = Classes.ANY
@@ -268,11 +268,28 @@ module Dnsruby
268
268
  resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{rdata}")
269
269
  add_update(resource)
270
270
  when 3 # name, type, rdata
271
- resource = RR.create("#{args[0]} #{ttl} IN #{args[1]} #{args[2]}")
271
+ name = args[0]
272
+ type = args[1]
273
+ rdata = args[2]
274
+ if (Types.new(type) == Types.TXT)
275
+ instring = "#{name} #{ttl} IN #{type} ";
276
+ if (String === rdata)
277
+ instring += " '#{rdata}'"
278
+ elsif (Array === rdata)
279
+ rdata.length.times {|rcounter|
280
+ instring += " '#{rdata[rcounter]}' "
281
+ }
282
+ else
283
+ instring += rdata
284
+ end
285
+ resource = RR.create(instring)
286
+ else
287
+ resource = RR.create("#{name} #{ttl} IN #{type} #{rdata}")
288
+ end
272
289
  resource.klass = Classes.NONE
273
290
  add_update(resource)
274
291
  end
275
292
  return resource
276
293
  end
277
294
  end
278
- end
295
+ end
@@ -1,3 +1,3 @@
1
1
  module Dnsruby
2
- VERSION = '1.60.1'
2
+ VERSION = '1.60.2'
3
3
  end
@@ -274,6 +274,18 @@ class TestUpdate < Minitest::Test
274
274
  assert(update.to_s.index("test signed update"))
275
275
  end
276
276
 
277
+ def test_delete_txt
278
+ update = Update.new 'example.com'
279
+ update.delete 'test.example.com', 'TXT', 'foo bar'
280
+
281
+ encoded_msg = Message.decode update.encode
282
+ rr = encoded_msg.authority.first
283
+ assert_equal rr.name.to_s, 'test.example.com', 'delete_txt - right name'
284
+ assert_equal 0, rr.ttl, 'delete_txt - right ttl'
285
+ assert_equal 'TXT', rr.type.string, 'delete_txt - right type'
286
+ assert_equal ['foo bar'], rr.rdata, 'delete_txt - right rdata'
287
+ end
288
+
277
289
  def test_array
278
290
  update = Update.new
279
291
  update.add("target_name", "TXT", 100, ['"test signed update"', 'item#2'])
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dnsruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.60.1
4
+ version: 1.60.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Dalitz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-24 00:00:00.000000000 Z
11
+ date: 2017-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry