diff options
author | Peter Powell <petpow@saberuk.com> | 2018-10-13 13:15:25 +0100 |
---|---|---|
committer | Peter Powell <petpow@saberuk.com> | 2018-10-13 14:04:33 +0100 |
commit | a0f7d012791d79b67b56b62415f7901d5e48870f (patch) | |
tree | 6cfb5e95f8035295f1d8bfedede87190a0d1e9d4 /src/modules/extra | |
parent | 553877f7a9eff26166dfa4d953d6f69f9420de28 (diff) |
Implement support for IPv6 GeoIP lookups.
Diffstat (limited to 'src/modules/extra')
-rw-r--r-- | src/modules/extra/m_geoip.cpp | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/src/modules/extra/m_geoip.cpp b/src/modules/extra/m_geoip.cpp index 0d7c2eb70..6272a5c24 100644 --- a/src/modules/extra/m_geoip.cpp +++ b/src/modules/extra/m_geoip.cpp @@ -53,15 +53,24 @@ class ModuleGeoIP : public Module, public Stats::EventListener, public Whois::Ev { StringExtItem ext; bool extban; - GeoIP* gi; + GeoIP* ipv4db; + GeoIP* ipv6db; std::string* SetExt(User* user) { - const char* c = GeoIP_country_code_by_addr(gi, user->GetIPString().c_str()); - if (!c) - c = "UNK"; + const char* code = NULL; + switch (user->client_sa.family()) + { + case AF_INET: + code = GeoIP_country_code_by_addr(ipv4db, user->GetIPString().c_str()); + break; + + case AF_INET6: + code = GeoIP_country_code_by_addr_v6(ipv6db, user->GetIPString().c_str()); + break; + } - ext.set(user, c); + ext.set(user, code ? code : "UNK"); return ext.get(user); } @@ -71,15 +80,20 @@ class ModuleGeoIP : public Module, public Stats::EventListener, public Whois::Ev , Whois::EventListener(this) , ext("geoip_cc", ExtensionItem::EXT_USER, this) , extban(true) - , gi(NULL) + , ipv4db(NULL) + , ipv6db(NULL) { } void init() CXX11_OVERRIDE { - gi = GeoIP_new(GEOIP_STANDARD); - if (gi == NULL) - throw ModuleException("Unable to initialize geoip, are you missing GeoIP.dat?"); + ipv4db = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD); + if (!ipv4db) + throw ModuleException("Unable to load the IPv4 GeoIP database. Are you missing GeoIP.dat?"); + + ipv6db = GeoIP_open_type(GEOIP_COUNTRY_EDITION_V6, GEOIP_STANDARD); + if (!ipv6db) + throw ModuleException("Unable to load the IPv6 GeoIP database. Are you missing GeoIPv6.dat?"); const UserManager::LocalList& list = ServerInstance->Users.GetLocalUsers(); for (UserManager::LocalList::const_iterator i = list.begin(); i != list.end(); ++i) @@ -94,8 +108,11 @@ class ModuleGeoIP : public Module, public Stats::EventListener, public Whois::Ev ~ModuleGeoIP() { - if (gi) - GeoIP_delete(gi); + if (ipv4db) + GeoIP_delete(ipv4db); + + if (ipv6db) + GeoIP_delete(ipv6db); } void ReadConfig(ConfigStatus&) CXX11_OVERRIDE |