dyndnsd 3.10.0 → 3.12.0

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
  SHA256:
3
- metadata.gz: cd51436a898f2b5d393fca48533750eac9d60bb86505194fb454aadfb9990d2e
4
- data.tar.gz: ec004c1d5c5a579ea1567b3034d9ed414666d0f35d83641c499513373ec32214
3
+ metadata.gz: 1291b6722535928edf7d305db50ffe5045b211b2a03425218f97fd6d6648ec4b
4
+ data.tar.gz: 6f9f5611f347d5f3e4dee4a0c9dd8d6fe85c6b21a36919bf39a68f872ae51e25
5
5
  SHA512:
6
- metadata.gz: f71367e43ccb83e17bbd727f5790ab03e3126d783f34216b9ba39e543b99ae23cc349757591ad46879aea2cd8b7cb6fd39fb407c525b89c1c8ed3d9d21db9ebe
7
- data.tar.gz: 38612ab6c1b41ac58575a21b15380eac341204f0ef3adf8743e52829a3393ba53153b3206d8ce996949d9a4a63d051d8e72deb447d705b60b256cd9b32564bbe
6
+ metadata.gz: c42f9a7bc3aece580177ffe50cfdcda3f7a7bc3f4ee978c3986f1abfd4cf6756f01f1c8606a852d76eb217da805c6633fa4a3df7ee76d7b95417cdb3dd8dd702
7
+ data.tar.gz: 1735e786ae2e77b1be0a2eb1bcb45d667836f71d9adf0268433c067296831af66674525db8c0fc961a398731d51fa7a0c3d9ff7967dd2ba326788d64e393700b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.12.0 (December 4th, 2025)
4
+
5
+ IMPROVEMENTS:
6
+
7
+ - regex instead of hosts list can be used for hostname ownership
8
+
9
+ ## 3.11.0 (October 2nd, 2025)
10
+
11
+ IMPROVEMENTS:
12
+
13
+ - add Ruby 3.4 support
14
+ - update base of Docker image to Alpine 3.22.1 (from 3.19.0 before)
15
+
3
16
  ## 3.10.0 (January 18th, 2024)
4
17
 
5
18
  IMPROVEMENTS:
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # dyndnsd.rb
2
2
 
3
- ![ci](https://github.com/cmur2/dyndnsd/workflows/ci/badge.svg) [![Dependencies](https://badges.depfu.com/badges/4f25da8493f7a29f652ac892fbf9227b/overview.svg)](https://depfu.com/github/cmur2/dyndnsd)
3
+ ![ci](https://github.com/cmur2/dyndnsd/workflows/ci/badge.svg)
4
4
 
5
5
  A small, lightweight and extensible DynDNS server written with Ruby and Rack.
6
6
 
@@ -307,6 +307,37 @@ users:
307
307
  ```
308
308
 
309
309
 
310
+ ### Matching with a regular expression
311
+
312
+ Instead of relying on `hosts`, you can use `regex` to employ a regular expression, which is very useful for avoiding having to repeatedly edit the configuration file to register a new host name.
313
+
314
+ ```yaml
315
+ host: "0.0.0.0"
316
+ port: 5354
317
+ username: "dyndnsd"
318
+ group: "dyndnsd"
319
+ db: "/dyndnsd/db.json"
320
+ debug: false
321
+ domain: "dyn.dc-air.home.arpa"
322
+ updater:
323
+ name: "command_with_bind_zone"
324
+ params:
325
+ zone_file: "/nsd/zones/static/dyn.dc-air.home.arpa.zone"
326
+ command: "doas service nsd reload"
327
+ ttl: "5m"
328
+ dns: "ns.dc-air.home.arpa."
329
+ email_addr: "admin.example.org"
330
+ users:
331
+ myuser:
332
+ password: "superhypermegas3kurepassword1234"
333
+ regex: '^[a-z][0-9]\.dyn\.dc\-air\.home\.arpa$'
334
+ ```
335
+
336
+ However, when using `regex`, `hosts` is simply ignored if defined, so you must choose one or the other. Recommendation: use `regex` for scripts or programs and `hosts` for regular users.
337
+
338
+ **Note**: Please note that when dyndnsd evaluates the regular expression, the `Regexp::EXTENDED` and `Regexp::IGNORECASE` options are used.
339
+
340
+
310
341
  ## License
311
342
 
312
343
  dyndnsd.rb is licensed under the Apache License, Version 2.0. See LICENSE for more information.
@@ -89,7 +89,7 @@ module Dyndnsd
89
89
  # @return [Array{Array{Object}}]
90
90
  def self.parse_endpoints(endpoint_list)
91
91
  endpoint_list.map { |addr_string| addr_string.split('@') }
92
- .map { |addr_parts| [addr_parts[0], addr_parts[1].to_i || 53] }
92
+ .map { |addr_parts| [addr_parts[0], addr_parts[1]&.to_i || 53] }
93
93
  .map { |addr| [:tcp, :udp].map { |type| [type] + addr } }
94
94
  .flatten(1)
95
95
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dyndnsd
4
- VERSION = '3.10.0'
4
+ VERSION = '3.12.0'
5
5
  end
data/lib/dyndnsd.rb CHANGED
@@ -138,7 +138,7 @@ module Dyndnsd
138
138
  # @param params [Hash{String => String}]
139
139
  # @return [Array<String>]
140
140
  def extract_v4_and_v6_address(params)
141
- return [] if !(params['myip'])
141
+ return [] if !params['myip']
142
142
  begin
143
143
  IPAddr.new(params['myip'], Socket::AF_INET)
144
144
  IPAddr.new(params['myip6'], Socket::AF_INET6)
@@ -207,7 +207,7 @@ module Dyndnsd
207
207
  params = Rack::Utils.parse_query(env['QUERY_STRING'])
208
208
 
209
209
  # require hostname parameter
210
- return [422, {'X-DynDNS-Response' => 'hostname_missing'}, []] if !(params['hostname'])
210
+ return [422, {'X-DynDNS-Response' => 'hostname_missing'}, []] if !params['hostname']
211
211
 
212
212
  hostnames = params['hostname'].split(',')
213
213
 
@@ -218,9 +218,22 @@ module Dyndnsd
218
218
  # we can trust this information since user was authorized by middleware
219
219
  user = env['REMOTE_USER']
220
220
 
221
- # check for hostnames that the user does not own
222
- forbidden_hostnames = hostnames - @users[user].fetch('hosts', [])
223
- return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []] if forbidden_hostnames.any?
221
+ if @users[user].key?('regex')
222
+ pattern = @users[user].fetch('regex')
223
+ begin
224
+ regex = Regexp.new(pattern, Regexp::IGNORECASE | Regexp::EXTENDED)
225
+ rescue RegexpError => e
226
+ Dyndnsd.logger.warn "Invalid regex pattern '#{pattern}': #{e.message}"
227
+ return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []]
228
+ end
229
+ # check for hostnames that match the regex
230
+ matches = hostnames.any? { |str| regex.match?(str) }
231
+ return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []] if !matches
232
+ else
233
+ # check for hostnames that the user does not own
234
+ forbidden_hostnames = hostnames - @users[user].fetch('hosts', [])
235
+ return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []] if forbidden_hostnames.any?
236
+ end
224
237
 
225
238
  if params['offline'] == 'YES'
226
239
  myips = []
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dyndnsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.10.0
4
+ version: 3.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Nicolai
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-18 00:00:00.000000000 Z
11
+ date: 2025-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -38,6 +38,40 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.3.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: base64
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.2.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.2.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: logger
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '1.6'
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '1.8'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '1.6'
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.8'
41
75
  - !ruby/object:Gem::Dependency
42
76
  name: metriks
43
77
  requirement: !ruby/object:Gem::Requirement
@@ -212,56 +246,56 @@ dependencies:
212
246
  requirements:
213
247
  - - "~>"
214
248
  - !ruby/object:Gem::Version
215
- version: 1.60.0
249
+ version: 1.81.1
216
250
  type: :development
217
251
  prerelease: false
218
252
  version_requirements: !ruby/object:Gem::Requirement
219
253
  requirements:
220
254
  - - "~>"
221
255
  - !ruby/object:Gem::Version
222
- version: 1.60.0
256
+ version: 1.81.1
223
257
  - !ruby/object:Gem::Dependency
224
258
  name: rubocop-rake
225
259
  requirement: !ruby/object:Gem::Requirement
226
260
  requirements:
227
261
  - - "~>"
228
262
  - !ruby/object:Gem::Version
229
- version: 0.6.0
263
+ version: 0.7.1
230
264
  type: :development
231
265
  prerelease: false
232
266
  version_requirements: !ruby/object:Gem::Requirement
233
267
  requirements:
234
268
  - - "~>"
235
269
  - !ruby/object:Gem::Version
236
- version: 0.6.0
270
+ version: 0.7.1
237
271
  - !ruby/object:Gem::Dependency
238
272
  name: rubocop-rspec
239
273
  requirement: !ruby/object:Gem::Requirement
240
274
  requirements:
241
275
  - - "~>"
242
276
  - !ruby/object:Gem::Version
243
- version: 2.26.1
277
+ version: 3.8.0
244
278
  type: :development
245
279
  prerelease: false
246
280
  version_requirements: !ruby/object:Gem::Requirement
247
281
  requirements:
248
282
  - - "~>"
249
283
  - !ruby/object:Gem::Version
250
- version: 2.26.1
284
+ version: 3.8.0
251
285
  - !ruby/object:Gem::Dependency
252
286
  name: solargraph
253
287
  requirement: !ruby/object:Gem::Requirement
254
288
  requirements:
255
289
  - - "~>"
256
290
  - !ruby/object:Gem::Version
257
- version: 0.50.0
291
+ version: 0.55.0
258
292
  type: :development
259
293
  prerelease: false
260
294
  version_requirements: !ruby/object:Gem::Requirement
261
295
  requirements:
262
296
  - - "~>"
263
297
  - !ruby/object:Gem::Version
264
- version: 0.50.0
298
+ version: 0.55.0
265
299
  description: A small, lightweight and extensible DynDNS server written with Ruby and
266
300
  Rack.
267
301
  email: