ronin-support 0.5.1 → 1.0.0.beta1

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.
Files changed (517) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +27 -0
  4. data/.gitignore +7 -6
  5. data/.mailmap +1 -0
  6. data/.ruby-version +1 -0
  7. data/.yardopts +1 -2
  8. data/ChangeLog.md +533 -137
  9. data/Gemfile +20 -20
  10. data/README.md +137 -61
  11. data/Rakefile +29 -10
  12. data/data/text/homoglyphs/ascii.txt +8 -0
  13. data/data/text/homoglyphs/cyrillic.txt +33 -0
  14. data/data/text/homoglyphs/full_width.txt +81 -0
  15. data/data/text/homoglyphs/greek.txt +21 -0
  16. data/data/text/homoglyphs/latin_numbers.txt +14 -0
  17. data/data/text/homoglyphs/punctuation.txt +7 -0
  18. data/data/text/patterns/network/public_suffix.rb.erb +44 -0
  19. data/examples/ssl_proxy.rb +38 -0
  20. data/examples/tcp_proxy.rb +41 -0
  21. data/gemspec.yml +25 -15
  22. data/lib/ronin/support/archive/core_ext/file.rb +118 -0
  23. data/lib/ronin/{formatting/sql.rb → support/archive/core_ext.rb} +6 -7
  24. data/lib/ronin/support/archive/mixin.rb +213 -0
  25. data/lib/ronin/support/archive/tar/reader.rb +135 -0
  26. data/lib/ronin/support/archive/tar/writer.rb +197 -0
  27. data/lib/ronin/support/archive/tar.rb +155 -0
  28. data/lib/ronin/support/archive/zip/reader/entry.rb +134 -0
  29. data/lib/ronin/support/archive/zip/reader/statistics.rb +76 -0
  30. data/lib/ronin/support/archive/zip/reader.rb +273 -0
  31. data/lib/ronin/support/archive/zip/writer.rb +175 -0
  32. data/lib/ronin/support/archive/zip.rb +105 -0
  33. data/lib/ronin/support/archive.rb +211 -0
  34. data/lib/ronin/support/binary/array.rb +255 -0
  35. data/lib/ronin/support/binary/bit_flip.rb +147 -0
  36. data/lib/ronin/support/binary/buffer.rb +2027 -0
  37. data/lib/ronin/support/binary/byte_slice.rb +324 -0
  38. data/lib/ronin/support/binary/core_ext/array.rb +75 -0
  39. data/lib/ronin/support/binary/core_ext/float.rb +80 -0
  40. data/lib/ronin/support/binary/core_ext/integer.rb +305 -0
  41. data/lib/ronin/support/binary/core_ext/io.rb +38 -0
  42. data/lib/ronin/support/binary/core_ext/string.rb +115 -0
  43. data/lib/ronin/{formatting/extensions/text.rb → support/binary/core_ext.rb} +9 -9
  44. data/lib/ronin/support/binary/cstring.rb +259 -0
  45. data/lib/ronin/support/binary/ctypes/aggregate_type.rb +98 -0
  46. data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +77 -0
  47. data/lib/ronin/support/binary/ctypes/arch/arm.rb +75 -0
  48. data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +77 -0
  49. data/lib/ronin/support/binary/ctypes/arch/arm64.rb +75 -0
  50. data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +77 -0
  51. data/lib/ronin/support/binary/ctypes/arch/mips.rb +75 -0
  52. data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +77 -0
  53. data/lib/ronin/support/binary/ctypes/arch/mips64.rb +75 -0
  54. data/lib/ronin/support/binary/ctypes/arch/ppc.rb +75 -0
  55. data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +75 -0
  56. data/lib/ronin/support/binary/ctypes/arch/x86.rb +75 -0
  57. data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +75 -0
  58. data/lib/ronin/support/binary/ctypes/arch.rb +30 -0
  59. data/lib/ronin/support/binary/ctypes/array_object_type.rb +164 -0
  60. data/lib/ronin/support/binary/ctypes/array_type.rb +232 -0
  61. data/lib/ronin/support/binary/ctypes/big_endian.rb +195 -0
  62. data/lib/ronin/support/binary/ctypes/char_type.rb +59 -0
  63. data/lib/ronin/support/binary/ctypes/char_types.rb +39 -0
  64. data/lib/ronin/support/binary/ctypes/enum_type.rb +181 -0
  65. data/lib/ronin/support/binary/ctypes/float32_type.rb +50 -0
  66. data/lib/ronin/support/binary/ctypes/float64_type.rb +50 -0
  67. data/lib/ronin/support/binary/ctypes/float_type.rb +62 -0
  68. data/lib/ronin/support/binary/ctypes/int16_type.rb +50 -0
  69. data/lib/ronin/support/binary/ctypes/int32_type.rb +50 -0
  70. data/lib/ronin/support/binary/ctypes/int64_type.rb +50 -0
  71. data/lib/ronin/support/binary/ctypes/int8_type.rb +41 -0
  72. data/lib/ronin/support/binary/ctypes/int_type.rb +62 -0
  73. data/lib/ronin/support/binary/ctypes/little_endian.rb +195 -0
  74. data/lib/ronin/support/binary/ctypes/mixin.rb +135 -0
  75. data/lib/ronin/support/binary/ctypes/native.rb +205 -0
  76. data/lib/ronin/support/binary/ctypes/network.rb +29 -0
  77. data/lib/ronin/support/binary/ctypes/object_type.rb +55 -0
  78. data/lib/ronin/support/binary/ctypes/os/bsd.rb +65 -0
  79. data/lib/ronin/support/binary/ctypes/os/freebsd.rb +215 -0
  80. data/lib/ronin/support/binary/ctypes/os/linux.rb +193 -0
  81. data/lib/ronin/support/binary/ctypes/os/macos.rb +151 -0
  82. data/lib/ronin/support/binary/ctypes/os/netbsd.rb +147 -0
  83. data/lib/ronin/support/binary/ctypes/os/openbsd.rb +168 -0
  84. data/lib/ronin/support/binary/ctypes/os/unix.rb +78 -0
  85. data/lib/ronin/support/binary/ctypes/os/windows.rb +125 -0
  86. data/lib/ronin/support/binary/ctypes/os.rb +125 -0
  87. data/lib/ronin/support/binary/ctypes/scalar_type.rb +200 -0
  88. data/lib/ronin/support/binary/ctypes/string_type.rb +143 -0
  89. data/lib/ronin/support/binary/ctypes/struct_object_type.rb +173 -0
  90. data/lib/ronin/support/binary/ctypes/struct_type.rb +359 -0
  91. data/lib/ronin/support/binary/ctypes/type.rb +193 -0
  92. data/lib/ronin/support/binary/ctypes/type_resolver.rb +206 -0
  93. data/lib/ronin/support/binary/ctypes/uint16_type.rb +50 -0
  94. data/lib/ronin/support/binary/ctypes/uint32_type.rb +50 -0
  95. data/lib/ronin/support/binary/ctypes/uint64_type.rb +50 -0
  96. data/lib/ronin/support/binary/ctypes/uint8_type.rb +41 -0
  97. data/lib/ronin/support/binary/ctypes/uint_type.rb +59 -0
  98. data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +258 -0
  99. data/lib/ronin/support/binary/ctypes/union_object_type.rb +173 -0
  100. data/lib/ronin/support/binary/ctypes/union_type.rb +261 -0
  101. data/lib/ronin/support/binary/ctypes.rb +462 -0
  102. data/lib/ronin/support/binary/hexdump/core_ext/file.rb +118 -0
  103. data/lib/ronin/support/binary/hexdump/core_ext/string.rb +115 -0
  104. data/lib/ronin/support/binary/hexdump/core_ext.rb +20 -0
  105. data/lib/ronin/support/binary/hexdump/parser.rb +492 -0
  106. data/lib/ronin/support/binary/hexdump.rb +20 -0
  107. data/lib/ronin/support/binary/memory.rb +268 -0
  108. data/lib/ronin/support/binary/packet.rb +33 -0
  109. data/lib/ronin/support/binary/stack.rb +256 -0
  110. data/lib/ronin/support/binary/stream/methods.rb +1755 -0
  111. data/lib/ronin/support/binary/stream.rb +151 -0
  112. data/lib/ronin/support/binary/struct/member.rb +86 -0
  113. data/lib/ronin/support/binary/struct.rb +830 -0
  114. data/lib/ronin/support/binary/template.rb +284 -0
  115. data/lib/ronin/support/binary/union.rb +162 -0
  116. data/lib/ronin/support/binary.rb +26 -0
  117. data/lib/ronin/support/cli/ansi.rb +330 -0
  118. data/lib/ronin/support/cli/io_shell/core_ext/io.rb +67 -0
  119. data/lib/ronin/{fuzzing/extensions.rb → support/cli/io_shell/core_ext.rb} +6 -7
  120. data/lib/ronin/support/cli/io_shell.rb +161 -0
  121. data/lib/ronin/support/cli/printing.rb +216 -0
  122. data/lib/ronin/support/cli.rb +20 -0
  123. data/lib/ronin/support/compression/core_ext/file.rb +70 -0
  124. data/lib/ronin/support/compression/core_ext/string.rb +101 -0
  125. data/lib/ronin/{formatting/html.rb → support/compression/core_ext.rb} +6 -7
  126. data/lib/ronin/support/compression/gzip/reader.rb +70 -0
  127. data/lib/ronin/support/compression/gzip/writer.rb +74 -0
  128. data/lib/ronin/support/compression/gzip.rb +105 -0
  129. data/lib/ronin/support/compression/mixin.rb +180 -0
  130. data/lib/ronin/{network/extensions/esmtp/net.rb → support/compression/zlib.rb} +9 -10
  131. data/lib/ronin/support/compression.rb +174 -0
  132. data/lib/ronin/{extensions → support/core_ext}/enumerable.rb +5 -6
  133. data/lib/ronin/{extensions → support/core_ext}/file.rb +11 -34
  134. data/lib/ronin/support/core_ext/integer.rb +37 -0
  135. data/lib/ronin/support/core_ext/ipaddr.rb +65 -0
  136. data/lib/ronin/{extensions → support/core_ext}/kernel.rb +10 -9
  137. data/lib/ronin/{extensions → support/core_ext}/resolv.rb +5 -28
  138. data/lib/ronin/{extensions → support/core_ext}/string.rb +117 -57
  139. data/lib/ronin/support/core_ext.rb +33 -0
  140. data/lib/ronin/support/crypto/cert.rb +522 -0
  141. data/lib/ronin/support/crypto/cert_chain.rb +204 -0
  142. data/lib/ronin/support/crypto/cipher/aes.rb +71 -0
  143. data/lib/ronin/support/crypto/cipher/aes128.rb +54 -0
  144. data/lib/ronin/support/crypto/cipher/aes256.rb +54 -0
  145. data/lib/ronin/support/crypto/cipher.rb +194 -0
  146. data/lib/ronin/support/crypto/core_ext/file.rb +660 -0
  147. data/lib/ronin/support/crypto/core_ext/string.rb +548 -0
  148. data/lib/ronin/{binary.rb → support/crypto/core_ext.rb} +7 -8
  149. data/lib/ronin/support/crypto/hmac.rb +48 -0
  150. data/lib/ronin/support/crypto/key/dh.rb +122 -0
  151. data/lib/ronin/support/crypto/key/dsa.rb +103 -0
  152. data/lib/ronin/support/crypto/key/ec.rb +99 -0
  153. data/lib/ronin/support/crypto/key/methods.rb +163 -0
  154. data/lib/ronin/support/crypto/key/rsa.rb +169 -0
  155. data/lib/ronin/support/crypto/key.rb +105 -0
  156. data/lib/ronin/support/crypto/mixin.rb +620 -0
  157. data/lib/ronin/{network/extensions/http/net.rb → support/crypto/openssl.rb} +9 -10
  158. data/lib/ronin/support/crypto.rb +779 -0
  159. data/lib/ronin/support/encoding/base16/core_ext/string.rb +63 -0
  160. data/lib/ronin/support/encoding/base16/core_ext.rb +19 -0
  161. data/lib/ronin/support/encoding/base16.rb +82 -0
  162. data/lib/ronin/support/encoding/base32/core_ext/string.rb +63 -0
  163. data/lib/ronin/support/encoding/base32/core_ext.rb +19 -0
  164. data/lib/ronin/support/encoding/base32.rb +164 -0
  165. data/lib/ronin/support/encoding/base64/core_ext/string.rb +76 -0
  166. data/lib/ronin/support/encoding/base64/core_ext.rb +19 -0
  167. data/lib/ronin/support/encoding/base64.rb +78 -0
  168. data/lib/ronin/support/encoding/c/core_ext/integer.rb +82 -0
  169. data/lib/ronin/support/encoding/c/core_ext/string.rb +125 -0
  170. data/lib/ronin/support/encoding/c/core_ext.rb +20 -0
  171. data/lib/ronin/support/encoding/c.rb +277 -0
  172. data/lib/ronin/support/encoding/core_ext/string.rb +107 -0
  173. data/lib/ronin/support/encoding/core_ext.rb +33 -0
  174. data/lib/ronin/support/encoding/hex/core_ext/integer.rb +82 -0
  175. data/lib/ronin/support/encoding/hex/core_ext/string.rb +133 -0
  176. data/lib/ronin/support/encoding/hex/core_ext.rb +22 -0
  177. data/lib/ronin/support/encoding/hex.rb +248 -0
  178. data/lib/ronin/support/encoding/html/core_ext/integer.rb +106 -0
  179. data/lib/ronin/support/encoding/html/core_ext/string.rb +130 -0
  180. data/lib/ronin/support/encoding/html/core_ext.rb +20 -0
  181. data/lib/ronin/support/encoding/html.rb +233 -0
  182. data/lib/ronin/support/encoding/http/core_ext/integer.rb +95 -0
  183. data/lib/ronin/support/encoding/http/core_ext/string.rb +129 -0
  184. data/lib/ronin/support/encoding/http/core_ext.rb +20 -0
  185. data/lib/ronin/support/encoding/http.rb +241 -0
  186. data/lib/ronin/support/encoding/js/core_ext/integer.rb +67 -0
  187. data/lib/ronin/support/encoding/js/core_ext/string.rb +125 -0
  188. data/lib/ronin/support/encoding/js/core_ext.rb +20 -0
  189. data/lib/ronin/support/encoding/js.rb +279 -0
  190. data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +87 -0
  191. data/lib/ronin/support/encoding/powershell/core_ext/string.rb +145 -0
  192. data/lib/ronin/support/encoding/powershell/core_ext.rb +20 -0
  193. data/lib/ronin/support/encoding/powershell.rb +297 -0
  194. data/lib/ronin/support/encoding/punycode/core_ext/string.rb +63 -0
  195. data/lib/ronin/support/encoding/punycode/core_ext.rb +19 -0
  196. data/lib/ronin/support/encoding/punycode.rb +76 -0
  197. data/lib/ronin/support/encoding/quoted_printable/core_ext/string.rb +75 -0
  198. data/lib/ronin/support/encoding/quoted_printable/core_ext.rb +19 -0
  199. data/lib/ronin/support/encoding/quoted_printable.rb +102 -0
  200. data/lib/ronin/support/encoding/ruby/core_ext/string.rb +129 -0
  201. data/lib/ronin/{formatting/binary.rb → support/encoding/ruby/core_ext.rb} +6 -7
  202. data/lib/ronin/support/encoding/ruby.rb +235 -0
  203. data/lib/ronin/support/encoding/shell/core_ext/integer.rb +89 -0
  204. data/lib/ronin/support/encoding/shell/core_ext/string.rb +134 -0
  205. data/lib/ronin/support/encoding/shell/core_ext.rb +20 -0
  206. data/lib/ronin/support/encoding/shell.rb +293 -0
  207. data/lib/ronin/{network/extensions → support/encoding}/smtp.rb +7 -7
  208. data/lib/ronin/support/encoding/sql/core_ext/string.rb +114 -0
  209. data/lib/ronin/{formatting/http.rb → support/encoding/sql/core_ext.rb} +6 -7
  210. data/lib/ronin/support/encoding/sql.rb +124 -0
  211. data/lib/ronin/support/encoding/uri/core_ext/integer.rb +149 -0
  212. data/lib/ronin/support/encoding/uri/core_ext/string.rb +195 -0
  213. data/lib/ronin/support/encoding/uri/core_ext.rb +20 -0
  214. data/lib/ronin/support/encoding/uri.rb +424 -0
  215. data/lib/ronin/support/encoding/uuencoding/core_ext/string.rb +73 -0
  216. data/lib/ronin/support/encoding/uuencoding/core_ext.rb +19 -0
  217. data/lib/ronin/support/encoding/uuencoding.rb +70 -0
  218. data/lib/ronin/support/encoding/xml/core_ext/integer.rb +100 -0
  219. data/lib/ronin/support/encoding/xml/core_ext/string.rb +124 -0
  220. data/lib/ronin/support/encoding/xml/core_ext.rb +20 -0
  221. data/lib/ronin/support/encoding/xml.rb +328 -0
  222. data/lib/ronin/support/encoding.rb +46 -0
  223. data/lib/ronin/support/home.rb +88 -0
  224. data/lib/ronin/support/mixin.rb +42 -0
  225. data/lib/ronin/support/network/asn/dns_record.rb +112 -0
  226. data/lib/ronin/support/network/asn/list.rb +269 -0
  227. data/lib/ronin/support/network/asn/record.rb +164 -0
  228. data/lib/ronin/support/network/asn/record_set.rb +226 -0
  229. data/lib/ronin/support/network/asn.rb +88 -0
  230. data/lib/ronin/{binary/hexdump.rb → support/network/core_ext.rb} +6 -7
  231. data/lib/ronin/support/network/dns/idn.rb +38 -0
  232. data/lib/ronin/support/network/dns/mixin.rb +941 -0
  233. data/lib/ronin/support/network/dns/resolver.rb +707 -0
  234. data/lib/ronin/support/network/dns.rb +1109 -0
  235. data/lib/ronin/support/network/domain.rb +70 -0
  236. data/lib/ronin/support/network/email_address.rb +574 -0
  237. data/lib/ronin/support/network/esmtp/mixin.rb +115 -0
  238. data/lib/ronin/support/network/exceptions.rb +43 -0
  239. data/lib/ronin/support/network/ftp/mixin.rb +106 -0
  240. data/lib/ronin/support/network/host.rb +1473 -0
  241. data/lib/ronin/support/network/http/cookie.rb +245 -0
  242. data/lib/ronin/support/network/http/core_ext/uri/http.rb +63 -0
  243. data/lib/ronin/support/network/http/core_ext.rb +19 -0
  244. data/lib/ronin/support/network/http/mixin.rb +890 -0
  245. data/lib/ronin/support/network/http/request.rb +215 -0
  246. data/lib/ronin/support/network/http/set_cookie.rb +210 -0
  247. data/lib/ronin/support/network/http/user_agents.rb +115 -0
  248. data/lib/ronin/support/network/http.rb +2582 -0
  249. data/lib/ronin/support/network/imap/mixin.rb +133 -0
  250. data/lib/ronin/support/network/ip/mixin.rb +114 -0
  251. data/lib/ronin/support/network/ip.rb +540 -0
  252. data/lib/ronin/support/network/ip_range/cidr.rb +252 -0
  253. data/lib/ronin/support/network/ip_range/glob.rb +309 -0
  254. data/lib/ronin/support/network/ip_range/range.rb +249 -0
  255. data/lib/ronin/support/network/ip_range.rb +284 -0
  256. data/lib/ronin/support/network/mixin.rb +58 -0
  257. data/lib/ronin/support/network/packet.rb +27 -0
  258. data/lib/ronin/support/network/pop3/mixin.rb +113 -0
  259. data/lib/ronin/support/network/proxy.rb +602 -0
  260. data/lib/ronin/support/network/public_suffix/list.rb +339 -0
  261. data/lib/ronin/support/network/public_suffix/suffix.rb +118 -0
  262. data/lib/ronin/support/network/public_suffix/suffix_set.rb +150 -0
  263. data/lib/ronin/support/network/public_suffix.rb +41 -0
  264. data/lib/ronin/support/network/smtp/email.rb +190 -0
  265. data/lib/ronin/support/network/smtp/mixin.rb +290 -0
  266. data/lib/ronin/{extensions/meta.rb → support/network/smtp.rb} +6 -7
  267. data/lib/ronin/support/network/ssl/local_cert.rb +114 -0
  268. data/lib/ronin/support/network/ssl/local_key.rb +84 -0
  269. data/lib/ronin/support/network/ssl/mixin.rb +740 -0
  270. data/lib/ronin/{network/extensions/imap/net.rb → support/network/ssl/openssl.rb} +9 -10
  271. data/lib/ronin/support/network/ssl/proxy.rb +296 -0
  272. data/lib/ronin/support/network/ssl.rb +173 -0
  273. data/lib/ronin/support/network/tcp/mixin.rb +400 -0
  274. data/lib/ronin/support/network/tcp/proxy.rb +435 -0
  275. data/lib/ronin/support/network/tcp.rb +443 -0
  276. data/lib/ronin/support/network/telnet/mixin.rb +150 -0
  277. data/lib/ronin/support/network/telnet.rb +90 -0
  278. data/lib/ronin/support/network/tld/list.rb +266 -0
  279. data/lib/ronin/support/network/tld.rb +41 -0
  280. data/lib/ronin/support/network/tls/mixin.rb +670 -0
  281. data/lib/ronin/support/network/tls/proxy.rb +135 -0
  282. data/lib/ronin/support/network/tls.rb +53 -0
  283. data/lib/ronin/support/network/udp/mixin.rb +389 -0
  284. data/lib/ronin/support/network/udp/proxy.rb +192 -0
  285. data/lib/ronin/support/network/udp.rb +435 -0
  286. data/lib/ronin/support/network/unix/mixin.rb +273 -0
  287. data/lib/ronin/support/network.rb +37 -0
  288. data/lib/ronin/support/path.rb +136 -0
  289. data/lib/ronin/{network/extensions/dns/net.rb → support/text/core_ext/regexp.rb} +8 -9
  290. data/lib/ronin/support/text/core_ext/string.rb +46 -0
  291. data/lib/ronin/support/text/core_ext.rb +23 -0
  292. data/lib/ronin/support/text/entropy/core_ext/string.rb +45 -0
  293. data/lib/ronin/support/text/entropy/core_ext.rb +19 -0
  294. data/lib/ronin/support/text/entropy.rb +66 -0
  295. data/lib/ronin/support/text/erb/mixin.rb +44 -0
  296. data/lib/ronin/support/text/erb.rb +19 -0
  297. data/lib/ronin/support/text/homoglyph/core_ext/string.rb +108 -0
  298. data/lib/ronin/{formatting/digest.rb → support/text/homoglyph/core_ext.rb} +6 -7
  299. data/lib/ronin/{network/http/exceptions/unknown_request.rb → support/text/homoglyph/exceptions.rb} +10 -9
  300. data/lib/ronin/support/text/homoglyph/table.rb +228 -0
  301. data/lib/ronin/support/text/homoglyph.rb +142 -0
  302. data/lib/ronin/support/text/mixin.rb +31 -0
  303. data/lib/ronin/support/text/patterns/credentials.rb +75 -0
  304. data/lib/ronin/support/text/patterns/crypto.rb +67 -0
  305. data/lib/ronin/support/text/patterns/file_system.rb +93 -0
  306. data/lib/ronin/support/text/patterns/language.rb +37 -0
  307. data/lib/ronin/support/text/patterns/network/public_suffix.rb +44 -0
  308. data/lib/ronin/support/text/patterns/network.rb +140 -0
  309. data/lib/ronin/support/text/patterns/numeric.rb +52 -0
  310. data/lib/ronin/support/text/patterns/pii.rb +105 -0
  311. data/lib/ronin/support/text/patterns/source_code.rb +148 -0
  312. data/lib/ronin/support/text/patterns.rb +25 -0
  313. data/lib/ronin/support/text/random/mixin.rb +437 -0
  314. data/lib/ronin/support/text/random.rb +419 -0
  315. data/lib/ronin/support/text/typo/core_ext/string.rb +123 -0
  316. data/lib/ronin/support/text/typo/core_ext.rb +19 -0
  317. data/lib/ronin/support/text/typo/exceptions.rb +28 -0
  318. data/lib/ronin/support/text/typo/generator.rb +161 -0
  319. data/lib/ronin/support/text/typo.rb +260 -0
  320. data/lib/ronin/support/text.rb +26 -0
  321. data/lib/ronin/support/version.rb +6 -7
  322. data/lib/ronin/support.rb +20 -15
  323. data/ronin-support.gemspec +3 -1
  324. metadata +462 -369
  325. data/.gemtest +0 -0
  326. data/lib/ronin/binary/hexdump/parser.rb +0 -403
  327. data/lib/ronin/binary/struct.rb +0 -567
  328. data/lib/ronin/binary/template.rb +0 -454
  329. data/lib/ronin/extensions/ip_addr.rb +0 -217
  330. data/lib/ronin/extensions/meta/object.rb +0 -24
  331. data/lib/ronin/extensions/regexp.rb +0 -157
  332. data/lib/ronin/extensions.rb +0 -29
  333. data/lib/ronin/formatting/extensions/binary/array.rb +0 -61
  334. data/lib/ronin/formatting/extensions/binary/base64.rb +0 -106
  335. data/lib/ronin/formatting/extensions/binary/file.rb +0 -77
  336. data/lib/ronin/formatting/extensions/binary/float.rb +0 -65
  337. data/lib/ronin/formatting/extensions/binary/integer.rb +0 -180
  338. data/lib/ronin/formatting/extensions/binary/string.rb +0 -345
  339. data/lib/ronin/formatting/extensions/binary.rb +0 -26
  340. data/lib/ronin/formatting/extensions/digest/file.rb +0 -129
  341. data/lib/ronin/formatting/extensions/digest/string.rb +0 -86
  342. data/lib/ronin/formatting/extensions/digest.rb +0 -21
  343. data/lib/ronin/formatting/extensions/html/integer.rb +0 -142
  344. data/lib/ronin/formatting/extensions/html/string.rb +0 -194
  345. data/lib/ronin/formatting/extensions/html.rb +0 -21
  346. data/lib/ronin/formatting/extensions/http/integer.rb +0 -69
  347. data/lib/ronin/formatting/extensions/http/string.rb +0 -110
  348. data/lib/ronin/formatting/extensions/http.rb +0 -21
  349. data/lib/ronin/formatting/extensions/sql/string.rb +0 -128
  350. data/lib/ronin/formatting/extensions/sql.rb +0 -20
  351. data/lib/ronin/formatting/extensions/text/array.rb +0 -137
  352. data/lib/ronin/formatting/extensions/text/string.rb +0 -297
  353. data/lib/ronin/formatting/extensions.rb +0 -24
  354. data/lib/ronin/formatting/text.rb +0 -20
  355. data/lib/ronin/formatting.rb +0 -25
  356. data/lib/ronin/fuzzing/extensions/string.rb +0 -209
  357. data/lib/ronin/fuzzing/fuzzer.rb +0 -110
  358. data/lib/ronin/fuzzing/fuzzing.rb +0 -360
  359. data/lib/ronin/fuzzing/mutator.rb +0 -161
  360. data/lib/ronin/fuzzing/repeater.rb +0 -81
  361. data/lib/ronin/fuzzing/template.rb +0 -133
  362. data/lib/ronin/fuzzing.rb +0 -21
  363. data/lib/ronin/mixin.rb +0 -89
  364. data/lib/ronin/network/dns.rb +0 -201
  365. data/lib/ronin/network/esmtp.rb +0 -113
  366. data/lib/ronin/network/extensions/dns.rb +0 -20
  367. data/lib/ronin/network/extensions/esmtp.rb +0 -20
  368. data/lib/ronin/network/extensions/http/uri/http.rb +0 -228
  369. data/lib/ronin/network/extensions/http.rb +0 -21
  370. data/lib/ronin/network/extensions/imap.rb +0 -20
  371. data/lib/ronin/network/extensions/pop3/net.rb +0 -24
  372. data/lib/ronin/network/extensions/pop3.rb +0 -20
  373. data/lib/ronin/network/extensions/smtp/net.rb +0 -24
  374. data/lib/ronin/network/extensions/ssl/net.rb +0 -24
  375. data/lib/ronin/network/extensions/ssl.rb +0 -20
  376. data/lib/ronin/network/extensions/tcp/net.rb +0 -24
  377. data/lib/ronin/network/extensions/tcp.rb +0 -20
  378. data/lib/ronin/network/extensions/telnet/net.rb +0 -24
  379. data/lib/ronin/network/extensions/telnet.rb +0 -20
  380. data/lib/ronin/network/extensions/udp/net.rb +0 -24
  381. data/lib/ronin/network/extensions/udp.rb +0 -20
  382. data/lib/ronin/network/extensions.rb +0 -29
  383. data/lib/ronin/network/ftp.rb +0 -149
  384. data/lib/ronin/network/http/exceptions.rb +0 -20
  385. data/lib/ronin/network/http/http.rb +0 -1127
  386. data/lib/ronin/network/http/proxy.rb +0 -330
  387. data/lib/ronin/network/http.rb +0 -22
  388. data/lib/ronin/network/imap.rb +0 -158
  389. data/lib/ronin/network/mixins/dns.rb +0 -55
  390. data/lib/ronin/network/mixins/esmtp.rb +0 -164
  391. data/lib/ronin/network/mixins/ftp.rb +0 -155
  392. data/lib/ronin/network/mixins/http.rb +0 -227
  393. data/lib/ronin/network/mixins/imap.rb +0 -156
  394. data/lib/ronin/network/mixins/mixin.rb +0 -58
  395. data/lib/ronin/network/mixins/pop3.rb +0 -149
  396. data/lib/ronin/network/mixins/smtp.rb +0 -159
  397. data/lib/ronin/network/mixins/ssl.rb +0 -148
  398. data/lib/ronin/network/mixins/tcp.rb +0 -368
  399. data/lib/ronin/network/mixins/telnet.rb +0 -208
  400. data/lib/ronin/network/mixins/udp.rb +0 -381
  401. data/lib/ronin/network/mixins/unix.rb +0 -279
  402. data/lib/ronin/network/mixins.rb +0 -29
  403. data/lib/ronin/network/network.rb +0 -45
  404. data/lib/ronin/network/pop3.rb +0 -124
  405. data/lib/ronin/network/proxy.rb +0 -578
  406. data/lib/ronin/network/smtp/email.rb +0 -174
  407. data/lib/ronin/network/smtp/smtp.rb +0 -230
  408. data/lib/ronin/network/smtp.rb +0 -22
  409. data/lib/ronin/network/ssl.rb +0 -186
  410. data/lib/ronin/network/tcp/proxy.rb +0 -417
  411. data/lib/ronin/network/tcp/tcp.rb +0 -443
  412. data/lib/ronin/network/tcp.rb +0 -21
  413. data/lib/ronin/network/telnet.rb +0 -264
  414. data/lib/ronin/network/udp/proxy.rb +0 -191
  415. data/lib/ronin/network/udp/udp.rb +0 -450
  416. data/lib/ronin/network/udp.rb +0 -21
  417. data/lib/ronin/network/unix.rb +0 -286
  418. data/lib/ronin/network.rb +0 -31
  419. data/lib/ronin/path.rb +0 -137
  420. data/lib/ronin/spec/ui/output.rb +0 -22
  421. data/lib/ronin/support/inflector.rb +0 -92
  422. data/lib/ronin/support/support.rb +0 -42
  423. data/lib/ronin/templates/erb.rb +0 -78
  424. data/lib/ronin/templates/template.rb +0 -169
  425. data/lib/ronin/templates.rb +0 -21
  426. data/lib/ronin/ui/output/helpers.rb +0 -296
  427. data/lib/ronin/ui/output/output.rb +0 -146
  428. data/lib/ronin/ui/output/terminal/color.rb +0 -124
  429. data/lib/ronin/ui/output/terminal/raw.rb +0 -103
  430. data/lib/ronin/ui/output/terminal.rb +0 -21
  431. data/lib/ronin/ui/output.rb +0 -21
  432. data/lib/ronin/ui/shell.rb +0 -286
  433. data/lib/ronin/wordlist.rb +0 -287
  434. data/spec/binary/hexdump/helpers/hexdumps/ascii.bin +0 -0
  435. data/spec/binary/hexdump/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -17
  436. data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_bytes.txt +0 -17
  437. data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_shorts.txt +0 -17
  438. data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_bytes.txt +0 -17
  439. data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_shorts.txt +0 -17
  440. data/spec/binary/hexdump/helpers/hexdumps/hexdump_repeated.txt +0 -6
  441. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_bytes.txt +0 -17
  442. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_ints.txt +0 -17
  443. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_quads.txt +0 -17
  444. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_shorts.txt +0 -17
  445. data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +0 -17
  446. data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +0 -17
  447. data/spec/binary/hexdump/helpers/hexdumps/od_hex_bytes.txt +0 -17
  448. data/spec/binary/hexdump/helpers/hexdumps/od_hex_ints.txt +0 -17
  449. data/spec/binary/hexdump/helpers/hexdumps/od_hex_quads.txt +0 -17
  450. data/spec/binary/hexdump/helpers/hexdumps/od_hex_shorts.txt +0 -17
  451. data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +0 -17
  452. data/spec/binary/hexdump/helpers/hexdumps/od_octal_bytes.txt +0 -17
  453. data/spec/binary/hexdump/helpers/hexdumps/od_octal_ints.txt +0 -17
  454. data/spec/binary/hexdump/helpers/hexdumps/od_octal_quads.txt +0 -17
  455. data/spec/binary/hexdump/helpers/hexdumps/od_octal_shorts.txt +0 -17
  456. data/spec/binary/hexdump/helpers/hexdumps/od_repeated.txt +0 -6
  457. data/spec/binary/hexdump/helpers/hexdumps/repeated.bin +0 -1
  458. data/spec/binary/hexdump/helpers/hexdumps.rb +0 -13
  459. data/spec/binary/hexdump/parser_spec.rb +0 -302
  460. data/spec/binary/struct_spec.rb +0 -496
  461. data/spec/binary/template_spec.rb +0 -414
  462. data/spec/extensions/enumerable_spec.rb +0 -24
  463. data/spec/extensions/file_spec.rb +0 -63
  464. data/spec/extensions/ip_addr_spec.rb +0 -203
  465. data/spec/extensions/kernel_spec.rb +0 -30
  466. data/spec/extensions/regexp_spec.rb +0 -482
  467. data/spec/extensions/resolv_spec.rb +0 -18
  468. data/spec/extensions/string_spec.rb +0 -179
  469. data/spec/formatting/binary/array_spec.rb +0 -26
  470. data/spec/formatting/binary/base64_spec.rb +0 -50
  471. data/spec/formatting/binary/float_spec.rb +0 -34
  472. data/spec/formatting/binary/integer_spec.rb +0 -166
  473. data/spec/formatting/binary/string_spec.rb +0 -197
  474. data/spec/formatting/digest/string_spec.rb +0 -82
  475. data/spec/formatting/html/integer_spec.rb +0 -66
  476. data/spec/formatting/html/string_spec.rb +0 -103
  477. data/spec/formatting/http/integer_spec.rb +0 -42
  478. data/spec/formatting/http/string_spec.rb +0 -76
  479. data/spec/formatting/sql/string_spec.rb +0 -75
  480. data/spec/formatting/text/array_spec.rb +0 -105
  481. data/spec/formatting/text/string_spec.rb +0 -162
  482. data/spec/fuzzing/extensions/string_spec.rb +0 -87
  483. data/spec/fuzzing/fuzzer_spec.rb +0 -109
  484. data/spec/fuzzing/fuzzing_spec.rb +0 -24
  485. data/spec/fuzzing/mutator_spec.rb +0 -112
  486. data/spec/fuzzing/repeater_spec.rb +0 -57
  487. data/spec/fuzzing/template_spec.rb +0 -54
  488. data/spec/mixin_spec.rb +0 -53
  489. data/spec/network/dns_spec.rb +0 -201
  490. data/spec/network/ftp_spec.rb +0 -81
  491. data/spec/network/http/http_spec.rb +0 -466
  492. data/spec/network/http/proxy_spec.rb +0 -148
  493. data/spec/network/network_spec.rb +0 -8
  494. data/spec/network/proxy_spec.rb +0 -121
  495. data/spec/network/shared/unix_server.rb +0 -31
  496. data/spec/network/smtp/email_spec.rb +0 -100
  497. data/spec/network/ssl_spec.rb +0 -70
  498. data/spec/network/tcp/proxy_spec.rb +0 -116
  499. data/spec/network/tcp/tcp_spec.rb +0 -273
  500. data/spec/network/telnet_spec.rb +0 -67
  501. data/spec/network/udp/udp_spec.rb +0 -271
  502. data/spec/network/unix_spec.rb +0 -183
  503. data/spec/path_spec.rb +0 -86
  504. data/spec/spec_helper.rb +0 -9
  505. data/spec/support/inflector_spec.rb +0 -22
  506. data/spec/support_spec.rb +0 -8
  507. data/spec/templates/classes/example_erb.rb +0 -11
  508. data/spec/templates/classes/example_template.rb +0 -35
  509. data/spec/templates/erb_spec.rb +0 -21
  510. data/spec/templates/helpers/data/includes/_relative.erb +0 -1
  511. data/spec/templates/helpers/data/templates/example.erb +0 -1
  512. data/spec/templates/helpers/data.rb +0 -9
  513. data/spec/templates/template_spec.rb +0 -54
  514. data/spec/ui/classes/test_shell.rb +0 -22
  515. data/spec/ui/output_spec.rb +0 -32
  516. data/spec/ui/shell_spec.rb +0 -83
  517. data/spec/wordlist_spec.rb +0 -151
@@ -0,0 +1,1473 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # ronin-support is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # ronin-support is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/support/network/dns'
20
+ require 'ronin/support/network/dns/idn'
21
+ require 'ronin/support/network/ip'
22
+ require 'ronin/support/network/tld'
23
+ require 'ronin/support/network/public_suffix'
24
+
25
+ module Ronin
26
+ module Support
27
+ module Network
28
+ #
29
+ # Represents a host or host name.
30
+ #
31
+ # ## Examples
32
+ #
33
+ # host = Host.new('www.example.com')
34
+ #
35
+ # Resolve parent domain:
36
+ #
37
+ # host.domain
38
+ # # => #<Ronin::Support::Network::Domain: example.co.uk>
39
+ #
40
+ # Resolve IP addresses:
41
+ #
42
+ # host.get_address
43
+ # # => "172.67.128.149"
44
+ # host.get_addresses
45
+ # # => ["104.21.2.18", "172.67.128.149"]
46
+ # host.get_ip
47
+ # # => #<Ronin::Support::Network::IP: 172.67.128.149>
48
+ # host.get_ips
49
+ # # => [#<Ronin::Support::Network::IP: 104.21.2.18>, #<Ronin::Support::Network::IP: 172.67.128.149>]
50
+ # host.ip
51
+ # # => #<Ronin::Support::Network::IP: 172.67.128.149>
52
+ # host.ips
53
+ # # => [#<Ronin::Support::Network::IP: 104.21.2.18>, #<Ronin::Support::Network::IP: 172.67.128.149>]
54
+ #
55
+ # Other DNS queries:
56
+ #
57
+ # host = Host.new('www.github.com')
58
+ # host.get_record(:txt)
59
+ # # => #<Resolv::DNS::Resource::IN::TXT:0x00007f7e500777d8 @strings=["MS=ms58704441"], @ttl=3575>
60
+ # host.get_records(:txt)
61
+ # # => [#<Resolv::DNS::Resource::IN::TXT:0x00007f7e500777d8 @strings=["MS=ms58704441"], @ttl=3575>, ...]
62
+ # host.get_cname_record
63
+ # # => #<Resolv::DNS::Resource::IN::CNAME:0x00007f7e50063da0 @name=#<Resolv::DNS::Name: github.com.>, @ttl=3500>
64
+ # host.get_cname
65
+ # # => "github.com"
66
+ # host.cname
67
+ # # => "github.com"
68
+ # host.get_mx_records
69
+ # # => [#<Resolv::DNS::Resource::IN::MX:0x00007f7e50035658 @exchange=#<Resolv::DNS::Name: aspmx.l.google.com.>, @preference=1, @ttl=3600>, ...]
70
+ # host.get_mailservers
71
+ # # => ["alt1.aspmx.l.google.com",
72
+ # "alt4.aspmx.l.google.com",
73
+ # "alt3.aspmx.l.google.com",
74
+ # "alt2.aspmx.l.google.com",
75
+ # "aspmx.l.google.com"]
76
+ # host.mailservers
77
+ # # => ["alt1.aspmx.l.google.com",
78
+ # "alt4.aspmx.l.google.com",
79
+ # "alt3.aspmx.l.google.com",
80
+ # "alt2.aspmx.l.google.com",
81
+ # "aspmx.l.google.com"]
82
+ # host.get_ns_records
83
+ # # => [#<Resolv::DNS::Resource::IN::NS:0x00007f7e4f972258 @name=#<Resolv::DNS::Name: dns1.p08.nsone.net.>, @ttl=900>, ...]
84
+ # host.get_nameservers
85
+ # # => ["dns3.p08.nsone.net",
86
+ # "ns-1707.awsdns-21.co.uk",
87
+ # "dns2.p08.nsone.net",
88
+ # "ns-1283.awsdns-32.org",
89
+ # "dns4.p08.nsone.net",
90
+ # "ns-421.awsdns-52.com",
91
+ # "dns1.p08.nsone.net",
92
+ # "ns-520.awsdns-01.net"]
93
+ # host.nameservers
94
+ # # => ["dns3.p08.nsone.net",
95
+ # "ns-1707.awsdns-21.co.uk",
96
+ # "dns2.p08.nsone.net",
97
+ # "ns-1283.awsdns-32.org",
98
+ # "dns4.p08.nsone.net",
99
+ # "ns-421.awsdns-52.com",
100
+ # "dns1.p08.nsone.net",
101
+ # "ns-520.awsdns-01.net"]
102
+ # host.get_soa_record
103
+ # # => #<Resolv::DNS::Resource::IN::SOA:0x00007f7e4f63d0b0 @mname=#<Resolv::DNS::Name: ns-1707.awsdns-21.co.uk.>, @rname=#<Resolv::DNS::Name: awsdns-hostmaster.amazon.com.>, @serial=1, @refresh=7200, @retry=900, @expire=1209600, @minimum=86400, @ttl=880>
104
+ # host.soa_record
105
+ # # => #<Resolv::DNS::Resource::IN::SOA:0x00007f7e4f63d0b0 @mname=#<Resolv::DNS::Name: ns-1707.awsdns-21.co.uk.>, @rname=#<Resolv::DNS::Name: awsdns-hostmaster.amazon.com.>, @serial=1, @refresh=7200, @retry=900, @expire=1209600, @minimum=86400, @ttl=880>
106
+ # host.get_txt_record
107
+ # # => #<Resolv::DNS::Resource::IN::TXT:0x00007f7e4f8cbbb0 @strings=[\"adobe-idp-site-verification=b92c9e999aef825edc36e0a3d847d2dbad5b2fc0e05c79ddd7a16139b48ecf4b\"], @ttl=2887>
108
+ # host.get_txt_string
109
+ # # => "stripe-verification=f88ef17321660a01bab1660454192e014defa29ba7b8de9633c69d6b4912217f"
110
+ # host.get_txt_records
111
+ # # => [#<Resolv::DNS::Resource::IN::TXT:0x00007f7e4f67c648 @strings=[\"apple-domain-verification=RyQhdzTl6Z6x8ZP4\"], @ttl=2852>, ...]
112
+ # host.get_txt_strings
113
+ # # => ["apple-domain-verification=RyQhdzTl6Z6x8ZP4",
114
+ # "MS=ms58704441",
115
+ # "atlassian-domain-verification=jjgw98AKv2aeoYFxiL/VFaoyPkn3undEssTRuMg6C/3Fp/iqhkV4HVV7WjYlVeF8",
116
+ # "MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805",
117
+ # "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com include:spf.protection.outlook.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net ip4:166.78.69.169 ip4:1",
118
+ # "66.78.69.170 ip4:166.78.71.131 ip4:167.89.101.2 ip4:167.89.101.192/28 ip4:192.254.112.60 ip4:192.254.112.98/31 ip4:192.254.113.10 ip4:192.254.113.101 ip4:192.254.114.176 ip4:62.253.227.114 ~all",
119
+ # "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd",
120
+ # "google-site-verification=UTM-3akMgubp6tQtgEuAkYNYLyYAvpTnnSrDMWoDR3o",
121
+ # "stripe-verification=f88ef17321660a01bab1660454192e014defa29ba7b8de9633c69d6b4912217f",
122
+ # "adobe-idp-site-verification=b92c9e999aef825edc36e0a3d847d2dbad5b2fc0e05c79ddd7a16139b48ecf4b",
123
+ # "MS=ms44452932"]
124
+ # host.txt_strings
125
+ # # => ["apple-domain-verification=RyQhdzTl6Z6x8ZP4",
126
+ # "MS=ms58704441",
127
+ # "atlassian-domain-verification=jjgw98AKv2aeoYFxiL/VFaoyPkn3undEssTRuMg6C/3Fp/iqhkV4HVV7WjYlVeF8",
128
+ # "MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805",
129
+ # "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com include:spf.protection.outlook.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net ip4:166.78.69.169 ip4:1",
130
+ # "66.78.69.170 ip4:166.78.71.131 ip4:167.89.101.2 ip4:167.89.101.192/28 ip4:192.254.112.60 ip4:192.254.112.98/31 ip4:192.254.113.10 ip4:192.254.113.101 ip4:192.254.114.176 ip4:62.253.227.114 ~all",
131
+ # "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd",
132
+ # "google-site-verification=UTM-3akMgubp6tQtgEuAkYNYLyYAvpTnnSrDMWoDR3o",
133
+ # "stripe-verification=f88ef17321660a01bab1660454192e014defa29ba7b8de9633c69d6b4912217f",
134
+ # "adobe-idp-site-verification=b92c9e999aef825edc36e0a3d847d2dbad5b2fc0e05c79ddd7a16139b48ecf4b",
135
+ # "MS=ms44452932"]
136
+ #
137
+ # @api public
138
+ #
139
+ # @since 1.0.0
140
+ #
141
+ class Host
142
+
143
+ # The host name.
144
+ #
145
+ # @return [String]
146
+ attr_reader :name
147
+
148
+ #
149
+ # Initializes the host.
150
+ #
151
+ # @param [String] name
152
+ # The host's hostname.
153
+ #
154
+ # @example
155
+ # host = Host.new('www.example.com')
156
+ #
157
+ def initialize(name)
158
+ @name = name
159
+ end
160
+
161
+ #
162
+ # Determines if the hostname is an [IDN] hostname.
163
+ #
164
+ # [IDN]: https://en.wikipedia.org/wiki/Internationalized_domain_name
165
+ #
166
+ # @return [Boolean]
167
+ #
168
+ def idn?
169
+ @name !~ /\A[A-Za-z0-9._-]+\z/
170
+ end
171
+
172
+ alias unicode? idn?
173
+
174
+ #
175
+ # Determines if the hostname is a [punycode] hostnmae.
176
+ #
177
+ # [punycode]: https://en.wikipedia.org/wiki/Punycode
178
+ #
179
+ # @return [Boolean]
180
+ #
181
+ def punycode?
182
+ @name.include?('xn--')
183
+ end
184
+
185
+ #
186
+ # Converts the hostname to it's [punycode] version.
187
+ #
188
+ # [punycode]: https://en.wikipedia.org/wiki/Punycode
189
+ #
190
+ # @return [Host]
191
+ # The new host containing the punycode version of the hostname.
192
+ #
193
+ def punycode
194
+ self.class.new(DNS::IDN.to_ascii(@name))
195
+ end
196
+
197
+ #
198
+ # The Top-Level Domain of the hostnmae.
199
+ #
200
+ # @return [String]
201
+ # The last component of the hostname.
202
+ #
203
+ # @raise [InvalidHostname]
204
+ # The hostname does not end with a valid TLD.
205
+ #
206
+ # @example
207
+ # host = Host.new('foo.bar.example.co.uk')
208
+ # host.tld
209
+ # # => "uk"
210
+ #
211
+ def tld
212
+ @tld ||= TLD.list.split(@name).last
213
+ end
214
+
215
+ #
216
+ # The public suffix of the hostname.
217
+ #
218
+ # @return [String]
219
+ # The suffix of the hostname (ex: `.co.uk`).
220
+ #
221
+ # @raise [InvalidHostname]
222
+ # The hostname does not end with a valid suffix.
223
+ #
224
+ # @example
225
+ # host = Host.new('foo.bar.example.co.uk')
226
+ # host.suffix
227
+ # # => "co.uk"
228
+ #
229
+ def suffix
230
+ @suffix ||= PublicSuffix.list.split(@name).last
231
+ end
232
+
233
+ #
234
+ # Returns the associated domain for the hostname.
235
+ #
236
+ # @return [Domain]
237
+ # The domain object derived from the hostname, without any sub-domain
238
+ # components (ex: `www`).
239
+ #
240
+ # @raise [InvalidHostname]
241
+ # The hostname does not end with a valid suffix.
242
+ #
243
+ # @example
244
+ # host = Host.new('foo.bar.example.co.uk')
245
+ # host.domain
246
+ # # => #<Ronin::Support::Network::Domain: example.co.uk>
247
+ #
248
+ # @note This method returns memoized data.
249
+ #
250
+ def domain
251
+ @domain ||= begin
252
+ domain, suffix = PublicSuffix.list.split(@name)
253
+
254
+ if (last_dot = domain.rindex('.'))
255
+ domain = domain[(last_dot+1)..]
256
+ end
257
+
258
+ Domain.new("#{domain}.#{suffix}")
259
+ end
260
+ end
261
+
262
+ #
263
+ # Creates a sub-domain under the hostname.
264
+ #
265
+ # @param [String] subname
266
+ # The sub-name to add under the hostname.
267
+ #
268
+ # @return [Host]
269
+ # The new sub-domain.
270
+ #
271
+ def subdomain(subname)
272
+ Host.new("#{subname}.#{@name}")
273
+ end
274
+
275
+ #
276
+ # Changes the suffix of the hostname.
277
+ #
278
+ # @param [String] new_suffix
279
+ # The new suffix for the hostname.
280
+ #
281
+ # @return [Host]
282
+ # The new host object with the new suffix.
283
+ #
284
+ # @raise [PublicSuffix::InvalidHostname]
285
+ # The hostname does not end with a valid suffix.
286
+ #
287
+ # @example
288
+ # host = Host.new('www.example.co.uk')
289
+ # host.change_suffix('.com')
290
+ # # => #<Ronin::Support::Network::Host: www.example.com>
291
+ #
292
+ def change_suffix(new_suffix)
293
+ name, suffix = PublicSuffix.list.split(@name)
294
+ new_suffix = new_suffix.to_s
295
+
296
+ if new_suffix.start_with?('.')
297
+ return self.class.new("#{name}#{new_suffix}")
298
+ else
299
+ return self.class.new("#{name}.#{new_suffix}")
300
+ end
301
+ end
302
+
303
+ alias change_tld change_suffix
304
+
305
+ #
306
+ # Enumerates over every hostname with a different TLD.
307
+ #
308
+ # @yield [host]
309
+ # The given block will be passed each hostname with a different TLD.
310
+ #
311
+ # @yieldparam [Host] host
312
+ # The new host object with a different TLD.
313
+ #
314
+ # @return [Enumerator]
315
+ # If no block is given, an enumerator will be returned.
316
+ #
317
+ def each_tld
318
+ return enum_for(__method__) unless block_given?
319
+
320
+ TLD.list.each do |tld|
321
+ yield change_suffix(tld)
322
+ end
323
+
324
+ return nil
325
+ end
326
+
327
+ #
328
+ # Enumerates over every hostname with a different public suffix.
329
+ #
330
+ # @param [:icann, :private, nil] type
331
+ # The optional specific type of suffixes to enumerate.
332
+ #
333
+ # @yield [host]
334
+ # The given block will be passed each hostname with a different
335
+ # public suffix.
336
+ #
337
+ # @yieldparam [Host] host
338
+ # The new host object with a different public suffix.
339
+ #
340
+ # @return [Enumerator]
341
+ # If no block is given, an enumerator will be returned.
342
+ #
343
+ def each_suffix(type: nil)
344
+ return enum_for(__method__, type: type) unless block_given?
345
+
346
+ PublicSuffix.list.each do |suffix|
347
+ unless suffix.wildcard?
348
+ if (type == nil) || (suffix.type == type)
349
+ yield change_suffix(suffix)
350
+ end
351
+ end
352
+ end
353
+
354
+ return nil
355
+ end
356
+
357
+ #
358
+ # Looks up the address of a hostname.
359
+ #
360
+ # @param [Hash{Symbol => Object}] kwargs
361
+ # Additional keyword arguments.
362
+ #
363
+ # @option [Array<String>, String, nil] :nameservers
364
+ # Optional DNS nameserver(s) to query.
365
+ #
366
+ # @option [String, nil] :nameserver
367
+ # Optional DNS nameserver to query.
368
+ #
369
+ # @return [String, nil]
370
+ # The address of the hostname.
371
+ #
372
+ # @example
373
+ # host = Host.new('www.example.com')
374
+ # host.get_address
375
+ # # => "172.67.128.149"
376
+ #
377
+ def get_address(**kwargs)
378
+ DNS.resolver(**kwargs).get_address(@name)
379
+ end
380
+
381
+ alias lookup get_address
382
+
383
+ #
384
+ # Looks up all addresses of a hostname.
385
+ #
386
+ # @param [Hash{Symbol => Object}] kwargs
387
+ # Additional keyword arguments.
388
+ #
389
+ # @option [Array<String>, String, nil] :nameservers
390
+ # Optional DNS nameserver(s) to query.
391
+ #
392
+ # @option [String, nil] :nameserver
393
+ # Optional DNS nameserver to query.
394
+ #
395
+ # @return [Array<String>]
396
+ # The addresses of the hostname.
397
+ #
398
+ # @example
399
+ # host = Host.new('www.example.com')
400
+ # host.get_addresses
401
+ # # => ["104.21.2.18", "172.67.128.149"]
402
+ #
403
+ def get_addresses(**kwargs)
404
+ DNS.resolver(**kwargs).get_addresses(@name)
405
+ end
406
+
407
+ #
408
+ # The addreses of the hostname.
409
+ #
410
+ # @return [Array<String>]
411
+ # The addresses associated with the hostname.
412
+ #
413
+ # @example
414
+ # host = Host.new('www.example.com')
415
+ # host.addresses
416
+ # # => ["104.21.2.18", "172.67.128.149"]
417
+ #
418
+ # @note This method returns memoized data.
419
+ #
420
+ def addresses
421
+ @addresses ||= get_addresses
422
+ end
423
+
424
+ #
425
+ # Determines if the hostname has any addresses.
426
+ #
427
+ # @return [Boolean]
428
+ #
429
+ # @example
430
+ # host = Host.new('www.example.com')
431
+ # host.has_addresses?
432
+ # # => trun
433
+ # host = Host.new('www.does-not-exist.com')
434
+ # host.has_addresses?
435
+ # # => false
436
+ #
437
+ def has_addresses?
438
+ !addresses.empty?
439
+ end
440
+
441
+ #
442
+ # Looks up the IPs of the host.
443
+ #
444
+ # @param [Hash{Symbol => Object}] kwargs
445
+ # Additional keyword arguments.
446
+ #
447
+ # @option [Array<String>, String, nil] :nameservers
448
+ # Optional DNS nameserver(s) to query.
449
+ #
450
+ # @option [String, nil] :nameserver
451
+ # Optional DNS nameserver to query.
452
+ #
453
+ # @return [String, nil]
454
+ # The IP for the host.
455
+ #
456
+ # @example
457
+ # host = Host.new('www.example.com')
458
+ # host.get_ip
459
+ # # => #<Ronin::Support::Network::IP: 172.67.128.149>
460
+ #
461
+ def get_ip(**kwargs)
462
+ if (address = get_address(**kwargs))
463
+ IP.new(address)
464
+ end
465
+ end
466
+
467
+ #
468
+ # Looks up all IPs for the host.
469
+ #
470
+ # @param [Hash{Symbol => Object}] kwargs
471
+ # Additional keyword arguments.
472
+ #
473
+ # @option [Array<String>, String, nil] :nameservers
474
+ # Optional DNS nameserver(s) to query.
475
+ #
476
+ # @option [String, nil] :nameserver
477
+ # Optional DNS nameserver to query.
478
+ #
479
+ # @return [Array<IP>]
480
+ # The IPs for the host.
481
+ #
482
+ # @example
483
+ # host = Host.new('www.example.com')
484
+ # host.get_ips
485
+ # # => [#<Ronin::Support::Network::IP: 104.21.2.18>, #<Ronin::Support::Network::IP: 172.67.128.149>]
486
+ #
487
+ def get_ips(**kwargs)
488
+ get_addresses(**kwargs).map { |address| IP.new(address) }
489
+ end
490
+
491
+ #
492
+ # The IPs for the host.
493
+ #
494
+ # @return [Array<IP>]
495
+ # The IPs of the host or an empty Array if the host has no IP
496
+ # addresses.
497
+ #
498
+ # @example
499
+ # host = Host.new('www.example.com')
500
+ # host.ips
501
+ # # => [#<Ronin::Support::Network::IP: 104.21.2.18>, #<Ronin::Support::Network::IP: 172.67.128.149>]
502
+ #
503
+ # @note This method returns memoized data.
504
+ #
505
+ def ips
506
+ @ips ||= get_ips
507
+ end
508
+
509
+ #
510
+ # The IP for the host.
511
+ #
512
+ # @return [IP, nil]
513
+ # The IP for the host or `nil` if the host has no IP addresses.
514
+ #
515
+ # @example
516
+ # host = Host.new('www.example.com')
517
+ # host.ip
518
+ # # => #<Ronin::Support::Network::IP: 104.21.2.18>
519
+ #
520
+ def ip
521
+ ips.first
522
+ end
523
+
524
+ #
525
+ # Queries a single matching DNS record for the host name.
526
+ #
527
+ # @param [String, nil] name
528
+ # The optional record name to query.
529
+ #
530
+ # @param [:a, :aaaa, :any, :cname, :hinfo, :loc, :minfo, :mx, :ns, :ptr, :soa, :srv, :txt, :wks] record_type
531
+ # The record type to query for.
532
+ #
533
+ # @param [Hash{Symbol => Object}] kwargs
534
+ # Additional keyword arguments.
535
+ #
536
+ # @option [Array<String>, String, nil] :nameservers
537
+ # Optional DNS nameserver(s) to query.
538
+ #
539
+ # @option [String, nil] :nameserver
540
+ # Optional DNS nameserver to query.
541
+ #
542
+ # @return [Resolv::DNS::Resource, nil]
543
+ # The matching DNS records or `nil` if no matching DNS records
544
+ # could be found.
545
+ #
546
+ # @example
547
+ # host = Host.new('www.example.com')
548
+ #
549
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource
550
+ # @see DNS::Resolver#get_record
551
+ #
552
+ def get_record(name=nil,record_type,**kwargs)
553
+ name = if name then "#{name}.#{@name}"
554
+ else @name
555
+ end
556
+
557
+ DNS.resolver(**kwargs).get_record(name,record_type)
558
+ end
559
+
560
+ #
561
+ # Queries all matching DNS records for the host name.
562
+ #
563
+ # @param [String, nil] name
564
+ # The optional record name to query.
565
+ #
566
+ # @param [:a, :aaaa, :any, :cname, :hinfo, :loc, :minfo, :mx, :ns, :ptr, :soa, :srv, :txt, :wks] record_type
567
+ # The record type to query for.
568
+ #
569
+ # @param [Hash{Symbol => Object}] kwargs
570
+ # Additional keyword arguments.
571
+ #
572
+ # @option [Array<String>, String, nil] :nameservers
573
+ # Optional DNS nameserver(s) to query.
574
+ #
575
+ # @option [String, nil] :nameserver
576
+ # Optional DNS nameserver to query.
577
+ #
578
+ # @return [Array<Resolv::DNS::Resource>]
579
+ # All matching DNS records.
580
+ #
581
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource
582
+ # @see DNS::Resolver#get_records
583
+ #
584
+ def get_records(name=nil,record_type,**kwargs)
585
+ name = if name then "#{name}.#{@name}"
586
+ else @name
587
+ end
588
+
589
+ DNS.resolver(**kwargs).get_records(name,record_type)
590
+ end
591
+
592
+ #
593
+ # Queries all records of the host name using the `ANY` DNS query.
594
+ #
595
+ # @param [String, nil] name
596
+ # The optional record name to query.
597
+ #
598
+ # @param [Hash{Symbol => Object}] kwargs
599
+ # Additional keyword arguments.
600
+ #
601
+ # @option [Array<String>, String, nil] :nameservers
602
+ # Optional DNS nameserver(s) to query.
603
+ #
604
+ # @option [String, nil] :nameserver
605
+ # Optional DNS nameserver to query.
606
+ #
607
+ # @return [Array<Resolv::DNS::Resource>]
608
+ # All of the DNS records belonging to the host name.
609
+ #
610
+ # @see DNS::Resolver#get_any_records
611
+ #
612
+ def get_any_records(name=nil,**kwargs)
613
+ name = if name then "#{name}.#{@name}"
614
+ else @name
615
+ end
616
+
617
+ DNS.resolver(**kwargs).get_any_records(name)
618
+ end
619
+
620
+ #
621
+ # Queries the `CNAME` record for the host name.
622
+ #
623
+ # @param [String, nil] name
624
+ # The optional record name to query.
625
+ #
626
+ # @param [Hash{Symbol => Object}] kwargs
627
+ # Additional keyword arguments.
628
+ #
629
+ # @option [Array<String>, String, nil] :nameservers
630
+ # Optional DNS nameserver(s) to query.
631
+ #
632
+ # @option [String, nil] :nameserver
633
+ # Optional DNS nameserver to query.
634
+ #
635
+ # @return [Resolv::DNS::Resource::IN::CNAME, nil]
636
+ # The `CNAME` record or `nil` if the host name has no `CNAME`
637
+ # record.
638
+ #
639
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/CNAME
640
+ # @see DNS::Resolver#get_cname_record
641
+ #
642
+ def get_cname_record(name=nil,**kwargs)
643
+ name = if name then "#{name}.#{@name}"
644
+ else @name
645
+ end
646
+
647
+ DNS.resolver(**kwargs).get_cname_record(name)
648
+ end
649
+
650
+ #
651
+ # Queries the canonical name for the host name.
652
+ #
653
+ # @param [String, nil] name
654
+ # The optional record name to query.
655
+ #
656
+ # @param [Hash{Symbol => Object}] kwargs
657
+ # Additional keyword arguments.
658
+ #
659
+ # @option [Array<String>, String, nil] :nameservers
660
+ # Optional DNS nameserver(s) to query.
661
+ #
662
+ # @option [String, nil] :nameserver
663
+ # Optional DNS nameserver to query.
664
+ #
665
+ # @return [String, nil]
666
+ # The canonical name for the host or `nil` if the host has no
667
+ # `CNAME` record.
668
+ #
669
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/CNAME
670
+ # @see DNS::Resolver#get_cname
671
+ #
672
+ def get_cname(name=nil,**kwargs)
673
+ name = if name then "#{name}.#{@name}"
674
+ else @name
675
+ end
676
+
677
+ DNS.resolver(**kwargs).get_cname(name)
678
+ end
679
+
680
+ #
681
+ # The `CNAME` record for the host.
682
+ #
683
+ # @return [String, nil]
684
+ # The `CNAME` host name.
685
+ #
686
+ # @note This method returns memoized data.
687
+ #
688
+ # @see #get_cname
689
+ #
690
+ def cname
691
+ @cname ||= get_cname
692
+ end
693
+
694
+ #
695
+ # Queries the `HINFO` record for the host name.
696
+ #
697
+ # @param [String, nil] name
698
+ # The optional record name to query.
699
+ #
700
+ # @param [Hash{Symbol => Object}] kwargs
701
+ # Additional keyword arguments.
702
+ #
703
+ # @option [Array<String>, String, nil] :nameservers
704
+ # Optional DNS nameserver(s) to query.
705
+ #
706
+ # @option [String, nil] :nameserver
707
+ # Optional DNS nameserver to query.
708
+ #
709
+ # @return [Resolv::DNS::Resource::IN::HINFO, nil]
710
+ # The `HINFO` DNS record or `nil` if the host name has no `HINFO`
711
+ # record.
712
+ #
713
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/HINFO
714
+ # @see DNS::Resolver#get_hinfo_record
715
+ #
716
+ def get_hinfo_record(name=nil,**kwargs)
717
+ name = if name then "#{name}.#{@name}"
718
+ else @name
719
+ end
720
+
721
+ DNS.resolver(**kwargs).get_hinfo_record(name)
722
+ end
723
+
724
+ #
725
+ # The `HINFO` record for the host.
726
+ #
727
+ # @return [Resolv::DNS::Resource::IN::HINFO, nil]
728
+ # The `HINFO` DNS record or `nil` if the host name has no `HINFO`
729
+ # record.
730
+ #
731
+ # @note This method returns memoized data.
732
+ #
733
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/HINFO
734
+ # @see #get_hinfo_record
735
+ #
736
+ def hinfo_record
737
+ @hinfo_record ||= get_hinfo_record
738
+ end
739
+
740
+ #
741
+ # Queries the first `A` record belonging to the host name.
742
+ #
743
+ # @param [String, nil] name
744
+ # The optional record name to query.
745
+ #
746
+ # @param [Hash{Symbol => Object}] kwargs
747
+ # Additional keyword arguments.
748
+ #
749
+ # @option [Array<String>, String, nil] :nameservers
750
+ # Optional DNS nameserver(s) to query.
751
+ #
752
+ # @option [String, nil] :nameserver
753
+ # Optional DNS nameserver to query.
754
+ #
755
+ # @return [Resolv::DNS::Resource::IN::A, nil]
756
+ # The first `A` DNS record or `nil` if the host name has no `A`
757
+ # records.
758
+ #
759
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/IN/A
760
+ # @see DNS::Resolver#get_a_record
761
+ #
762
+ def get_a_record(name=nil,**kwargs)
763
+ name = if name then "#{name}.#{@name}"
764
+ else @name
765
+ end
766
+
767
+ DNS.resolver(**kwargs).get_a_record(name)
768
+ end
769
+
770
+ #
771
+ # Queries the first IPv4 address belonging to the host name.
772
+ #
773
+ # @param [String, nil] name
774
+ # The optional record name to query.
775
+ #
776
+ # @param [Hash{Symbol => Object}] kwargs
777
+ # Additional keyword arguments.
778
+ #
779
+ # @option [Array<String>, String, nil] :nameservers
780
+ # Optional DNS nameserver(s) to query.
781
+ #
782
+ # @option [String, nil] :nameserver
783
+ # Optional DNS nameserver to query.
784
+ #
785
+ # @return [String, nil]
786
+ # The first IPv4 address belonging to the host name.
787
+ #
788
+ # @see DNS::Resolver#get_a_address
789
+ #
790
+ def get_a_address(name=nil,**kwargs)
791
+ name = if name then "#{name}.#{@name}"
792
+ else @name
793
+ end
794
+
795
+ DNS.resolver(**kwargs).get_a_address(name)
796
+ end
797
+
798
+ #
799
+ # Queries all `A` records belonging to the host name.
800
+ #
801
+ # @param [String, nil] name
802
+ # The optional record name to query.
803
+ #
804
+ # @param [Hash{Symbol => Object}] kwargs
805
+ # Additional keyword arguments.
806
+ #
807
+ # @option [Array<String>, String, nil] :nameservers
808
+ # Optional DNS nameserver(s) to query.
809
+ #
810
+ # @option [String, nil] :nameserver
811
+ # Optional DNS nameserver to query.
812
+ #
813
+ # @return [Array<Resolv::DNS::Resource::IN::A>]
814
+ # All of the `A` DNS records belonging to the host name.
815
+ #
816
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/IN/A
817
+ # @see DNS::Resolver#get_a_records
818
+ #
819
+ def get_a_records(name=nil,**kwargs)
820
+ name = if name then "#{name}.#{@name}"
821
+ else @name
822
+ end
823
+
824
+ DNS.resolver(**kwargs).get_a_records(name)
825
+ end
826
+
827
+ #
828
+ # Queries all IPv4 addresses belonging to the host name.
829
+ #
830
+ # @param [String, nil] name
831
+ # The optional record name to query.
832
+ #
833
+ # @param [Hash{Symbol => Object}] kwargs
834
+ # Additional keyword arguments.
835
+ #
836
+ # @option [Array<String>, String, nil] :nameservers
837
+ # Optional DNS nameserver(s) to query.
838
+ #
839
+ # @option [String, nil] :nameserver
840
+ # Optional DNS nameserver to query.
841
+ #
842
+ # @return [Array<String>]
843
+ # All of the IPv4 addresses belonging to the host name.
844
+ #
845
+ # @see DNS::Resolver#get_a_addresses
846
+ #
847
+ def get_a_addresses(name=nil,**kwargs)
848
+ name = if name then "#{name}.#{@name}"
849
+ else @name
850
+ end
851
+
852
+ DNS.resolver(**kwargs).get_a_addresses(name)
853
+ end
854
+
855
+ #
856
+ # Queries the first `AAAA` DNS records belonging to the host name.
857
+ #
858
+ # @param [String, nil] name
859
+ # The optional record name to query.
860
+ #
861
+ # @param [Hash{Symbol => Object}] kwargs
862
+ # Additional keyword arguments.
863
+ #
864
+ # @option [Array<String>, String, nil] :nameservers
865
+ # Optional DNS nameserver(s) to query.
866
+ #
867
+ # @option [String, nil] :nameserver
868
+ # Optional DNS nameserver to query.
869
+ #
870
+ # @return [Resolv::DNS::Resource::IN::AAAA, nil]
871
+ # The first `AAAA` DNS record or `nil` if the host name has no
872
+ # `AAAA` records.
873
+ #
874
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/IN/AAAA
875
+ # @see DNS::Resolver#get_aaaa_record
876
+ #
877
+ def get_aaaa_record(name=nil,**kwargs)
878
+ name = if name then "#{name}.#{@name}"
879
+ else @name
880
+ end
881
+
882
+ DNS.resolver(**kwargs).get_aaaa_record(name)
883
+ end
884
+
885
+ #
886
+ # Queries the first IPv6 address belonging to the host name.
887
+ #
888
+ # @param [String, nil] name
889
+ # The optional record name to query.
890
+ #
891
+ # @param [Hash{Symbol => Object}] kwargs
892
+ # Additional keyword arguments.
893
+ #
894
+ # @option [Array<String>, String, nil] :nameservers
895
+ # Optional DNS nameserver(s) to query.
896
+ #
897
+ # @option [String, nil] :nameserver
898
+ # Optional DNS nameserver to query.
899
+ #
900
+ # @return [String, nil]
901
+ # The first IPv6 address or `nil` if the host name has no IPv6
902
+ # addresses.
903
+ #
904
+ # @see DNS::Resolver#get_aaaa_address
905
+ #
906
+ def get_aaaa_address(name=nil,**kwargs)
907
+ name = if name then "#{name}.#{@name}"
908
+ else @name
909
+ end
910
+
911
+ DNS.resolver(**kwargs).get_aaaa_address(name)
912
+ end
913
+
914
+ #
915
+ # Queries all `AAAA` DNS records belonging to the host name.
916
+ #
917
+ # @param [String, nil] name
918
+ # The optional record name to query.
919
+ #
920
+ # @param [Hash{Symbol => Object}] kwargs
921
+ # Additional keyword arguments.
922
+ #
923
+ # @option [Array<String>, String, nil] :nameservers
924
+ # Optional DNS nameserver(s) to query.
925
+ #
926
+ # @option [String, nil] :nameserver
927
+ # Optional DNS nameserver to query.
928
+ #
929
+ # @return [Array<Resolv::DNS::Resource::IN::AAAA>]
930
+ # All of the `AAAA` DNS records belonging to the host name.
931
+ #
932
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/IN/AAAA
933
+ # @see DNS::Resolver#get_aaaa_records
934
+ #
935
+ def get_aaaa_records(name=nil,**kwargs)
936
+ name = if name then "#{name}.#{@name}"
937
+ else @name
938
+ end
939
+
940
+ DNS.resolver(**kwargs).get_aaaa_records(name)
941
+ end
942
+
943
+ #
944
+ # Queries all IPv6 addresses belonging to the host name.
945
+ #
946
+ # @param [String, nil] name
947
+ # The optional record name to query.
948
+ #
949
+ # @param [Hash{Symbol => Object}] kwargs
950
+ # Additional keyword arguments.
951
+ #
952
+ # @option [Array<String>, String, nil] :nameservers
953
+ # Optional DNS nameserver(s) to query.
954
+ #
955
+ # @option [String, nil] :nameserver
956
+ # Optional DNS nameserver to query.
957
+ #
958
+ # @return [Array<String>]
959
+ # All IPv6 addresses belonging to the host name.
960
+ #
961
+ # @see DNS::Resolver#get_aaaa_addresses
962
+ #
963
+ def get_aaaa_addresses(name=nil,**kwargs)
964
+ name = if name then "#{name}.#{@name}"
965
+ else @name
966
+ end
967
+
968
+ DNS.resolver(**kwargs).get_aaaa_addresses(name)
969
+ end
970
+
971
+ #
972
+ # Queries all `SRV` DNS records belonging to the host name.
973
+ #
974
+ # @param [String, nil] name
975
+ # The optional record name to query.
976
+ #
977
+ # @param [Hash{Symbol => Object}] kwargs
978
+ # Additional keyword arguments.
979
+ #
980
+ # @option [Array<String>, String, nil] :nameservers
981
+ # Optional DNS nameserver(s) to query.
982
+ #
983
+ # @option [String, nil] :nameserver
984
+ # Optional DNS nameserver to query.
985
+ #
986
+ # @return [Array<Resolv::DNS::Resource::IN::SRV>]
987
+ # All `SRV` DNS records belonging to the host name.
988
+ #
989
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/IN/SRV
990
+ # @see DNS::Resolver#get_srv_records
991
+ #
992
+ def get_srv_records(name=nil,**kwargs)
993
+ name = if name then "#{name}.#{@name}"
994
+ else @name
995
+ end
996
+
997
+ DNS.resolver(**kwargs).get_srv_records(name)
998
+ end
999
+
1000
+ #
1001
+ # Queries all `WKS` (Well-Known-Service) DNS records belonging to the
1002
+ # host name.
1003
+ #
1004
+ # @param [String, nil] name
1005
+ # The optional record name to query.
1006
+ #
1007
+ # @param [Hash{Symbol => Object}] kwargs
1008
+ # Additional keyword arguments.
1009
+ #
1010
+ # @option [Array<String>, String, nil] :nameservers
1011
+ # Optional DNS nameserver(s) to query.
1012
+ #
1013
+ # @option [String, nil] :nameserver
1014
+ # Optional DNS nameserver to query.
1015
+ #
1016
+ # @return [Array<Resolv::DNS::Resource::IN::WKS>]
1017
+ # All `WKS` DNS records belonging to the host name.
1018
+ #
1019
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/IN/WKS
1020
+ # @see DNS::Resolver#get_wks_records
1021
+ #
1022
+ def get_wks_records(name=nil,**kwargs)
1023
+ name = if name then "#{name}.#{@name}"
1024
+ else @name
1025
+ end
1026
+
1027
+ DNS.resolver(**kwargs).get_wks_records(name)
1028
+ end
1029
+
1030
+ #
1031
+ # Queries the `LOC` (Location) DNS record of the host name.
1032
+ #
1033
+ # @param [String, nil] name
1034
+ # The optional record name to query.
1035
+ #
1036
+ # @param [Hash{Symbol => Object}] kwargs
1037
+ # Additional keyword arguments.
1038
+ #
1039
+ # @option [Array<String>, String, nil] :nameservers
1040
+ # Optional DNS nameserver(s) to query.
1041
+ #
1042
+ # @option [String, nil] :nameserver
1043
+ # Optional DNS nameserver to query.
1044
+ #
1045
+ # @return [Resolv::DNS::Resource::LOC, nil]
1046
+ # The `LOC` DNS record of the host name or `nil` if the host name
1047
+ # has no `LOC` record.
1048
+ #
1049
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/LOC
1050
+ # @see DNS::Resolver#get_loc_record
1051
+ #
1052
+ def get_loc_record(name=nil,**kwargs)
1053
+ name = if name then "#{name}.#{@name}"
1054
+ else @name
1055
+ end
1056
+
1057
+ DNS.resolver(**kwargs).get_loc_record(name)
1058
+ end
1059
+
1060
+ #
1061
+ # Queries the `MINFO` (Machine-Info) DNS record of the host name.
1062
+ #
1063
+ # @param [String, nil] name
1064
+ # The optional record name to query.
1065
+ #
1066
+ # @param [Hash{Symbol => Object}] kwargs
1067
+ # Additional keyword arguments.
1068
+ #
1069
+ # @option [Array<String>, String, nil] :nameservers
1070
+ # Optional DNS nameserver(s) to query.
1071
+ #
1072
+ # @option [String, nil] :nameserver
1073
+ # Optional DNS nameserver to query.
1074
+ #
1075
+ # @return [Resolv::DNS::Resource::MINFO, nil]
1076
+ # The `MINFO` DNS record of the host name or `nil` if the host name
1077
+ # has no `MINFO` record.
1078
+ #
1079
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/MINFO
1080
+ # @see DNS::Resolver#get_minfo_record
1081
+ #
1082
+ def get_minfo_record(name=nil,**kwargs)
1083
+ name = if name then "#{name}.#{@name}"
1084
+ else @name
1085
+ end
1086
+
1087
+ DNS.resolver(**kwargs).get_minfo_record(name)
1088
+ end
1089
+
1090
+ #
1091
+ # Queries all `MX` DNS records belonging to the host name.
1092
+ #
1093
+ # @param [String, nil] name
1094
+ # The optional record name to query.
1095
+ #
1096
+ # @param [Hash{Symbol => Object}] kwargs
1097
+ # Additional keyword arguments.
1098
+ #
1099
+ # @option [Array<String>, String, nil] :nameservers
1100
+ # Optional DNS nameserver(s) to query.
1101
+ #
1102
+ # @option [String, nil] :nameserver
1103
+ # Optional DNS nameserver to query.
1104
+ #
1105
+ # @return [Array<Resolv::DNS::Resource::MX>]
1106
+ # All `MX` DNS records belonging to the host name.
1107
+ #
1108
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/MX
1109
+ # @see DNS::Resolver#get_mx_records
1110
+ #
1111
+ def get_mx_records(name=nil,**kwargs)
1112
+ name = if name then "#{name}.#{@name}"
1113
+ else @name
1114
+ end
1115
+
1116
+ DNS.resolver(**kwargs).get_mx_records(name)
1117
+ end
1118
+
1119
+ #
1120
+ # Queries the mailservers for the host name.
1121
+ #
1122
+ # @param [Hash{Symbol => Object}] kwargs
1123
+ # Additional keyword arguments.
1124
+ #
1125
+ # @option [Array<String>, String, nil] :nameservers
1126
+ # Optional DNS nameserver(s) to query.
1127
+ #
1128
+ # @option [String, nil] :nameserver
1129
+ # Optional DNS nameserver to query.
1130
+ #
1131
+ # @return [Array<String>]
1132
+ # The host names of the mailservers serving the given host name.
1133
+ #
1134
+ # @see DNS::Resolver#get_mailservers
1135
+ #
1136
+ def get_mailservers(**kwargs)
1137
+ DNS.resolver(**kwargs).get_mailservers(@name)
1138
+ end
1139
+
1140
+ #
1141
+ # The mailservers for the host.
1142
+ #
1143
+ # @return [Array<String>]
1144
+ # The mailserver host names for the host.
1145
+ #
1146
+ # @note This method returns memoized data.
1147
+ #
1148
+ # @see #get_mailservers
1149
+ #
1150
+ def mailservers
1151
+ @mailservers ||= get_mailservers
1152
+ end
1153
+
1154
+ #
1155
+ # Determines if the hostname has any associated mailservers?
1156
+ #
1157
+ # @return [Boolean]
1158
+ #
1159
+ def has_mailservers?
1160
+ !mailservers.empty?
1161
+ end
1162
+
1163
+ #
1164
+ # Queries all `NS` DNS records belonging to the host name.
1165
+ #
1166
+ # @param [String, nil] name
1167
+ # The optional record name to query.
1168
+ #
1169
+ # @param [Hash{Symbol => Object}] kwargs
1170
+ # Additional keyword arguments.
1171
+ #
1172
+ # @option [Array<String>, String, nil] :nameservers
1173
+ # Optional DNS nameserver(s) to query.
1174
+ #
1175
+ # @option [String, nil] :nameserver
1176
+ # Optional DNS nameserver to query.
1177
+ #
1178
+ # @return [Array<Resolv::DNS::Resource::NS>]
1179
+ # All `NS` DNS records belonging to the host name.
1180
+ #
1181
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/NS
1182
+ # @see DNS::Resolver#get_ns_records
1183
+ #
1184
+ def get_ns_records(name=nil,**kwargs)
1185
+ name = if name then "#{name}.#{@name}"
1186
+ else @name
1187
+ end
1188
+
1189
+ DNS.resolver(**kwargs).get_ns_records(name)
1190
+ end
1191
+
1192
+ #
1193
+ # Queries the nameservers for the host name.
1194
+ #
1195
+ # @param [Hash{Symbol => Object}] kwargs
1196
+ # Additional keyword arguments.
1197
+ #
1198
+ # @option [Array<String>, String, nil] :nameservers
1199
+ # Optional DNS nameserver(s) to query.
1200
+ #
1201
+ # @option [String, nil] :nameserver
1202
+ # Optional DNS nameserver to query.
1203
+ #
1204
+ # @return [Array<String>]
1205
+ # The host names of the nameservers serving the given host name.
1206
+ #
1207
+ # @see DNS::Resolver#get_nameservers
1208
+ #
1209
+ def get_nameservers(**kwargs)
1210
+ DNS.resolver(**kwargs).get_nameservers(@name)
1211
+ end
1212
+
1213
+ #
1214
+ # The nameservers for the host.
1215
+ #
1216
+ # @return [Array<String>]
1217
+ # The nameserver IP addresses for the host.
1218
+ #
1219
+ # @note This method returns memoized data.
1220
+ #
1221
+ # @see #get_nameservers
1222
+ #
1223
+ def nameservers
1224
+ @nameservers ||= get_nameservers
1225
+ end
1226
+
1227
+ #
1228
+ # Determines if the hostname has any associated nameservers?
1229
+ #
1230
+ # @return [Boolean]
1231
+ #
1232
+ def has_nameservers?
1233
+ !nameservers.empty?
1234
+ end
1235
+
1236
+ #
1237
+ # Queries the first `SOA` DNS record belonging to the host name.
1238
+ #
1239
+ # @param [String, nil] name
1240
+ # The optional record name to query.
1241
+ #
1242
+ # @param [Hash{Symbol => Object}] kwargs
1243
+ # Additional keyword arguments.
1244
+ #
1245
+ # @option [Array<String>, String, nil] :nameservers
1246
+ # Optional DNS nameserver(s) to query.
1247
+ #
1248
+ # @option [String, nil] :nameserver
1249
+ # Optional DNS nameserver to query.
1250
+ #
1251
+ # @return [Resolv::DNS::Resource::SOA, nil]
1252
+ # The first `SOA` DNS record for the host name or `nil` if the host
1253
+ # name has no `SOA` records.
1254
+ #
1255
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/SOA
1256
+ # @see DNS::Resolver#get_soa_record
1257
+ #
1258
+ def get_soa_record(name=nil,**kwargs)
1259
+ name = if name then "#{name}.#{@name}"
1260
+ else @name
1261
+ end
1262
+
1263
+ DNS.resolver(**kwargs).get_soa_record(name)
1264
+ end
1265
+
1266
+ #
1267
+ # The `SOA` record for the host.
1268
+ #
1269
+ # @return [Resolv::DNS::Resource::SOA, nil]
1270
+ # The first `SOA` DNS record for the host name or `nil` if the host
1271
+ # name has no `SOA` records.
1272
+ #
1273
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/SOA
1274
+ # @see #get_soa_record
1275
+ #
1276
+ # @note This method returns memoized data.
1277
+ #
1278
+ def soa_record
1279
+ @soa_record ||= get_soa_record
1280
+ end
1281
+
1282
+ #
1283
+ # Queiries the first `TXT` DNS record belonging to the host name.
1284
+ #
1285
+ # @param [String, nil] name
1286
+ # The optional record name to query.
1287
+ #
1288
+ # @param [Hash{Symbol => Object}] kwargs
1289
+ # Additional keyword arguments.
1290
+ #
1291
+ # @option [Array<String>, String, nil] :nameservers
1292
+ # Optional DNS nameserver(s) to query.
1293
+ #
1294
+ # @option [String, nil] :nameserver
1295
+ # Optional DNS nameserver to query.
1296
+ #
1297
+ # @return [Resolv::DNS::Resource::TXT, nil]
1298
+ # The first `TXT` DNS record for the host name or `nil` if the host
1299
+ # name has no `TXT` records.
1300
+ #
1301
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/TXT
1302
+ # @see DNS::Resolver#get_txt_record
1303
+ #
1304
+ def get_txt_record(name=nil,**kwargs)
1305
+ name = if name then "#{name}.#{@name}"
1306
+ else @name
1307
+ end
1308
+
1309
+ DNS.resolver(**kwargs).get_txt_record(name)
1310
+ end
1311
+
1312
+ #
1313
+ # Queries the first `TXT` string belonging to the host name.
1314
+ #
1315
+ # @param [String, nil] name
1316
+ # The optional record name to query.
1317
+ #
1318
+ # @param [Hash{Symbol => Object}] kwargs
1319
+ # Additional keyword arguments.
1320
+ #
1321
+ # @option [Array<String>, String, nil] :nameservers
1322
+ # Optional DNS nameserver(s) to query.
1323
+ #
1324
+ # @option [String, nil] :nameserver
1325
+ # Optional DNS nameserver to query.
1326
+ #
1327
+ # @return [String, nil]
1328
+ # The first `TXT` string belonging to the host name or `nil` if the
1329
+ # host name has no `TXT` records.
1330
+ #
1331
+ # @see DNS::Resolver#get_txt_string
1332
+ #
1333
+ def get_txt_string(name=nil,**kwargs)
1334
+ name = if name then "#{name}.#{@name}"
1335
+ else @name
1336
+ end
1337
+
1338
+ DNS.resolver(**kwargs).get_txt_string(name)
1339
+ end
1340
+
1341
+ #
1342
+ # Queries all `TXT` DNS records belonging to the host name.
1343
+ #
1344
+ # @param [String, nil] name
1345
+ # The optional record name to query.
1346
+ #
1347
+ # @param [Hash{Symbol => Object}] kwargs
1348
+ # Additional keyword arguments.
1349
+ #
1350
+ # @option [Array<String>, String, nil] :nameservers
1351
+ # Optional DNS nameserver(s) to query.
1352
+ #
1353
+ # @option [String, nil] :nameserver
1354
+ # Optional DNS nameserver to query.
1355
+ #
1356
+ # @return [Array<Resolv::DNS::Resource::TXT>]
1357
+ # All of the `TXT` DNS records belonging to the host name.
1358
+ #
1359
+ # @see https://rubydoc.info/stdlib/resolv/Resolv/DNS/Resource/TXT
1360
+ # @see DNS::Resolver#get_txt_records
1361
+ #
1362
+ def get_txt_records(name=nil,**kwargs)
1363
+ name = if name then "#{name}.#{@name}"
1364
+ else @name
1365
+ end
1366
+
1367
+ DNS.resolver(**kwargs).get_txt_records(name)
1368
+ end
1369
+
1370
+ #
1371
+ # Queries all of the `TXT` string values of the host name.
1372
+ #
1373
+ # @param [String, nil] name
1374
+ # The optional record name to query.
1375
+ #
1376
+ # @param [Hash{Symbol => Object}] kwargs
1377
+ # Additional keyword arguments.
1378
+ #
1379
+ # @option [Array<String>, String, nil] :nameservers
1380
+ # Optional DNS nameserver(s) to query.
1381
+ #
1382
+ # @option [String, nil] :nameserver
1383
+ # Optional DNS nameserver to query.
1384
+ #
1385
+ # @return [Array<String>]
1386
+ # All `TXT` string values belonging of the host name.
1387
+ #
1388
+ # @see DNS::Resolver#get_txt_strings
1389
+ #
1390
+ def get_txt_strings(name=nil,**kwargs)
1391
+ name = if name then "#{name}.#{@name}"
1392
+ else @name
1393
+ end
1394
+
1395
+ DNS.resolver(**kwargs).get_txt_strings(name)
1396
+ end
1397
+
1398
+ #
1399
+ # The `TXT` strings for the host.
1400
+ #
1401
+ # @return [Array<String>]
1402
+ # All `TXT` string values belonging of the host name.
1403
+ #
1404
+ # @note This method returns memoized data.
1405
+ #
1406
+ # @see #get_txt_strings
1407
+ #
1408
+ def txt_strings
1409
+ @txt_strings ||= get_txt_strings
1410
+ end
1411
+
1412
+ #
1413
+ # Determines if the host name is registered.
1414
+ #
1415
+ # @return [Boolean]
1416
+ #
1417
+ # @note This method will query `8.8.8.8` which supports `ANY` queries.
1418
+ #
1419
+ def registered?
1420
+ !get_any_records(nameserver: '8.8.8.8').empty?
1421
+ end
1422
+
1423
+ #
1424
+ # Determines if the host name is not registered.
1425
+ #
1426
+ # @return [Boolean]
1427
+ #
1428
+ # @see #registered?
1429
+ #
1430
+ def unregistered?
1431
+ !registered?
1432
+ end
1433
+
1434
+ #
1435
+ # Converts the host to a String.
1436
+ #
1437
+ # @return [String]
1438
+ # The host's hostname.
1439
+ #
1440
+ # @example
1441
+ # host = Host.new('www.example.com')
1442
+ # host.to_s
1443
+ # # => "www.example.com"
1444
+ #
1445
+ def to_s
1446
+ @name.to_s
1447
+ end
1448
+
1449
+ #
1450
+ # Converts the host to a String.
1451
+ #
1452
+ # @return [String]
1453
+ #
1454
+ def to_str
1455
+ @name.to_str
1456
+ end
1457
+
1458
+ #
1459
+ # Inspects the host.
1460
+ #
1461
+ # @return [String]
1462
+ # The inspected host object.
1463
+ #
1464
+ def inspect
1465
+ "#<#{self.class}: #{@name}>"
1466
+ end
1467
+
1468
+ end
1469
+ end
1470
+ end
1471
+ end
1472
+
1473
+ require 'ronin/support/network/domain'