gitlab-net-dns 0.9.2 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7252fa3548673ea245bdc6c38a07b10ed922758881c52c4cb474573cf496632c
4
- data.tar.gz: 7598048ebeb99e6e52c08ce0f182bbf4484b19ea8dceb2a4eff45a0fdf6259de
3
+ metadata.gz: 04ce28e53e3b0986fb5a2dcde807ac07bc15ceb3bdd127abe31d125e4ae9e054
4
+ data.tar.gz: 119fcc2767ae448912fbadb013a82fdeff83fd68c06937fafdefecabbfea0d58
5
5
  SHA512:
6
- metadata.gz: 513489ab5947af35ea4c3290b694c1e0bbb99a4bf7124fee3a1d5ffd816cb4fa17b35e345e9445d33752559903a555d4d2619e9429004411e098bdcc1cbbc610
7
- data.tar.gz: c31b0927a8c62717b0ffaef61d6eb1c531b815f1477dc00f6fa0c63b08aa03450fe41d2b362ee84ea618efcec5fd7d1ea6304361f130d9e6d66d4373021ceb69
6
+ metadata.gz: 0546f72172a83589a710a70cb8ff1e3caabab249cbd49a1ecf8751a802433d6ef6ff9b1667843772598248e7c0b155fd7836cf2aa1131da1be7fa1541bcf0a91
7
+ data.tar.gz: 469360aa30e2681543719347ce2a1dd488615df7f22eb7a6482bf2c58ce3e4b9d54fceab14de3de9b0a88e7394a3b2f76320877742c533f6a10e62a9fbb0660a
data/.gitlab-ci.yml CHANGED
@@ -20,4 +20,4 @@ rspec:
20
20
  - bundle exec rake
21
21
  parallel:
22
22
  matrix:
23
- - RUBY_VERSION: [ "2.7", "3.0" ]
23
+ - RUBY_VERSION: [ "2.7", "3.0", "3.1", "3.2" ]
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## Release 0.10.0
4
+
5
+ - CHANGED: Update list of supported types (https://gitlab.com/gitlab-org/ruby/gems/gitlab-net-dns/-/merge_requests/7)
6
+
3
7
  ## Release 0.9.2
4
8
 
5
9
  - FIXED: Fixed TimeoutError deprecation warning (https://gitlab.com/gitlab-org/ruby/gems/gitlab-net-dns/-/merge_requests/4)
data/demo/check_soa.rb CHANGED
@@ -18,7 +18,7 @@ domain = ARGV[0]
18
18
  res = Net::DNS::Resolver.new(defname: false, retry: 2)
19
19
 
20
20
  ns_req = res.query(domain, Net::DNS::NS)
21
- unless ns_req && (ns_req.header.anCount > 0)
21
+ unless ns_req && ns_req.header.anCount.positive?
22
22
  raise ArgumentError, "No nameservers found for domain: #{res.errorstring}"
23
23
  end
24
24
 
@@ -674,20 +674,20 @@ module Net
674
674
  end
675
675
 
676
676
  arr = str.unpack("n C2 n4")
677
- @id = arr[0]
678
- @qr = (arr[1] >> 7) & 0x01
679
- @opCode = (arr[1] >> 3) & 0x0F
680
- @aa = (arr[1] >> 2) & 0x01
681
- @tc = (arr[1] >> 1) & 0x01
682
- @rd = arr[1] & 0x1
683
- @ra = (arr[2] >> 7) & 0x01
684
- @ad = (arr[2] >> 5) & 0x01
685
- @cd = (arr[2] >> 4) & 0x01
686
- @rCode = RCode.new(arr[2] & 0xf)
687
- @qdCount = arr[3]
688
- @anCount = arr[4]
689
- @nsCount = arr[5]
690
- @arCount = arr[6]
677
+ @id = arr[0]
678
+ @qr = (arr[1] >> 7) & 0x01
679
+ @opCode = (arr[1] >> 3) & 0x0F
680
+ @aa = (arr[1] >> 2) & 0x01
681
+ @tc = (arr[1] >> 1) & 0x01
682
+ @rd = arr[1] & 0x1
683
+ @ra = (arr[2] >> 7) & 0x01
684
+ @ad = (arr[2] >> 5) & 0x01
685
+ @cd = (arr[2] >> 4) & 0x01
686
+ @rCode = RCode.new(arr[2] & 0xf)
687
+ @qdCount = arr[3]
688
+ @anCount = arr[4]
689
+ @nsCount = arr[5]
690
+ @arCount = arr[6]
691
691
  end
692
692
 
693
693
  def new_from_hash(hash)
@@ -173,6 +173,8 @@ module Net
173
173
  end
174
174
 
175
175
  def new_from_binary(data)
176
+ raise NameInvalid if data.size <= 4
177
+
176
178
  str, type, cls = data.unpack("a#{data.size - 4}nn")
177
179
  @qName = build_qName(str)
178
180
  @qType = Net::DNS::RR::Types.new type
@@ -142,7 +142,7 @@ class UdpRawSocket < RawSocket # :nodoc:
142
142
  [@src_port, 'n'], # source port
143
143
  [@dest_port, 'n'], # destination port
144
144
  [8 + pay_size, 'n'], # len
145
- [0, 'n'] # checksum (mandatory)
145
+ [0, 'n'], # checksum (mandatory)
146
146
  ])
147
147
  end
148
148
  end
@@ -1074,14 +1074,560 @@ module Net
1074
1074
  if ENV['LOCALDOMAIN']
1075
1075
  self.domain = ENV['LOCALDOMAIN']
1076
1076
  end
1077
- if ENV['RES_OPTIONS']
1078
- ENV['RES_OPTIONS'].split(" ").each do |opt|
1079
- name, val = opt.split(":")
1080
- begin
1081
- eval("self.#{name} = #{val}")
1082
- rescue NoMethodError
1083
- raise ArgumentError, "Invalid ENV option #{name}"
1084
- end
1077
+ # Resolver helper method.
1078
+ #
1079
+ # Calling the resolver directly:
1080
+ #
1081
+ # puts Resolver("www.google.com").answer.size
1082
+ # # => 5
1083
+ #
1084
+ # An optional block can be passed yielding the Net::DNS::Packet object.
1085
+ #
1086
+ # Resolver("www.google.com") { |packet| puts packet.size + " bytes" }
1087
+ # # => 484 bytes
1088
+ #
1089
+ # = Net::DNS::Resolver - DNS resolver class
1090
+ #
1091
+ # The Net::DNS::Resolver class implements a complete DNS resolver written
1092
+ # in pure Ruby, without a single C line of code. It has all of the
1093
+ # tipical properties of an evoluted resolver, and a bit of OO which
1094
+ # comes from having used Ruby.
1095
+ #
1096
+ # This project started as a porting of the Net::DNS Perl module,
1097
+ # written by Martin Fuhr, but turned out (in the last months) to be
1098
+ # an almost complete rewriting. Well, maybe some of the features of
1099
+ # the Perl version are still missing, but guys, at least this is
1100
+ # readable code!
1101
+ #
1102
+ # == Environment
1103
+ #
1104
+ # The Following Environment variables can also be used to configure
1105
+ # the resolver:
1106
+ #
1107
+ # * +RES_NAMESERVERS+: A space-separated list of nameservers to query.
1108
+ #
1109
+ # # Bourne Shell
1110
+ # $ RES_NAMESERVERS="192.168.1.1 192.168.2.2 192.168.3.3"
1111
+ # $ export RES_NAMESERVERS
1112
+ #
1113
+ # # C Shell
1114
+ # % setenv RES_NAMESERVERS "192.168.1.1 192.168.2.2 192.168.3.3"
1115
+ #
1116
+ # * +RES_SEARCHLIST+: A space-separated list of domains to put in the
1117
+ # search list.
1118
+ #
1119
+ # # Bourne Shell
1120
+ # $ RES_SEARCHLIST="example.com sub1.example.com sub2.example.com"
1121
+ # $ export RES_SEARCHLIST
1122
+ #
1123
+ # # C Shell
1124
+ # % setenv RES_SEARCHLIST "example.com sub1.example.com sub2.example.com"
1125
+ #
1126
+ # * +LOCALDOMAIN+: The default domain.
1127
+ #
1128
+ # # Bourne Shell
1129
+ # $ LOCALDOMAIN=example.com
1130
+ # $ export LOCALDOMAIN
1131
+ #
1132
+ # # C Shell
1133
+ # % setenv LOCALDOMAIN example.com
1134
+ #
1135
+ # * +RES_OPTIONS+: A space-separated list of resolver options to set.
1136
+ # Options that take values are specified as option:value.
1137
+ #
1138
+ # # Bourne Shell
1139
+ # $ RES_OPTIONS="retrans:3 retry:2 debug"
1140
+ # $ export RES_OPTIONS
1141
+ #
1142
+ # # C Shell
1143
+ # % setenv RES_OPTIONS "retrans:3 retry:2 debug"
1144
+ #
1145
+ # An hash with the defaults values of almost all the
1146
+ # configuration parameters of a resolver object. See
1147
+ # the description for each parameter to have an
1148
+ # explanation of its usage.
1149
+ # Quick resolver method. Bypass the configuration using
1150
+ # the defaults.
1151
+ #
1152
+ # Net::DNS::Resolver.start "www.google.com"
1153
+ #
1154
+ # Returns true if running on a Windows platform.
1155
+ #
1156
+ # Note. This method doesn't rely on the RUBY_PLATFORM constant
1157
+ # because the comparison will fail when running on JRuby.
1158
+ # On JRuby RUBY_PLATFORM == 'java'.
1159
+ # Creates a new resolver object.
1160
+ #
1161
+ # Argument +config+ can either be empty or be an hash with
1162
+ # some configuration parameters. To know what each parameter
1163
+ # do, look at the description of each.
1164
+ # Some example:
1165
+ #
1166
+ # # Use the sistem defaults
1167
+ # res = Net::DNS::Resolver.new
1168
+ #
1169
+ # # Specify a configuration file
1170
+ # res = Net::DNS::Resolver.new(:config_file => '/my/dns.conf')
1171
+ #
1172
+ # # Set some option
1173
+ # res = Net::DNS::Resolver.new(:nameservers => "172.16.1.1",
1174
+ # :recursive => false,
1175
+ # :retry => 10)
1176
+ #
1177
+ # == Config file
1178
+ #
1179
+ # Net::DNS::Resolver uses a config file to read the usual
1180
+ # values a resolver needs, such as nameserver list and
1181
+ # domain names. On UNIX systems the defaults are read from the
1182
+ # following files, in the order indicated:
1183
+ #
1184
+ # * /etc/resolv.conf
1185
+ # * $HOME/.resolv.conf
1186
+ # * ./.resolv.conf
1187
+ #
1188
+ # The following keywords are recognized in resolver configuration files:
1189
+ #
1190
+ # * domain: the default domain.
1191
+ # * search: a space-separated list of domains to put in the search list.
1192
+ # * nameserver: a space-separated list of nameservers to query.
1193
+ #
1194
+ # Files except for /etc/resolv.conf must be owned by the effective userid
1195
+ # running the program or they won't be read. In addition, several environment
1196
+ # variables can also contain configuration information; see Environment
1197
+ # in the main description for Resolver class.
1198
+ #
1199
+ # On Windows Systems, an attempt is made to determine the system defaults
1200
+ # using the registry. This is still a work in progress; systems with many
1201
+ # dynamically configured network interfaces may confuse Net::DNS.
1202
+ #
1203
+ # You can include a configuration file of your own when creating a resolver
1204
+ # object:
1205
+ #
1206
+ # # Use my own configuration file
1207
+ # my $res = Net::DNS::Resolver->new(config_file => '/my/dns.conf');
1208
+ #
1209
+ # This is supported on both UNIX and Windows. Values pulled from a custom
1210
+ # configuration file override the the system's defaults, but can still be
1211
+ # overridden by the other arguments to Resolver::new.
1212
+ #
1213
+ # Explicit arguments to Resolver::new override both the system's defaults
1214
+ # and the values of the custom configuration file, if any.
1215
+ #
1216
+ # == Parameters
1217
+ #
1218
+ # The following arguments to Resolver::new are supported:
1219
+ #
1220
+ # * nameservers: an array reference of nameservers to query.
1221
+ # * searchlist: an array reference of domains.
1222
+ # * recurse
1223
+ # * debug
1224
+ # * domain
1225
+ # * port
1226
+ # * srcaddr
1227
+ # * srcport
1228
+ # * tcp_timeout
1229
+ # * udp_timeout
1230
+ # * retrans
1231
+ # * retry
1232
+ # * usevc
1233
+ # * stayopen
1234
+ # * igntc
1235
+ # * defnames
1236
+ # * dnsrch
1237
+ # * persistent_tcp
1238
+ # * persistent_udp
1239
+ # * dnssec
1240
+ #
1241
+ # For more information on any of these options, please consult the
1242
+ # method of the same name.
1243
+ #
1244
+ # == Disclaimer
1245
+ #
1246
+ # Part of the above documentation is taken from the one in the
1247
+ # Net::DNS::Resolver Perl module.
1248
+ #
1249
+ # New logger facility
1250
+ #------------------------------------------------------------
1251
+ # Resolver configuration will be set in order from:
1252
+ # 1) initialize arguments
1253
+ # 2) ENV variables
1254
+ # 3) config file
1255
+ # 4) defaults (and /etc/resolv.conf for config)
1256
+ #------------------------------------------------------------
1257
+ #------------------------------------------------------------
1258
+ # Parsing config file
1259
+ #------------------------------------------------------------
1260
+ #------------------------------------------------------------
1261
+ # Parsing ENV variables
1262
+ #------------------------------------------------------------
1263
+ #------------------------------------------------------------
1264
+ # Parsing arguments
1265
+ #------------------------------------------------------------
1266
+ # Get the resolver search list, returned as an array of entries.
1267
+ #
1268
+ # res.searchlist
1269
+ # #=> ["example.com","a.example.com","b.example.com"]
1270
+ #
1271
+ # Set the resolver searchlist.
1272
+ # +arg+ can be a single string or an array of strings.
1273
+ #
1274
+ # res.searchstring = "example.com"
1275
+ # res.searchstring = ["example.com","a.example.com","b.example.com"]
1276
+ #
1277
+ # Note that you can also append a new name to the searchlist.
1278
+ #
1279
+ # res.searchlist << "c.example.com"
1280
+ # res.searchlist
1281
+ # #=> ["example.com","a.example.com","b.example.com","c.example.com"]
1282
+ #
1283
+ # The default is an empty array.
1284
+ #
1285
+ # Get the list of resolver nameservers, in a dotted decimal format-
1286
+ #
1287
+ # res.nameservers
1288
+ # #=> ["192.168.0.1","192.168.0.2"]
1289
+ #
1290
+ # Set the list of resolver nameservers.
1291
+ # +arg+ can be a single ip address or an array of addresses.
1292
+ #
1293
+ # res.nameservers = "192.168.0.1"
1294
+ # res.nameservers = ["192.168.0.1","192.168.0.2"]
1295
+ #
1296
+ # If you want you can specify the addresses as IPAddr instances.
1297
+ #
1298
+ # ip = IPAddr.new("192.168.0.3")
1299
+ # res.nameservers << ip
1300
+ # #=> ["192.168.0.1","192.168.0.2","192.168.0.3"]
1301
+ #
1302
+ # The default is 127.0.0.1 (localhost)
1303
+ #
1304
+ # arg is in the name form, not IP
1305
+ # Return a string with the default domain.
1306
+ # Set the domain for the query.
1307
+ # Return the defined size of the packet.
1308
+ # Get the port number to which the resolver sends queries.
1309
+ #
1310
+ # puts "Sending queries to port #{res.port}"
1311
+ #
1312
+ # Set the port number to which the resolver sends queries. This can be useful
1313
+ # for testing a nameserver running on a non-standard port.
1314
+ #
1315
+ # res.port = 10053
1316
+ #
1317
+ # The default is port 53.
1318
+ #
1319
+ # Get the value of the source port number.
1320
+ #
1321
+ # puts "Sending queries using port #{res.source_port}"
1322
+ #
1323
+ # Set the local source port from which the resolver sends its queries.
1324
+ #
1325
+ # res.source_port = 40000
1326
+ #
1327
+ # Note that if you want to set a port you need root priviledges, as
1328
+ # raw sockets will be used to generate packets. The class will then
1329
+ # generate the exception ResolverPermissionError if you're not root.
1330
+ #
1331
+ # The default is 0, which means that the port will be chosen by the
1332
+ # underlaying layers.
1333
+ #
1334
+ # Get the local address from which the resolver sends queries
1335
+ #
1336
+ # puts "Sending queries using source address #{res.source_address}"
1337
+ #
1338
+ # Get the local ipv6 address from which the resolver sends queries
1339
+ #
1340
+ # Set the local source address from which the resolver sends its queries.
1341
+ #
1342
+ # res.source_address = "172.16.100.1"
1343
+ # res.source_address = IPAddr.new("172.16.100.1")
1344
+ #
1345
+ # You can specify +arg+ as either a string containing the ip address
1346
+ # or an instance of IPAddr class.
1347
+ #
1348
+ # Normally this can be used to force queries out a specific interface
1349
+ # on a multi-homed host. In this case, you should of course need to
1350
+ # know the addresses of the interfaces.
1351
+ #
1352
+ # Another way to use this option is for some kind of spoofing attacks
1353
+ # towards weak nameservers, to probe the security of your network.
1354
+ # This includes specifing ranged attacks such as DoS and others. For
1355
+ # a paper on DNS security, checks http://www.marcoceresa.com/security/
1356
+ #
1357
+ # Note that if you want to set a non-binded source address you need
1358
+ # root priviledges, as raw sockets will be used to generate packets.
1359
+ # The class will then generate an exception if you're not root.
1360
+ #
1361
+ # The default is 0.0.0.0, meaning any local address (chosen on routing needs).
1362
+ #
1363
+ # Port already in use!
1364
+ # Address is not valid: raw socket
1365
+ # Return the retrasmission interval (in seconds) the resolvers has
1366
+ # been set on.
1367
+ # Set the retrasmission interval in seconds. Default 5 seconds.
1368
+ # The number of times the resolver will try a query.
1369
+ #
1370
+ # puts "Will try a max of #{res.retry_number} queries"
1371
+ #
1372
+ # Set the number of times the resolver will try a query.
1373
+ # Default 4 times.
1374
+ # This method will return true if the resolver is configured to
1375
+ # perform recursive queries.
1376
+ #
1377
+ # print "The resolver will perform a "
1378
+ # print res.recursive? ? "" : "not "
1379
+ # puts "recursive query"
1380
+ #
1381
+ # Sets whether or not the resolver should perform recursive
1382
+ # queries. Default is true.
1383
+ #
1384
+ # res.recursive = false # perform non-recursive query
1385
+ #
1386
+ # Return a string representing the resolver state, suitable
1387
+ # for printing on the screen.
1388
+ #
1389
+ # puts "Resolver state:"
1390
+ # puts res.state
1391
+ #
1392
+ # Checks whether the +defname+ flag has been activate.
1393
+ # Set the flag +defname+ in a boolean state. if +defname+ is true,
1394
+ # calls to Resolver#query will append the default domain to names
1395
+ # that contain no dots.
1396
+ # Example:
1397
+ #
1398
+ # # Domain example.com
1399
+ # res.defname = true
1400
+ # res.query("machine1")
1401
+ # #=> This will perform a query for machine1.example.com
1402
+ #
1403
+ # Default is true.
1404
+ #
1405
+ # Get the state of the dns_search flag.
1406
+ # Set the flag +dns_search+ in a boolean state. If +dns_search+
1407
+ # is true, when using the Resolver#search method will be applied
1408
+ # the search list. Default is true.
1409
+ # Get the state of the use_tcp flag.
1410
+ #
1411
+ # If +use_tcp+ is true, the resolver will perform all queries
1412
+ # using TCP virtual circuits instead of UDP datagrams, which
1413
+ # is the default for the DNS protocol.
1414
+ #
1415
+ # res.use_tcp = true
1416
+ # res.query "host.example.com"
1417
+ # #=> Sending TCP segments...
1418
+ #
1419
+ # Default is false.
1420
+ #
1421
+ # Return an object representing the value of the stored TCP
1422
+ # timeout the resolver will use in is queries. This object
1423
+ # is an instance of the class +TcpTimeout+, and two methods
1424
+ # are available for printing informations: TcpTimeout#to_s
1425
+ # and TcpTimeout#pretty_to_s.
1426
+ #
1427
+ # Here's some example:
1428
+ #
1429
+ # puts "Timeout of #{res.tcp_timeout} seconds" # implicit to_s
1430
+ # #=> Timeout of 150 seconds
1431
+ #
1432
+ # puts "You set a timeout of " + res.tcp_timeout.pretty_to_s
1433
+ # #=> You set a timeout of 2 minutes and 30 seconds
1434
+ #
1435
+ # If the timeout is infinite, a string "infinite" will be returned.
1436
+ #
1437
+ # Set the value of TCP timeout for resolver queries that
1438
+ # will be performed using TCP. A value of 0 means that
1439
+ # the timeout will be infinite.
1440
+ # The value is stored internally as a +TcpTimeout+ object, see
1441
+ # the description for Resolver#tcp_timeout
1442
+ #
1443
+ # Default is 5 seconds.
1444
+ #
1445
+ # Return an object representing the value of the stored UDP
1446
+ # timeout the resolver will use in is queries. This object
1447
+ # is an instance of the class +UdpTimeout+, and two methods
1448
+ # are available for printing information: UdpTimeout#to_s
1449
+ # and UdpTimeout#pretty_to_s.
1450
+ #
1451
+ # Here's some example:
1452
+ #
1453
+ # puts "Timeout of #{res.udp_timeout} seconds" # implicit to_s
1454
+ # #=> Timeout of 150 seconds
1455
+ #
1456
+ # puts "You set a timeout of " + res.udp_timeout.pretty_to_s
1457
+ # #=> You set a timeout of 2 minutes and 30 seconds
1458
+ #
1459
+ # If the timeout is zero, a string "not defined" will
1460
+ # be returned.
1461
+ #
1462
+ # Set the value of UDP timeout for resolver queries that
1463
+ # will be performed using UDP. A value of 0 means that
1464
+ # the timeout will not be used, and the resolver will use
1465
+ # only +retry_number+ and +retry_interval+ parameters.
1466
+ #
1467
+ # Default is 5 seconds.
1468
+ #
1469
+ # The value is stored internally as a +UdpTimeout+ object, see
1470
+ # the description for Resolver#udp_timeout.
1471
+ #
1472
+ # Set a new log file for the logger facility of the resolver
1473
+ # class. Could be a file descriptor too:
1474
+ #
1475
+ # res.log_file = $stderr
1476
+ #
1477
+ # Note that a new logging facility will be create, destroing
1478
+ # the old one, which will then be impossibile to recover.
1479
+ #
1480
+ # This one permits to have a personal logger facility to handle
1481
+ # resolver messages, instead of new built-in one, which is set up
1482
+ # for a +$stdout+ (or +$stderr+) use.
1483
+ #
1484
+ # If you want your own logging facility you can create a new instance
1485
+ # of the +Logger+ class:
1486
+ #
1487
+ # log = Logger.new("/tmp/resolver.log","weekly",2*1024*1024)
1488
+ # log.level = Logger::DEBUG
1489
+ # log.progname = "ruby_resolver"
1490
+ #
1491
+ # and then pass it to the resolver:
1492
+ #
1493
+ # res.logger = log
1494
+ #
1495
+ # Note that this will destroy the precedent logger.
1496
+ #
1497
+ # Set the log level for the built-in logging facility.
1498
+ #
1499
+ # The log level can be one of the following:
1500
+ #
1501
+ # - +Net::DNS::DEBUG+
1502
+ # - +Net::DNS::INFO+
1503
+ # - +Net::DNS::WARN+
1504
+ # - +Net::DNS::ERROR+
1505
+ # - +Net::DNS::FATAL+
1506
+ #
1507
+ # Note that if the global variable $DEBUG is set (like when the
1508
+ # -d switch is used at the command line) the logger level is
1509
+ # automatically set at DEGUB.
1510
+ #
1511
+ # For further informations, see Logger documentation in the
1512
+ # Ruby standard library.
1513
+ #
1514
+ # Performs a DNS query for the given name, applying the searchlist if
1515
+ # appropriate. The search algorithm is as follows:
1516
+ #
1517
+ # 1. If the name contains at least one dot, try it as is.
1518
+ # 2. If the name doesn't end in a dot then append each item in the search
1519
+ # list to the name. This is only done if +dns_search+ is true.
1520
+ # 3. If the name doesn't contain any dots, try it as is.
1521
+ #
1522
+ # The record type and class can be omitted; they default to +A+ and +IN+.
1523
+ #
1524
+ # packet = res.search('mailhost')
1525
+ # packet = res.search('mailhost.example.com')
1526
+ # packet = res.search('example.com', Net::DNS::MX)
1527
+ # packet = res.search('user.passwd.example.com', Net::DNS::TXT, Net::DNS::HS)
1528
+ #
1529
+ # If the name is an IP address (Ipv4 or IPv6), in the form of a string
1530
+ # or a +IPAddr+ object, then an appropriate PTR query will be performed:
1531
+ #
1532
+ # ip = IPAddr.new("172.16.100.2")
1533
+ # packet = res.search(ip)
1534
+ # packet = res.search("192.168.10.254")
1535
+ #
1536
+ # Returns a Net::DNS::Packet object. If you need to examine the response packet
1537
+ # whether it contains any answers or not, use the Resolver#query method instead.
1538
+ #
1539
+ # If the name contains at least one dot then try it as is first.
1540
+ # If the name doesn't end in a dot then apply the search list.
1541
+ # Finally, if the name has no dots then try it as is.
1542
+ # Performs a DNS query for the given name; the search list
1543
+ # is not applied. If the name doesn't contain any dots and
1544
+ # +defname+ is true then the default domain will be appended.
1545
+ #
1546
+ # The record type and class can be omitted; they default to +A+
1547
+ # and +IN+. If the name looks like an IP address (IPv4 or IPv6),
1548
+ # then an appropriate PTR query will be performed.
1549
+ #
1550
+ # packet = res.query('mailhost')
1551
+ # packet = res.query('mailhost.example.com')
1552
+ # packet = res.query('example.com', Net::DNS::MX)
1553
+ # packet = res.query('user.passwd.example.com', Net::DNS::TXT, Net::DNS::HS)
1554
+ #
1555
+ # If the name is an IP address (Ipv4 or IPv6), in the form of a string
1556
+ # or a +IPAddr+ object, then an appropriate PTR query will be performed:
1557
+ #
1558
+ # ip = IPAddr.new("172.16.100.2")
1559
+ # packet = res.query(ip)
1560
+ # packet = res.query("192.168.10.254")
1561
+ #
1562
+ # Returns a Net::DNS::Packet object. If you need to examine the response
1563
+ # packet whether it contains any answers or not, use the Resolver#query
1564
+ # method instead.
1565
+ #
1566
+ # If the name doesn't contain any dots then append the default domain.
1567
+ # Performs a DNS query for the given name. Neither the
1568
+ # searchlist nor the default domain will be appended.
1569
+ #
1570
+ # The argument list can be either a Net::DNS::Packet object
1571
+ # or a name string plus optional type and class, which if
1572
+ # omitted default to +A+ and +IN+.
1573
+ #
1574
+ # Returns a Net::DNS::Packet object.
1575
+ #
1576
+ # # Executes the query with a +Packet+ object
1577
+ # send_packet = Net::DNS::Packet.new("host.example.com", Net::DNS::NS, Net::DNS::HS)
1578
+ # packet = res.query(send_packet)
1579
+ #
1580
+ # # Executes the query with a host, type and cls
1581
+ # packet = res.query("host.example.com")
1582
+ # packet = res.query("host.example.com", Net::DNS::NS)
1583
+ # packet = res.query("host.example.com", Net::DNS::NS, Net::DNS::HS)
1584
+ #
1585
+ # If the name is an IP address (Ipv4 or IPv6), in the form of a string
1586
+ # or a IPAddr object, then an appropriate PTR query will be performed:
1587
+ #
1588
+ # ip = IPAddr.new("172.16.100.2")
1589
+ # packet = res.query(ip)
1590
+ #
1591
+ # packet = res.query("172.16.100.2")
1592
+ #
1593
+ # Use +packet.header.ancount+ or +packet.answer+ to find out if there
1594
+ # were any records in the answer section.
1595
+ #
1596
+ # Store packet_data for performance improvements,
1597
+ # so methods don't keep on calling Packet#data
1598
+ # Choose whether use TCP, UDP or RAW
1599
+ # Must use TCP, either plain or raw
1600
+ # Use raw sockets?
1601
+ # Packet size is inside the boundaries
1602
+ # Use raw sockets?
1603
+ # User requested TCP
1604
+ # Finally use UDP
1605
+ # Performs a zone transfer for the zone passed as a parameter.
1606
+ #
1607
+ # It is actually only a wrapper to a send with type set as Net::DNS::AXFR,
1608
+ # since it is using the same infrastucture.
1609
+ #
1610
+ # Performs an MX query for the domain name passed as parameter.
1611
+ #
1612
+ # It actually uses the same methods a normal Resolver query would
1613
+ # use, but automatically sort the results based on preferences
1614
+ # and returns an ordered array.
1615
+ #
1616
+ # res = Net::DNS::Resolver.new
1617
+ # res.mx("google.com")
1618
+ #
1619
+ # Parses a configuration file specified as the argument.
1620
+ # Parses environment variables.
1621
+ # Contains a number, try to see if it's an IP or IPv6 address
1622
+ # Create the packet
1623
+ # DNSSEC and TSIG stuff to be inserted here
1624
+ # FIXME: a ? method should never raise.
1625
+ ENV['RES_OPTIONS']&.split(" ")&.each do |opt|
1626
+ name, val = opt.split(":")
1627
+ begin
1628
+ eval("self.#{name} = #{val}")
1629
+ rescue NoMethodError
1630
+ raise ArgumentError, "Invalid ENV option #{name}"
1085
1631
  end
1086
1632
  end
1087
1633
  end
@@ -41,7 +41,7 @@ module Net # :nodoc:
41
41
  end
42
42
 
43
43
  def number?(num)
44
- if num.is_a?(Integer) && (num > 0)
44
+ if num.is_a?(Integer) && num.positive?
45
45
  true
46
46
  else
47
47
  raise ArgumentError, "Wrong format field: #{num} not a number or less than zero"
@@ -6,63 +6,82 @@ module Net # :nodoc:
6
6
  TYPES = {
7
7
  'SIGZERO' => 0, # RFC2931 consider this a pseudo type
8
8
  'A' => 1, # RFC 1035, Section 3.4.1
9
- 'NS' => 2, # RFC 1035, Section 3.3.11
10
- 'MD' => 3, # RFC 1035, Section 3.3.4 (obsolete)
11
- 'MF' => 4, # RFC 1035, Section 3.3.5 (obsolete)
9
+ 'NS' => 2, # RFC 1035, Section 3.3.11
10
+ 'MD' => 3, # RFC 1035, Section 3.3.4 (obsolete)
11
+ 'MF' => 4, # RFC 1035, Section 3.3.5 (obsolete)
12
12
  'CNAME' => 5, # RFC 1035, Section 3.3.1
13
13
  'SOA' => 6, # RFC 1035, Section 3.3.13
14
- 'MB' => 7, # RFC 1035, Section 3.3.3
15
- 'MG' => 8, # RFC 1035, Section 3.3.6
16
- 'MR' => 9, # RFC 1035, Section 3.3.8
17
- 'NULL' => 10, # RFC 1035, Section 3.3.10
18
- 'WKS' => 11, # RFC 1035, Section 3.4.2 (deprecated)
19
- 'PTR' => 12, # RFC 1035, Section 3.3.12
20
- 'HINFO' => 13, # RFC 1035, Section 3.3.2
21
- 'MINFO' => 14, # RFC 1035, Section 3.3.7
14
+ 'MB' => 7, # RFC 1035, Section 3.3.3 (obsolete)
15
+ 'MG' => 8, # RFC 1035, Section 3.3.6 (obsolete)
16
+ 'MR' => 9, # RFC 1035, Section 3.3.8 (obsolete)
17
+ 'NULL' => 10, # RFC 1035, Section 3.3.10 (obsolete)
18
+ 'WKS' => 11, # RFC 1035, Section 3.4.2 (obsolete)
19
+ 'PTR' => 12, # RFC 1035, Section 3.3.12
20
+ 'HINFO' => 13, # RFC 1035, Section 3.3.2
21
+ 'MINFO' => 14, # RFC 1035, Section 3.3.7 (obsolete)
22
22
  'MX' => 15, # RFC 1035, Section 3.3.9
23
23
  'TXT' => 16, # RFC 1035, Section 3.3.14
24
- 'RP' => 17, # RFC 1183, Section 2.2
24
+ 'RP' => 17, # RFC 1183, Section 2.2 (obsolete)
25
25
  'AFSDB' => 18, # RFC 1183, Section 1
26
- 'X25' => 19, # RFC 1183, Section 3.1
27
- 'ISDN' => 20, # RFC 1183, Section 3.2
28
- 'RT' => 21, # RFC 1183, Section 3.3
29
- 'NSAP' => 22, # RFC 1706, Section 5
30
- 'NSAP_PTR' => 23, # RFC 1348 (obsolete)
26
+ 'X25' => 19, # RFC 1183, Section 3.1 (obsolete)
27
+ 'ISDN' => 20, # RFC 1183, Section 3.2 (obsolete)
28
+ 'RT' => 21, # RFC 1183, Section 3.3 (obsolete)
29
+ 'NSAP' => 22, # RFC 1706, Section 5 (obsolete)
30
+ 'NSAP_PTR' => 23, # RFC 1348 (obsolete) (obsolete)
31
31
  # The following 2 RRs are impemented in Net::DNS::SEC, TODO
32
- 'SIG' => 24, # RFC 2535, Section 4.1
33
- 'KEY' => 25, # RFC 2535, Section 3.1
34
- 'PX' => 26, # RFC 2163,
35
- 'GPOS' => 27, # RFC 1712 (obsolete)
36
- 'AAAA' => 28, # RFC 1886, Section 2.1
32
+ 'SIG' => 24, # RFC 2535, Section 4.1 (obsolete)
33
+ 'KEY' => 25, # RFC 2535, Section 3.1 (obsolete)
34
+ 'PX' => 26, # RFC 2163, (obsolete)
35
+ 'GPOS' => 27, # RFC 1712 (obsolete)
36
+ 'AAAA' => 28, # RFC 1886, Section 2.1
37
37
  'LOC' => 29, # RFC 1876
38
38
  # The following RR is implemented in Net::DNS::SEC, TODO
39
- 'NXT' => 30, # RFC 2535, Section 5.2
40
- 'EID' => 31, # draft-ietf-nimrod-dns-xx.txt
41
- 'NIMLOC' => 32, # draft-ietf-nimrod-dns-xx.txt
39
+ 'NXT' => 30, # RFC 2535, Section 5.2 (obsolete)
40
+ 'EID' => 31, # draft-ietf-nimrod-dns-xx.txt (obsolete)
41
+ 'NIMLOC' => 32, # draft-ietf-nimrod-dns-xx.txt (obsolete)
42
42
  'SRV' => 33, # RFC 2052
43
- 'ATMA' => 34, # ???
43
+ 'ATMA' => 34, # ??? (obsolete)
44
44
  'NAPTR' => 35, # RFC 2168
45
45
  'KX' => 36, # RFC 2230
46
46
  'CERT' => 37, # RFC 2538
47
47
  'DNAME' => 39, # RFC 2672
48
48
  'OPT' => 41, # RFC 2671
49
+ 'APL' => 42, # RFC 3123 (obsolete)
49
50
  # The following 4 RRs are implemented in Net::DNS::SEC TODO
50
- 'DS' => 43, # draft-ietf-dnsext-delegation-signer
51
- 'SSHFP' => 44, # draft-ietf-secsh-dns (No RFC # yet at time of coding)
52
- 'RRSIG' => 46, # draft-ietf-dnsext-dnssec-2535typecode-change
53
- 'NSEC' => 47, # draft-ietf-dnsext-dnssec-2535typecode-change
54
- 'DNSKEY' => 48, # draft-ietf-dnsext-dnssec-2535typecode-change
55
- 'UINFO' => 100, # non-standard
56
- 'UID' => 101, # non-standard
57
- 'GID' => 102, # non-standard
58
- 'UNSPEC' => 103, # non-standard
59
- 'TKEY' => 249, # RFC 2930
60
- 'TSIG' => 250, # RFC 2931
61
- 'IXFR' => 251, # RFC 1995
62
- 'AXFR' => 252, # RFC 1035
63
- 'MAILB' => 253, # RFC 1035 (MB, MG, MR)
64
- 'MAILA' => 254, # RFC 1035 (obsolete - see MX)
51
+ 'DS' => 43, # RFC 4034
52
+ 'SSHFP' => 44, # RFC 4255
53
+ 'IPSECKEY' => 45, # RFC 4025
54
+ 'RRSIG' => 46, # RFC 4034
55
+ 'NSEC' => 47, # RFC 4034
56
+ 'DNSKEY' => 48, # RFC 4034
57
+ 'DHCID' => 49, # RFC 4701
58
+ 'NSEC3' => 50, # RFC 5155
59
+ 'NSEC3PARAM' => 51, # RFC 5155
60
+ 'TLSA' => 52, # RFC 6698
61
+ 'SMIMEA' => 53, # RFC 8162
62
+ 'HIP' => 55, # RFC 8005
63
+ 'CDS' => 59, # RFC 7344
64
+ 'CDNSKEY' => 60, # RFC 7344
65
+ 'OPENPGPKEY' => 61, # RFC 7929
66
+ 'CSYNC' => 62, # RFC 7477
67
+ 'ZONEMD' => 63, # RFC 8976
68
+ 'SVCB' => 64, # RFC 9460
69
+ 'HTTPS' => 65, # RFC 9460
70
+ 'UINFO' => 100, # non-standard (obsolete)
71
+ 'UID' => 101, # non-standard (obsolete)
72
+ 'GID' => 102, # non-standard (obsolete)
73
+ 'UNSPEC' => 103, # non-standard (obsolete)
74
+ 'EUI48' => 108, # RFC 7043
75
+ 'EUI64' => 109, # RFC 7043
76
+ 'TKEY' => 249, # RFC 2930
77
+ 'TSIG' => 250, # RFC 2931
78
+ 'IXFR' => 251, # RFC 1995
79
+ 'AXFR' => 252, # RFC 1035
80
+ 'MAILB' => 253, # RFC 1035 (MB, MG, MR) (obsolete)
81
+ 'MAILA' => 254, # RFC 1035 (obsolete - see MX)
65
82
  'ANY' => 255, # RFC 1035
83
+ 'URI' => 256, # RFC 7553
84
+ 'CAA' => 257, # RFC 6844
66
85
  }.freeze
67
86
 
68
87
  # The default value when type is nil in Resource Records
@@ -3,6 +3,6 @@
3
3
  module Net
4
4
  module DNS
5
5
  # The current library version.
6
- VERSION = "0.9.2".freeze
6
+ VERSION = "0.10.0"
7
7
  end
8
8
  end
@@ -5,7 +5,7 @@ class QuestionTest < Minitest::Test
5
5
  def setup
6
6
  @domain = 'example.com.'
7
7
  @type = 'MX'
8
- @cls = 'HS'
8
+ @cls = 'HS'
9
9
  @data = "\006google\003com\000\000\001\000\001"
10
10
 
11
11
  @default = Net::DNS::Question.new(@domain)
@@ -42,6 +42,15 @@ class QuestionTest < Minitest::Test
42
42
  assert_raises(ArgumentError) do
43
43
  Net::DNS::Question.parse([])
44
44
  end
45
+ assert_raises(ArgumentError) do
46
+ Net::DNS::Question.parse("[]")
47
+ end
48
+ assert_raises(ArgumentError) do
49
+ Net::DNS::Question.parse("12344")
50
+ end
51
+ assert_raises(ArgumentError) do
52
+ Net::DNS::Question.parse("12345")
53
+ end
45
54
  assert_raises(ArgumentError) do
46
55
  Net::DNS::Question.parse("test")
47
56
  end
@@ -10,7 +10,7 @@ class RRATest < Minitest::Test
10
10
  @rr_value = "64.233.187.99"
11
11
  @rr_address = IPAddr.new(@rr_value)
12
12
 
13
- @rr_output = "google.com. 10000 IN A 64.233.187.99"
13
+ @rr_output = "google.com. 10000 IN A 64.233.187.99"
14
14
 
15
15
  @rr = Net::DNS::RR::A.new(name: @rr_name, address: @rr_address, ttl: @rr_ttl)
16
16
  end
@@ -10,9 +10,9 @@ class RRAAAATest < Minitest::Test
10
10
  @rr_value = "2a00:d40:1:1::239"
11
11
  @rr_address = IPAddr.new(@rr_value)
12
12
 
13
- @rr_output = "www.nic.it. 60 IN AAAA 2a00:d40:1:1::239"
13
+ @rr_output = "www.nic.it. 60 IN AAAA 2a00:d40:1:1::239"
14
14
 
15
- @rr = Net::DNS::RR::AAAA.new(name: @rr_name, address: @rr_address, ttl: @rr_ttl)
15
+ @rr = Net::DNS::RR::AAAA.new(name: @rr_name, address: @rr_address, ttl: @rr_ttl)
16
16
  end
17
17
 
18
18
  def test_initialize_from_hash
@@ -10,9 +10,9 @@ class RRCNAMETest < Minitest::Test
10
10
  @rr_value = "www.l.google.com."
11
11
  @rr_cname = @rr_value
12
12
 
13
- @rr_output = "www.google.com. 550317 IN CNAME www.l.google.com."
13
+ @rr_output = "www.google.com. 550317 IN CNAME www.l.google.com."
14
14
 
15
- @rr = Net::DNS::RR::CNAME.new(name: @rr_name, cname: @rr_cname, ttl: @rr_ttl)
15
+ @rr = Net::DNS::RR::CNAME.new(name: @rr_name, cname: @rr_cname, ttl: @rr_ttl)
16
16
  end
17
17
 
18
18
  def test_initialize_from_hash
@@ -14,7 +14,7 @@ class RRHINFOTest < Minitest::Test
14
14
  @rr_cpu = "PC-Intel-700mhz"
15
15
  @rr_os = "Redhat Linux 7.1"
16
16
 
17
- @rr = Net::DNS::RR::HINFO.new(name: @rr_name, cpu: @rr_cpu, os: @rr_os)
17
+ @rr = Net::DNS::RR::HINFO.new(name: @rr_name, cpu: @rr_cpu, os: @rr_os)
18
18
  end
19
19
 
20
20
  def test_initialize_from_hash
@@ -11,9 +11,9 @@ class RRMXTest < Minitest::Test
11
11
  @rr_exchange = "mail.example.com."
12
12
  @rr_value = "#{@rr_preference} #{@rr_exchange}"
13
13
 
14
- @rr_output = "example.com. 10000 IN MX 10 mail.example.com."
14
+ @rr_output = "example.com. 10000 IN MX 10 mail.example.com."
15
15
 
16
- @rr = Net::DNS::RR::MX.new(name: "example.com.", preference: 10, exchange: "mail.example.com.", ttl: 10_000)
16
+ @rr = Net::DNS::RR::MX.new(name: "example.com.", preference: 10, exchange: "mail.example.com.", ttl: 10_000)
17
17
  end
18
18
 
19
19
  def test_initialize_from_hash
@@ -9,9 +9,9 @@ class RRNSTest < Minitest::Test
9
9
  @rr_ttl = 10_800
10
10
  @rr_nsdname = "ns1.google.com."
11
11
 
12
- @rr_output = "google.com. 10800 IN NS ns1.google.com."
12
+ @rr_output = "google.com. 10800 IN NS ns1.google.com."
13
13
 
14
- @rr = Net::DNS::RR::NS.new(name: "google.com.", nsdname: "ns1.google.com.", ttl: @rr_ttl)
14
+ @rr = Net::DNS::RR::NS.new(name: "google.com.", nsdname: "ns1.google.com.", ttl: @rr_ttl)
15
15
  end
16
16
 
17
17
  def test_initialize_from_hash
@@ -50,10 +50,10 @@ class RRTypesTest < Minitest::Test
50
50
  end
51
51
 
52
52
  def test_valid?
53
- assert_equal(true, Net::DNS::RR::Types.valid?("A"))
54
- assert_equal(true, Net::DNS::RR::Types.valid?(1))
53
+ assert_equal(true, Net::DNS::RR::Types.valid?("A"))
54
+ assert_equal(true, Net::DNS::RR::Types.valid?(1))
55
55
  assert_equal(false, Net::DNS::RR::Types.valid?("Q"))
56
- assert_equal(false, Net::DNS::RR::Types.valid?(256))
56
+ assert_equal(false, Net::DNS::RR::Types.valid?(12345))
57
57
  assert_raises(ArgumentError) do
58
58
  Net::DNS::RR::Types.valid?({})
59
59
  end
@@ -62,7 +62,7 @@ class RRTypesTest < Minitest::Test
62
62
  def test_to_str
63
63
  assert_equal("A", Net::DNS::RR::Types.to_str(1))
64
64
  assert_raises(ArgumentError) do
65
- Net::DNS::RR::Types.to_str(256)
65
+ Net::DNS::RR::Types.to_str(12345)
66
66
  end
67
67
  assert_raises(ArgumentError) do
68
68
  Net::DNS::RR::Types.to_str("string")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-net-dns
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marco Ceresa
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-04-19 00:00:00.000000000 Z
12
+ date: 2023-12-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mocha
@@ -144,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  requirements: []
147
- rubygems_version: 3.4.12
147
+ rubygems_version: 3.4.22
148
148
  signing_key:
149
149
  specification_version: 4
150
150
  summary: Pure Ruby DNS library.