Initial implementation of namesys/isdomain

This commit is contained in:
Jose Marcial Vieira Bisneto 2016-11-24 19:52:19 -03:00
parent b1d5440303
commit 63c7bd72e2
4 changed files with 900 additions and 0 deletions

View file

@ -0,0 +1,740 @@
#ifndef ISDOMAIN_H
#define ISDOMAIN_H
// TLDs is a set of TLDs, according to ICANN in 2014.
tlds TLDs[] = {
{ "AC", 1 },
{ "ACADEMY", 1 },
{ "ACCOUNTANTS", 1 },
{ "ACTIVE", 1 },
{ "ACTOR", 1 },
{ "AD", 1 },
{ "AE", 1 },
{ "AERO", 1 },
{ "AF", 1 },
{ "AG", 1 },
{ "AGENCY", 1 },
{ "AI", 1 },
{ "AIRFORCE", 1 },
{ "AL", 1 },
{ "ALLFINANZ", 1 },
{ "AM", 1 },
{ "AN", 1 },
{ "AO", 1 },
{ "AQ", 1 },
{ "AR", 1 },
{ "ARCHI", 1 },
{ "ARMY", 1 },
{ "ARPA", 1 },
{ "AS", 1 },
{ "ASIA", 1 },
{ "ASSOCIATES", 1 },
{ "AT", 1 },
{ "ATTORNEY", 1 },
{ "AU", 1 },
{ "AUCTION", 1 },
{ "AUDIO", 1 },
{ "AUTOS", 1 },
{ "AW", 1 },
{ "AX", 1 },
{ "AXA", 1 },
{ "AZ", 1 },
{ "BA", 1 },
{ "BAR", 1 },
{ "BARGAINS", 1 },
{ "BAYERN", 1 },
{ "BB", 1 },
{ "BD", 1 },
{ "BE", 1 },
{ "BEER", 1 },
{ "BERLIN", 1 },
{ "BEST", 1 },
{ "BF", 1 },
{ "BG", 1 },
{ "BH", 1 },
{ "BI", 1 },
{ "BID", 1 },
{ "BIKE", 1 },
{ "BIO", 1 },
{ "BIZ", 1 },
{ "BJ", 1 },
{ "BLACK", 1 },
{ "BLACKFRIDAY", 1 },
{ "BLUE", 1 },
{ "BM", 1 },
{ "BMW", 1 },
{ "BN", 1 },
{ "BNPPARIBAS", 1 },
{ "BO", 1 },
{ "BOO", 1 },
{ "BOUTIQUE", 1 },
{ "BR", 1 },
{ "BRUSSELS", 1 },
{ "BS", 1 },
{ "BT", 1 },
{ "BUDAPEST", 1 },
{ "BUILD", 1 },
{ "BUILDERS", 1 },
{ "BUSINESS", 1 },
{ "BUZZ", 1 },
{ "BV", 1 },
{ "BW", 1 },
{ "BY", 1 },
{ "BZ", 1 },
{ "BZH", 1 },
{ "CA", 1 },
{ "CAB", 1 },
{ "CAL", 1 },
{ "CAMERA", 1 },
{ "CAMP", 1 },
{ "CANCERRESEARCH", 1 },
{ "CAPETOWN", 1 },
{ "CAPITAL", 1 },
{ "CARAVAN", 1 },
{ "CARDS", 1 },
{ "CARE", 1 },
{ "CAREER", 1 },
{ "CAREERS", 1 },
{ "CASA", 1 },
{ "CASH", 1 },
{ "CAT", 1 },
{ "CATERING", 1 },
{ "CC", 1 },
{ "CD", 1 },
{ "CENTER", 1 },
{ "CEO", 1 },
{ "CERN", 1 },
{ "CF", 1 },
{ "CG", 1 },
{ "CH", 1 },
{ "CHANNEL", 1 },
{ "CHEAP", 1 },
{ "CHRISTMAS", 1 },
{ "CHROME", 1 },
{ "CHURCH", 1 },
{ "CI", 1 },
{ "CITIC", 1 },
{ "CITY", 1 },
{ "CK", 1 },
{ "CL", 1 },
{ "CLAIMS", 1 },
{ "CLEANING", 1 },
{ "CLICK", 1 },
{ "CLINIC", 1 },
{ "CLOTHING", 1 },
{ "CLUB", 1 },
{ "CM", 1 },
{ "CN", 1 },
{ "CO", 1 },
{ "CODES", 1 },
{ "COFFEE", 1 },
{ "COLLEGE", 1 },
{ "COLOGNE", 1 },
{ "COM", 1 },
{ "COMMUNITY", 1 },
{ "COMPANY", 1 },
{ "COMPUTER", 1 },
{ "CONDOS", 1 },
{ "CONSTRUCTION", 1 },
{ "CONSULTING", 1 },
{ "CONTRACTORS", 1 },
{ "COOKING", 1 },
{ "COOL", 1 },
{ "COOP", 1 },
{ "COUNTRY", 1 },
{ "CR", 1 },
{ "CREDIT", 1 },
{ "CREDITCARD", 1 },
{ "CRUISES", 1 },
{ "CU", 1 },
{ "CUISINELLA", 1 },
{ "CV", 1 },
{ "CW", 1 },
{ "CX", 1 },
{ "CY", 1 },
{ "CYMRU", 1 },
{ "CZ", 1 },
{ "DAD", 1 },
{ "DANCE", 1 },
{ "DATING", 1 },
{ "DAY", 1 },
{ "DE", 1 },
{ "DEALS", 1 },
{ "DEGREE", 1 },
{ "DEMOCRAT", 1 },
{ "DENTAL", 1 },
{ "DENTIST", 1 },
{ "DESI", 1 },
{ "DIAMONDS", 1 },
{ "DIET", 1 },
{ "DIGITAL", 1 },
{ "DIRECT", 1 },
{ "DIRECTORY", 1 },
{ "DISCOUNT", 1 },
{ "DJ", 1 },
{ "DK", 1 },
{ "DM", 1 },
{ "DNP", 1 },
{ "DO", 1 },
{ "DOMAINS", 1 },
{ "DURBAN", 1 },
{ "DVAG", 1 },
{ "DZ", 1 },
{ "EAT", 1 },
{ "EC", 1 },
{ "EDU", 1 },
{ "EDUCATION", 1 },
{ "EE", 1 },
{ "EG", 1 },
{ "EMAIL", 1 },
{ "ENGINEER", 1 },
{ "ENGINEERING", 1 },
{ "ENTERPRISES", 1 },
{ "EQUIPMENT", 1 },
{ "ER", 1 },
{ "ES", 1 },
{ "ESQ", 1 },
{ "ESTATE", 1 },
{ "ET", 1 },
{ "EU", 1 },
{ "EUS", 1 },
{ "EVENTS", 1 },
{ "EXCHANGE", 1 },
{ "EXPERT", 1 },
{ "EXPOSED", 1 },
{ "FAIL", 1 },
{ "FARM", 1 },
{ "FEEDBACK", 1 },
{ "FI", 1 },
{ "FINANCE", 1 },
{ "FINANCIAL", 1 },
{ "FISH", 1 },
{ "FISHING", 1 },
{ "FITNESS", 1 },
{ "FJ", 1 },
{ "FK", 1 },
{ "FLIGHTS", 1 },
{ "FLORIST", 1 },
{ "FLY", 1 },
{ "FM", 1 },
{ "FO", 1 },
{ "FOO", 1 },
{ "FORSALE", 1 },
{ "FOUNDATION", 1 },
{ "FR", 1 },
{ "FRL", 1 },
{ "FROGANS", 1 },
{ "FUND", 1 },
{ "FURNITURE", 1 },
{ "FUTBOL", 1 },
{ "GA", 1 },
{ "GAL", 1 },
{ "GALLERY", 1 },
{ "GB", 1 },
{ "GBIZ", 1 },
{ "GD", 1 },
{ "GE", 1 },
{ "GENT", 1 },
{ "GF", 1 },
{ "GG", 1 },
{ "GH", 1 },
{ "GI", 1 },
{ "GIFT", 1 },
{ "GIFTS", 1 },
{ "GIVES", 1 },
{ "GL", 1 },
{ "GLASS", 1 },
{ "GLE", 1 },
{ "GLOBAL", 1 },
{ "GLOBO", 1 },
{ "GM", 1 },
{ "GMAIL", 1 },
{ "GMO", 1 },
{ "GMX", 1 },
{ "GN", 1 },
{ "GOOGLE", 1 },
{ "GOP", 1 },
{ "GOV", 1 },
{ "GP", 1 },
{ "GQ", 1 },
{ "GR", 1 },
{ "GRAPHICS", 1 },
{ "GRATIS", 1 },
{ "GREEN", 1 },
{ "GRIPE", 1 },
{ "GS", 1 },
{ "GT", 1 },
{ "GU", 1 },
{ "GUIDE", 1 },
{ "GUITARS", 1 },
{ "GURU", 1 },
{ "GW", 1 },
{ "GY", 1 },
{ "HAMBURG", 1 },
{ "HAUS", 1 },
{ "HEALTHCARE", 1 },
{ "HELP", 1 },
{ "HERE", 1 },
{ "HIPHOP", 1 },
{ "HIV", 1 },
{ "HK", 1 },
{ "HM", 1 },
{ "HN", 1 },
{ "HOLDINGS", 1 },
{ "HOLIDAY", 1 },
{ "HOMES", 1 },
{ "HORSE", 1 },
{ "HOST", 1 },
{ "HOSTING", 1 },
{ "HOUSE", 1 },
{ "HOW", 1 },
{ "HR", 1 },
{ "HT", 1 },
{ "HU", 1 },
{ "IBM", 1 },
{ "ID", 1 },
{ "IE", 1 },
{ "IL", 1 },
{ "IM", 1 },
{ "IMMO", 1 },
{ "IMMOBILIEN", 1 },
{ "IN", 1 },
{ "INDUSTRIES", 1 },
{ "INFO", 1 },
{ "ING", 1 },
{ "INK", 1 },
{ "INSTITUTE", 1 },
{ "INSURE", 1 },
{ "INT", 1 },
{ "INTERNATIONAL", 1 },
{ "INVESTMENTS", 1 },
{ "IO", 1 },
{ "IQ", 1 },
{ "IR", 1 },
{ "IS", 1 },
{ "IT", 1 },
{ "JE", 1 },
{ "JETZT", 1 },
{ "JM", 1 },
{ "JO", 1 },
{ "JOBS", 1 },
{ "JOBURG", 1 },
{ "JP", 1 },
{ "JUEGOS", 1 },
{ "KAUFEN", 1 },
{ "KE", 1 },
{ "KG", 1 },
{ "KH", 1 },
{ "KI", 1 },
{ "KIM", 1 },
{ "KITCHEN", 1 },
{ "KIWI", 1 },
{ "KM", 1 },
{ "KN", 1 },
{ "KOELN", 1 },
{ "KP", 1 },
{ "KR", 1 },
{ "KRD", 1 },
{ "KRED", 1 },
{ "KW", 1 },
{ "KY", 1 },
{ "KZ", 1 },
{ "LA", 1 },
{ "LACAIXA", 1 },
{ "LAND", 1 },
{ "LAWYER", 1 },
{ "LB", 1 },
{ "LC", 1 },
{ "LEASE", 1 },
{ "LGBT", 1 },
{ "LI", 1 },
{ "LIFE", 1 },
{ "LIGHTING", 1 },
{ "LIMITED", 1 },
{ "LIMO", 1 },
{ "LINK", 1 },
{ "LK", 1 },
{ "LOANS", 1 },
{ "LONDON", 1 },
{ "LOTTO", 1 },
{ "LR", 1 },
{ "LS", 1 },
{ "LT", 1 },
{ "LTDA", 1 },
{ "LU", 1 },
{ "LUXE", 1 },
{ "LUXURY", 1 },
{ "LV", 1 },
{ "LY", 1 },
{ "MA", 1 },
{ "MAISON", 1 },
{ "MANAGEMENT", 1 },
{ "MANGO", 1 },
{ "MARKET", 1 },
{ "MARKETING", 1 },
{ "MC", 1 },
{ "MD", 1 },
{ "ME", 1 },
{ "MEDIA", 1 },
{ "MEET", 1 },
{ "MELBOURNE", 1 },
{ "MEME", 1 },
{ "MENU", 1 },
{ "MG", 1 },
{ "MH", 1 },
{ "MIAMI", 1 },
{ "MIL", 1 },
{ "MINI", 1 },
{ "MK", 1 },
{ "ML", 1 },
{ "MM", 1 },
{ "MN", 1 },
{ "MO", 1 },
{ "MOBI", 1 },
{ "MODA", 1 },
{ "MOE", 1 },
{ "MONASH", 1 },
{ "MORTGAGE", 1 },
{ "MOSCOW", 1 },
{ "MOTORCYCLES", 1 },
{ "MOV", 1 },
{ "MP", 1 },
{ "MQ", 1 },
{ "MR", 1 },
{ "MS", 1 },
{ "MT", 1 },
{ "MU", 1 },
{ "MUSEUM", 1 },
{ "MV", 1 },
{ "MW", 1 },
{ "MX", 1 },
{ "MY", 1 },
{ "MZ", 1 },
{ "NA", 1 },
{ "NAGOYA", 1 },
{ "NAME", 1 },
{ "NAVY", 1 },
{ "NC", 1 },
{ "NE", 1 },
{ "NET", 1 },
{ "NETWORK", 1 },
{ "NEUSTAR", 1 },
{ "NEW", 1 },
{ "NEXUS", 1 },
{ "NF", 1 },
{ "NG", 1 },
{ "NGO", 1 },
{ "NHK", 1 },
{ "NI", 1 },
{ "NINJA", 1 },
{ "NL", 1 },
{ "NO", 1 },
{ "NP", 1 },
{ "NR", 1 },
{ "NRA", 1 },
{ "NRW", 1 },
{ "NU", 1 },
{ "NYC", 1 },
{ "NZ", 1 },
{ "OKINAWA", 1 },
{ "OM", 1 },
{ "ONG", 1 },
{ "ONL", 1 },
{ "OOO", 1 },
{ "ORG", 1 },
{ "ORGANIC", 1 },
{ "OTSUKA", 1 },
{ "OVH", 1 },
{ "PA", 1 },
{ "PARIS", 1 },
{ "PARTNERS", 1 },
{ "PARTS", 1 },
{ "PE", 1 },
{ "PF", 1 },
{ "PG", 1 },
{ "PH", 1 },
{ "PHARMACY", 1 },
{ "PHOTO", 1 },
{ "PHOTOGRAPHY", 1 },
{ "PHOTOS", 1 },
{ "PHYSIO", 1 },
{ "PICS", 1 },
{ "PICTURES", 1 },
{ "PINK", 1 },
{ "PIZZA", 1 },
{ "PK", 1 },
{ "PL", 1 },
{ "PLACE", 1 },
{ "PLUMBING", 1 },
{ "PM", 1 },
{ "PN", 1 },
{ "POHL", 1 },
{ "POST", 1 },
{ "PR", 1 },
{ "PRAXI", 1 },
{ "PRESS", 1 },
{ "PRO", 1 },
{ "PROD", 1 },
{ "PRODUCTIONS", 1 },
{ "PROF", 1 },
{ "PROPERTIES", 1 },
{ "PROPERTY", 1 },
{ "PS", 1 },
{ "PT", 1 },
{ "PUB", 1 },
{ "PW", 1 },
{ "PY", 1 },
{ "QA", 1 },
{ "QPON", 1 },
{ "QUEBEC", 1 },
{ "RE", 1 },
{ "REALTOR", 1 },
{ "RECIPES", 1 },
{ "RED", 1 },
{ "REHAB", 1 },
{ "REISE", 1 },
{ "REISEN", 1 },
{ "REN", 1 },
{ "RENTALS", 1 },
{ "REPAIR", 1 },
{ "REPORT", 1 },
{ "REPUBLICAN", 1 },
{ "REST", 1 },
{ "RESTAURANT", 1 },
{ "REVIEWS", 1 },
{ "RICH", 1 },
{ "RIO", 1 },
{ "RO", 1 },
{ "ROCKS", 1 },
{ "RODEO", 1 },
{ "RS", 1 },
{ "RSVP", 1 },
{ "RU", 1 },
{ "RUHR", 1 },
{ "RW", 1 },
{ "RYUKYU", 1 },
{ "SA", 1 },
{ "SAARLAND", 1 },
{ "SARL", 1 },
{ "SB", 1 },
{ "SC", 1 },
{ "SCA", 1 },
{ "SCB", 1 },
{ "SCHMIDT", 1 },
{ "SCHULE", 1 },
{ "SCOT", 1 },
{ "SD", 1 },
{ "SE", 1 },
{ "SERVICES", 1 },
{ "SEXY", 1 },
{ "SG", 1 },
{ "SH", 1 },
{ "SHIKSHA", 1 },
{ "SHOES", 1 },
{ "SI", 1 },
{ "SINGLES", 1 },
{ "SJ", 1 },
{ "SK", 1 },
{ "SL", 1 },
{ "SM", 1 },
{ "SN", 1 },
{ "SO", 1 },
{ "SOCIAL", 1 },
{ "SOFTWARE", 1 },
{ "SOHU", 1 },
{ "SOLAR", 1 },
{ "SOLUTIONS", 1 },
{ "SOY", 1 },
{ "SPACE", 1 },
{ "SPIEGEL", 1 },
{ "SR", 1 },
{ "ST", 1 },
{ "SU", 1 },
{ "SUPPLIES", 1 },
{ "SUPPLY", 1 },
{ "SUPPORT", 1 },
{ "SURF", 1 },
{ "SURGERY", 1 },
{ "SUZUKI", 1 },
{ "SV", 1 },
{ "SX", 1 },
{ "SY", 1 },
{ "SYSTEMS", 1 },
{ "SZ", 1 },
{ "TATAR", 1 },
{ "TATTOO", 1 },
{ "TAX", 1 },
{ "TC", 1 },
{ "TD", 1 },
{ "TECHNOLOGY", 1 },
{ "TEL", 1 },
{ "TF", 1 },
{ "TG", 1 },
{ "TH", 1 },
{ "TIENDA", 1 },
{ "TIPS", 1 },
{ "TIROL", 1 },
{ "TJ", 1 },
{ "TK", 1 },
{ "TL", 1 },
{ "TM", 1 },
{ "TN", 1 },
{ "TO", 1 },
{ "TODAY", 1 },
{ "TOKYO", 1 },
{ "TOOLS", 1 },
{ "TOP", 1 },
{ "TOWN", 1 },
{ "TOYS", 1 },
{ "TP", 1 },
{ "TR", 1 },
{ "TRADE", 1 },
{ "TRAINING", 1 },
{ "TRAVEL", 1 },
{ "TT", 1 },
{ "TUI", 1 },
{ "TV", 1 },
{ "TW", 1 },
{ "TZ", 1 },
{ "UA", 1 },
{ "UG", 1 },
{ "UK", 1 },
{ "UNIVERSITY", 1 },
{ "UNO", 1 },
{ "UOL", 1 },
{ "US", 1 },
{ "UY", 1 },
{ "UZ", 1 },
{ "VA", 1 },
{ "VACATIONS", 1 },
{ "VC", 1 },
{ "VE", 1 },
{ "VEGAS", 1 },
{ "VENTURES", 1 },
{ "VERSICHERUNG", 1 },
{ "VET", 1 },
{ "VG", 1 },
{ "VI", 1 },
{ "VIAJES", 1 },
{ "VILLAS", 1 },
{ "VISION", 1 },
{ "VLAANDEREN", 1 },
{ "VN", 1 },
{ "VODKA", 1 },
{ "VOTE", 1 },
{ "VOTING", 1 },
{ "VOTO", 1 },
{ "VOYAGE", 1 },
{ "VU", 1 },
{ "WALES", 1 },
{ "WANG", 1 },
{ "WATCH", 1 },
{ "WEBCAM", 1 },
{ "WEBSITE", 1 },
{ "WED", 1 },
{ "WF", 1 },
{ "WHOSWHO", 1 },
{ "WIEN", 1 },
{ "WIKI", 1 },
{ "WILLIAMHILL", 1 },
{ "WME", 1 },
{ "WORK", 1 },
{ "WORKS", 1 },
{ "WORLD", 1 },
{ "WS", 1 },
{ "WTC", 1 },
{ "WTF", 1 },
{ "XN--1QQW23A", 1 },
{ "XN--3BST00M", 1 },
{ "XN--3DS443G", 1 },
{ "XN--3E0B707E", 1 },
{ "XN--45BRJ9C", 1 },
{ "XN--4GBRIM", 1 },
{ "XN--55QW42G", 1 },
{ "XN--55QX5D", 1 },
{ "XN--6FRZ82G", 1 },
{ "XN--6QQ986B3XL", 1 },
{ "XN--80ADXHKS", 1 },
{ "XN--80AO21A", 1 },
{ "XN--80ASEHDB", 1 },
{ "XN--80ASWG", 1 },
{ "XN--90A3AC", 1 },
{ "XN--C1AVG", 1 },
{ "XN--CG4BKI", 1 },
{ "XN--CLCHC0EA0B2G2A9GCD", 1 },
{ "XN--CZR694B", 1 },
{ "XN--CZRU2D", 1 },
{ "XN--D1ACJ3B", 1 },
{ "XN--FIQ228C5HS", 1 },
{ "XN--FIQ64B", 1 },
{ "XN--FIQS8S", 1 },
{ "XN--FIQZ9S", 1 },
{ "XN--FPCRJ9C3D", 1 },
{ "XN--FZC2C9E2C", 1 },
{ "XN--GECRJ9C", 1 },
{ "XN--H2BRJ9C", 1 },
{ "XN--I1B6B1A6A2E", 1 },
{ "XN--IO0A7I", 1 },
{ "XN--J1AMH", 1 },
{ "XN--J6W193G", 1 },
{ "XN--KPRW13D", 1 },
{ "XN--KPRY57D", 1 },
{ "XN--KPUT3I", 1 },
{ "XN--L1ACC", 1 },
{ "XN--LGBBAT1AD8J", 1 },
{ "XN--MGB9AWBF", 1 },
{ "XN--MGBA3A4F16A", 1 },
{ "XN--MGBAAM7A8H", 1 },
{ "XN--MGBAB2BD", 1 },
{ "XN--MGBAYH7GPA", 1 },
{ "XN--MGBBH1A71E", 1 },
{ "XN--MGBC0A9AZCG", 1 },
{ "XN--MGBERP4A5D4AR", 1 },
{ "XN--MGBX4CD0AB", 1 },
{ "XN--NGBC5AZD", 1 },
{ "XN--NQV7F", 1 },
{ "XN--NQV7FS00EMA", 1 },
{ "XN--O3CW4H", 1 },
{ "XN--OGBPF8FL", 1 },
{ "XN--P1ACF", 1 },
{ "XN--P1AI", 1 },
{ "XN--PGBS0DH", 1 },
{ "XN--Q9JYB4C", 1 },
{ "XN--RHQV96G", 1 },
{ "XN--S9BRJ9C", 1 },
{ "XN--SES554G", 1 },
{ "XN--UNUP4Y", 1 },
{ "XN--VERMGENSBERATER-CTB", 1 },
{ "XN--VERMGENSBERATUNG-PWB", 1 },
{ "XN--VHQUV", 1 },
{ "XN--WGBH1C", 1 },
{ "XN--WGBL6A", 1 },
{ "XN--XHQ521B", 1 },
{ "XN--XKC2AL3HYE2A", 1 },
{ "XN--XKC2DL3A5EE0H", 1 },
{ "XN--YFRO4I67O", 1 },
{ "XN--YGBI2AMMX", 1 },
{ "XN--ZFR164B", 1 },
{ "XXX", 1 },
{ "XYZ", 1 },
{ "YACHTS", 1 },
{ "YANDEX", 1 },
{ "YE", 1 },
{ "YOKOHAMA", 1 },
{ "YOUTUBE", 1 },
{ "YT", 1 },
{ "ZA", 1 },
{ "ZIP", 1 },
{ "ZM", 1 },
{ "ZONE", 1 },
{ "ZW", 1 },
{ NULL, 0 }
};
// ExtendedTLDs is a set of additional "TLDs", allowing decentralized name
// systems, like TOR and Namecoin.
tlds ExtendedTLDs[] = {
{ "BIT", 1 },
{ "ONION", 1 },
{ NULL, 0 }
};
#endif

View file

@ -54,6 +54,11 @@
publishers *Publisher;
} mpns;
typedef struct s_tlds {
char *str;
int condition;
} tlds;
int resolve (resolver *r, char **p, char *str, int depth, char **prefixes);
int Resolve(char **path, char *name);
int ResolveN(char **path, char *name, int depth);
@ -62,4 +67,10 @@
int PublishWithEOL (char *proto, ciPrivKey name, char *value, time_t eol);
int ProquintResolveOnce (char **p, char *name);
int domainMatchString (char *d);
int IsICANNTLD(char *s);
int IsExtendedTLD (char *s);
int IsTLD (char *s);
int IsDomain (char *s);
#endif //NAMESYS_H

33
namesys/is_domain_test.c Normal file
View file

@ -0,0 +1,33 @@
#include <stdio.h>
#include <time.h>
#include "ipfs/namesys/namesys.h"
int main(int argc, char **argv)
{
int i;
tlds chk[] = {
{ "foo.bar.baz.com", 1 },
{ "foo.bar.baz", 0 },
{ "foo.bar.baz.com.", 1 },
{ "com", 0 }, // yeah yeah...
{ ".", 0 }, // yeah yeah...
{ "..", 0 },
{ ".foo.com.", 0 },
{ ".foo.com", 0 },
{ "fo o.com", 0 },
{ "example.com", 1 },
{ "fjdoisajfdiosafdsa8fd8saf8dsa8fdsafdsa-fd-sa-fd-saf-dsa.org", 1 },
{ "fjdoisajfdiosafdsa8fd8saf8dsa8fdsafdsa-fd-sa-fd-saf-dsa.bit", 1 },
{ "fjdoisajfdiosafdsa8fd8saf8dsa8fdsafdsa-fd-sa-fd-saf-dsa.onion", 1 },
{ "a.b.c.d.e.f.g.h.i.j.k.l.museum", 1 },
{ "a.b.c.d.e.f.g.h.i.j.k.l", 0 },
{ NULL, 0 }
};
for (i = 0 ; chk[i].str ; i++) {
if (IsDomain (chk[i].str) != chk[i].condition) {
printf ("Misclassification: %s should be %d\n", chk[i].str, chk[i].condition);
}
}
return 0;
}

116
namesys/isdomain.c Normal file
View file

@ -0,0 +1,116 @@
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "ipfs/namesys/namesys.h"
#include "ipfs/namesys/isdomain.h"
void ToUpper(char *dst, char *src)
{
while(*src) {
*dst++ = toupper(*src++);
}
*dst = '\0';
}
int HasSuffix (char *s, char *suf)
{
char *p;
p = s + strlen(s) - strlen(suf);
return strcmp(p, suf) == 0;
}
int IsAtArray(tlds *a, char *s)
{
char str[strlen(s)+1];
ToUpper(str, s);
while(a->str) {
if (strcmp(a->str, str) == 0) {
return a->condition;
}
a++;
}
return 0;
}
int domainMatchString (char *d)
{
char str[strlen(d)+1], *p = str, *l;
ToUpper(str, d);
// l point to last two chars.
l = p + strlen(p) - 2;
// can't start with a dot
if (*p == '.') {
return 0; // invalid
}
// last 2 chars can't be a dot or a number.
if ((*l >= 'A' && *l <= 'Z') && (l[1] >= 'A' && l[1] <= 'Z')) {
while (*p) {
if ((*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || *p == '.' || *p == '-') {
p++;
} else {
return 0; // invalid
}
}
} else {
return 0; // invalid
}
return 1; // valid
}
// IsICANNTLD returns whether the given string is a TLD (Top Level Domain),
// according to ICANN. Well, really according to the TLDs listed in this
// package.
int IsICANNTLD(char *s)
{
return IsAtArray (TLDs, s);
}
// IsExtendedTLD returns whether the given string is a TLD (Top Level Domain),
// extended with a few other "TLDs", .bit, .onion
int IsExtendedTLD (char *s)
{
return IsAtArray (ExtendedTLDs, s);
}
// IsTLD returns whether the given string is a TLD (according to ICANN, or
// in the set of ExtendedTLDs listed in this package.
int IsTLD (char *s)
{
return IsICANNTLD (s) || IsExtendedTLD(s);
}
// IsDomain returns whether given string is a domain.
// It first checks the TLD, and then uses a regular expression.
int IsDomain (char *s)
{
char str[strlen(s)];
char *tld;
strcpy(str, s);
s = str; // work with local copy.
if (HasSuffix (s, ".")) {
s[strlen(s) - 1] = '\0';
}
tld = strrchr(s, '.');
if (!tld) { // don't have a dot.
return 0;
}
tld++; // ignore last dot
if (!IsTLD (tld)) {
return 0;
}
return domainMatchString(s);
}