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,32 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.centralnic.com record.
7
+ class WhoisCentralnicCom < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :scan_available,
12
+ :scan_disclaimer,
13
+ :scan_keyvalue,
14
+ ]
15
+
16
+
17
+ tokenizer :scan_available do
18
+ if @input.skip(/^(?:DOMAIN NOT FOUND|The queried object does not exist: DOMAIN NOT FOUND|>>> Domain \S+ is available for registration)\n/i)
19
+ @ast["status:available"] = true
20
+ end
21
+ end
22
+
23
+ tokenizer :scan_disclaimer do
24
+ if @input.match?(/^\S([^:]+)\n/)
25
+ @ast["field:disclaimer"] = _scan_lines_to_array(/(.+)\n/).join(" ")
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,72 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.cira.ca record.
7
+ class WhoisCiraCa < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :scan_disclaimer,
12
+ :skip_comment,
13
+ :scan_header,
14
+ :scan_keyvalue,
15
+ :scan_nameserver,
16
+ ]
17
+
18
+
19
+ tokenizer :scan_disclaimer do
20
+ if @input.match?(/^% Use of CIRA/)
21
+ @ast["field:disclaimer"] = _scan_lines_to_array(/^%(.*)\n/).join("\n")
22
+ end
23
+ end
24
+
25
+ tokenizer :scan_header do
26
+ if !@input.match?(/^\s/) && @input.scan(/^(.+?):\n/)
27
+ @tmp["group"] = @input[1]
28
+ end
29
+ end
30
+
31
+ tokenizer :scan_keyvalue do
32
+ if @input.scan(/^(.+?):(.*?)\n/)
33
+ start = @input[1]
34
+ key, value = start.strip, @input[2].strip
35
+
36
+ # This is a nested key
37
+ target = if start.index(" ") == 0
38
+ error!("Expected group.") if @tmp["group"].nil?
39
+ @ast[@tmp["group"]] ||= {}
40
+ @ast[@tmp["group"]]
41
+ else
42
+ @tmp.delete("group")
43
+ @ast
44
+ end
45
+
46
+ more = _scan_lines_to_array(/^\s{#{start.size}}(.+)\n/)
47
+ value = more.unshift(value).join("\n") unless more.empty?
48
+
49
+ if target[key].nil?
50
+ target[key] = value
51
+ else
52
+ target[key] = Array.wrap(target[key])
53
+ target[key] << value
54
+ end
55
+ end
56
+ end
57
+
58
+ tokenizer :scan_nameserver do
59
+ if @input.scan(/^\s+(.+?)\n/) && @tmp["group"] == "Name servers"
60
+ @ast["field:nameservers"] ||= []
61
+ @ast["field:nameservers"] << @input[1].strip
62
+ end
63
+ end
64
+
65
+ tokenizer :skip_comment do
66
+ @input.skip(/^%.*\n/)
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,42 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.cnnic.cn record.
7
+ class WhoisCnnicCn < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :scan_reserved,
12
+ :scan_reserved_list,
13
+ :scan_available,
14
+ :scan_keyvalue,
15
+ ]
16
+
17
+
18
+ tokenizer :scan_available do
19
+ if @input.match?(/^No matching record\.?\n/i)
20
+ @ast["status:available"] = true
21
+ @input.scan_until(/\n/)
22
+ end
23
+ end
24
+
25
+ tokenizer :scan_reserved do
26
+ if @input.match?(/^The domain you requested is prohibited/)
27
+ @ast["status:reserved"] = true
28
+ @input.scan_until(/\n/)
29
+ end
30
+ end
31
+
32
+ tokenizer :scan_reserved_list do
33
+ if @input.scan(/^Sorry, The domain you requested is in the reserved list/)
34
+ @ast["status:reserved"] = true
35
+ @input.scan_until(/\n/)
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,103 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ class WhoisDenicDe < Base
7
+
8
+ self.tokenizers += [
9
+ :skip_empty_line,
10
+ :scan_response_throttled,
11
+ :scan_response_error,
12
+ :scan_disclaimer,
13
+ :scan_pair,
14
+ :scan_contact,
15
+ :skip_db_time,
16
+ ]
17
+
18
+
19
+ tokenizer :scan_response_throttled do
20
+ if @input.match?(/^% Error: 55000000002/)
21
+ @ast["response:throttled"] = true
22
+ @input.skip(/^.+\n/)
23
+ end
24
+ end
25
+
26
+ tokenizer :scan_response_error do
27
+ if @input.match?(/^% Error: 55000000010/)
28
+ @ast["response:error"] = true
29
+ @input.skip(/^.+\n/)
30
+ end
31
+ end
32
+
33
+ tokenizer :scan_disclaimer do
34
+ if @input.match?(/% Copyright \(c\) *\d{4} by DENIC\n/)
35
+ @input.scan_until(/% Terms and Conditions of Use\n/)
36
+ lines = []
37
+ while @input.match?(/%/) && @input.scan(/%(.*)\n/) # rubocop:disable Style/WhileUntilModifier
38
+ lines << @input[1].strip unless @input[1].strip == ""
39
+ end
40
+ @ast["Disclaimer"] = lines.join(" ")
41
+ elsif @input.match?(/^% Restricted rights\.\n/)
42
+ lines = []
43
+ while @input.match?(/^%.*\n/) && @input.scan(/^%(.*)\n/) # rubocop:disable Style/WhileUntilModifier
44
+ lines << @input[1].strip unless @input[1].strip == ""
45
+ end
46
+ @input.skip(/^\n/)
47
+ @ast["Disclaimer"] = lines.join(" ")
48
+ end
49
+ end
50
+
51
+ tokenizer :scan_pair do
52
+ parse_pair(@ast)
53
+ end
54
+
55
+ tokenizer :scan_contact do
56
+ if @input.scan(/\[(.*)\]\n/)
57
+ contact_name = @input[1]
58
+ contact = {}
59
+ while parse_pair(contact)
60
+ end
61
+ @ast[contact_name] = {
62
+ "id" => nil,
63
+ "name" => contact['Name'],
64
+ "organization" => contact['Organisation'],
65
+ "address" => contact['Address'],
66
+ "city" => contact['City'],
67
+ "zip" => contact['PostalCode'],
68
+ "state" => nil,
69
+ "country" => contact['Country'],
70
+ "country_code" => contact['CountryCode'],
71
+ "phone" => contact['Phone'],
72
+ "fax" => contact['Fax'],
73
+ "email" => contact['Email'],
74
+ "created_on" => nil,
75
+ "updated_on" => contact['Changed'],
76
+ }
77
+ end
78
+ end
79
+
80
+ tokenizer :skip_db_time do
81
+ @input.skip(/^% DB time is (.+)\n/)
82
+ end
83
+
84
+
85
+ private
86
+
87
+ def parse_pair(store)
88
+ if @input.scan(/([^ \[]*):(.*)\n/)
89
+ key, value = @input[1].strip, @input[2].strip
90
+ if store[key].nil?
91
+ store[key] = value
92
+ else
93
+ store[key].is_a?(Array) || store[key] = [store[key]]
94
+ store[key] << value
95
+ end
96
+ store
97
+ end
98
+ end
99
+
100
+ end
101
+
102
+ end
103
+ end
@@ -0,0 +1,30 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.dns.hr record.
7
+ class WhoisDnsHr < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :scan_available,
12
+ :skip_comment,
13
+ :scan_keyvalue,
14
+ ]
15
+
16
+
17
+ tokenizer :scan_available do
18
+ if @input.skip(/^%ERROR:\s*no entries found\s*\n/i)
19
+ @ast["status:available"] = true
20
+ end
21
+ end
22
+
23
+ tokenizer :skip_comment do
24
+ @input.skip(/^%.*\n/)
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.domainregistry.ie server.
7
+ class WhoisDomainregistryIe < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :scan_disclaimer,
12
+ :scan_contact,
13
+ :scan_available,
14
+ :scan_keyvalue,
15
+ :skip_application_pending,
16
+ :skip_comment,
17
+ ]
18
+
19
+ tokenizer :scan_available do
20
+ if @input.skip(/^% Not Registered - .+\n/) || @input.skip(/^Not found: .+\n/)
21
+ @ast["status:available"] = true
22
+ end
23
+ end
24
+
25
+ tokenizer :skip_comment do
26
+ @input.skip(/^%.*\n/)
27
+ end
28
+
29
+ tokenizer :scan_disclaimer do
30
+ if @input.match?(/^% Rights restricted by copyright/)
31
+ @ast["field:disclaimer"] = _scan_lines_to_array(/^%(.+)\n/).join("\n")
32
+ end
33
+ end
34
+
35
+ tokenizer :scan_contact do
36
+ if @input.match?(/^person:/)
37
+ lines = _scan_lines_to_hash(/(.+?):(.*?)\n/)
38
+ @ast["field:#{lines['nic-hdl']}"] = lines
39
+ end
40
+ end
41
+
42
+ tokenizer :skip_application_pending do
43
+ if @input.match?(/^% Application Pending/)
44
+ _scan_lines_to_array(/^%(.+)\n/)
45
+ @ast["status:pending"] = true
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,66 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.fi record.
7
+ class WhoisFi < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :scan_available,
12
+ :scan_disclaimer,
13
+ :skip_section_header,
14
+ :scan_keyvalue_normalized,
15
+ :scan_reserved,
16
+ :skip_lastupdate,
17
+ :skip_copyright,
18
+ ]
19
+
20
+
21
+ tokenizer :scan_available do
22
+ if @input.skip(/^Domain not found/)
23
+ @ast["status:available"] = true
24
+ end
25
+ end
26
+
27
+ tokenizer :scan_reserved do
28
+ if @input.skip(/^Domain not available/)
29
+ @ast["status:reserved"] = true
30
+ end
31
+ end
32
+
33
+ tokenizer :skip_section_header do
34
+ @input.skip(/^(Nameservers|DNSSEC|Holder|Registrar|Tech)\n/)
35
+ end
36
+
37
+ tokenizer :skip_lastupdate do
38
+ @input.skip(/^>>> Last update of WHOIS database:.*\n/)
39
+ end
40
+
41
+ tokenizer :skip_copyright do
42
+ @input.skip(/^Copyright \(c\) Finnish Transport and Communications Agency Traficom\n/)
43
+ end
44
+
45
+ tokenizer :scan_keyvalue_normalized do
46
+ if @input.scan(/(.+?):(.*?)(\n|\z)/)
47
+ key = @input[1].strip.sub(/\.+\z/, "").strip
48
+ value = @input[2].strip
49
+ @ast[key] = if @ast.key?(key)
50
+ Array.wrap(@ast[key]) << value
51
+ else
52
+ value
53
+ end
54
+ end
55
+ end
56
+
57
+ tokenizer :scan_disclaimer do
58
+ if @input.match?(/^More information/)
59
+ @ast["field:disclaimer"] = @input.scan_until(/(.*)\n\n/).strip
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,32 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.nc record.
7
+ class WhoisNc < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :skip_more,
12
+ :scan_available,
13
+ :scan_keyvalue,
14
+ ]
15
+
16
+
17
+ MORES = ['Whois \.NC', 'more details on']
18
+
19
+ tokenizer :scan_available do
20
+ if @input.skip(/^No entries found .+\n/)
21
+ @ast["status:available"] = true
22
+ end
23
+ end
24
+
25
+ tokenizer :skip_more do
26
+ MORES.any? { |more| @input.skip(/^#{more}.*\n/) }
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,22 @@
1
+ require_relative 'base_whoisd'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ class WhoisNicCz < BaseWhoisd
7
+
8
+ self.tokenizers += [
9
+ :scan_response_throttled,
10
+ ]
11
+
12
+ tokenizer :scan_response_throttled do
13
+ if @input.match?(/Your connection limit exceeded\. Please slow down and try again later/)
14
+ @ast["response:throttled"] = true
15
+ @input.skip(/^.+\n/)
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,92 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ class WhoisNicIt < Base
7
+
8
+ self.tokenizers += [
9
+ :skip_empty_line,
10
+ :scan_response_unavailable,
11
+ :scan_disclaimer,
12
+ :scan_keyvalue,
13
+ :scan_section,
14
+ ]
15
+
16
+
17
+ tokenizer :scan_response_unavailable do
18
+ if @input.scan(/Service temporarily unavailable\.\n/)
19
+ @ast["response:unavailable"] = true
20
+ end
21
+ end
22
+
23
+ tokenizer :scan_disclaimer do
24
+ if @input.match?(/\*(.*?)\*\n/)
25
+ @ast["Disclaimer"] = _scan_lines_to_array(/\*(.*?)\*\n/).select { |line| line =~ /\w+/ }.join(" ")
26
+ end
27
+ end
28
+
29
+ tokenizer :scan_section do
30
+ if @input.scan(/([^:]+?)\n/)
31
+ section = @input[1].strip
32
+ content = parse_section_pairs ||
33
+ parse_section_items
34
+ @input.match?(/\n+/) || error!("Unexpected end of section")
35
+ @ast[section] = content
36
+ end
37
+ end
38
+
39
+
40
+ private
41
+
42
+ def parse_section_items
43
+ if @input.match?(/(\s+)([^:]+?)\n/)
44
+ items = []
45
+ indentation = @input[1].length
46
+ while item = parse_section_items_item(indentation)
47
+ items << item
48
+ end
49
+ items
50
+ end
51
+ end
52
+
53
+ def parse_section_items_item(indentation)
54
+ if @input.scan(/\s{#{indentation}}(.+)\n/)
55
+ @input[1]
56
+ end
57
+ end
58
+
59
+ def parse_section_pairs
60
+ contents = {}
61
+ while content = parse_section_pair
62
+ contents.merge!(content)
63
+ end
64
+ if contents.empty?
65
+ false
66
+ else
67
+ contents
68
+ end
69
+ end
70
+
71
+ def parse_section_pair
72
+ if @input.scan(/(\s+)(.+?):(\s+)(.*?)\n/)
73
+ key = @input[2].strip
74
+ values = [@input[4].strip]
75
+ indentation = @input[1].length + @input[2].length + 1 + @input[3].length
76
+ while value = parse_section_pair_newlinevalue(indentation)
77
+ values << value
78
+ end
79
+ { key => values.join("\n") }
80
+ end
81
+ end
82
+
83
+ def parse_section_pair_newlinevalue(indentation)
84
+ if @input.scan(/\s{#{indentation}}(.+)\n/)
85
+ @input[1]
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,17 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the Afilias-based records.
7
+ class WhoisPirOrg < BaseAfilias
8
+
9
+ tokenizer :scan_disclaimer do
10
+ if @input.match?(/^Access to/)
11
+ @ast["field:disclaimer"] = _scan_lines_to_array(/^(.+)(\n+)/).join(" ")
12
+ end
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,52 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.rnids.rs record.
7
+ class WhoisRnidsRs < Base
8
+
9
+ self.tokenizers += [
10
+ :scan_available,
11
+ :skip_comment,
12
+ :flag_section_start,
13
+ :scan_keyvalue,
14
+ :flag_section_end,
15
+ :skip_empty_line,
16
+ :skip_privacy,
17
+ ]
18
+
19
+
20
+ SECTIONS = ["Owner", "Administrative contact", "Technical contact"]
21
+
22
+ tokenizer :scan_available do
23
+ if @input.scan(/^%ERROR:103: Domain is not registered/)
24
+ @ast["status:available"] = true
25
+ end
26
+ end
27
+
28
+ tokenizer :flag_section_start do
29
+ if SECTIONS.any? { |section| @input.check(/^(#{section}):/) }
30
+ @tmp['_section'] = @input[1]
31
+ end
32
+ false
33
+ end
34
+
35
+ tokenizer :flag_section_end do
36
+ if @input.match?(/^\n/)
37
+ @tmp.delete('_section')
38
+ end
39
+ end
40
+
41
+ tokenizer :skip_comment do
42
+ @input.skip(/^%.*\n/)
43
+ end
44
+
45
+ tokenizer :skip_privacy do
46
+ @input.skip(/^Whois privacy has been activated for domain.\n/)
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,50 @@
1
+ require_relative 'base'
2
+ require 'yaml'
3
+
4
+ module Whois
5
+ module Scanners
6
+
7
+ # Scanner for the whois.smallregistry.net record.
8
+ class WhoisSmallregistryNet < Base
9
+
10
+ self.tokenizers += [
11
+ :scan_yaml_header,
12
+ :scan_disclaimer,
13
+ :scan_request_time,
14
+ :scan_available,
15
+ :scan_body,
16
+ ]
17
+
18
+ tokenizer :scan_yaml_header do
19
+ # skip the YAML prelude
20
+ @input.scan(/^---.*\n/)
21
+ end
22
+
23
+ tokenizer :scan_disclaimer do
24
+ if @input.match?(/^#/) && disclaimer = @input.scan_until(/^#\n/)
25
+ @ast["field:disclaimer"] = disclaimer
26
+ end
27
+ end
28
+
29
+ tokenizer :scan_request_time do
30
+ if @input.scan(/^# (\d+-\d+-\d+T.*)\n/)
31
+ @ast["field:request_time"] = @input[1].strip
32
+ end
33
+ end
34
+
35
+ tokenizer :scan_available do
36
+ if @input.scan(/^# Object not found.*\n/)
37
+ @ast["status:available"] = true
38
+ end
39
+ end
40
+
41
+ tokenizer :scan_body do
42
+ str = @input.rest
43
+ str.gsub!(/ (!\w+) \n/, " \n") # remove custom types
44
+ @ast.merge! YAML.safe_load(str)
45
+ @input.terminate
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,23 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.srs.net.nz record.
7
+ class WhoisSrsNetNz < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :skip_comment,
12
+ :scan_keyvalue,
13
+ ]
14
+
15
+
16
+ tokenizer :skip_comment do
17
+ @input.skip(/^%.*\n/)
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+ end