From 63c7bd72e2412b2d14d0ff10e4fdf25eab45cd31 Mon Sep 17 00:00:00 2001 From: Jose Marcial Vieira Bisneto Date: Thu, 24 Nov 2016 19:52:19 -0300 Subject: [PATCH] Initial implementation of namesys/isdomain --- include/ipfs/namesys/isdomain.h | 740 ++++++++++++++++++++++++++++++++ include/ipfs/namesys/namesys.h | 11 + namesys/is_domain_test.c | 33 ++ namesys/isdomain.c | 116 +++++ 4 files changed, 900 insertions(+) create mode 100644 include/ipfs/namesys/isdomain.h create mode 100644 namesys/is_domain_test.c create mode 100644 namesys/isdomain.c diff --git a/include/ipfs/namesys/isdomain.h b/include/ipfs/namesys/isdomain.h new file mode 100644 index 0000000..96de2f2 --- /dev/null +++ b/include/ipfs/namesys/isdomain.h @@ -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 diff --git a/include/ipfs/namesys/namesys.h b/include/ipfs/namesys/namesys.h index 6510f07..b98ef88 100644 --- a/include/ipfs/namesys/namesys.h +++ b/include/ipfs/namesys/namesys.h @@ -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 diff --git a/namesys/is_domain_test.c b/namesys/is_domain_test.c new file mode 100644 index 0000000..35d6914 --- /dev/null +++ b/namesys/is_domain_test.c @@ -0,0 +1,33 @@ +#include +#include +#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; +} diff --git a/namesys/isdomain.c b/namesys/isdomain.c new file mode 100644 index 0000000..cd1e5a8 --- /dev/null +++ b/namesys/isdomain.c @@ -0,0 +1,116 @@ +#include +#include +#include +#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); +}