diff --git a/lib/dns/tests/geoip_test.c b/lib/dns/tests/geoip_test.c index 3c687bdc3b..71b447bbc3 100644 --- a/lib/dns/tests/geoip_test.c +++ b/lib/dns/tests/geoip_test.c @@ -35,12 +35,12 @@ #if defined(HAVE_GEOIP2) #include -/* TODO GEOIP2 */ -#define TEST_GEOIP_DATA "" +/* Use GeoIP2 databases from the 'geoip2' system test */ +#define TEST_GEOIP_DATA "../../../bin/tests/system/geoip2/data" #elif defined(HAVE_GEOIP) #include -/* We use GeoIP databases from the 'geoip' system test */ +/* Use GeoIP databases from the 'geoip' system test */ #define TEST_GEOIP_DATA "../../../bin/tests/system/geoip/data" #endif @@ -69,13 +69,36 @@ _teardown(void **state) { static dns_geoip_databases_t geoip = DNS_GEOIP_DATABASE_INIT; #endif /* HAVE_GEOIP || HAVE_GEOIP2 */ -#ifdef HAVE_GEOIP -/* - * Helper functions - * (Mostly copied from bin/named/geoip.c) - */ -static dns_geoip_databases_t geoip = { NULL }; +#if defined(HAVE_GEOIP2) +static MMDB_s geoip_country, geoip_city, geoip_as, geoip_isp, geoip_domain; +static MMDB_s * +open_geoip2(const char *dir, const char *dbfile, MMDB_s *mmdb) { + char pathbuf[PATH_MAX]; + int ret; + + snprintf(pathbuf, sizeof(pathbuf), "%s/%s", dir, dbfile); + ret = MMDB_open(pathbuf, MMDB_MODE_MMAP, mmdb); + if (ret == MMDB_SUCCESS) { + return (mmdb); + } + + return (NULL); +} + +static void +load_geoip(const char *dir) { + geoip.country = open_geoip2(dir, "GeoIP2-Country.mmdb", + &geoip_country); + geoip.city = open_geoip2(dir, "GeoIP2-City.mmdb", &geoip_city); + geoip.as = open_geoip2(dir, "GeoLite2-ASN.mmdb", &geoip_as); + geoip.isp = open_geoip2(dir, "GeoIP2-ISP.mmdb", &geoip_isp); + geoip.domain = open_geoip2(dir, "GeoIP2-Domain.mmdb", &geoip_domain); +} +#elif defined(HAVE_GEOIP) +/* + * Helper functions (mostly copied from bin/named/geoip.c) + */ static void init_geoip_db(void **dbp, GeoIPDBTypes edition, GeoIPDBTypes fallback, GeoIPOptions method, const char *name) @@ -153,6 +176,24 @@ load_geoip(const char *dir) { method, "NetSpeed"); } +static bool +do_lookup_int(const char *addr, dns_geoip_subtype_t subtype, int id) { + dns_geoip_elem_t elt; + struct in_addr in4; + isc_netaddr_t na; + + inet_pton(AF_INET, addr, &in4); + isc_netaddr_fromin(&na, &in4); + + elt.subtype = subtype; + elt.as_int = id; + + return (dns_geoip_match(&na, &geoip, &elt)); +} + +#endif /* HAVE_GEOIP */ + +#if defined(HAVE_GEOIP) || defined(HAVE_GEOIP2) static bool do_lookup_string(const char *addr, dns_geoip_subtype_t subtype, const char *string) @@ -187,21 +228,6 @@ do_lookup_string_v6(const char *addr, dns_geoip_subtype_t subtype, return (dns_geoip_match(&na, &geoip, &elt)); } -static bool -do_lookup_int(const char *addr, dns_geoip_subtype_t subtype, int id) { - dns_geoip_elem_t elt; - struct in_addr in4; - isc_netaddr_t na; - - inet_pton(AF_INET, addr, &in4); - isc_netaddr_fromin(&na, &in4); - - elt.subtype = subtype; - elt.as_int = id; - - return (dns_geoip_match(&na, &geoip, &elt)); -} - /* GeoIP country matching */ static void country(void **state) { @@ -212,16 +238,19 @@ country(void **state) { /* Use databases from the geoip system test */ load_geoip(TEST_GEOIP_DATA); +#ifdef HAVE_GEOIP2 + if (geoip.country == NULL) { + skip(); + } +#else /* HAVE_GEOIP */ if (geoip.country_v4 == NULL) { skip(); } +#endif /* HAVE_GEOIP */ match = do_lookup_string("10.53.0.1", dns_geoip_country_code, "AU"); assert_true(match); - match = do_lookup_string("10.53.0.1", dns_geoip_country_code3, "AUS"); - assert_true(match); - match = do_lookup_string("10.53.0.1", dns_geoip_country_name, "Australia"); assert_true(match); @@ -244,18 +273,20 @@ country_v6(void **state) { /* Use databases from the geoip system test */ load_geoip(TEST_GEOIP_DATA); +#ifdef HAVE_GEOIP2 + if (geoip.country == NULL) { + skip(); + } +#else /* HAVE_GEOIP */ if (geoip.country_v6 == NULL) { skip(); } +#endif /* HAVE_GEOIP */ match = do_lookup_string_v6("fd92:7065:b8e:ffff::1", dns_geoip_country_code, "AU"); assert_true(match); - match = do_lookup_string_v6("fd92:7065:b8e:ffff::1", - dns_geoip_country_code3, "AUS"); - assert_true(match); - match = do_lookup_string_v6("fd92:7065:b8e:ffff::1", dns_geoip_country_name, "Australia"); assert_true(match); @@ -271,9 +302,15 @@ city(void **state) { /* Use databases from the geoip system test */ load_geoip(TEST_GEOIP_DATA); +#ifdef HAVE_GEOIP2 + if (geoip.city == NULL) { + skip(); + } +#else /* HAVE_GEOIP */ if (geoip.city_v4 == NULL) { skip(); } +#endif /* HAVE_GEOIP */ match = do_lookup_string("10.53.0.1", dns_geoip_city_continentcode, "NA"); @@ -283,10 +320,6 @@ city(void **state) { dns_geoip_city_countrycode, "US"); assert_true(match); - match = do_lookup_string("10.53.0.1", - dns_geoip_city_countrycode3, "USA"); - assert_true(match); - match = do_lookup_string("10.53.0.1", dns_geoip_city_countryname, "United States"); assert_true(match); @@ -307,11 +340,13 @@ city(void **state) { dns_geoip_city_postalcode, "94063"); assert_true(match); +#ifdef HAVE_GEOIP match = do_lookup_int("10.53.0.1", dns_geoip_city_areacode, 650); assert_true(match); match = do_lookup_int("10.53.0.1", dns_geoip_city_metrocode, 807); assert_true(match); +#endif } /* GeoIP city (ipv6) matching */ @@ -324,9 +359,15 @@ city_v6(void **state) { /* Use databases from the geoip system test */ load_geoip(TEST_GEOIP_DATA); +#ifdef HAVE_GEOIP2 + if (geoip.city == NULL) { + skip(); + } +#else /* HAVE_GEOIP */ if (geoip.city_v6 == NULL) { skip(); } +#endif /* HAVE_GEOIP */ match = do_lookup_string_v6("fd92:7065:b8e:ffff::1", dns_geoip_city_continentcode, "NA"); @@ -336,10 +377,6 @@ city_v6(void **state) { dns_geoip_city_countrycode, "US"); assert_true(match); - match = do_lookup_string_v6("fd92:7065:b8e:ffff::1", - dns_geoip_city_countrycode3, "USA"); - assert_true(match); - match = do_lookup_string_v6("fd92:7065:b8e:ffff::1", dns_geoip_city_countryname, "United States"); @@ -362,7 +399,90 @@ city_v6(void **state) { assert_true(match); } +/* GeoIP asnum matching */ +static void +asnum(void **state) { + bool match; + UNUSED(state); + + /* Use databases from the geoip system test */ + load_geoip(TEST_GEOIP_DATA); + + if (geoip.as == NULL) { + skip(); + } + + + match = do_lookup_string("10.53.0.3", dns_geoip_as_asnum, "AS100003"); + assert_true(match); +} + +/* GeoIP isp matching */ +static void +isp(void **state) { + bool match; + + UNUSED(state); + + /* Use databases from the geoip system test */ + load_geoip(TEST_GEOIP_DATA); + + if (geoip.isp == NULL) { + skip(); + } + + match = do_lookup_string("10.53.0.1", dns_geoip_isp_name, + "One Systems, Inc."); + assert_true(match); +} + +/* GeoIP org matching */ +static void +org(void **state) { + bool match; + + UNUSED(state); + + /* Use databases from the geoip system test */ + load_geoip(TEST_GEOIP_DATA); + +#ifdef HAVE_GEOIP2 + if (geoip.as == NULL) { + skip(); + } +#else /* HAVE_GEOIP */ + if (geoip.org == NULL) { + skip(); + } +#endif /* HAVE_GEOIP */ + + match = do_lookup_string("10.53.0.2", dns_geoip_org_name, + "Two Technology Ltd."); + assert_true(match); +} + +/* GeoIP domain matching */ +static void +domain(void **state) { + bool match; + + UNUSED(state); + + /* Use databases from the geoip system test */ + load_geoip(TEST_GEOIP_DATA); + + if (geoip.domain == NULL) { + skip(); + } + + match = do_lookup_string("10.53.0.5", + dns_geoip_domain_name, "five.es"); + assert_true(match); +} +#endif /* HAVE_GEOIP || HAVE_GEOIP2 */ + +#ifdef HAVE_GEOIP /* GeoIP region matching */ static void region(void **state) { @@ -390,6 +510,33 @@ region(void **state) { assert_true(match); } +/* GeoIP netspeed matching */ +static void +netspeed(void **state) { + bool match; + + UNUSED(state); + + /* Use databases from the geoip system test */ + load_geoip(TEST_GEOIP_DATA); + + if (geoip.netspeed == NULL) { + skip(); + } + + match = do_lookup_int("10.53.0.1", dns_geoip_netspeed_id, 0); + assert_true(match); + + match = do_lookup_int("10.53.0.2", dns_geoip_netspeed_id, 1); + assert_true(match); + + match = do_lookup_int("10.53.0.3", dns_geoip_netspeed_id, 2); + assert_true(match); + + match = do_lookup_int("10.53.0.4", dns_geoip_netspeed_id, 3); + assert_true(match); +} + /* * GeoIP best-database matching * (With no specified databse and a city database available, answers @@ -463,136 +610,30 @@ best(void **state) { dns_geoip_countryname, "Canada"); assert_true(match); } - - -/* GeoIP asnum matching */ -static void -asnum(void **state) { - bool match; - - UNUSED(state); - - /* Use databases from the geoip system test */ - load_geoip(TEST_GEOIP_DATA); - - if (geoip.as == NULL) { - skip(); - } - - - match = do_lookup_string("10.53.0.3", dns_geoip_as_asnum, - "AS100003 Three Network Labs"); - assert_true(match); -} - -/* GeoIP isp matching */ -static void -isp(void **state) { - bool match; - - UNUSED(state); - - /* Use databases from the geoip system test */ - load_geoip(TEST_GEOIP_DATA); - - if (geoip.isp == NULL) { - skip(); - } - - match = do_lookup_string("10.53.0.1", dns_geoip_isp_name, - "One Systems, Inc."); - assert_true(match); -} - -/* GeoIP org matching */ -static void -org(void **state) { - bool match; - - UNUSED(state); - - /* Use databases from the geoip system test */ - load_geoip(TEST_GEOIP_DATA); - - if (geoip.org == NULL) { - skip(); - } - - match = do_lookup_string("10.53.0.2", dns_geoip_org_name, - "Two Technology Ltd."); - assert_true(match); -} - -/* GeoIP domain matching */ -static void -domain(void **state) { - bool match; - - UNUSED(state); - - /* Use databases from the geoip system test */ - load_geoip(TEST_GEOIP_DATA); - - if (geoip.domain == NULL) { - skip(); - } - - match = do_lookup_string("10.53.0.4", - dns_geoip_domain_name, "four.com"); - assert_true(match); -} - -/* GeoIP netspeed matching */ -static void -netspeed(void **state) { - bool match; - - UNUSED(state); - - /* Use databases from the geoip system test */ - load_geoip(TEST_GEOIP_DATA); - - if (geoip.netspeed == NULL) { - skip(); - } - - match = do_lookup_int("10.53.0.1", dns_geoip_netspeed_id, 0); - assert_true(match); - - match = do_lookup_int("10.53.0.2", dns_geoip_netspeed_id, 1); - assert_true(match); - - match = do_lookup_int("10.53.0.3", dns_geoip_netspeed_id, 2); - assert_true(match); - - match = do_lookup_int("10.53.0.4", dns_geoip_netspeed_id, 3); - assert_true(match); -} #endif /* HAVE_GEOIP */ int main(void) { -#if defined(HAVE_GEOIP2) - /* TODO GEOIP2 */ - print_message("1..0 # Skip geoip2 tests not complete\n"); -#elif defined(HAVE_GEOIP) +#if defined(HAVE_GEOIP) || defined(HAVE_GEOIP2) const struct CMUnitTest tests[] = { cmocka_unit_test_setup_teardown(country, _setup, _teardown), cmocka_unit_test_setup_teardown(country_v6, _setup, _teardown), cmocka_unit_test_setup_teardown(city, _setup, _teardown), cmocka_unit_test_setup_teardown(city_v6, _setup, _teardown), - cmocka_unit_test_setup_teardown(region, _setup, _teardown), - cmocka_unit_test_setup_teardown(best, _setup, _teardown), cmocka_unit_test_setup_teardown(asnum, _setup, _teardown), cmocka_unit_test_setup_teardown(isp, _setup, _teardown), cmocka_unit_test_setup_teardown(org, _setup, _teardown), cmocka_unit_test_setup_teardown(domain, _setup, _teardown), +#ifdef HAVE_GEOIP + cmocka_unit_test_setup_teardown(region, _setup, _teardown), cmocka_unit_test_setup_teardown(netspeed, _setup, _teardown), + cmocka_unit_test_setup_teardown(best, _setup, _teardown), +#endif /* HAVE_GEOIP */ }; return (cmocka_run_group_tests(tests, NULL, NULL)); #else - print_message("1..0 # Skip geoip not enabled\n"); + print_message("1..0 # Skip GeoIP not enabled\n"); #endif } diff --git a/lib/isccfg/aclconf.c b/lib/isccfg/aclconf.c index da26c3f9d8..1d10f7843b 100644 --- a/lib/isccfg/aclconf.c +++ b/lib/isccfg/aclconf.c @@ -519,7 +519,7 @@ parse_geoip_element(const cfg_obj_t *obj, isc_log_t *lctx, } if (geoip_dbnames[i] == NULL) { cfg_obj_log(obj, lctx, ISC_LOG_ERROR, - "database '%s' is not defined for GeoIP", + "database '%s' is not defined for GeoIP2", dbname); return (ISC_R_UNEXPECTED); } @@ -862,6 +862,7 @@ parse_geoip_element(const cfg_obj_t *obj, isc_log_t *lctx, cfg_obj_log(obj, lctx, ISC_LOG_ERROR, "database '%s' is not defined for GeoIP", dbname); + return (ISC_R_UNEXPECTED); } }