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,51 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the Afilias-based records.
7
+ class BaseAfilias < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :scan_available,
12
+ :scan_reserved,
13
+ :scan_throttled,
14
+ :scan_disclaimer,
15
+ :scan_keyvalue,
16
+ ]
17
+
18
+
19
+ tokenizer :scan_available do
20
+ if @input.scan(/^(?:NOT FOUND|Domain not found\.)\n/)
21
+ @ast["status:available"] = true
22
+ end
23
+ end
24
+
25
+ tokenizer :scan_reserved do
26
+ if settings[:pattern_reserved] && @input.scan(settings[:pattern_reserved])
27
+ @ast["status:reserved"] = true
28
+ end
29
+ end
30
+
31
+ # .ORG
32
+ tokenizer :scan_throttled do
33
+ if @input.match?(/^WHOIS LIMIT EXCEEDED/)
34
+ @ast["response:throttled"] = true
35
+ @input.skip(/^.+\n/)
36
+ end
37
+ end
38
+
39
+ tokenizer :scan_disclaimer do
40
+ if settings[:pattern_disclaimer]
41
+ if @input.match?(settings[:pattern_disclaimer])
42
+ @ast["field:disclaimer"] = _scan_lines_to_array(/^(.+)\n/).join(" ")
43
+ end
44
+ elsif @input.pos == 0 && @input.match?(/^(.+\n){3,}\n/)
45
+ @ast["field:disclaimer"] = _scan_lines_to_array(/^(.+)\n/).join(" ")
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,58 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ class BaseCocca2 < Base
7
+
8
+ self.tokenizers += [
9
+ :skip_empty_line,
10
+ :scan_disclaimer,
11
+ :skip_lastupdate,
12
+ :skip_token_additionalsection,
13
+ :skip_comment,
14
+ :skip_no_object,
15
+ :skip_footer,
16
+ :scan_keyvalue,
17
+ ]
18
+
19
+
20
+ DISCLAIMER_MATCHES = [
21
+ "TERMS OF USE:", # global
22
+ "Terminos de Uso:", # whois.nic.hn
23
+ "The data in the WHOIS database of Meridian", # whois.meridiantld.net
24
+ "This information is provided", # whois.gg
25
+ ]
26
+
27
+ tokenizer :scan_disclaimer do
28
+ if @input.match?(/^#{DISCLAIMER_MATCHES.join('|')}/)
29
+ @ast["field:disclaimer"] = @input.scan_until(/>>>/) ||
30
+ # special handler for whois.nic.cx exception
31
+ @input.scan_until(/\Z/)
32
+ end
33
+ end
34
+
35
+ tokenizer :skip_lastupdate do
36
+ @input.skip(/>>>(.+?)<<<\n/)
37
+ end
38
+
39
+ tokenizer :skip_token_additionalsection do
40
+ @input.skip(/Additional Section\n/)
41
+ end
42
+
43
+ tokenizer :skip_comment do
44
+ @input.skip(/^%.*\n/)
45
+ end
46
+
47
+ tokenizer :skip_no_object do
48
+ @input.skip(/^The queried object does not exist: No Object Found\n/i)
49
+ end
50
+
51
+ tokenizer :skip_footer do
52
+ @input.skip(/^For more information on domain status codes,.*\n/i)
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,45 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the Icann Compliant-based records.
7
+ class BaseIcannCompliant < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_head,
11
+ :scan_available,
12
+ :scan_throttled,
13
+ :skip_empty_line,
14
+ :skip_blank_line,
15
+ :scan_keyvalue,
16
+ :skip_end,
17
+ ]
18
+
19
+ tokenizer :scan_available do
20
+ if settings[:pattern_available] && @input.skip_until(settings[:pattern_available])
21
+ @ast['status:available'] = true
22
+ end
23
+ end
24
+
25
+ tokenizer :scan_throttled do
26
+ if settings[:pattern_throttled] && @input.skip_until(settings[:pattern_throttled])
27
+ @ast['response:throttled'] = true
28
+ end
29
+ end
30
+
31
+ tokenizer :skip_head do
32
+ if @input.skip_until(/Domain Name:/)
33
+ @input.scan(/\s?(.+)\n/)
34
+ @ast["Domain Name"] = @input[1].strip
35
+ end
36
+ end
37
+
38
+ tokenizer :skip_end do
39
+ @input.terminate
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the IIS.se company.
7
+ class BaseIisse < 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.+\n/)
19
+ @ast["status:available"] = true
20
+ end
21
+ end
22
+
23
+ tokenizer :scan_disclaimer do
24
+ if @input.match?(/# Copyright/)
25
+ lines = []
26
+ while @input.scan(/#(.*)\n\n?/) # rubocop:disable Style/WhileUntilModifier
27
+ lines << @input[1].strip if @input[1].strip != ""
28
+ end
29
+ @ast["field:disclaimer"] = lines.join(" ")
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,31 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ class BaseShared1 < Base
7
+
8
+ self.tokenizers += [
9
+ :skip_empty_line,
10
+ :scan_available,
11
+ :scan_reserved,
12
+ :scan_keyvalue,
13
+ ]
14
+
15
+
16
+ tokenizer :scan_available do
17
+ if @input.skip(/^No Data Found\n/)
18
+ @ast["status:available"] = true
19
+ end
20
+ end
21
+
22
+ tokenizer :scan_reserved do
23
+ if settings[:pattern_reserved] && @input.scan(settings[:pattern_reserved])
24
+ @ast["status:reserved"] = true
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ class BaseShared2 < Base
7
+
8
+ self.tokenizers += [
9
+ :skip_blank_line,
10
+ :scan_available,
11
+ :scan_keyvalue,
12
+ :skip_lastupdate,
13
+ :skip_fuffa,
14
+ ]
15
+
16
+
17
+ tokenizer :scan_available do
18
+ if @input.scan(/^Not found: (.+)\n/)
19
+ @ast["Domain Name"] = @input[1]
20
+ @ast["status:available"] = true
21
+ end
22
+ end
23
+
24
+ tokenizer :skip_lastupdate do
25
+ @input.skip(/>>>(.+?)<<<\n/)
26
+ end
27
+
28
+ tokenizer :skip_fuffa do
29
+ @input.skip(/^\S(.+)\n/)
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ class BaseShared3 < Base
7
+
8
+ self.tokenizers += [
9
+ :scan_disclaimer,
10
+ :skip_empty_line,
11
+ :skip_comment,
12
+ :scan_available,
13
+ :scan_keyvalue,
14
+ ]
15
+
16
+
17
+ tokenizer :skip_comment do
18
+ @input.skip(/^;.*\n/)
19
+ end
20
+
21
+ tokenizer :scan_available do
22
+ if @input.skip(/^not found.+\n/)
23
+ @ast["status:available"] = true
24
+ end
25
+ end
26
+
27
+ tokenizer :scan_disclaimer do
28
+ if @input.pos == 0 && @input.match?(/^;.*/)
29
+ @ast["field:disclaimer"] = _scan_lines_to_array(/^;(.*)\n/).join(" ")
30
+ @ast["field:disclaimer"].gsub!(" ", "\n")
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,44 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for Whoisd-based records.
7
+ class BaseWhoisd < Base
8
+
9
+ self.tokenizers += [
10
+ :scan_available,
11
+ :skip_comment,
12
+ :scan_section,
13
+ :scan_keyvalue,
14
+ :skip_empty_line,
15
+ ]
16
+
17
+
18
+ tokenizer :scan_available do
19
+ if @input.skip(/^%ERROR:101: no entries found/)
20
+ @ast['status:available'] = true
21
+ end
22
+ end
23
+
24
+ tokenizer :scan_section do
25
+ if @input.scan(/\n(contact|nsset|keyset):\s+(.+)\n/)
26
+ @tmp["_section"] = "node:#{@input[1]}/#{@input[2].strip}"
27
+ while scan_keyvalue
28
+ end
29
+ @tmp.delete("_section")
30
+ end
31
+ end
32
+
33
+ tokenizer :todo_content do
34
+ @input.scan(/(.*)\n/)
35
+ end
36
+
37
+ tokenizer :skip_comment do
38
+ @input.skip(/^%.*\n/)
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,89 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ class Iana < Base
7
+
8
+ self.tokenizers += [
9
+ :skip_empty_line,
10
+ :scan_disclaimer,
11
+ :scan_section,
12
+ ]
13
+
14
+
15
+ tokenizer :scan_disclaimer do
16
+ if @input.match?(/^%(.*?)\n/)
17
+ @ast["Disclaimer"] = _scan_lines_to_array(/%(.*?)\n/).select { |line| line =~ /\w+/ }.join(" ")
18
+ end
19
+ end
20
+
21
+ tokenizer :scan_section do
22
+ if @input.scan(/^(.+):(.+)\n/)
23
+
24
+ # Adapt the section's name depending on the first line
25
+ section = case @input[1].strip
26
+ when 'contact'
27
+ @input[2].strip # use the contact type name as identifier
28
+ when 'created', 'changed'
29
+ 'dates'
30
+ when 'nserver'
31
+ 'nameservers'
32
+ else
33
+ @input[1].strip # Default name is the first label found
34
+ end
35
+
36
+ content = parse_section_pairs
37
+ @input.match?(/\n+/) || error("Unexpected end of section")
38
+ @ast[section] = content
39
+ end
40
+ end
41
+
42
+
43
+ private
44
+
45
+ def parse_section_pairs
46
+ # Sets by default the firsts values found in the section parsing bellow
47
+ section_name, section_value = @input[1].strip, @input[2].strip
48
+ # contents = {section_name => section_value}
49
+
50
+ contents = {}
51
+
52
+ while content = parse_section_pair
53
+ contents.merge!(content)
54
+ end
55
+
56
+ if contents.key? section_name
57
+ contents[section_name].insert(0, "#{section_value}\n")
58
+ else
59
+ contents[section_name] = section_value
60
+ end
61
+
62
+ if contents.empty?
63
+ false
64
+ else
65
+ contents
66
+ end
67
+ end
68
+
69
+ def parse_section_pair
70
+ if @input.scan(/^(.+):\s*(.+)\n/)
71
+ key = @input[1].strip
72
+ values = [@input[2].strip]
73
+
74
+ while value = parse_section_pair_newlinevalue(key)
75
+ values << value
76
+ end
77
+ { key => values.join("\n") }
78
+ end
79
+ end
80
+
81
+ def parse_section_pair_newlinevalue(key)
82
+ if @input.scan(/^#{key}:\s*(.+)\n/)
83
+ @input[1].strip
84
+ end
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,65 @@
1
+ require 'strscan'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # The Scannable module tries to emulate a super-simple Abstract Syntax Tree structure
7
+ # including method for accessing ast nodes.
8
+ #
9
+ # == Usage
10
+ #
11
+ # Include the Scannable module and set the `self.scanner` value.
12
+ #
13
+ # class ParserFoo
14
+ # include Scannable
15
+ #
16
+ # self.scanner = ScannerFoo
17
+ # end
18
+ #
19
+ # Now you can access the AST using the <tt>node</tt> method.
20
+ #
21
+ # node "created_on"
22
+ # # => "2009-12-12"
23
+ #
24
+ # node? "created_on"
25
+ # # => true
26
+ #
27
+ # node? "created_at"
28
+ # # => false
29
+ #
30
+ module Scannable
31
+
32
+ def self.included(base)
33
+ base.class_attribute :scanner
34
+ end
35
+
36
+ def node(key)
37
+ if block_given?
38
+ value = ast[key]
39
+ value = yield(value) unless value.nil?
40
+ value
41
+ else
42
+ ast[key]
43
+ end
44
+ end
45
+
46
+ def node?(key)
47
+ !ast[key].nil?
48
+ end
49
+
50
+ def parse
51
+ scanner = self.scanner.is_a?(Array) ? self.scanner.first : self.scanner
52
+ settings = self.scanner.is_a?(Array) ? self.scanner.last : {}
53
+ scanner.new(settings).parse(content_for_scanner)
54
+ end
55
+
56
+ private
57
+
58
+ def ast
59
+ @ast ||= parse
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,100 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ class Verisign < Base
7
+
8
+ self.tokenizers += [
9
+ :skip_empty_line,
10
+ :scan_response_unavailable,
11
+ :scan_available,
12
+ :scan_disclaimer,
13
+ :scan_notice,
14
+ :scan_keyvalue_indented,
15
+ :skip_ianaservice,
16
+ :skip_lastupdate,
17
+ :skip_fuffa,
18
+ ]
19
+
20
+
21
+ tokenizer :scan_response_unavailable do
22
+ # Check if the string starts with /*
23
+ # If it does, match until the end of all /* lines
24
+ #  or the end of the file and check for the content.
25
+ #
26
+ # Flag the block as visited to force the scanner to ignore this tokenizer
27
+ #  if already used and the content didn't match the unavailable message.
28
+ if @input.match?(/^\*\n/) && !visited?
29
+ p = /^[^*]|\z/
30
+ y = @input.check_until(p) =~ /^\* Sorry, the Whois database is currently down/
31
+
32
+ if y
33
+ @input.skip_until(p)
34
+ @ast["response:unavailable"] = true
35
+ else
36
+ visited!
37
+ end
38
+ end
39
+ end
40
+
41
+ tokenizer :scan_available do
42
+ if @input.scan(/No match for "(.+?)"\.\n/)
43
+ @ast["Domain Name"] = @input[1].strip
44
+ end
45
+ end
46
+
47
+ tokenizer :scan_disclaimer do
48
+ if @input.match?(/^TERMS OF USE:/)
49
+ @ast["Disclaimer"] = _scan_lines_to_array(/(.+)\n/).join(" ")
50
+ end
51
+ end
52
+
53
+ tokenizer :scan_notice do
54
+ if @input.match?(/^NOTICE:/)
55
+ @ast["Notice"] = _scan_lines_to_array(/(.+)\n/).join(" ")
56
+ end
57
+ end
58
+
59
+ tokenizer :scan_keyvalue_indented do
60
+ if @input.scan(/\s+(.+?):(.*?)\n/)
61
+ key, value = @input[1].strip, @input[2].strip
62
+ if @ast[key].nil?
63
+ @ast[key] = value
64
+ else
65
+ @ast[key] = [@ast[key]] unless @ast[key].is_a?(Array)
66
+ @ast[key] << value
67
+ end
68
+ end
69
+ end
70
+
71
+ tokenizer :skip_lastupdate do
72
+ @input.skip(/>>>(.+?)<<<\n/)
73
+ end
74
+
75
+ tokenizer :skip_fuffa do
76
+ @input.scan(/^\S(.+)(?:\n|\z)/)
77
+ end
78
+
79
+ tokenizer :skip_ianaservice do
80
+ if @input.match?(/IANA Whois Service/)
81
+ @ast["IANA"] = true
82
+ @input.terminate
83
+ end
84
+ end
85
+
86
+ private
87
+
88
+ def visited?
89
+ !!@tmp["visited:#{@input.pos}"]
90
+ end
91
+
92
+ def visited!
93
+ @tmp["visited:#{@input.pos}"] = true
94
+ nil
95
+ end
96
+
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,32 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.ati.tn record.
7
+ class WhoisAtiTn < 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/)
19
+ @ast["status:available"] = true
20
+ end
21
+ end
22
+
23
+ tokenizer :scan_disclaimer do
24
+ if @input.match?(/^All rights reserved/)
25
+ @ast["field:disclaimer"] = _scan_lines_to_array(/(.+)\n/).join("\n")
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.audns.net.au record.
7
+ class WhoisAudnsNetAu < Base
8
+
9
+ self.tokenizers += [
10
+ :skip_empty_line,
11
+ :scan_available,
12
+ :skip_lastupdate,
13
+ :scan_keyvalue,
14
+ ]
15
+
16
+
17
+ tokenizer :scan_available do
18
+ if @input.skip(/^(No Data Found|Domain not found\.)\n/)
19
+ @ast["status:available"] = true
20
+ end
21
+ end
22
+
23
+ tokenizer :skip_lastupdate do
24
+ if @input.skip(/^>>> Last update of WHOIS database:.*\n/)
25
+ @input.terminate
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'base'
2
+
3
+ module Whois
4
+ module Scanners
5
+
6
+ # Scanner for the whois.cctld.by server.
7
+ #
8
+ # @author Aliaksei Kliuchnikau <aliaksei.kliuchnikau@gmail.com>
9
+ class WhoisCctldBy < Base
10
+
11
+ self.tokenizers += [
12
+ :skip_empty_line,
13
+ :skip_dash_line,
14
+ :scan_available,
15
+ :scan_keyvalue,
16
+ :skip_provider_signature,
17
+ ]
18
+
19
+ tokenizer :scan_available do
20
+ if @input.skip(/^Object does not exist/i)
21
+ @ast["status:available"] = true
22
+ end
23
+ end
24
+
25
+ tokenizer :skip_dash_line do
26
+ @input.skip(/^-+\n/)
27
+ end
28
+
29
+ tokenizer :skip_provider_signature do
30
+ @input.scan(/^(.+)\n/)
31
+ end
32
+
33
+ end
34
+ end
35
+ end