whois-parser-next 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +80 -0
  3. data/CODE_OF_CONDUCT.md +30 -0
  4. data/CONTRIBUTING.md +80 -0
  5. data/GOVERNANCE.md +59 -0
  6. data/LICENSE.txt +22 -0
  7. data/MAINTAINERS.md +44 -0
  8. data/README.md +123 -0
  9. data/RELEASING.md +43 -0
  10. data/ROADMAP.md +59 -0
  11. data/SECURITY.md +41 -0
  12. data/lib/whois/parser/contact.rb +56 -0
  13. data/lib/whois/parser/errors.rb +46 -0
  14. data/lib/whois/parser/nameserver.rb +39 -0
  15. data/lib/whois/parser/registrar.rb +25 -0
  16. data/lib/whois/parser/super_struct.rb +50 -0
  17. data/lib/whois/parser/version.rb +6 -0
  18. data/lib/whois/parser.rb +447 -0
  19. data/lib/whois/parser_extensions/whois.rb +83 -0
  20. data/lib/whois/parser_extensions/whois_parser.rb +24 -0
  21. data/lib/whois/parser_extensions/whois_record.rb +236 -0
  22. data/lib/whois/parser_extensions.rb +3 -0
  23. data/lib/whois/parsers/base.rb +413 -0
  24. data/lib/whois/parsers/base_afilias.rb +144 -0
  25. data/lib/whois/parsers/base_afilias2.rb +145 -0
  26. data/lib/whois/parsers/base_cocca.rb +97 -0
  27. data/lib/whois/parsers/base_cocca2.rb +93 -0
  28. data/lib/whois/parsers/base_icann_compliant.rb +158 -0
  29. data/lib/whois/parsers/base_icb.rb +51 -0
  30. data/lib/whois/parsers/base_iisse.rb +113 -0
  31. data/lib/whois/parsers/base_nic_fr.rb +175 -0
  32. data/lib/whois/parsers/base_shared1.rb +112 -0
  33. data/lib/whois/parsers/base_shared2.rb +130 -0
  34. data/lib/whois/parsers/base_shared3.rb +131 -0
  35. data/lib/whois/parsers/base_unsupported_registry.rb +30 -0
  36. data/lib/whois/parsers/base_verisign.rb +106 -0
  37. data/lib/whois/parsers/base_whoisd.rb +150 -0
  38. data/lib/whois/parsers/blank.rb +35 -0
  39. data/lib/whois/parsers/capetown-whois.registry.net.za.rb +25 -0
  40. data/lib/whois/parsers/ccwhois.ksregistry.net.rb +25 -0
  41. data/lib/whois/parsers/ccwhois.verisign-grs.com.rb +25 -0
  42. data/lib/whois/parsers/coza-whois.registry.net.za.rb +25 -0
  43. data/lib/whois/parsers/durban-whois.registry.net.za.rb +25 -0
  44. data/lib/whois/parsers/example.rb +163 -0
  45. data/lib/whois/parsers/joburg-whois.registry.net.za.rb +25 -0
  46. data/lib/whois/parsers/kero.yachay.pe.rb +97 -0
  47. data/lib/whois/parsers/org-whois.registry.net.za.rb +25 -0
  48. data/lib/whois/parsers/registry_response_safety.rb +29 -0
  49. data/lib/whois/parsers/tvwhois.verisign-grs.com.rb +25 -0
  50. data/lib/whois/parsers/vunic.vu.rb +11 -0
  51. data/lib/whois/parsers/whois.1und1.info.rb +28 -0
  52. data/lib/whois/parsers/whois.35.com.rb +23 -0
  53. data/lib/whois/parsers/whois.aeda.net.ae.rb +65 -0
  54. data/lib/whois/parsers/whois.aero.rb +58 -0
  55. data/lib/whois/parsers/whois.afilias-grs.info.rb +33 -0
  56. data/lib/whois/parsers/whois.afilias-srs.net.rb +16 -0
  57. data/lib/whois/parsers/whois.afilias.net.rb +41 -0
  58. data/lib/whois/parsers/whois.amnic.net.rb +81 -0
  59. data/lib/whois/parsers/whois.ascio.com.rb +29 -0
  60. data/lib/whois/parsers/whois.ati.tn.rb +120 -0
  61. data/lib/whois/parsers/whois.auda.org.au.rb +12 -0
  62. data/lib/whois/parsers/whois.audns.net.au.rb +118 -0
  63. data/lib/whois/parsers/whois.ax.rb +64 -0
  64. data/lib/whois/parsers/whois.biz.rb +34 -0
  65. data/lib/whois/parsers/whois.bnnic.bn.rb +77 -0
  66. data/lib/whois/parsers/whois.cat.rb +75 -0
  67. data/lib/whois/parsers/whois.cctld.by.rb +98 -0
  68. data/lib/whois/parsers/whois.cctld.uz.rb +83 -0
  69. data/lib/whois/parsers/whois.cdmon.com.rb +23 -0
  70. data/lib/whois/parsers/whois.centralnic.com.rb +144 -0
  71. data/lib/whois/parsers/whois.cira.ca.rb +227 -0
  72. data/lib/whois/parsers/whois.cmc.iq.rb +25 -0
  73. data/lib/whois/parsers/whois.cnnic.cn.rb +108 -0
  74. data/lib/whois/parsers/whois.co.ca.rb +74 -0
  75. data/lib/whois/parsers/whois.co.pl.rb +82 -0
  76. data/lib/whois/parsers/whois.co.ug.rb +93 -0
  77. data/lib/whois/parsers/whois.comlaude.com.rb +113 -0
  78. data/lib/whois/parsers/whois.corporatedomains.com.rb +28 -0
  79. data/lib/whois/parsers/whois.denic.de.rb +164 -0
  80. data/lib/whois/parsers/whois.dk-hostmaster.dk.rb +88 -0
  81. data/lib/whois/parsers/whois.dns.be.rb +120 -0
  82. data/lib/whois/parsers/whois.dns.hr.rb +119 -0
  83. data/lib/whois/parsers/whois.dns.lu.rb +125 -0
  84. data/lib/whois/parsers/whois.dns.pl.rb +151 -0
  85. data/lib/whois/parsers/whois.dns.pt.rb +92 -0
  86. data/lib/whois/parsers/whois.domain-registry.nl.rb +133 -0
  87. data/lib/whois/parsers/whois.domainregistry.ie.rb +128 -0
  88. data/lib/whois/parsers/whois.domreg.lt.rb +68 -0
  89. data/lib/whois/parsers/whois.donuts.co.rb +59 -0
  90. data/lib/whois/parsers/whois.dot.cf.rb +71 -0
  91. data/lib/whois/parsers/whois.dot.tk.rb +70 -0
  92. data/lib/whois/parsers/whois.dotgov.gov.rb +58 -0
  93. data/lib/whois/parsers/whois.dotmobiregistry.net.rb +21 -0
  94. data/lib/whois/parsers/whois.dotpostregistry.net.rb +25 -0
  95. data/lib/whois/parsers/whois.dreamhost.com.rb +23 -0
  96. data/lib/whois/parsers/whois.educause.edu.rb +198 -0
  97. data/lib/whois/parsers/whois.eenet.ee.rb +72 -0
  98. data/lib/whois/parsers/whois.enom.com.rb +34 -0
  99. data/lib/whois/parsers/whois.eu.org.rb +58 -0
  100. data/lib/whois/parsers/whois.eu.rb +130 -0
  101. data/lib/whois/parsers/whois.fi.rb +119 -0
  102. data/lib/whois/parsers/whois.gandi.net.rb +36 -0
  103. data/lib/whois/parsers/whois.gg.rb +93 -0
  104. data/lib/whois/parsers/whois.godaddy.com.rb +42 -0
  105. data/lib/whois/parsers/whois.gov.za.rb +60 -0
  106. data/lib/whois/parsers/whois.hkirc.hk.rb +71 -0
  107. data/lib/whois/parsers/whois.iana.org.rb +102 -0
  108. data/lib/whois/parsers/whois.id.rb +26 -0
  109. data/lib/whois/parsers/whois.iedr.ie.rb +18 -0
  110. data/lib/whois/parsers/whois.iis.nu.rb +46 -0
  111. data/lib/whois/parsers/whois.iis.se.rb +26 -0
  112. data/lib/whois/parsers/whois.in.ua.rb +75 -0
  113. data/lib/whois/parsers/whois.inregistry.net.rb +27 -0
  114. data/lib/whois/parsers/whois.isnic.is.rb +70 -0
  115. data/lib/whois/parsers/whois.isoc.org.il.rb +75 -0
  116. data/lib/whois/parsers/whois.ja.net.rb +75 -0
  117. data/lib/whois/parsers/whois.je.rb +75 -0
  118. data/lib/whois/parsers/whois.jprs.jp.rb +103 -0
  119. data/lib/whois/parsers/whois.kenic.or.ke.rb +93 -0
  120. data/lib/whois/parsers/whois.kg.rb +77 -0
  121. data/lib/whois/parsers/whois.kr.rb +79 -0
  122. data/lib/whois/parsers/whois.markmonitor.com.rb +36 -0
  123. data/lib/whois/parsers/whois.marnet.mk.rb +20 -0
  124. data/lib/whois/parsers/whois.monic.mo.rb +83 -0
  125. data/lib/whois/parsers/whois.museum.rb +79 -0
  126. data/lib/whois/parsers/whois.mx.rb +16 -0
  127. data/lib/whois/parsers/whois.mynic.my.rb +86 -0
  128. data/lib/whois/parsers/whois.na-nic.com.na.rb +21 -0
  129. data/lib/whois/parsers/whois.nc.rb +122 -0
  130. data/lib/whois/parsers/whois.netcom.cm.rb +54 -0
  131. data/lib/whois/parsers/whois.networksolutions.com.rb +37 -0
  132. data/lib/whois/parsers/whois.nic.ac.rb +33 -0
  133. data/lib/whois/parsers/whois.nic.af.rb +32 -0
  134. data/lib/whois/parsers/whois.nic.ag.rb +33 -0
  135. data/lib/whois/parsers/whois.nic.ai.rb +62 -0
  136. data/lib/whois/parsers/whois.nic.ar.rb +54 -0
  137. data/lib/whois/parsers/whois.nic.art.rb +9 -0
  138. data/lib/whois/parsers/whois.nic.as.rb +73 -0
  139. data/lib/whois/parsers/whois.nic.asia.rb +112 -0
  140. data/lib/whois/parsers/whois.nic.at.rb +68 -0
  141. data/lib/whois/parsers/whois.nic.best.rb +9 -0
  142. data/lib/whois/parsers/whois.nic.bj.rb +127 -0
  143. data/lib/whois/parsers/whois.nic.bo.rb +82 -0
  144. data/lib/whois/parsers/whois.nic.business.rb +8 -0
  145. data/lib/whois/parsers/whois.nic.cat.rb +23 -0
  146. data/lib/whois/parsers/whois.nic.cd.rb +38 -0
  147. data/lib/whois/parsers/whois.nic.cfd.rb +9 -0
  148. data/lib/whois/parsers/whois.nic.ch.rb +109 -0
  149. data/lib/whois/parsers/whois.nic.chat.rb +10 -0
  150. data/lib/whois/parsers/whois.nic.ci.rb +74 -0
  151. data/lib/whois/parsers/whois.nic.cl.rb +76 -0
  152. data/lib/whois/parsers/whois.nic.cloud.rb +15 -0
  153. data/lib/whois/parsers/whois.nic.club.rb +15 -0
  154. data/lib/whois/parsers/whois.nic.co.rb +25 -0
  155. data/lib/whois/parsers/whois.nic.college.rb +25 -0
  156. data/lib/whois/parsers/whois.nic.coop.rb +70 -0
  157. data/lib/whois/parsers/whois.nic.cr.rb +64 -0
  158. data/lib/whois/parsers/whois.nic.cx.rb +25 -0
  159. data/lib/whois/parsers/whois.nic.cz.rb +42 -0
  160. data/lib/whois/parsers/whois.nic.delivery.rb +9 -0
  161. data/lib/whois/parsers/whois.nic.design.rb +30 -0
  162. data/lib/whois/parsers/whois.nic.direct.rb +9 -0
  163. data/lib/whois/parsers/whois.nic.dm.rb +39 -0
  164. data/lib/whois/parsers/whois.nic.domains.rb +8 -0
  165. data/lib/whois/parsers/whois.nic.dz.rb +67 -0
  166. data/lib/whois/parsers/whois.nic.ec.rb +44 -0
  167. data/lib/whois/parsers/whois.nic.es.rb +114 -0
  168. data/lib/whois/parsers/whois.nic.fm.rb +18 -0
  169. data/lib/whois/parsers/whois.nic.fo.rb +69 -0
  170. data/lib/whois/parsers/whois.nic.fr.rb +25 -0
  171. data/lib/whois/parsers/whois.nic.fun.rb +13 -0
  172. data/lib/whois/parsers/whois.nic.games.rb +9 -0
  173. data/lib/whois/parsers/whois.nic.gd.rb +31 -0
  174. data/lib/whois/parsers/whois.nic.gl.rb +49 -0
  175. data/lib/whois/parsers/whois.nic.group.rb +8 -0
  176. data/lib/whois/parsers/whois.nic.gs.rb +31 -0
  177. data/lib/whois/parsers/whois.nic.hn.rb +49 -0
  178. data/lib/whois/parsers/whois.nic.host.rb +37 -0
  179. data/lib/whois/parsers/whois.nic.ht.rb +25 -0
  180. data/lib/whois/parsers/whois.nic.hu.rb +78 -0
  181. data/lib/whois/parsers/whois.nic.icu.rb +12 -0
  182. data/lib/whois/parsers/whois.nic.im.rb +66 -0
  183. data/lib/whois/parsers/whois.nic.ink.rb +12 -0
  184. data/lib/whois/parsers/whois.nic.io.rb +52 -0
  185. data/lib/whois/parsers/whois.nic.ir.rb +70 -0
  186. data/lib/whois/parsers/whois.nic.it.rb +159 -0
  187. data/lib/whois/parsers/whois.nic.jobs.rb +25 -0
  188. data/lib/whois/parsers/whois.nic.ki.rb +25 -0
  189. data/lib/whois/parsers/whois.nic.kz.rb +69 -0
  190. data/lib/whois/parsers/whois.nic.la.rb +32 -0
  191. data/lib/whois/parsers/whois.nic.li.rb +68 -0
  192. data/lib/whois/parsers/whois.nic.life.rb +10 -0
  193. data/lib/whois/parsers/whois.nic.link.rb +13 -0
  194. data/lib/whois/parsers/whois.nic.lk.rb +109 -0
  195. data/lib/whois/parsers/whois.nic.ltd.rb +8 -0
  196. data/lib/whois/parsers/whois.nic.lv.rb +69 -0
  197. data/lib/whois/parsers/whois.nic.ly.rb +78 -0
  198. data/lib/whois/parsers/whois.nic.market.rb +8 -0
  199. data/lib/whois/parsers/whois.nic.md.rb +101 -0
  200. data/lib/whois/parsers/whois.nic.me.rb +85 -0
  201. data/lib/whois/parsers/whois.nic.mg.rb +35 -0
  202. data/lib/whois/parsers/whois.nic.ms.rb +37 -0
  203. data/lib/whois/parsers/whois.nic.mu.rb +25 -0
  204. data/lib/whois/parsers/whois.nic.mw.rb +33 -0
  205. data/lib/whois/parsers/whois.nic.mx.rb +79 -0
  206. data/lib/whois/parsers/whois.nic.name.rb +68 -0
  207. data/lib/whois/parsers/whois.nic.net.bw.rb +11 -0
  208. data/lib/whois/parsers/whois.nic.net.ng.rb +27 -0
  209. data/lib/whois/parsers/whois.nic.net.sa.rb +74 -0
  210. data/lib/whois/parsers/whois.nic.net.sb.rb +35 -0
  211. data/lib/whois/parsers/whois.nic.news.rb +8 -0
  212. data/lib/whois/parsers/whois.nic.nf.rb +50 -0
  213. data/lib/whois/parsers/whois.nic.ninja.rb +8 -0
  214. data/lib/whois/parsers/whois.nic.one.rb +41 -0
  215. data/lib/whois/parsers/whois.nic.online.rb +39 -0
  216. data/lib/whois/parsers/whois.nic.org.uy.rb +75 -0
  217. data/lib/whois/parsers/whois.nic.plus.rb +8 -0
  218. data/lib/whois/parsers/whois.nic.pm.rb +25 -0
  219. data/lib/whois/parsers/whois.nic.pr.rb +84 -0
  220. data/lib/whois/parsers/whois.nic.priv.at.rb +62 -0
  221. data/lib/whois/parsers/whois.nic.pub.rb +8 -0
  222. data/lib/whois/parsers/whois.nic.pw.rb +25 -0
  223. data/lib/whois/parsers/whois.nic.re.rb +29 -0
  224. data/lib/whois/parsers/whois.nic.rocks.rb +8 -0
  225. data/lib/whois/parsers/whois.nic.run.rb +8 -0
  226. data/lib/whois/parsers/whois.nic.sh.rb +25 -0
  227. data/lib/whois/parsers/whois.nic.site.rb +62 -0
  228. data/lib/whois/parsers/whois.nic.sl.rb +80 -0
  229. data/lib/whois/parsers/whois.nic.sm.rb +84 -0
  230. data/lib/whois/parsers/whois.nic.sn.rb +119 -0
  231. data/lib/whois/parsers/whois.nic.so.rb +71 -0
  232. data/lib/whois/parsers/whois.nic.software.rb +9 -0
  233. data/lib/whois/parsers/whois.nic.solutions.rb +9 -0
  234. data/lib/whois/parsers/whois.nic.space.rb +25 -0
  235. data/lib/whois/parsers/whois.nic.st.rb +76 -0
  236. data/lib/whois/parsers/whois.nic.store.rb +15 -0
  237. data/lib/whois/parsers/whois.nic.studio.rb +8 -0
  238. data/lib/whois/parsers/whois.nic.systems.rb +8 -0
  239. data/lib/whois/parsers/whois.nic.tc.rb +25 -0
  240. data/lib/whois/parsers/whois.nic.tech.rb +33 -0
  241. data/lib/whois/parsers/whois.nic.technology.rb +8 -0
  242. data/lib/whois/parsers/whois.nic.tel.rb +25 -0
  243. data/lib/whois/parsers/whois.nic.tg.rb +49 -0
  244. data/lib/whois/parsers/whois.nic.tl.rb +32 -0
  245. data/lib/whois/parsers/whois.nic.tm.rb +101 -0
  246. data/lib/whois/parsers/whois.nic.today.rb +8 -0
  247. data/lib/whois/parsers/whois.nic.tools.rb +9 -0
  248. data/lib/whois/parsers/whois.nic.tr.rb +159 -0
  249. data/lib/whois/parsers/whois.nic.travel.rb +25 -0
  250. data/lib/whois/parsers/whois.nic.tv.rb +15 -0
  251. data/lib/whois/parsers/whois.nic.uk.rb +177 -0
  252. data/lib/whois/parsers/whois.nic.us.rb +25 -0
  253. data/lib/whois/parsers/whois.nic.ve.rb +94 -0
  254. data/lib/whois/parsers/whois.nic.vg.rb +16 -0
  255. data/lib/whois/parsers/whois.nic.video.rb +10 -0
  256. data/lib/whois/parsers/whois.nic.vip.rb +13 -0
  257. data/lib/whois/parsers/whois.nic.website.rb +9 -0
  258. data/lib/whois/parsers/whois.nic.wf.rb +29 -0
  259. data/lib/whois/parsers/whois.nic.win.rb +10 -0
  260. data/lib/whois/parsers/whois.nic.work.rb +10 -0
  261. data/lib/whois/parsers/whois.nic.works.rb +8 -0
  262. data/lib/whois/parsers/whois.nic.world.rb +10 -0
  263. data/lib/whois/parsers/whois.nic.xxx.rb +42 -0
  264. data/lib/whois/parsers/whois.nic.xyz.rb +25 -0
  265. data/lib/whois/parsers/whois.nixiregistry.in.rb +15 -0
  266. data/lib/whois/parsers/whois.norid.no.rb +61 -0
  267. data/lib/whois/parsers/whois.ovh.com.rb +12 -0
  268. data/lib/whois/parsers/whois.pairnic.com.rb +28 -0
  269. data/lib/whois/parsers/whois.pandi.or.id.rb +25 -0
  270. data/lib/whois/parsers/whois.pir.org.rb +90 -0
  271. data/lib/whois/parsers/whois.pnina.ps.rb +31 -0
  272. data/lib/whois/parsers/whois.register.bg.rb +86 -0
  273. data/lib/whois/parsers/whois.register.com.rb +30 -0
  274. data/lib/whois/parsers/whois.register.si.rb +73 -0
  275. data/lib/whois/parsers/whois.registre.ma.rb +65 -0
  276. data/lib/whois/parsers/whois.registro.br.rb +126 -0
  277. data/lib/whois/parsers/whois.registry.co.rb +19 -0
  278. data/lib/whois/parsers/whois.registry.gy.rb +32 -0
  279. data/lib/whois/parsers/whois.registry.hm.rb +72 -0
  280. data/lib/whois/parsers/whois.registry.om.rb +40 -0
  281. data/lib/whois/parsers/whois.registry.qa.rb +25 -0
  282. data/lib/whois/parsers/whois.ricta.org.rw.rb +16 -0
  283. data/lib/whois/parsers/whois.ripe.net.rb +68 -0
  284. data/lib/whois/parsers/whois.rnids.rs.rb +135 -0
  285. data/lib/whois/parsers/whois.rotld.ro.rb +65 -0
  286. data/lib/whois/parsers/whois.rrpproxy.net.rb +32 -0
  287. data/lib/whois/parsers/whois.safenames.net.rb +48 -0
  288. data/lib/whois/parsers/whois.schlund.info.rb +34 -0
  289. data/lib/whois/parsers/whois.sgnic.sg.rb +92 -0
  290. data/lib/whois/parsers/whois.sk-nic.sk.rb +111 -0
  291. data/lib/whois/parsers/whois.smallregistry.net.rb +131 -0
  292. data/lib/whois/parsers/whois.srs.net.nz.rb +177 -0
  293. data/lib/whois/parsers/whois.sx.rb +127 -0
  294. data/lib/whois/parsers/whois.tcinet.ru.rb +114 -0
  295. data/lib/whois/parsers/whois.thnic.co.th.rb +80 -0
  296. data/lib/whois/parsers/whois.tld.ee.rb +134 -0
  297. data/lib/whois/parsers/whois.tld.sy.rb +34 -0
  298. data/lib/whois/parsers/whois.tonic.to.rb +100 -0
  299. data/lib/whois/parsers/whois.tonicregistry.to.rb +12 -0
  300. data/lib/whois/parsers/whois.trabis.gov.tr.rb +58 -0
  301. data/lib/whois/parsers/whois.tucows.com.rb +28 -0
  302. data/lib/whois/parsers/whois.twnic.net.tw.rb +72 -0
  303. data/lib/whois/parsers/whois.tznic.or.tz.rb +36 -0
  304. data/lib/whois/parsers/whois.ua.rb +242 -0
  305. data/lib/whois/parsers/whois.udag.net.rb +28 -0
  306. data/lib/whois/parsers/whois.uniregistry.net.rb +71 -0
  307. data/lib/whois/parsers/whois.usp.ac.fj.rb +72 -0
  308. data/lib/whois/parsers/whois.verisign-grs.com.rb +49 -0
  309. data/lib/whois/parsers/whois.vunic.vu.rb +14 -0
  310. data/lib/whois/parsers/whois.website.ws.rb +79 -0
  311. data/lib/whois/parsers/whois.wildwestdomains.com.rb +37 -0
  312. data/lib/whois/parsers/whois.yoursrs.com.rb +125 -0
  313. data/lib/whois/parsers/whois.za.net.rb +72 -0
  314. data/lib/whois/parsers/whois.za.org.rb +72 -0
  315. data/lib/whois/parsers/whois.zicta.zm.rb +13 -0
  316. data/lib/whois/parsers/whois1.nic.bi.rb +25 -0
  317. data/lib/whois/parsers/za_central_registry.rb +80 -0
  318. data/lib/whois/parsers.rb +1 -0
  319. data/lib/whois/safe_record.rb +170 -0
  320. data/lib/whois/scanners/base.rb +114 -0
  321. data/lib/whois/scanners/base_afilias.rb +51 -0
  322. data/lib/whois/scanners/base_cocca2.rb +58 -0
  323. data/lib/whois/scanners/base_icann_compliant.rb +45 -0
  324. data/lib/whois/scanners/base_iisse.rb +36 -0
  325. data/lib/whois/scanners/base_shared1.rb +31 -0
  326. data/lib/whois/scanners/base_shared2.rb +35 -0
  327. data/lib/whois/scanners/base_shared3.rb +37 -0
  328. data/lib/whois/scanners/base_whoisd.rb +44 -0
  329. data/lib/whois/scanners/iana.rb +89 -0
  330. data/lib/whois/scanners/scannable.rb +65 -0
  331. data/lib/whois/scanners/verisign.rb +100 -0
  332. data/lib/whois/scanners/whois.ati.tn.rb +32 -0
  333. data/lib/whois/scanners/whois.audns.net.au.rb +32 -0
  334. data/lib/whois/scanners/whois.cctld.by.rb +35 -0
  335. data/lib/whois/scanners/whois.centralnic.com.rb +32 -0
  336. data/lib/whois/scanners/whois.cira.ca.rb +72 -0
  337. data/lib/whois/scanners/whois.cnnic.cn.rb +42 -0
  338. data/lib/whois/scanners/whois.denic.de.rb +103 -0
  339. data/lib/whois/scanners/whois.dns.hr.rb +30 -0
  340. data/lib/whois/scanners/whois.domainregistry.ie.rb +51 -0
  341. data/lib/whois/scanners/whois.fi.rb +66 -0
  342. data/lib/whois/scanners/whois.nc.rb +32 -0
  343. data/lib/whois/scanners/whois.nic.cz.rb +22 -0
  344. data/lib/whois/scanners/whois.nic.it.rb +92 -0
  345. data/lib/whois/scanners/whois.pir.org.rb +17 -0
  346. data/lib/whois/scanners/whois.rnids.rs.rb +52 -0
  347. data/lib/whois/scanners/whois.smallregistry.net.rb +50 -0
  348. data/lib/whois/scanners/whois.srs.net.nz.rb +23 -0
  349. data/lib/whois/scanners/whois.sx.rb +37 -0
  350. data/lib/whois/scanners/whois.tld.ee.rb +47 -0
  351. data/lib/whois/scanners/whois.tucows.com.rb +23 -0
  352. data/lib/whois/scanners/whois.yoursrs.com.rb +24 -0
  353. data/lib/whois-parser.rb +10 -0
  354. metadata +507 -0
@@ -0,0 +1,113 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require_relative 'base'
11
+ require 'whois/scanners/base_iisse'
12
+
13
+
14
+ module Whois
15
+ class Parsers
16
+
17
+ # Base parser for IIS.se servers.
18
+ #
19
+ # @abstract
20
+ class BaseIisse < Base
21
+ include Scanners::Scannable
22
+
23
+ self.scanner = Scanners::BaseIisse
24
+
25
+
26
+ property_supported :disclaimer do
27
+ node("field:disclaimer")
28
+ end
29
+
30
+
31
+ property_supported :domain do
32
+ node("domain")
33
+ end
34
+
35
+ property_not_supported :domain_id
36
+
37
+
38
+ property_supported :status do
39
+ if available?
40
+ :available
41
+ else
42
+ :registered
43
+ end
44
+ end
45
+
46
+ property_supported :available? do
47
+ !!node("status:available")
48
+ end
49
+
50
+ property_supported :registered? do
51
+ !available?
52
+ end
53
+
54
+
55
+ property_supported :created_on do
56
+ node("created") { |value| parse_time(value) }
57
+ end
58
+
59
+ property_supported :expires_on do
60
+ node("expires") { |value| parse_time(value) }
61
+ end
62
+
63
+ property_supported :updated_on do
64
+ node("modified") { |value| parse_time(value) }
65
+ end
66
+
67
+
68
+ property_supported :registrar do
69
+ node("registrar") { |name| Parser::Registrar.new(name: name) unless name == "-" }
70
+ end
71
+
72
+
73
+ property_supported :registrant_contacts do
74
+ build_contact(Parser::Contact::TYPE_REGISTRANT, node("holder"))
75
+ end
76
+
77
+ property_supported :admin_contacts do
78
+ build_contact(Parser::Contact::TYPE_ADMINISTRATIVE, node("admin-c"))
79
+ end
80
+
81
+ property_supported :technical_contacts do
82
+ build_contact(Parser::Contact::TYPE_TECHNICAL, node("tech-c"))
83
+ end
84
+
85
+
86
+ # nserver: ns2.loopia.se
87
+ # nserver: ns2.loopia.se 93.188.0.21
88
+ #
89
+ property_supported :nameservers do
90
+ node("nserver") do |values|
91
+ Array.wrap(values).map do |line|
92
+ name, ipv4 = line.split(/\s+/)
93
+ Parser::Nameserver.new(name: name, ipv4: ipv4)
94
+ end
95
+ end
96
+ end
97
+
98
+
99
+ private
100
+
101
+ def build_contact(type, id)
102
+ return if id.nil? || id == "-"
103
+
104
+ Parser::Contact.new(
105
+ type: type,
106
+ id: id
107
+ )
108
+ end
109
+
110
+ end
111
+
112
+ end
113
+ end
@@ -0,0 +1,175 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require_relative 'base'
11
+
12
+
13
+ module Whois
14
+ class Parsers
15
+
16
+ # Base parser for Nic.fr servers.
17
+ #
18
+ # @abstract
19
+ class BaseNicFr < Base
20
+
21
+ property_supported :status do
22
+ if available?
23
+ :available
24
+ elsif content_for_scanner =~ /status:\s+(.+)\n/i
25
+ case ::Regexp.last_match(1).downcase
26
+ when "active" then :registered
27
+ when "registered" then :registered
28
+ when "redemption" then :redemption
29
+ when "blocked" then :inactive
30
+ # The 'frozen' status seems to be a status
31
+ # where a registered domain is placed to prevent changes
32
+ # and/or when changes can't be made.
33
+ when "frozen" then :registered
34
+ # The 'not_open' status seems to indicate a domain
35
+ # that is already reserved and can't be registered directly.
36
+ # This is the case of second level names.
37
+ when "not_open" then :reserved
38
+ else
39
+ Whois::Parser.bug!(ParserError, "Unknown status `#{::Regexp.last_match(1)}'.")
40
+ end
41
+ else
42
+ :unknown
43
+ end
44
+ end
45
+
46
+ property_supported :available? do
47
+ !!(content_for_scanner =~ /No entries found in the AFNIC Database/)
48
+ end
49
+
50
+ property_supported :registered? do
51
+ ![:available, :unknown].include?(status)
52
+ end
53
+
54
+
55
+ property_supported :created_on do
56
+ if content_for_scanner =~ /created:\s+(.+)\n/
57
+ d, m, y = ::Regexp.last_match(1).split("/")
58
+ parse_time("#{y}-#{m}-#{d}")
59
+ end
60
+ end
61
+
62
+ property_supported :updated_on do
63
+ if content_for_scanner =~ /last-update:\s+(.+)\n/
64
+ d, m, y = ::Regexp.last_match(1).split("/")
65
+ parse_time("#{y}-#{m}-#{d}")
66
+ end
67
+ end
68
+
69
+ property_supported :expires_on do
70
+ if content_for_scanner =~ /Expiry Date:\s+(.+)\n/
71
+ d, m, y = ::Regexp.last_match(1).split("/")
72
+ parse_time("#{y}-#{m}-#{d}")
73
+ end
74
+ end
75
+
76
+ property_supported :registrant_contacts do
77
+ parse_contact("holder-c", Parser::Contact::TYPE_REGISTRANT)
78
+ end
79
+
80
+ property_supported :admin_contacts do
81
+ parse_contact("admin-c", Parser::Contact::TYPE_ADMINISTRATIVE)
82
+ end
83
+
84
+ property_supported :technical_contacts do
85
+ parse_contact("tech-c", Parser::Contact::TYPE_TECHNICAL)
86
+ end
87
+
88
+
89
+ property_supported :nameservers do
90
+ content_for_scanner.scan(/nserver:\s+(.+)\n/).flatten.map do |line|
91
+ if line =~ /(.+) \[(.+)\]/
92
+ name = ::Regexp.last_match(1)
93
+ ips = ::Regexp.last_match(2).split(/\s+/)
94
+ ipv4 = ips.find { |ip| Whois::Server.send(:valid_ipv4?, ip) }
95
+ ipv6 = ips.find { |ip| Whois::Server.send(:valid_ipv6?, ip) }
96
+ Parser::Nameserver.new(:name => name, :ipv4 => ipv4, :ipv6 => ipv6)
97
+ else
98
+ Parser::Nameserver.new(:name => line)
99
+ end
100
+ end
101
+ end
102
+
103
+ # Checks whether the response has been throttled.
104
+ #
105
+ # @return [Boolean]
106
+ def response_throttled?
107
+ !!(content_for_scanner =~ /^%% Too many requests\.{3}/)
108
+ end
109
+
110
+
111
+ MULTIVALUE_KEYS = %w[address]
112
+ private_constant :MULTIVALUE_KEYS
113
+
114
+ private
115
+
116
+ def parse_contact(element, type)
117
+ return unless content_for_scanner =~ /#{element}:\s+(.+)\n/
118
+
119
+ id = ::Regexp.last_match(1)
120
+ content_for_scanner.scan(/nic-hdl:\s+#{id}\n((.+\n)+)\n/).any? ||
121
+ Whois::Parser.bug!(ParserError, "Unable to parse contact block for nic-hdl: #{id}")
122
+ values = build_hash(::Regexp.last_match(1).scan(/(.+?):\s+(.+?)\n/))
123
+
124
+ if values["type"] == "ORGANIZATION"
125
+ name = nil
126
+ organization = values["contact"]
127
+ address = values["address"].join("\n")
128
+ else
129
+ name = values["contact"]
130
+ if values["address"].nil?
131
+ organization = nil
132
+ address = nil
133
+ elsif values["address"].size > 2
134
+ organization = values["address"][0]
135
+ address = values["address"][1..-1].join("\n")
136
+ else
137
+ organization = nil
138
+ address = values["address"].join("\n")
139
+ end
140
+ end
141
+
142
+ updated_on = values["changed"] ? Time.utc(*values["changed"].split(" ").first.split("/").reverse) : nil
143
+
144
+ Parser::Contact.new({
145
+ :type => type,
146
+ :id => id,
147
+ :name => name,
148
+ :organization => organization,
149
+ :address => address,
150
+ :country_code => values["country"],
151
+ :phone => values["phone"],
152
+ :fax => values["fax-no"],
153
+ :email => values["e-mail"],
154
+ :updated_on => updated_on,
155
+ })
156
+ end
157
+
158
+ def build_hash(tokens)
159
+ {}.tap do |hash|
160
+ tokens.each do |key, value|
161
+ if MULTIVALUE_KEYS.include?(key)
162
+ hash[key] ||= []
163
+ hash[key] << value
164
+ else
165
+ hash[key] = value
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+
172
+ end
173
+
174
+ end
175
+ end
@@ -0,0 +1,112 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require_relative 'base'
11
+ require_relative 'registry_response_safety'
12
+ require 'whois/scanners/base_shared1'
13
+
14
+
15
+ module Whois
16
+ class Parsers
17
+
18
+ # Shared parser 1.
19
+ #
20
+ # @abstract
21
+ class BaseShared1 < Base
22
+ include RegistryResponseSafety
23
+ include Scanners::Scannable
24
+
25
+ self.scanner = Scanners::BaseShared1
26
+
27
+
28
+ property_not_supported :disclaimer
29
+
30
+
31
+ property_supported :domain do
32
+ node('Domain Name')
33
+ end
34
+
35
+ property_not_supported :domain_id
36
+
37
+
38
+ property_supported :status do
39
+ if respond_to?(:reserved?) && reserved?
40
+ :reserved
41
+ else
42
+ Array.wrap(node("Status"))
43
+ end
44
+ end
45
+
46
+ property_supported :available? do
47
+ !(respond_to?(:reserved?) && reserved?) && !!node('status:available')
48
+ end
49
+
50
+ property_supported :registered? do
51
+ !(respond_to?(:reserved?) && reserved?) && !available? &&
52
+ [node("Status"), node("Registry Domain ID")].any? { |value| !Array.wrap(value).empty? } &&
53
+ !node('Domain Name').to_s.strip.empty?
54
+ end
55
+
56
+
57
+ property_not_supported :created_on
58
+
59
+ property_not_supported :updated_on
60
+
61
+ property_not_supported :expires_on
62
+
63
+
64
+ property_supported :registrar do
65
+ node('Registrar Name') do |name|
66
+ Parser::Registrar.new(
67
+ :id => node('Registrar ID'),
68
+ :name => node('Registrar Name'),
69
+ :organization => node('Registrar Name')
70
+ )
71
+ end
72
+ end
73
+
74
+
75
+ property_supported :registrant_contacts do
76
+ build_contact('Registrant', Parser::Contact::TYPE_REGISTRANT)
77
+ end
78
+
79
+ property_not_supported :admin_contacts
80
+
81
+ property_supported :technical_contacts do
82
+ build_contact('Tech', Parser::Contact::TYPE_TECHNICAL)
83
+ end
84
+
85
+
86
+ property_supported :nameservers do
87
+ node('Name Server') do |value|
88
+ ipv4s = node('Name Server IP') || Array.new(value.size)
89
+ value.zip(ipv4s).map do |name, ipv4|
90
+ Parser::Nameserver.new(:name => name, :ipv4 => ipv4)
91
+ end
92
+ end
93
+ end
94
+
95
+
96
+ private
97
+
98
+ def build_contact(element, type)
99
+ node("#{element} Contact ID") do
100
+ Parser::Contact.new(
101
+ :type => type,
102
+ :id => node("#{element} Contact ID"),
103
+ :name => node("#{element} Contact Name"),
104
+ :email => node("#{element} Contact Email")
105
+ )
106
+ end
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1,130 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require_relative 'base'
11
+ require_relative 'registry_response_safety'
12
+ require 'whois/scanners/base_shared2'
13
+
14
+
15
+ module Whois
16
+ class Parsers
17
+
18
+ # Shared parser 2.
19
+ #
20
+ # @abstract
21
+ class BaseShared2 < Base
22
+ include RegistryResponseSafety
23
+ include Scanners::Scannable
24
+
25
+ self.scanner = Scanners::BaseShared2
26
+
27
+
28
+ # Actually the :disclaimer is supported,
29
+ # but extracting it with the current scanner
30
+ # would require too much effort.
31
+ # property_supported :disclaimer
32
+
33
+
34
+ property_supported :domain do
35
+ node("Domain Name", &:downcase)
36
+ end
37
+
38
+ property_supported :domain_id do
39
+ node("Domain ID")
40
+ end
41
+
42
+
43
+ property_supported :status do
44
+ node("Domain Status") { |value| Array.wrap(value) }
45
+ end
46
+
47
+ property_supported :available? do
48
+ !!node("status:available")
49
+ end
50
+
51
+ property_supported :registered? do
52
+ !available? && !Array.wrap(node("Domain Status")).empty? &&
53
+ !node('Domain Name').to_s.strip.empty?
54
+ end
55
+
56
+
57
+ property_supported :created_on do
58
+ node("Domain Registration Date") { |value| parse_time(value) }
59
+ end
60
+
61
+ property_supported :updated_on do
62
+ node("Domain Last Updated Date") { |value| parse_time(value) }
63
+ end
64
+
65
+ property_supported :expires_on do
66
+ node("Domain Expiration Date") { |value| parse_time(value) }
67
+ end
68
+
69
+
70
+ property_supported :registrar do
71
+ node("Sponsoring Registrar") do |str|
72
+ Parser::Registrar.new(
73
+ :id => node("Sponsoring Registrar IANA ID"),
74
+ :name => node("Sponsoring Registrar")
75
+ )
76
+ end
77
+ end
78
+
79
+
80
+ property_supported :registrant_contacts do
81
+ build_contact("Registrant", Parser::Contact::TYPE_REGISTRANT)
82
+ end
83
+
84
+ property_supported :admin_contacts do
85
+ build_contact("Administrative Contact", Parser::Contact::TYPE_ADMINISTRATIVE)
86
+ end
87
+
88
+ property_supported :technical_contacts do
89
+ build_contact("Technical Contact", Parser::Contact::TYPE_TECHNICAL)
90
+ end
91
+
92
+
93
+ property_supported :nameservers do
94
+ Array.wrap(node("Name Server")).map do |name|
95
+ Parser::Nameserver.new(:name => name.downcase)
96
+ end
97
+ end
98
+
99
+
100
+ private
101
+
102
+ def build_contact(element, type)
103
+ node("#{element} ID") do |str|
104
+ address = (1..3)
105
+ .map { |i| node("#{element} Address#{i}") }
106
+ .delete_if(&:nil?)
107
+ .join("\n")
108
+
109
+ Parser::Contact.new(
110
+ :type => type,
111
+ :id => node("#{element} ID"),
112
+ :name => node("#{element} Name"),
113
+ :organization => node("#{element} Organization"),
114
+ :address => address,
115
+ :city => node("#{element} City"),
116
+ :zip => node("#{element} Postal Code"),
117
+ :state => node("#{element} State/Province"),
118
+ :country => node("#{element} Country"),
119
+ :country_code => node("#{element} Country Code"),
120
+ :phone => node("#{element} Phone Number"),
121
+ :fax => node("#{element} Facsimile Number"),
122
+ :email => node("#{element} Email")
123
+ )
124
+ end
125
+ end
126
+
127
+ end
128
+
129
+ end
130
+ end
@@ -0,0 +1,131 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require_relative 'base'
11
+ require_relative 'registry_response_safety'
12
+ require 'whois/scanners/base_shared3'
13
+
14
+
15
+ module Whois
16
+ class Parsers
17
+
18
+ # Shared parser 3.
19
+ #
20
+ # @abstract
21
+ class BaseShared3 < Base
22
+ include RegistryResponseSafety
23
+ include Scanners::Scannable
24
+
25
+ self.scanner = Scanners::BaseShared3
26
+
27
+
28
+ property_supported :disclaimer do
29
+ node("field:disclaimer")
30
+ end
31
+
32
+
33
+ property_supported :domain do
34
+ node("domain name", &:downcase)
35
+ end
36
+
37
+ property_not_supported :domain_id
38
+
39
+
40
+ property_supported :status do
41
+ if respond_to?(:reserved?) && reserved?
42
+ :reserved
43
+ elsif available?
44
+ :available
45
+ else
46
+ :registered
47
+ end
48
+ end
49
+
50
+ property_supported :available? do
51
+ !(respond_to?(:reserved?) && reserved?) && !!node("status:available")
52
+ end
53
+
54
+ property_supported :registered? do
55
+ !(respond_to?(:reserved?) && reserved?) && !available? &&
56
+ !node('domain name').to_s.strip.empty? &&
57
+ [node('created date'), node('updated date'), node('expiration date'), node('status')].any?(&:present?)
58
+ end
59
+
60
+
61
+ property_supported :created_on do
62
+ node("created date") { |value| parse_time(value) }
63
+ end
64
+
65
+ property_supported :updated_on do
66
+ node("updated date") { |value| parse_time(value) }
67
+ end
68
+
69
+ property_supported :expires_on do
70
+ node("expiration date") { |value| parse_time(value) }
71
+ end
72
+
73
+
74
+ property_supported :registrar do
75
+ node("registrar") do |raw|
76
+ Parser::Registrar.new(
77
+ :id => nil,
78
+ :name => node("registrar"),
79
+ :organization => nil,
80
+ :url => node("url")
81
+ )
82
+ end
83
+ end
84
+
85
+ property_supported :registrant_contacts do
86
+ build_contact("owner", Parser::Contact::TYPE_REGISTRANT)
87
+ end
88
+
89
+ property_supported :admin_contacts do
90
+ build_contact("admin", Parser::Contact::TYPE_ADMINISTRATIVE)
91
+ end
92
+
93
+ property_supported :technical_contacts do
94
+ build_contact("tech", Parser::Contact::TYPE_TECHNICAL)
95
+ end
96
+
97
+
98
+ property_supported :nameservers do
99
+ node("nameserver") do |array|
100
+ array.map do |name|
101
+ Parser::Nameserver.new(:name => name)
102
+ end
103
+ end
104
+ end
105
+
106
+
107
+ private
108
+
109
+ def build_contact(element, type)
110
+ node("#{element}-contact") do |raw|
111
+ Parser::Contact.new(
112
+ :type => type,
113
+ :id => node("#{element}-contact"),
114
+ :name => node("#{element}-name"),
115
+ :organization => node("#{element}-organization"),
116
+ :address => node("#{element}-street"),
117
+ :city => node("#{element}-city"),
118
+ :zip => node("#{element}-zip"),
119
+ :state => nil,
120
+ :country_code => node("#{element}-country"),
121
+ :phone => node("#{element}-phone"),
122
+ :fax => node("#{element}-fax"),
123
+ :email => node("#{element}-email")
124
+ )
125
+ end
126
+ end
127
+
128
+ end
129
+
130
+ end
131
+ end
@@ -0,0 +1,30 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ class Parsers
5
+
6
+ # Parser for a registry endpoint that is reachable but explicitly refuses
7
+ # the requested TLD. It must never infer either availability or a
8
+ # registration from that denial response.
9
+ class BaseUnsupportedRegistry < Base
10
+ property_supported :status do
11
+ :unknown
12
+ end
13
+
14
+ property_supported :available? do
15
+ false
16
+ end
17
+
18
+ property_supported :registered? do
19
+ false
20
+ end
21
+
22
+ def response_unavailable?
23
+ content_for_scanner.match?(
24
+ /^(?:TLD is not supported\.|No Data Found)\s*$/i
25
+ )
26
+ end
27
+ end
28
+
29
+ end
30
+ end