diff --git a/.gitignore b/.gitignore index dabbc22..f0f26c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *_del.h new_gtlds.h +nic_handles.h tld_serv.h servers_charset.h version.h diff --git a/Makefile b/Makefile index 8f1ca35..8d8f69b 100644 --- a/Makefile +++ b/Makefile @@ -87,6 +87,9 @@ ip6_del.h: ip6_del_list make_ip6_del.pl new_gtlds.h: new_gtlds_list make_new_gtlds.pl $(PERL) make_new_gtlds.pl < $< > $@ +nic_handles.h: nic_handles_list make_nic_handles.pl + $(PERL) make_nic_handles.pl < $< > $@ + tld_serv.h: tld_serv_list make_tld_serv.pl $(PERL) make_tld_serv.pl < $< > $@ @@ -118,7 +121,7 @@ distclean: clean clean: rm -f Makefile.depend as_del.h as32_del.h ip_del.h ip6_del.h \ - tld_serv.h servers_charset.h *.o whois mkpasswd + new_gtlds.h tld_serv.h servers_charset.h *.o whois mkpasswd rm -f po/*.mo pos: diff --git a/config.h b/config.h index 4492e4b..7e324f7 100644 --- a/config.h +++ b/config.h @@ -81,6 +81,15 @@ # define RANDOM_DEVICE "/dev/urandom" #endif +/* use arc4random_buf instead if it is available */ +#if (defined __FreeBSD__ && __FreeBSD__ >= 9) || \ + (defined __NetBSD__ && __NetBSD_Version__ >= 600000000) || \ + (defined OpenBSD && OpenBSD >= 200805) || \ + (defined __APPLE__ && defined __MACH__) +# define HAVE_ARC4RANDOM_BUF +# undef RANDOM_DEVICE +#endif + #ifdef ENABLE_NLS # ifndef NLS_CAT_NAME # define NLS_CAT_NAME "whois" diff --git a/data.h b/data.h index 797eaae..4ec505e 100644 --- a/data.h +++ b/data.h @@ -11,17 +11,13 @@ const char *ripe_servers[] = { "whois.apnic.net", "whois.afrinic.net", "rr.arin.net", /* does not accept the old syntax */ - "whois.6bone.net", /* 3.0.0b1 */ "whois.connect.com.au", /* 3.0.0b1 */ "whois.nic.fr", - "whois.telstra.net", "whois.restena.lu", "rr.level3.net", /* 3.0.0a13 */ "whois.ripn.net", "whois.arnes.si", - "www.registry.co.ug", "whois.nic.ir", - "whois.nic.ck", "whois.ra.net", "whois.bgpmon.net", NULL @@ -159,6 +155,11 @@ const char *tld_serv[] = { NULL, NULL }; +const char *nic_handles_post[] = { +#include "nic_handles.h" + NULL, NULL +}; + #ifdef HAVE_ICONV struct server_charset { const char *name; diff --git a/debian/changelog b/debian/changelog index f44c23e..106bcc3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,35 @@ -whois (5.2.0~bpo70+1) wheezy-backports; urgency=medium +whois (5.2.3) unstable; urgency=medium - * Rebuilt for wheezy. + * Added the .gw TLD server. + * Updated the .bm, .gr, .gt, .md, .np, .py, .tc, .tg, .vi, .net.za, + .org.za and .web.za TLD servers. (Closes: #773489) + * Removed the .cg TLD server. + * Updated the list of new gTLDs. + * mkpasswd: use arc4random_buf(3) where available. + * mkpasswd: support OpenBSD's new hash 2b. + * Updated some IPv4 allocations. + * Remove the new_gtlds.h generated file from the Debian source package. - -- Marco d'Itri Sun, 14 Sep 2014 13:30:49 +0200 + -- Marco d'Itri Fri, 26 Dec 2014 20:12:24 +0100 + +whois (5.2.2) unstable; urgency=medium + + * Fixed the code that removes trailing dots. (Closes: #763834) + * Added the .xn--d1alf (.мкд, Macedonia) and .xn--node (.გე, Georgia) + TLD servers. + * Updated the list of new gTLDs. + + -- Marco d'Itri Thu, 06 Nov 2014 03:47:43 +0100 + +whois (5.2.1) unstable; urgency=medium + + * Added the .aw and .zm TLD servers. + * Added the charset for whois.domain.kg. + * Updated the list of new gTLDs. + * Queries for bare TLDs will be directed to whois.iana.org. + (Closes: #763833) + + -- Marco d'Itri Thu, 16 Oct 2014 02:01:20 +0200 whois (5.2.0) unstable; urgency=medium diff --git a/debian/control b/debian/control index 9006ad9..f4b963a 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: whois Section: net Priority: standard Maintainer: Marco d'Itri -Standards-Version: 3.9.5 +Standards-Version: 3.9.6 Build-Depends: debhelper (>= 5), gettext, libidn11-dev Vcs-Git: git://github.com/rfc1036/whois.git Vcs-Browser: https://github.com/rfc1036/whois diff --git a/ip_del_list b/ip_del_list index db7361e..0425203 100644 --- a/ip_del_list +++ b/ip_del_list @@ -19,6 +19,7 @@ 39.0.0.0/8 apnic 41.0.0.0/8 afrinic 42.0.0.0/8 apnic +43.224.0.0/11 apnic 43.0.0.0/8 whois.nic.ad.jp 46.0.0.0/8 ripe 49.0.0.0/8 apnic @@ -149,11 +150,6 @@ 196.0.0.0/7 afrinic 198.0.0.0/7 arin -200.17.0.0/16 whois.nic.br -200.18.0.0/15 whois.nic.br -200.20.0.0/16 whois.nic.br -200.96.0.0/13 whois.nic.br -200.128.0.0/9 whois.nic.br 200.0.0.0/7 lacnic 202.11.0.0/16 whois.nic.ad.jp 202.13.0.0/16 whois.nic.ad.jp diff --git a/make_new_gtlds.pl b/make_new_gtlds.pl index 964a2f7..dc7110e 100755 --- a/make_new_gtlds.pl +++ b/make_new_gtlds.pl @@ -9,8 +9,8 @@ while (<>) { s/^\s+//; s/\s+$//; next if /^$/; - die "format error: $_" if not /^((?:xn--)?[a-z0-9]+)$/; + die "format error: $_" if not /^(xn--[a-z0-9-]+|[a-z]+)$/; - print qq| ".$_",\n|; + print qq| "$_",\n|; } diff --git a/make_nic_handles.pl b/make_nic_handles.pl new file mode 100755 index 0000000..6b031c2 --- /dev/null +++ b/make_nic_handles.pl @@ -0,0 +1,17 @@ +#!/usr/bin/perl + +use warnings; +use strict; + +while (<>) { + chomp; + s/#.*$//; + s/^\s+//; s/\s+$//; + next if /^$/; + + die "format error: $_" if not + (my ($a, $b) = /^(-\w+)\s+([\w\d\.:-]+)$/); + + print qq| "$a",\t"$b",\n|; +} + diff --git a/make_tld_serv.pl b/make_tld_serv.pl index 6afa03e..c962015 100755 --- a/make_tld_serv.pl +++ b/make_tld_serv.pl @@ -10,7 +10,7 @@ while (<>) { next if /^$/; die "format error: $_" if not - (my ($a, $b) = /^([\w\d\.-]+)\s+([\w\d\.:-]+|[A-Z]+\s+.*)$/); + (my ($a, $b) = /^\.(\w[\w\d\.-]+)\s+([\w\d\.:-]+|[A-Z]+\s+.*)$/); $b =~ s/^W(?:EB)?\s+/\\x01/; $b =~ s/^VERISIGN\s+/\\x04" "/; diff --git a/mkpasswd.c b/mkpasswd.c index 2e3ca80..ffd887e 100644 --- a/mkpasswd.c +++ b/mkpasswd.c @@ -86,7 +86,13 @@ static const struct crypt_method methods[] = { N_("standard 56 bit DES-based crypt(3)") }, { "md5", "$1$", 8, 8, 0, "MD5" }, #if defined OpenBSD || defined FreeBSD || (defined __SVR4 && defined __sun) +# if (defined OpenBSD && OpenBSD >= 201405) + /* http://marc.info/?l=openbsd-misc&m=139320023202696 */ + { "bf", "$2b$", 22, 22, 1, "Blowfish" }, + { "bfa", "$2a$", 22, 22, 1, "Blowfish (obsolete $2a$ version)" }, +# else { "bf", "$2a$", 22, 22, 1, "Blowfish" }, +# endif #endif #if defined HAVE_LINUX_CRYPT_GENSALT { "bf", "$2a$", 22, 22, 1, "Blowfish, system-specific on 8-bit chars" }, @@ -377,20 +383,27 @@ void* get_random_bytes(const unsigned int count) } #endif -#ifdef RANDOM_DEVICE +#if defined RANDOM_DEVICE || defined HAVE_ARC4RANDOM_BUF void generate_salt(char *const buf, const unsigned int len) { unsigned int i; + unsigned char *entropy; + +#if defined HAVE_ARC4RANDOM_BUF + void *entropy = NOFAIL(malloc(len)); + arc4random_buf(entropy, len); +#else + entropy = get_random_bytes(len); +#endif - unsigned char *entropy = get_random_bytes(len * sizeof(unsigned char)); for (i = 0; i < len; i++) buf[i] = valid_salts[entropy[i] % (sizeof valid_salts - 1)]; buf[i] = '\0'; free(entropy); } -#else /* RANDOM_DEVICE */ +#else /* RANDOM_DEVICE || HAVE_ARC4RANDOM_BUF */ void generate_salt(char *const buf, const unsigned int len) { @@ -418,7 +431,7 @@ void generate_salt(char *const buf, const unsigned int len) buf[i] = '\0'; } -#endif /* RANDOM_DEVICE */ +#endif /* RANDOM_DEVICE || HAVE_ARC4RANDOM_BUF */ void display_help(int error) { diff --git a/new_gtlds_list b/new_gtlds_list index df530c0..b9f6d91 100644 --- a/new_gtlds_list +++ b/new_gtlds_list @@ -4,12 +4,19 @@ # Any exceptions can be handled in tld_serv_list as usual, since it will # be checked first. +abogado academy accountants active actor +adult agency airforce +allfinanz +alsace +amsterdam +android +aquarelle archi army associates @@ -18,6 +25,7 @@ auction audio autos axa +band bar bargains bayern @@ -29,18 +37,21 @@ bike bio black blackfriday +bloomberg blue bmw bnpparibas boo boutique brussels +budapest build builders business buzz bzh cab +cal camera camp cancerresearch @@ -51,13 +62,17 @@ cards care career careers +cartier +casa cash catering center ceo cern +channel cheap christmas +chrome church citic city @@ -67,11 +82,11 @@ click clinic clothing club +coach codes coffee college cologne -com community company computer @@ -84,6 +99,8 @@ cool country credit creditcard +cricket +crs cruises cuisinella cymru @@ -93,10 +110,12 @@ dating day deals degree +delivery democrat dental dentist desi +dev diamonds diet digital @@ -104,33 +123,46 @@ direct directory discount dnp +docs domains +doosan durban +dvag eat education email +emerck +energy engineer engineering enterprises equipment esq estate +eurovision eus events +everbank exchange expert exposed fail farm +fashion feedback finance financial +firmdale fish fishing fitness flights florist +flowers +flsmidth +fly foo +forsale foundation frl frogans @@ -139,17 +171,21 @@ furniture futbol gal gallery +garden gbiz gent +ggee gift gifts gives glass +gle global globo gmail gmo gmx +google gop graphics gratis @@ -173,16 +209,18 @@ host hosting house how +ibm immo immobilien industries -info ing ink institute insure international investments +irish +iwc jetzt joburg juegos @@ -195,9 +233,13 @@ krd kred lacaixa land +latrobe lawyer +lds lease +legal lgbt +lidl life lighting limited @@ -209,6 +251,7 @@ lotto ltda luxe luxury +madrid maison management mango @@ -218,22 +261,25 @@ media meet melbourne meme +memorial menu miami mini moda moe monash +money +mormon mortgage moscow motorcycles mov nagoya navy -net network neustar new +nexus ngo nhk ninja @@ -244,13 +290,14 @@ okinawa ong onl ooo -org organic +osaka otsuka ovh paris partners parts +party pharmacy photo photography @@ -262,10 +309,14 @@ pink pizza place plumbing +pohl +poker +porn praxi press prod productions +prof properties property pub @@ -277,6 +328,7 @@ red rehab reise reisen +reit ren rentals repair @@ -287,23 +339,30 @@ restaurant reviews rich rio +rip rocks rodeo rsvp ruhr ryukyu saarland +sale +samsung sarl sca scb schmidt schule +schwarz +science scot services +sew sexy shiksha shoes singles +sky social software sohu @@ -318,13 +377,16 @@ support surf surgery suzuki +sydney systems +taipei tatar tattoo tax technology tienda tips +tires tirol today tokyo @@ -334,6 +396,8 @@ town toys trade training +trust +tui university uno uol @@ -343,6 +407,7 @@ ventures versicherung vet viajes +video villas vision vlaanderen @@ -357,17 +422,21 @@ watch webcam website wed +wedding whoswho wien wiki williamhill wme +work works +world wtc wtf xn--1qqw23a xn--3bst00m xn--3ds443g +xn--45q11c xn--4gbrim xn--55qw42g xn--55qx5d @@ -379,10 +448,13 @@ xn--80aswg xn--c1avg xn--cg4bki xn--czr694b +xn--czrs0t xn--czru2d xn--d1acj3b xn--fiq228c5hs xn--fiq64b +xn--flw351e +xn--hxt814e xn--i1b6b1a6a2e xn--io0a7i xn--kput3i @@ -390,16 +462,23 @@ xn--mgbab2bd xn--ngbc5azd xn--nqv7f xn--nqv7fs00ema +xn--p1acf xn--q9jyb4c +xn--qcka1pmc xn--rhqv96g xn--ses554g xn--unup4y +xn--vermgensberater-ctb +xn--vermgensberatung-pwb xn--vhquv xn--xhq521b xn--zfr164b xyz yachts yandex +yoga yokohama youtube +zip zone +zuerich diff --git a/nic_handles_list b/nic_handles_list new file mode 100644 index 0000000..44e019b --- /dev/null +++ b/nic_handles_list @@ -0,0 +1,22 @@ +-arin whois.arin.net +-ripe whois.ripe.net +-mnt whois.ripe.net +-lacnic whois.lacnic.net +-afrinic whois.afrinic.net +-ap whois.apnic.net +-cznic whois.nic.cz +-dk whois.dk-hostmaster.dk +-il whois.isoc.org.il +-is whois.isnic.is +-kg whois.domain.kg +-coop whois.nic.coop +-frnic whois.nic.fr +-lrms whois.afilias.info +-metu whois.nic.tr +-nicat whois.nic.at +-nicci whois.nic.ci +-irnic whois.nic.ir +-norid whois.norid.no +-tel whois.nic.tel +-adnic whois.nic.org.uy +-sixxs whois.sixxs.net diff --git a/po/eu.po b/po/eu.po index 73a6bfe..d0362ea 100644 --- a/po/eu.po +++ b/po/eu.po @@ -11,7 +11,7 @@ msgstr "" "PO-Revision-Date: 2002-08-24 16:22+0200\n" "Last-Translator: Aitor Ibaez \n" "Language-Team: Euskara \n" -"Language: \n" +"Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/po/pt_BR.po b/po/pt_BR.po index 34285d2..9a471b1 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -11,7 +11,7 @@ msgstr "" "PO-Revision-Date: 2006-04-26 21:03-0300\n" "Last-Translator: Anderson Goulart \n" "Language-Team: Portuguese/Brazil\n" -"Language: \n" +"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/servers_charset_list b/servers_charset_list index 0a4d247..2ad0ab7 100644 --- a/servers_charset_list +++ b/servers_charset_list @@ -32,6 +32,7 @@ whois.isnic.is iso-8859-1 whois.nic.it utf-8 whois.jprs.jp iso-2022-jp whois.nic.ad.jp iso-2022-jp +whois.domain.kg cp1251 whois.nic.or.kr utf-8 whois.kr utf-8 # XXX I had to guess: the server is unable to fully transcode U+49b in the @@ -40,6 +41,7 @@ whois.nic.kz rk1048 whois.nic.li utf-8 whois.domreg.lt utf-8 whois.dns.lu iso-8859-1 +whois.marnet.mk utf-8 whois.nic.mu utf-8 whois.norid.no iso-8859-1 whois.iis.nu utf-8 diff --git a/tld_serv_list b/tld_serv_list index 51fa1c6..46b7c5a 100644 --- a/tld_serv_list +++ b/tld_serv_list @@ -91,7 +91,7 @@ .bi whois1.nic.bi .bj whois.nic.bj #.bl -.bm WEB http://207.228.133.14/cgi-bin/lansaweb?procfun+BMWHO+BMWHO2+WHO +.bm WEB http://www.bermudanic.bm/cgi-bin/lansaweb?procfun+BMWHO+BMWHO2+WHO .bn whois.bn # www.brunet.bn .bo whois.nic.bo #.bq @@ -107,7 +107,7 @@ .cc VERISIGN ccwhois.verisign-grs.com .cd whois.nic.cd .cf whois.dot.cf -.cg WEB http://www.nic.cg/cgi-bin/whois.pl +.cg NONE .ch whois.nic.ch .ci whois.nic.ci .ck NONE @@ -156,12 +156,12 @@ .gm WEB http://www.nic.gm/htmlpages/whois.htm .gn NONE # http://www.psg.com/dns/gn/ .gp WEB https://www.dom-enic.com/whois.html -.gq NONE # NO NIC http://www.getesa.gq/ -.gr WEB https://grweb.ics.forth.gr/Whois?lang=en +.gq whois.dominio.gq +.gr WEB https://grweb.ics.forth.gr/public/whois.jsp?lang=en .gs whois.nic.gs -.gt WEB http://www.gt/who_is.html +.gt WEB http://www.gt/ .gu WEB http://gadao.gov.gu/domainsearch.htm -.gw NONE # currently no registry +.gw WEB http://nic.gw/en/whois/ .gy whois.registry.gy .hk whois.hkirc.hk .hm whois.registry.hm @@ -185,7 +185,7 @@ .jp whois.jprs.jp .ke whois.kenic.or.ke .kg whois.domain.kg -.kh NONE # http://www.mptc.gov.kh/DomainNameRegistrationForm.aspx http://www.nic.net.kh/ +.kh NONE # http://www.trc.gov.kh/index.php/en/newsCategory/view?id=42&detail_id=68 .ki whois.nic.mu .km NONE # www.domaine.km .kn WEB http://www.nic.kn/ @@ -207,7 +207,7 @@ .ly whois.nic.ly .ma whois.iam.net.ma # www.nic.ma .mc NONE # www.nic.mc -.md WEB http://www.dns.md/wh1.php # whois.nic.md is restricted +.md whois.nic.md .me whois.nic.me # afilias #.mf .mg whois.nic.mg @@ -227,7 +227,7 @@ .mw WEB http://www.registrar.mw/ .mx whois.mx .my whois.mynic.my -.mz NONE # NIC? www.uem.mz +.mz whois.nic.mz .na whois.na-nic.com.na .nc whois.nc .ne NONE # NIC? http://www.intnet.ne @@ -236,7 +236,7 @@ .ni WEB http://www.nic.ni/ .nl whois.domain-registry.nl .no whois.norid.no -.np WEB http://register.mos.com.np/userSearchInc.asp +.np WEB http://register.mos.com.np/np-whois-lookup .nr WEB http://www.cenpac.net.nr/dns/whois.html .nu whois.iis.nu .nz whois.srs.net.nz @@ -255,7 +255,7 @@ .ps whois.pnina.ps .pt whois.dns.pt .pw whois.nic.pw -.py WEB http://www.nic.py/consultas.html +.py WEB http://www.nic.py/consulta-datos.php .qa whois.registry.qa .re whois.nic.re .ro whois.rotld.ro @@ -285,10 +285,10 @@ .sx whois.sx .sy whois.tld.sy .sz NONE # http://www.sispa.org.sz/ -.tc whois.meridiantld.net +.tc whois.nic.tc .td WEB http://www.nic.td/ .tf whois.nic.tf -.tg WEB http://www.nic.tg/ +.tg whois.nic.tg .th whois.thnic.co.th .tj WEB http://www.nic.tj/whois.html .tk whois.dot.tk @@ -329,7 +329,7 @@ .vc AFILIAS .ve whois.nic.ve .vg whois.adamsnames.tc -.vi WEB http://www.nic.vi/whoisform.htm +.vi WEB https://secure.nic.vi/whois-lookup/ .vn WEB http://www.vnnic.vn/en/domain .vu vunic.vu .wf whois.nic.wf @@ -340,10 +340,10 @@ .alt.za whois.alt.za .co.za whois.registry.net.za .gov.za whois.gov.za -.net.za whois.net.za -.org.za WEB http://www.org.za/ # rwhois.org.za:4321 is restricted -.web.za whois.web.za -.za NONE # http://www.zadna.org.za/annexure-d.html +.net.za net-whois.registry.net.za +.org.za org-whois.registry.net.za +.web.za web-whois.registry.net.za +.za NONE # http://www.zadna.org.za/content/page/domain-information .zm whois.nic.zm .zw NONE # http://www.zispa.co.zw/ @@ -354,6 +354,7 @@ .xn--80ao21a whois.nic.kz # Kazakhstan .xn--90a3ac whois.rnids.rs # Serbia .xn--clchc0ea0b2g2a9gcd whois.sgnic.sg # Singapore, Tamil +.xn--d1alf whois.marnet.mk # Macedonia .xn--fiqs8s cwhois.cnnic.cn # China, Simplified Chinese .xn--fiqz9s cwhois.cnnic.cn # China, Traditional Chinese .xn--fpcrj9c3d whois.inregistry.net # India, Telugu AW @@ -374,6 +375,7 @@ .xn--mgbc0a9azcg NONE # Morocco .xn--mgberp4a5d4ar whois.nic.net.sa # Saudi Arabia .xn--mgbx4cd0ab whois.mynic.my # Malaysia AW +.xn--node whois.itdc.ge # Georgia .xn--o3cw4h whois.thnic.co.th # Thailand .xn--ogbpf8fl whois.tld.sy # Syria .xn--p1ai whois.tcinet.ru # Russian Federation @@ -385,38 +387,3 @@ .xn--xkc2dl3a5ee0h whois.inregistry.net # India, Tamil AW .xn--yfro4i67o whois.sgnic.sg # Singapore, Chinese .xn--ygbi2ammx whois.pnina.ps # Palestinian Territory - --dom whois.networksolutions.com --org whois.networksolutions.com --hst whois.networksolutions.com --arin whois.arin.net --ripe whois.ripe.net --mnt whois.ripe.net --lacnic whois.lacnic.net --afrinic whois.afrinic.net --ap whois.apnic.net --cn whois.cnnic.cn --cz whois.nic.cz --dk whois.dk-hostmaster.dk --il whois.isoc.org.il --is whois.isnic.is --kg whois.domain.kg --ti whois.telstra.net --tw whois.twnic.net.tw --coop whois.nic.coop --frnic whois.nic.fr --gandi whois.gandi.net --kenic whois.kenic.or.ke --lrms whois.afilias.info --metu whois.nic.tr --nicat whois.nic.at --nicci whois.nic.ci --nicir whois.nic.ir --norid whois.norid.no --rotld whois.rotld.ro --sgnic whois.sgnic.sg --tel whois.nic.tel --uanic whois.ua --cunic whois.cunic.ua --uynic whois.nic.org.uy --sixxs whois.sixxs.net diff --git a/whois.c b/whois.c index c3d2a1d..fdb2824 100644 --- a/whois.c +++ b/whois.c @@ -442,7 +442,7 @@ const char *match_config_file(const char *s) } regfree(&re); #else - if (domcmp(s, pattern)) { + if (endstrcaseeq(s, pattern)) { fclose(fp); return strdup(server); } @@ -496,6 +496,15 @@ char *guess_server(const char *s) /* no dot and no hyphen means it's a NSI NIC handle or ASN (?) */ if (!strpbrk(s, ".-")) { + /* if it is a TLD or a new gTLD then ask IANA */ + for (i = 0; tld_serv[i]; i += 2) + if (strcaseeq(s, tld_serv[i])) + return strdup("whois.iana.org"); + + for (i = 0; new_gtlds[i]; i++) + if (strcaseeq(s, new_gtlds[i])) + return strdup("whois.iana.org"); + if (strncaseeq(s, "as", 2) && /* it's an AS */ (isasciidigit(s[2]) || s[2] == ' ')) return strdup(whereas(atol(s + 2))); @@ -524,7 +533,7 @@ char *guess_server(const char *s) /* check the TLDs list */ for (i = 0; tld_serv[i]; i += 2) - if (domcmp(s, tld_serv[i])) + if (in_domain(s, tld_serv[i])) return strdup(tld_serv[i + 1]); /* use the default server name for "new" gTLDs */ @@ -541,6 +550,12 @@ char *guess_server(const char *s) for (i = 0; nic_handles[i]; i += 2) if (strncaseeq(s, nic_handles[i], strlen(nic_handles[i]))) return strdup(nic_handles[i + 1]); + + /* search for strings at the end of the word */ + for (i = 0; nic_handles_post[i]; i += 2) + if (endstrcaseeq(s, nic_handles_post[i])) + return strdup(nic_handles_post[i + 1]); + /* it's probably a network name */ return strdup(""); } @@ -633,9 +648,9 @@ char *queryformat(const char *server, const char *flags, const char *query) /* add useful default flags if there are no flags or multiple arguments */ if (isripe) { } else if (strchr(query, ' ') || *flags) { } - else if (streq(server, "whois.denic.de") && domcmp(query, ".de")) + else if (streq(server, "whois.denic.de") && in_domain(query, "de")) strcat(buf, "-T dn" DENIC_PARAM_ACE DENIC_PARAM_CHARSET " "); - else if (streq(server, "whois.dk-hostmaster.dk") && domcmp(query, ".dk")) + else if (streq(server, "whois.dk-hostmaster.dk") && in_domain(query, "dk")) strcat(buf, "--show-handles "); /* mangle and add the query string */ @@ -1035,18 +1050,50 @@ int japanese_locale(void) { } /* check if dom ends with tld */ -int domcmp(const char *dom, const char *tld) +int endstrcaseeq(const char *dom, const char *tld) { - const char *p, *q; + size_t dom_len, tld_len; + const char *p = NULL; - for (p = dom; *p; p++); p--; /* move to the last char */ - for (q = tld; *q; q++); q--; - while (p >= dom && q >= tld && tolower(*p) == *q) { /* compare backwards */ - if (q == tld) /* start of the second word? */ - return 1; - p--; q--; - } - return 0; + if ((dom_len = strlen(dom)) == 0) + return 0; + + if ((tld_len = strlen(tld)) == 0) + return 0; + + /* dom cannot be shorter than what we are looking for */ + if (tld_len > dom_len) + return 0; + + p = dom + dom_len - tld_len; + + return strcaseeq(p, tld); +} + +/* check if dom is a subdomain of tld */ +int in_domain(const char *dom, const char *tld) +{ + size_t dom_len, tld_len; + const char *p = NULL; + + if ((dom_len = strlen(dom)) == 0) + return 0; + + if ((tld_len = strlen(tld)) == 0) + return 0; + + /* dom cannot be shorter than what we are looking for */ + /* -1 to ignore dom containing just a dot and tld */ + if (tld_len >= dom_len - 1) + return 0; + + p = dom + dom_len - tld_len; + + /* fail if the character before tld is not a dot */ + if (*(p - 1) != '.') + return 0; + + return strcaseeq(p, tld); } const char *is_new_gtld(const char *s) @@ -1054,8 +1101,8 @@ const char *is_new_gtld(const char *s) int i; for (i = 0; new_gtlds[i]; i++) - if (domcmp(s, new_gtlds[i])) - return new_gtlds[i] + 1; + if (in_domain(s, new_gtlds[i])) + return new_gtlds[i]; return 0; } @@ -1063,7 +1110,7 @@ const char *is_new_gtld(const char *s) /* * Attempt to normalize a query by removing trailing dots and whitespace, * then convert the domain to punycode. - * The function assumes that the domain is the last token of they query. + * The function assumes that the domain is the last token of the query. * Returns a malloc'ed string which needs to be freed by the caller. */ char *normalize_domain(const char *dom) @@ -1074,10 +1121,15 @@ char *normalize_domain(const char *dom) #endif ret = strdup(dom); - /* eat trailing dots and blanks */ - p = ret + strlen(ret); - for (; *p == '.' || *p == ' ' || *p == '\t' || p == ret; p--) + /* start from the last character */ + p = ret + strlen(ret) - 1; + /* and then eat trailing dots and blanks */ + while (p > ret) { + if (!(*p == '.' || *p == ' ' || *p == '\t')) + break; *p = '\0'; + p--; + } #ifdef HAVE_LIBIDN /* find the start of the last word if there are spaces in the query */ @@ -1235,19 +1287,23 @@ char *convert_inaddr(const char *s) if (errno || a < 0 || a > 255 || *endptr != '.') return strdup("0.0.0.0"); - if (domcmp(endptr + 1, ".in-addr.arpa")) { + if (in_domain(endptr + 1, "in-addr.arpa")) { b = strtol(endptr + 1, &endptr, 10); /* 1.2. */ if (errno || b < 0 || b > 255 || *endptr != '.') return strdup("0.0.0.0"); - if (domcmp(endptr + 1, ".in-addr.arpa")) { + if (in_domain(endptr + 1, "in-addr.arpa")) { c = strtol(endptr + 1, &endptr, 10); /* 1.2.3. */ if (errno || c < 0 || c > 255 || *endptr != '.') return strdup("0.0.0.0"); - if (domcmp(endptr + 1, ".in-addr.arpa")) + if (in_domain(endptr + 1, "in-addr.arpa")) return strdup("0.0.0.0"); + } else { + c = b; b = a; a = 0; } + } else { + c = a; a = 0; } new = malloc(sizeof("255.255.255.255")); diff --git a/whois.h b/whois.h index 3fd49bb..205b763 100644 --- a/whois.h +++ b/whois.h @@ -28,7 +28,8 @@ int japanese_locale(void); unsigned long myinet_aton(const char *); unsigned long asn32_to_long(const char *); int isasciidigit(const char); -int domcmp(const char *, const char *); +int endstrcaseeq(const char *, const char *); +int in_domain(const char *, const char *); const char *is_new_gtld(const char *); int domfind(const char *, const char *[]); char *normalize_domain(const char *);