123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- #include <u.h>
- #include <libc.h>
- #include <bio.h>
- #include <ndb.h>
- #include "whois.h"
- typedef struct Country Country;
- struct Country
- {
- char *code;
- char *name;
- };
- Country badc[] =
- {
- {"af", "afghanistan"},
- {"cu", "cuba"},
- {"ir", "iran"},
- {"iq", "iraq"},
- {"ly", "libya"},
- {"kp", "north korea"},
- {"sd", "sudan"},
- {"sy", "syria"},
- { 0, 0 }
- };
- Country goodc[] =
- {
- // the original, us and canada
- {"us", "united states of america"},
- {"ca", "canada"},
- {"gov", "gov"},
- {"mil", "mil"},
- // the european union
- { "eu", "european union" },
- { "be", "belgium" },
- { "de", "germany" },
- { "fr", "france" },
- { "it", "italy" },
- { "lu", "luxembourg" },
- { "nl", "netherlands" },
- { "dk", "denmark" },
- { "ie", "ireland" },
- { "gb", "great britain" },
- { "uk", "united kingdom" },
- { "gr", "greece" },
- { "es", "spain" },
- { "pt", "portugal" },
- { "au", "australia" },
- { "fi", "finland" },
- { "se", "sweden" },
- // the rest
- {"au", "australia"},
- {"no", "norway"},
- {"cz", "czech republic"},
- {"hu", "hungary"},
- {"pl", "poland"},
- {"jp", "japan"},
- {"ch", "switzerland"},
- {"nz", "new zealand"},
- { 0, 0 }
- };
- char *gov[] =
- {
- "gov",
- "gouv",
- "mil",
- "government",
- 0,
- };
- Country allc[] =
- {
- { "ad", "andorra" },
- { "ae", "united arab emirates" },
- { "af", "afghanistan" },
- { "ag", "antigua and barbuda" },
- { "ai", "anguilla" },
- { "al", "albania" },
- { "am", "armenia" },
- { "an", "netherlands antilles" },
- { "ao", "angola" },
- { "aq", "antarctica" },
- { "ar", "argentina" },
- { "as", "american samoa" },
- { "at", "austria" },
- { "au", "australia" },
- { "aw", "aruba" },
- { "az", "azerbaijan" },
- { "ba", "bosnia and herzegovina" },
- { "bb", "barbados" },
- { "bd", "bangladesh" },
- { "be", "belgium" },
- { "bf", "burkina faso" },
- { "bg", "bulgaria" },
- { "bh", "bahrain" },
- { "bi", "burundi" },
- { "bj", "benin" },
- { "bm", "bermuda" },
- { "bn", "brunei darussalam" },
- { "bo", "bolivia" },
- { "br", "brazil" },
- { "bs", "bahamas" },
- { "bt", "bhutan" },
- { "bu", "burma" },
- { "bv", "bouvet island" },
- { "bw", "botswana" },
- { "by", "belarus" },
- { "bz", "belize" },
- { "ca", "canada" },
- { "cc", "cocos (keeling) islands" },
- { "cf", "central african republic" },
- { "cg", "congo" },
- { "ch", "switzerland" },
- { "ci", "cote d'ivoire (ivory coast)" },
- { "ck", "cook islands" },
- { "cl", "chile" },
- { "cm", "cameroon" },
- { "cn", "china" },
- { "co", "colombia" },
- { "cr", "costa rica" },
- { "cs", "czechoslovakia (former)" },
- { "ct", "canton and enderbury island" },
- { "cu", "cuba" },
- { "cv", "cape verde" },
- { "cx", "christmas island" },
- { "cy", "cyprus" },
- { "cz", "czech republic" },
- { "dd", "german democratic republic" },
- { "de", "germany" },
- { "dj", "djibouti" },
- { "dk", "denmark" },
- { "dm", "dominica" },
- { "do", "dominican republic" },
- { "dz", "algeria" },
- { "ec", "ecuador" },
- { "ee", "estonia" },
- { "eg", "egypt" },
- { "eh", "western sahara" },
- { "er", "eritrea" },
- { "es", "spain" },
- { "et", "ethiopia" },
- { "eu", "european union" },
- { "fi", "finland" },
- { "fj", "fiji" },
- { "fk", "falkland islands (malvinas)" },
- { "fm", "micronesia" },
- { "fo", "faroe islands" },
- { "fr", "france" },
- { "fx", "france, metropolitan" },
- { "ga", "gabon" },
- { "gb", "great britain (uk)" },
- { "gd", "grenada" },
- { "ge", "georgia" },
- { "gf", "french guiana" },
- { "gh", "ghana" },
- { "gi", "gibraltar" },
- { "gl", "greenland" },
- { "gm", "gambia" },
- { "gn", "guinea" },
- { "gp", "guadeloupe" },
- { "gq", "equatorial guinea" },
- { "gr", "greece" },
- { "gs", "s. georgia and s. sandwich isls." },
- { "gt", "guatemala" },
- { "gu", "guam" },
- { "gw", "guinea-bissau" },
- { "gy", "guyana" },
- { "hk", "hong kong" },
- { "hm", "heard and mcdonald islands" },
- { "hn", "honduras" },
- { "hr", "croatia (hrvatska)" },
- { "ht", "haiti" },
- { "hu", "hungary" },
- { "id", "indonesia" },
- { "ie", "ireland" },
- { "il", "israel" },
- { "in", "india" },
- { "io", "british indian ocean territory" },
- { "iq", "iraq" },
- { "ir", "iran" },
- { "is", "iceland" },
- { "it", "italy" },
- { "jm", "jamaica" },
- { "jo", "jordan" },
- { "jp", "japan" },
- { "jt", "johnston island" },
- { "ke", "kenya" },
- { "kg", "kyrgyzstan" },
- { "kh", "cambodia (democratic kampuchea)" },
- { "ki", "kiribati" },
- { "km", "comoros" },
- { "kn", "saint kitts and nevis" },
- { "kp", "korea (north)" },
- { "kr", "korea (south)" },
- { "kw", "kuwait" },
- { "ky", "cayman islands" },
- { "kz", "kazakhstan" },
- { "la", "laos" },
- { "lb", "lebanon" },
- { "lc", "saint lucia" },
- { "li", "liechtenstein" },
- { "lk", "sri lanka" },
- { "lr", "liberia" },
- { "ls", "lesotho" },
- { "lt", "lithuania" },
- { "lu", "luxembourg" },
- { "lv", "latvia" },
- { "ly", "libya" },
- { "ma", "morocco" },
- { "mc", "monaco" },
- { "md", "moldova" },
- { "mg", "madagascar" },
- { "mh", "marshall islands" },
- { "mi", "midway islands" },
- { "mk", "macedonia" },
- { "ml", "mali" },
- { "mm", "myanmar" },
- { "mn", "mongolia" },
- { "mo", "macau" },
- { "mp", "northern mariana islands" },
- { "mq", "martinique" },
- { "mr", "mauritania" },
- { "ms", "montserrat" },
- { "mt", "malta" },
- { "mu", "mauritius" },
- { "mv", "maldives" },
- { "mw", "malawi" },
- { "mx", "mexico" },
- { "my", "malaysia" },
- { "mz", "mozambique" },
- { "na", "namibia" },
- { "nc", "new caledonia" },
- { "ne", "niger" },
- { "nf", "norfolk island" },
- { "ng", "nigeria" },
- { "ni", "nicaragua" },
- { "nl", "netherlands" },
- { "no", "norway" },
- { "np", "nepal" },
- { "nq", "dronning maud land" },
- { "nr", "nauru" },
- { "nt", "neutral zone" },
- { "nu", "niue" },
- { "nz", "new zealand (aotearoa)" },
- { "om", "oman" },
- { "pa", "panama" },
- { "pc", "pacific islands" },
- { "pe", "peru" },
- { "pf", "french polynesia" },
- { "pg", "papua new guinea" },
- { "ph", "philippines" },
- { "pk", "pakistan" },
- { "pl", "poland" },
- { "pm", "st. pierre and miquelon" },
- { "pn", "pitcairn" },
- { "pr", "puerto rico" },
- { "pu", "united states misc. pacific islands" },
- { "pt", "portugal" },
- { "pw", "palau" },
- { "py", "paraguay" },
- { "qa", "qatar" },
- { "re", "reunion" },
- { "ro", "romania" },
- { "ru", "russian federation" },
- { "rw", "rwanda" },
- { "sa", "saudi arabia" },
- { "sb", "solomon islands" },
- { "sc", "seychelles" },
- { "sd", "sudan" },
- { "se", "sweden" },
- { "sg", "singapore" },
- { "sh", "st. helena" },
- { "si", "slovenia" },
- { "sj", "svalbard and jan mayen islands" },
- { "sk", "slovak republic" },
- { "sl", "sierra leone" },
- { "sm", "san marino" },
- { "sn", "senegal" },
- { "so", "somalia" },
- { "sr", "suriname" },
- { "st", "sao tome and principe" },
- { "su", "ussr (former)" },
- { "sv", "el salvador" },
- { "sy", "syria" },
- { "sz", "swaziland" },
- { "tc", "turks and caicos islands" },
- { "td", "chad" },
- { "tf", "french southern territories" },
- { "tg", "togo" },
- { "th", "thailand" },
- { "tj", "tajikistan" },
- { "tk", "tokelau" },
- { "tm", "turkmenistan" },
- { "tn", "tunisia" },
- { "to", "tonga" },
- { "tp", "east timor" },
- { "tr", "turkey" },
- { "tt", "trinidad and tobago" },
- { "tv", "tuvalu" },
- { "tw", "taiwan" },
- { "tz", "tanzania" },
- { "ua", "ukraine" },
- { "ug", "uganda" },
- { "uk", "united kingdom" },
- { "um", "us minor outlying islands" },
- { "us", "united states" },
- { "uy", "uruguay" },
- { "uz", "uzbekistan" },
- { "va", "vatican city state (holy see)" },
- { "vc", "saint vincent and the grenadines" },
- { "ve", "venezuela" },
- { "vg", "virgin islands (british)" },
- { "vi", "virgin islands (u.s.)" },
- { "vn", "viet nam" },
- { "vu", "vanuatu" },
- { "wf", "wallis and futuna islands" },
- { "wk", "wake island" },
- { "ws", "samoa" },
- { "yd", "democratic yemen" },
- { "ye", "yemen" },
- { "yt", "mayotte" },
- { "yu", "yugoslavia" },
- { "za", "south africa" },
- { "zm", "zambia" },
- { "zr", "zaire" },
- { "zw", "zimbabwe" },
- {"gov", "gov"},
- {"mil", "mil"},
- { 0, 0 }
- };
- int classdebug;
- static int
- incountries(char *s, Country *cp)
- {
- for(; cp->code != 0; cp++)
- if(cistrcmp(s, cp->code) == 0
- || cistrcmp(s, cp->name) == 0)
- return 1;
- return 0;
- }
- static int
- indomains(char *s, char **dp)
- {
- for(; *dp != nil; dp++)
- if(cistrcmp(s, *dp) == 0)
- return 1;
- return 0;
- }
- int
- classify(char *ip, Ndbtuple *t)
- {
- int isgov, iscountry, isbadc, isgoodc;
- char dom[256];
- char *df[128];
- Ndbtuple *nt, *x;
- int n;
- isgov = iscountry = isbadc = 0;
- isgoodc = 1;
-
- for(nt = t; nt != nil; nt = nt->entry){
- if(strcmp(nt->attr, "country") == 0){
- iscountry = 1;
- if(incountries(nt->val, badc)){
- if(classdebug)fprint(2, "isbadc\n");
- isbadc = 1;
- isgoodc = 0;
- } else if(!incountries(nt->val, goodc)){
- if(classdebug)fprint(2, "!isgoodc\n");
- isgoodc = 0;
- }
- }
- /* domain names can always hurt, even without forward verification */
- if(strcmp(nt->attr, "dom") == 0){
- strncpy(dom, nt->val, sizeof dom);
- dom[sizeof(dom)-1] = 0;
- n = getfields(dom, df, nelem(df), 0, ".");
- /* a bad country in a domain name is always believed */
- if(incountries(df[n-1], badc)){
- if(classdebug)fprint(2, "isbadc dom\n");
- isbadc = 1;
- isgoodc = 0;
- }
- /* a goverment in a domain name is always believed */
- if(n > 1 && indomains(df[n-2], gov))
- isgov = 1;
- }
- }
- if(iscountry == 0){
- /* did the forward lookup work? */
- for(nt = t; nt != nil; nt = nt->entry){
- if(strcmp(nt->attr, "ip") == 0 && strcmp(nt->val, ip) == 0)
- break;
- }
- /* see if the domain name ends in a country code */
- if(nt != nil && (x = ndbfindattr(t, nt, "dom")) != nil){
- strncpy(dom, x->val, sizeof dom);
- dom[sizeof(dom)-1] = 0;
- n = getfields(dom, df, nelem(df), 0, ".");
- if(incountries(df[n-1], allc))
- iscountry = 1;
- }
- }
- if(iscountry == 0)
- return Cunknown;
- if(isbadc)
- return Cbadc;
- if(!isgoodc && isgov)
- return Cbadgov;
- return Cok;
- }
|