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,125 @@
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/whois.yoursrs.com'
12
+
13
+
14
+ module Whois
15
+ class Parsers
16
+
17
+ # Parser for the whois.yoursrs.com server.
18
+ #
19
+ # @see Whois::Parsers::Example
20
+ # The Example parser for the list of all available methods.
21
+ #
22
+ class WhoisYoursrsCom < Base
23
+ include Scanners::Scannable
24
+
25
+ self.scanner = Scanners::WhoisYoursrsCom
26
+
27
+
28
+ property_supported :domain do
29
+ node("Domain Name", &:downcase)
30
+ end
31
+
32
+ property_not_supported :domain_id
33
+
34
+
35
+ property_supported :status do
36
+ Array.wrap(node("Status"))
37
+ end
38
+
39
+ property_supported :available? do
40
+ !!node("status:available")
41
+ end
42
+
43
+ property_supported :registered? do
44
+ !available?
45
+ end
46
+
47
+
48
+ property_supported :created_on do
49
+ node("Created On") do |value|
50
+ parse_time(value)
51
+ end
52
+ end
53
+
54
+ property_supported :updated_on do
55
+ node("Last Updated On") do |value|
56
+ parse_time(value)
57
+ end
58
+ end
59
+
60
+ property_supported :expires_on do
61
+ node("Expiration Date") do |value|
62
+ parse_time(value)
63
+ end
64
+ end
65
+
66
+
67
+ property_supported :registrar do
68
+ node("Sponsoring Registrar") do |value|
69
+ Parser::Registrar.new(
70
+ name: value
71
+ )
72
+ end
73
+ end
74
+
75
+
76
+ property_supported :registrant_contacts do
77
+ build_contact("Registrant", Parser::Contact::TYPE_REGISTRANT)
78
+ end
79
+
80
+ property_supported :admin_contacts do
81
+ build_contact("ADMIN", Parser::Contact::TYPE_ADMINISTRATIVE)
82
+ end
83
+
84
+ property_supported :technical_contacts do
85
+ build_contact("TECH", Parser::Contact::TYPE_TECHNICAL)
86
+ end
87
+
88
+
89
+ property_supported :nameservers do
90
+ Array.wrap(node("Name Server")).reject(&:empty?).map do |name|
91
+ Parser::Nameserver.new(name: name.downcase)
92
+ end
93
+ end
94
+
95
+
96
+ private
97
+
98
+ def build_contact(element, type)
99
+ node("#{element} ID") do
100
+ address = (1..3)
101
+ .map { |i| node("#{element} Street#{i}") }
102
+ .delete_if { |i| i.nil? || i.empty? }
103
+ .join("\n")
104
+
105
+ Parser::Contact.new(
106
+ type: type,
107
+ id: node("#{element} ID"),
108
+ name: node("#{element} Name"),
109
+ organization: node("#{element} Organization"),
110
+ address: address,
111
+ city: node("#{element} City"),
112
+ zip: node("#{element} Postal Code"),
113
+ state: node("#{element} State"),
114
+ country_code: node("#{element} Country"),
115
+ phone: node("#{element} Phone"),
116
+ fax: node("#{element} Fax"),
117
+ email: node("#{element} Email")
118
+ )
119
+ end
120
+ end
121
+
122
+ end
123
+
124
+ end
125
+ end
@@ -0,0 +1,72 @@
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
+ #
17
+ # = whois.za.net parser
18
+ #
19
+ # Parser for the whois.za.net server.
20
+ #
21
+ # NOTE: This parser is just a stub and provides only a few basic methods
22
+ # to check for domain availability and get domain status.
23
+ # Please consider to contribute implementing missing methods.
24
+ # See WhoisNicIt parser for an explanation of all available methods
25
+ # and examples.
26
+ #
27
+ class WhoisZaNet < Base
28
+
29
+ property_supported :status do
30
+ if available?
31
+ :available
32
+ else
33
+ :registered
34
+ end
35
+ end
36
+
37
+ property_supported :available? do
38
+ !!(content_for_scanner =~ /No such domain:/)
39
+ end
40
+
41
+ property_supported :registered? do
42
+ !available?
43
+ end
44
+
45
+
46
+ property_supported :created_on do
47
+ if content_for_scanner =~ /Record Created\s+:\s+(.*)\n/
48
+ parse_time(::Regexp.last_match(1))
49
+ end
50
+ end
51
+
52
+ property_supported :updated_on do
53
+ if content_for_scanner =~ /Record Last Updated\s+:\s+(.*)\n/
54
+ parse_time(::Regexp.last_match(1))
55
+ end
56
+ end
57
+
58
+ property_not_supported :expires_on
59
+
60
+
61
+ property_supported :nameservers do
62
+ if content_for_scanner =~ /Domain Name Servers listed in order:\n\n((.+\n)+)\n/
63
+ ::Regexp.last_match(1).split("\n").reject { |value| value.strip.empty? }.map do |name|
64
+ Parser::Nameserver.new(:name => name.strip)
65
+ end
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,72 @@
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
+ #
17
+ # = whois.za.org parser
18
+ #
19
+ # Parser for the whois.za.org server.
20
+ #
21
+ # NOTE: This parser is just a stub and provides only a few basic methods
22
+ # to check for domain availability and get domain status.
23
+ # Please consider to contribute implementing missing methods.
24
+ # See WhoisNicIt parser for an explanation of all available methods
25
+ # and examples.
26
+ #
27
+ class WhoisZaOrg < Base
28
+
29
+ property_supported :status do
30
+ if available?
31
+ :available
32
+ else
33
+ :registered
34
+ end
35
+ end
36
+
37
+ property_supported :available? do
38
+ !!(content_for_scanner =~ /No such domain:/)
39
+ end
40
+
41
+ property_supported :registered? do
42
+ !available?
43
+ end
44
+
45
+
46
+ property_supported :created_on do
47
+ if content_for_scanner =~ /Record Created\s+:\s+(.*)\n/
48
+ parse_time(::Regexp.last_match(1))
49
+ end
50
+ end
51
+
52
+ property_supported :updated_on do
53
+ if content_for_scanner =~ /Record Last Updated\s+:\s+(.*)\n/
54
+ parse_time(::Regexp.last_match(1))
55
+ end
56
+ end
57
+
58
+ property_not_supported :expires_on
59
+
60
+
61
+ property_supported :nameservers do
62
+ if content_for_scanner =~ /Domain Name Servers listed in order:\n\n((.+\n)+)\n/
63
+ ::Regexp.last_match(1).split("\n").reject { |value| value.strip.empty? }.map do |name|
64
+ Parser::Nameserver.new(:name => name.strip)
65
+ end
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'base_icann_compliant'
2
+
3
+ module Whois
4
+ class Parsers
5
+ # ZICTA's current endpoint uses ICANN key/value fields and the CoCCA-style
6
+ # no-object marker for an absent name.
7
+ class WhoisZictaZm < BaseIcannCompliant
8
+ self.scanner = Scanners::BaseIcannCompliant, {
9
+ pattern_available: /^The queried object does not exist: No Object Found\s*$/i,
10
+ }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
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_cocca2'
11
+
12
+
13
+ module Whois
14
+ class Parsers
15
+
16
+ # Parser for the whois1.nic.bi server.
17
+ #
18
+ # @see Whois::Parsers::Example
19
+ # The Example parser for the list of all available methods.
20
+ #
21
+ class Whois1NicBi < BaseCocca2
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,80 @@
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
+ # Parser for the ZA Central Registry servers.
17
+ #
18
+ class ZaCentralRegistry < BaseIcannCompliant
19
+
20
+ property_supported :domain_id do
21
+ node('Domain ID')
22
+ end
23
+
24
+ property_supported :expires_on do
25
+ node('Registry Expiry Date') do |value|
26
+ parse_time(value)
27
+ end
28
+ end
29
+
30
+ property_supported :registrar do
31
+ return unless node("Sponsoring Registrar")
32
+
33
+ Parser::Registrar.new(
34
+ id: node('Sponsoring Registrar IANA ID'),
35
+ name: node('Sponsoring Registrar'),
36
+ organization: node('Sponsoring Registrar')
37
+ )
38
+ end
39
+
40
+ property_supported :available? do
41
+ !node("Creation Date")
42
+ end
43
+
44
+ # Checks whether the response has been throttled.
45
+ #
46
+ # @return [Boolean]
47
+ #
48
+ # @example
49
+ # Please go away for 13 Seconds
50
+ #
51
+ def response_throttled?
52
+ !!(content_for_scanner =~ /Please go away for \d+ [Ss]econds/)
53
+ end
54
+
55
+
56
+ private
57
+
58
+ def build_contact(element, type)
59
+ node("#{element} Name") do
60
+ Parser::Contact.new(
61
+ type: type,
62
+ id: node("#{element} ID").presence,
63
+ name: value_for_property(element, 'Name'),
64
+ organization: value_for_property(element, 'Organization'),
65
+ address: value_for_property(element, 'Street'),
66
+ city: value_for_property(element, 'City'),
67
+ zip: value_for_property(element, 'Postal Code'),
68
+ state: value_for_property(element, 'State/Province'),
69
+ country_code: value_for_property(element, 'Country'),
70
+ phone: value_for_phone_property(element, 'Phone'),
71
+ fax: value_for_phone_property(element, 'Fax'),
72
+ email: value_for_property(element, 'Email')
73
+ )
74
+ end
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1 @@
1
+ require_relative 'parsers/base'
@@ -0,0 +1,170 @@
1
+ require_relative 'parser'
2
+
3
+ module Whois
4
+ class SafeRecord < BasicObject
5
+
6
+ # @api private
7
+ def self.define_property_method(method)
8
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
9
+ def #{method}(*args, &block)
10
+ if property_any_supported?(:#{method})
11
+ parser.#{method}(*args, &block)
12
+ end
13
+ end
14
+ RUBY
15
+ end
16
+
17
+ # @api private
18
+ def self.define_method_method(method)
19
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
20
+ def #{method}(*args, &block)
21
+ if parser.respond_to?(:#{method})
22
+ parser.#{method}(*args, &block)
23
+ end
24
+ end
25
+ RUBY
26
+ end
27
+
28
+ # @api private
29
+ def self.define_question_method(method)
30
+ return if method.to_s.end_with?("?")
31
+
32
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
33
+ def #{method}?
34
+ !#{method}.nil?
35
+ end
36
+ RUBY
37
+ end
38
+
39
+ Parser::PROPERTIES.each do |method|
40
+ define_property_method(method)
41
+ end
42
+
43
+ Parser::METHODS.each do |method|
44
+ define_method_method(method)
45
+ end
46
+
47
+ (Parser::PROPERTIES + Parser::METHODS).each do |method|
48
+ define_question_method(method)
49
+ end
50
+
51
+
52
+ attr_reader :record
53
+
54
+ def initialize(record)
55
+ @record = record
56
+ end
57
+
58
+ alias target record
59
+
60
+
61
+ # Checks if this class respond to given method.
62
+ #
63
+ # Overrides the default implementation to add support
64
+ # for {Whois::Parser::PROPERTIES} and {Whois::Parser::METHODS}.
65
+ #
66
+ # @return [Boolean]
67
+ #
68
+ def respond_to?(*args)
69
+ respond_to_parser_method?(args.first) || target.respond_to?(*args)
70
+ end
71
+
72
+
73
+ # Lazy-loads and returns the parser proxy for current record.
74
+ #
75
+ # @return [Whois::Parser]
76
+ def parser
77
+ @parser ||= Parser.new(record)
78
+ end
79
+
80
+ # Returns a Hash containing all supported properties for this record
81
+ # along with corresponding values.
82
+ #
83
+ # @return [{ Symbol => Object }]
84
+ def properties
85
+ hash = {}
86
+ Parser::PROPERTIES.each do |property|
87
+ hash[property] = __send__(property)
88
+ end
89
+ hash
90
+ end
91
+
92
+ # Shortcut for <tt>#registrant_contacts.first</tt>.
93
+ #
94
+ # @see Whois::Parser#registrant_contacts
95
+ #
96
+ # @return [Whois::Parser::Contact]
97
+ # If the property is supported and a contact exists.
98
+ # @return [nil]
99
+ # If the property is not supported or the contact doesn't exist.
100
+ def registrant_contact
101
+ if property_any_supported?(:registrant_contacts)
102
+ registrant_contacts.first
103
+ end
104
+ end
105
+
106
+ # Shortcut for <tt>#admin_contacts.first</tt>.
107
+ #
108
+ # @see Whois::Parser#admin_contacts
109
+ #
110
+ # @return [Whois::Parser::Contact]
111
+ # If the property is supported and a contact exists.
112
+ # @return [nil]
113
+ # If the property is not supported or the contact doesn't exist.
114
+ def admin_contact
115
+ if property_any_supported?(:admin_contacts)
116
+ admin_contacts.first
117
+ end
118
+ end
119
+
120
+ # Shortcut for <tt>#technical_contacts.first</tt>.
121
+ #
122
+ # @see Whois::Parser#technical_contacts
123
+ #
124
+ # @return [Whois::Parser::Contact]
125
+ # If the property is supported and a contact exists.
126
+ # @return [nil]
127
+ # If the property is not supported or the contact doesn't exist.
128
+ def technical_contact
129
+ if property_any_supported?(:technical_contacts)
130
+ technical_contacts.first
131
+ end
132
+ end
133
+
134
+ # Collects and returns all the contacts.
135
+ #
136
+ # @see Whois::Parser#contacts
137
+ #
138
+ # @return [Array<Whois::Parser::Contact>]
139
+ def contacts
140
+ parser.contacts
141
+ end
142
+
143
+
144
+ private
145
+
146
+ # @api private
147
+ def respond_to_parser_method?(symbol)
148
+ name = symbol.to_s =~ /\?$/ ? symbol.to_s[0..-2] : symbol
149
+ Parser::PROPERTIES.include?(name.to_sym) || Parser::METHODS.include?(name.to_sym)
150
+ end
151
+
152
+ # Checks if the property passed as symbol
153
+ # is supported in any of the parsers.
154
+ #
155
+ # @api private
156
+ # @see Whois::Parser::Parser#property_any_supported?
157
+ #
158
+ # @param [Symbol] property The name of the property to check.
159
+ # @return [Boolean]
160
+ def property_any_supported?(property)
161
+ parser.property_any_supported?(property)
162
+ end
163
+
164
+ # Delegates any missing method to Record.
165
+ def method_missing(method, *args, &block)
166
+ target.send(method, *args, &block)
167
+ end
168
+
169
+ end
170
+ end
@@ -0,0 +1,114 @@
1
+ module Whois
2
+ module Scanners
3
+
4
+ class Base
5
+
6
+ class_attribute :tokenizers
7
+ self.tokenizers = []
8
+
9
+ def self.tokenizer(name, &block)
10
+ define_method(name, &block)
11
+ end
12
+
13
+
14
+ attr_reader :settings
15
+
16
+ def initialize(settings = nil)
17
+ @settings = settings || {}
18
+ end
19
+
20
+ def parse(content)
21
+ # The temporary store.
22
+ # Scanners may use this to store pointers, states or other flags.
23
+ @tmp = {}
24
+
25
+ # A super-simple AST store.
26
+ @ast = {}
27
+
28
+ @input = StringScanner.new(content)
29
+ tokenize until @input.eos?
30
+
31
+ @ast
32
+ end
33
+
34
+
35
+ tokenizer :skip_empty_line do
36
+ @input.skip(/^\n/)
37
+ end
38
+
39
+ tokenizer :skip_blank_line do
40
+ @input.skip(/^\s*\n/)
41
+ end
42
+
43
+ tokenizer :skip_newline do
44
+ @input.skip(/\n/)
45
+ end
46
+
47
+ # Scan a key/value pair and stores the result in the current target.
48
+ #  target is the global @ast if no '_section' is set, else '_section' is used.
49
+ tokenizer :scan_keyvalue do
50
+ if @input.scan(/(.+?):(.*?)(\n|\z)/)
51
+ key, value = @input[1].strip, @input[2].strip
52
+ target = @tmp['_section'] ? (@ast[@tmp['_section']] ||= {}) : @ast
53
+
54
+ if target[key].nil?
55
+ target[key] = value
56
+ else
57
+ target[key] = Array.wrap(target[key])
58
+ target[key] << value
59
+ end
60
+ end
61
+ end
62
+
63
+ protected
64
+
65
+ def _scan_lines_to_array(pattern)
66
+ results = []
67
+ while @input.scan(pattern)
68
+ @input[1].strip
69
+ results << @input[1].strip
70
+ end
71
+ results
72
+ end
73
+
74
+ def _scan_lines_to_hash(pattern)
75
+ results = {}
76
+ results.merge! @input[1].strip => @input[2].strip while @input.scan(pattern)
77
+ results
78
+ end
79
+
80
+ def _scan_keyvalues(pattern)
81
+ results = []
82
+ while @input.scan(/(.+?):(.*?)\n/)
83
+ key, value = @input[1].strip, @input[2].strip
84
+ if results[key].nil?
85
+ results[key] = value
86
+ else
87
+ results[key] = Array.wrap(results[key])
88
+ results[key] << value
89
+ end
90
+ end
91
+ end
92
+
93
+
94
+ private
95
+
96
+ def tokenize
97
+ tokenizers.each do |tokenizer|
98
+ return if send(tokenizer)
99
+ end
100
+ unexpected_token
101
+ end
102
+
103
+ def unexpected_token
104
+ error!("Unexpected token")
105
+ end
106
+
107
+ def error!(message)
108
+ raise ParserError, "#{message}: #{@input.peek(@input.string.length)}"
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+ end