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,144 @@
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_afilias'
13
+
14
+
15
+ module Whois
16
+ class Parsers
17
+
18
+ # Base parser for Afilias servers.
19
+ #
20
+ # @abstract
21
+ class BaseAfilias < Base
22
+ include RegistryResponseSafety
23
+ include Scanners::Scannable
24
+
25
+ self.scanner = Scanners::BaseAfilias
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_supported :domain_id do
38
+ node("Domain ID")
39
+ end
40
+
41
+
42
+ property_supported :status do
43
+ Array.wrap(node("Status"))
44
+ end
45
+
46
+ property_supported :available? do
47
+ !!node("status:available")
48
+ end
49
+
50
+ property_supported :registered? do
51
+ !available? &&
52
+ (node("status:reserved") ||
53
+ (!node("Domain Name").to_s.strip.empty? &&
54
+ [node("Domain ID"), node("Registry Domain ID"), node("Status"), node("Domain Status")].any? { |value| !Array.wrap(value).empty? }))
55
+ end
56
+
57
+
58
+ property_supported :created_on do
59
+ node("Created On") do |value|
60
+ parse_time(value)
61
+ end
62
+ end
63
+
64
+ property_supported :updated_on do
65
+ node("Last Updated On") do |value|
66
+ parse_time(value)
67
+ end
68
+ end
69
+
70
+ property_supported :expires_on do
71
+ node("Expiration Date") do |value|
72
+ parse_time(value)
73
+ end
74
+ end
75
+
76
+
77
+ property_supported :registrar do
78
+ node("Sponsoring Registrar") do |value|
79
+ id, name = decompose_registrar(value) ||
80
+ Whois::Parser.bug!(ParserError, "Unknown registrar format `#{value}'")
81
+
82
+ Parser::Registrar.new(
83
+ id: id,
84
+ name: name
85
+ )
86
+ end
87
+ end
88
+
89
+ property_supported :registrant_contacts do
90
+ build_contact("Registrant", Parser::Contact::TYPE_REGISTRANT)
91
+ end
92
+
93
+ property_supported :admin_contacts do
94
+ build_contact("Admin", Parser::Contact::TYPE_ADMINISTRATIVE)
95
+ end
96
+
97
+ property_supported :technical_contacts do
98
+ build_contact("Tech", Parser::Contact::TYPE_TECHNICAL)
99
+ end
100
+
101
+
102
+ property_supported :nameservers do
103
+ Array.wrap(node("Name Server")).reject(&:empty?).map do |name|
104
+ Parser::Nameserver.new(:name => name.downcase)
105
+ end
106
+ end
107
+
108
+
109
+ private
110
+
111
+ def build_contact(element, type)
112
+ node("#{element} ID") do
113
+ address = ["", "1", "2", "3"]
114
+ .map { |i| node("#{element} Street#{i}") }
115
+ .delete_if { |i| i.nil? || i.empty? }
116
+ .join("\n")
117
+
118
+ Parser::Contact.new(
119
+ :type => type,
120
+ :id => node("#{element} ID"),
121
+ :name => node("#{element} Name"),
122
+ :organization => node("#{element} Organization"),
123
+ :address => address,
124
+ :city => node("#{element} City"),
125
+ :zip => node("#{element} Postal Code"),
126
+ :state => node("#{element} State/Province"),
127
+ :country_code => node("#{element} Country"),
128
+ :phone => node("#{element} Phone"),
129
+ :fax => node("#{element} FAX") || node("#{element} Fax"),
130
+ :email => node("#{element} Email")
131
+ )
132
+ end
133
+ end
134
+
135
+ def decompose_registrar(value)
136
+ if value =~ /(.+?) \((.+?)\)/
137
+ [::Regexp.last_match(2), ::Regexp.last_match(1)]
138
+ end
139
+ end
140
+
141
+ end
142
+
143
+ end
144
+ end
@@ -0,0 +1,145 @@
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_afilias'
13
+
14
+
15
+ module Whois
16
+ class Parsers
17
+
18
+ # Base parser for Afilias servers.
19
+ #
20
+ # @abstract
21
+ class BaseAfilias2 < Base
22
+ include RegistryResponseSafety
23
+ include Scanners::Scannable
24
+
25
+ self.scanner = Scanners::BaseAfilias
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_supported :domain_id do
38
+ node("Domain ID")
39
+ end
40
+
41
+
42
+ property_supported :status do
43
+ Array.wrap(node("Domain Status"))
44
+ end
45
+
46
+ property_supported :available? do
47
+ !!node("status:available")
48
+ end
49
+
50
+ property_supported :registered? do
51
+ !available? &&
52
+ (node("status:reserved") ||
53
+ (!node("Domain Name").to_s.strip.empty? &&
54
+ [node("Domain ID"), node("Registry Domain ID"), node("Domain Status")].any? { |value| !Array.wrap(value).empty? }))
55
+ end
56
+
57
+
58
+ property_supported :created_on do
59
+ node("Creation Date") do |value|
60
+ parse_time(value)
61
+ end
62
+ end
63
+
64
+ property_supported :updated_on do
65
+ node("Updated Date") do |value|
66
+ parse_time(value)
67
+ end
68
+ end
69
+
70
+ property_supported :expires_on do
71
+ node("Registry Expiry Date") do |value|
72
+ parse_time(value)
73
+ end
74
+ end
75
+
76
+
77
+ property_supported :registrar do
78
+ node("Sponsoring Registrar") do |value|
79
+ id, name = decompose_registrar(value)
80
+
81
+ Parser::Registrar.new({
82
+ id: id,
83
+ name: name,
84
+ })
85
+ end
86
+ end
87
+
88
+ property_supported :registrant_contacts do
89
+ build_contact("Registrant", Parser::Contact::TYPE_REGISTRANT)
90
+ end
91
+
92
+ property_supported :admin_contacts do
93
+ build_contact("Admin", Parser::Contact::TYPE_ADMINISTRATIVE)
94
+ end
95
+
96
+ property_supported :technical_contacts do
97
+ build_contact("Tech", Parser::Contact::TYPE_TECHNICAL)
98
+ end
99
+
100
+
101
+ property_supported :nameservers do
102
+ Array.wrap(node("Name Server")).reject(&:empty?).map do |name|
103
+ Parser::Nameserver.new(:name => name.downcase)
104
+ end
105
+ end
106
+
107
+
108
+ private
109
+
110
+ def build_contact(element, type)
111
+ node("#{element} ID") do
112
+ address = ["", "1", "2", "3"]
113
+ .map { |i| node("#{element} Street#{i}") }
114
+ .delete_if { |i| i.nil? || i.empty? }
115
+ .join("\n")
116
+
117
+ Parser::Contact.new(
118
+ :type => type,
119
+ :id => node("#{element} ID"),
120
+ :name => node("#{element} Name"),
121
+ :organization => node("#{element} Organization"),
122
+ :address => address,
123
+ :city => node("#{element} City"),
124
+ :zip => node("#{element} Postal Code"),
125
+ :state => node("#{element} State/Province"),
126
+ :country_code => node("#{element} Country"),
127
+ :phone => node("#{element} Phone"),
128
+ :fax => node("#{element} FAX") || node("#{element} Fax"),
129
+ :email => node("#{element} Email")
130
+ )
131
+ end
132
+ end
133
+
134
+ def decompose_registrar(value)
135
+ if value =~ /(.+?) \((.+?)\)/
136
+ [::Regexp.last_match(2), ::Regexp.last_match(1)]
137
+ else
138
+ [nil, value]
139
+ end
140
+ end
141
+
142
+ end
143
+
144
+ end
145
+ end
@@ -0,0 +1,97 @@
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 CoCCA servers.
17
+ #
18
+ # @abstract
19
+ class BaseCocca < Base
20
+
21
+ class_attribute :status_mapping
22
+
23
+ self.status_mapping = {
24
+ "active" => :registered,
25
+ "delegated" => :registered,
26
+ "not registered" => :available,
27
+ }
28
+
29
+
30
+ property_supported :domain do
31
+ content_for_scanner =~ /Query:\s+(.+?)\n/
32
+ ::Regexp.last_match(1) || Whois::Parser.bug!(ParserError, "Unable to parse domain.")
33
+ end
34
+
35
+ property_not_supported :domain_id
36
+
37
+
38
+ property_supported :status do
39
+ if content_for_scanner =~ /Status:\s+(.+?)\n/
40
+ status = ::Regexp.last_match(1).downcase
41
+ self.class.status_mapping[status] || Whois::Parser.bug!(ParserError, "Unknown status `#{status}'.")
42
+ else
43
+ Whois::Parser.bug!(ParserError, "Unable to parse status.")
44
+ end
45
+ end
46
+
47
+ property_supported :available? do
48
+ status == :available
49
+ end
50
+
51
+ property_supported :registered? do
52
+ !available?
53
+ end
54
+
55
+
56
+ property_supported :created_on do
57
+ if content_for_scanner =~ /Created:\s+(.+?)\n/
58
+ parse_time(::Regexp.last_match(1))
59
+ end
60
+ end
61
+
62
+ property_supported :updated_on do
63
+ if content_for_scanner =~ /Modified:\s+(.+?)\n/
64
+ parse_time(::Regexp.last_match(1))
65
+ end
66
+ end
67
+
68
+ property_supported :expires_on do
69
+ if content_for_scanner =~ /Expires:\s+(.+?)\n/
70
+ parse_time(::Regexp.last_match(1))
71
+ end
72
+ end
73
+
74
+
75
+ property_supported :registrar do
76
+ if content_for_scanner =~ /Registrar Name: (.+)\n/
77
+ Parser::Registrar.new(
78
+ name: ::Regexp.last_match(1),
79
+ organization: nil,
80
+ url: content_for_scanner.slice(/Registration URL: (.+)\n/, 1)
81
+ )
82
+ end
83
+ end
84
+
85
+
86
+ property_supported :nameservers do
87
+ if content_for_scanner =~ /Name Servers:\n((.+\n)+)\n/
88
+ ::Regexp.last_match(1).split("\n").map do |name|
89
+ Parser::Nameserver.new(:name => name.strip)
90
+ end
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ end
97
+ end
@@ -0,0 +1,93 @@
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_cocca2.rb'
12
+
13
+
14
+ module Whois
15
+ class Parsers
16
+
17
+ # Base parser for CoCCA servers.
18
+ #
19
+ # @abstract
20
+ class BaseCocca2 < Base
21
+ include Scanners::Scannable
22
+
23
+ self.scanner = Scanners::BaseCocca2
24
+
25
+
26
+ property_supported :domain do
27
+ node("Domain Name")
28
+ end
29
+
30
+ property_supported :domain_id do
31
+ node("Domain ID")
32
+ end
33
+
34
+
35
+ # TODO: /pending delete/ => :redemption
36
+ # TODO: /pending purge/ => :redemption
37
+ property_supported :status do
38
+ list = Array.wrap(node("Domain Status")).map(&:downcase)
39
+ case
40
+ when list.include?("no object found")
41
+ :available
42
+ when list.include?("ok")
43
+ :registered
44
+ when list.any? { |value| value.match?(/\Aactive(?:\s|\z)/) }
45
+ :registered
46
+ else
47
+ :unknown
48
+ end
49
+ end
50
+
51
+ property_supported :available? do
52
+ status == :available
53
+ end
54
+
55
+ property_supported :registered? do
56
+ status == :registered
57
+ end
58
+
59
+
60
+ property_supported :created_on do
61
+ node("Creation Date") { |value| parse_time(value) }
62
+ end
63
+
64
+ property_supported :updated_on do
65
+ node("Updated Date") { |value| parse_time(value) }
66
+ end
67
+
68
+ property_supported :expires_on do
69
+ node("Registry Expiry Date") { |value| parse_time(value) }
70
+ end
71
+
72
+
73
+ property_supported :registrar do
74
+ if node("Sponsoring Registrar")
75
+ Parser::Registrar.new(
76
+ id: node("Sponsoring Registrar IANA ID").presence,
77
+ name: node("Sponsoring Registrar"),
78
+ url: node("Sponsoring Registrar URL").presence
79
+ )
80
+ end
81
+ end
82
+
83
+
84
+ property_supported :nameservers do
85
+ Array.wrap(node("Name Server")).map do |name|
86
+ Parser::Nameserver.new(name: name)
87
+ end
88
+ end
89
+
90
+ end
91
+
92
+ end
93
+ end
@@ -0,0 +1,158 @@
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_icann_compliant'
13
+
14
+
15
+ module Whois
16
+ class Parsers
17
+
18
+ # Base parser for ICANN Compliant servers.
19
+ #
20
+ # @abstract
21
+ # @see http://www.icann.org/en/resources/registrars/raa/approved-with-specs-27jun13-en.htm#whois
22
+ class BaseIcannCompliant < Base
23
+ include RegistryResponseSafety
24
+ include Scanners::Scannable
25
+
26
+ self.scanner = Scanners::BaseIcannCompliant
27
+
28
+
29
+ property_supported :domain do
30
+ node("Domain Name", &:downcase)
31
+ end
32
+
33
+ property_supported :domain_id do
34
+ node("Registry Domain ID")
35
+ end
36
+
37
+
38
+ property_supported :status do
39
+ # status = Array.wrap(node('Domain Status'))
40
+ if respond_to?(:reserved?) && reserved?
41
+ :reserved
42
+ elsif available?
43
+ :available
44
+ elsif node('Domain Name').to_s.strip.empty? ||
45
+ [node('Registry Domain ID'), node('Creation Date'), node('Registrar')].all? { |value| value.to_s.strip.empty? }
46
+ :unknown
47
+ else
48
+ :registered
49
+ end
50
+ end
51
+
52
+ property_supported :available? do
53
+ !!node('status:available')
54
+ end
55
+
56
+ property_supported :registered? do
57
+ [:registered, :reserved].include?(status)
58
+ end
59
+
60
+
61
+ property_supported :created_on do
62
+ node("Creation Date") do |value|
63
+ parse_time(value)
64
+ end
65
+ end
66
+
67
+ property_supported :updated_on do
68
+ node("Updated Date") do |value|
69
+ parse_time(value)
70
+ end
71
+ end
72
+
73
+ property_supported :expires_on do
74
+ node("Registrar Registration Expiration Date") do |value|
75
+ parse_time(value)
76
+ end
77
+ end
78
+
79
+
80
+ property_supported :registrar do
81
+ return unless node("Registrar")
82
+
83
+ Parser::Registrar.new({
84
+ id: node("Registrar IANA ID"),
85
+ name: node("Registrar"),
86
+ organization: node("Registrar"),
87
+ url: node("Registrar URL"),
88
+ })
89
+ end
90
+
91
+
92
+ property_supported :registrant_contacts do
93
+ build_contact("Registrant", Parser::Contact::TYPE_REGISTRANT)
94
+ end
95
+
96
+ property_supported :admin_contacts do
97
+ build_contact("Admin", Parser::Contact::TYPE_ADMINISTRATIVE)
98
+ end
99
+
100
+ property_supported :technical_contacts do
101
+ build_contact("Tech", Parser::Contact::TYPE_TECHNICAL)
102
+ end
103
+
104
+
105
+ property_supported :nameservers do
106
+ Array.wrap(node("Name Server") || node("Name Servers")).reject(&:empty?).map do |name|
107
+ Parser::Nameserver.new(name: name.downcase)
108
+ end
109
+ end
110
+
111
+
112
+ protected
113
+
114
+ def build_contact(element, type)
115
+ node("#{element} Name") do
116
+ Parser::Contact.new(
117
+ type: type,
118
+ id: node("Registry #{element} ID").presence,
119
+ name: value_for_property(element, 'Name'),
120
+ organization: contact_organization_attribute(element),
121
+ address: contact_address_attribute(element),
122
+ city: value_for_property(element, 'City'),
123
+ zip: value_for_property(element, 'Postal Code'),
124
+ state: value_for_property(element, 'State/Province'),
125
+ country_code: value_for_property(element, 'Country'),
126
+ phone: value_for_phone_property(element, 'Phone'),
127
+ fax: value_for_phone_property(element, 'Fax'),
128
+ email: value_for_property(element, 'Email')
129
+ )
130
+ end
131
+ end
132
+
133
+ def contact_organization_attribute(element)
134
+ value_for_property(element, 'Organization')
135
+ end
136
+
137
+ def contact_address_attribute(element)
138
+ value_for_property(element, 'Street')
139
+ end
140
+
141
+
142
+ private
143
+
144
+ def value_for_phone_property(element, property)
145
+ [
146
+ value_for_property(element, "#{property}"),
147
+ value_for_property(element, "#{property} Ext"),
148
+ ].reject(&:empty?).join(' ext: ')
149
+ end
150
+
151
+ def value_for_property(element, property)
152
+ Array.wrap(node("#{element} #{property}")).reject(&:empty?).join(', ')
153
+ end
154
+
155
+ end
156
+
157
+ end
158
+ end
@@ -0,0 +1,51 @@
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_icann_compliant'
11
+
12
+
13
+ module Whois
14
+ class Parsers
15
+
16
+ class BaseIcb < BaseIcannCompliant
17
+
18
+ self.scanner = Scanners::BaseIcannCompliant, {
19
+ pattern_available: /^NOT FOUND/,
20
+ }
21
+
22
+
23
+ property_not_supported :disclaimer
24
+
25
+
26
+ property_supported :expires_on do
27
+ node("Registry Expiry Date") do |value|
28
+ parse_time(value)
29
+ end
30
+ end
31
+
32
+
33
+ property_supported :registrant_contacts do
34
+ node("Registrant Organization") do
35
+ Parser::Contact.new({
36
+ type: Parser::Contact::TYPE_REGISTRANT,
37
+ organization: node("Registrant Organization"),
38
+ state: node("Registrant State/Province"),
39
+ country_code: node("Registrant Country"),
40
+ })
41
+ end
42
+ end
43
+
44
+ property_not_supported :admin_contacts
45
+
46
+ property_not_supported :technical_contacts
47
+
48
+ end
49
+
50
+ end
51
+ end