ronin-support 0.5.1 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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'