/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2019 Peter Powell <petpow@saberuk.com>
+ * Copyright (C) 2019-2021 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2019 Matt Schatz <genius3000@g3k.solutions>
*
* This file is part of InspIRCd. InspIRCd is free software: you can
* redistribute it and/or modify it under the terms of the GNU General Public
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/// $CompilerFlags: require_version("libmaxminddb" "0" "1.2.1") warning("The version of libmaxminddb you are using may cause a segmentation fault if given a corrupt database file!")
/// $CompilerFlags: find_compiler_flags("libmaxminddb" "")
+
/// $LinkerFlags: find_linker_flags("libmaxminddb" "-lmaxminddb")
+/// $PackageInfo: require_system("arch") libmaxminddb pkgconf
/// $PackageInfo: require_system("darwin") libmaxminddb pkg-config
/// $PackageInfo: require_system("debian" "9.0") libmaxminddb-dev pkg-config
/// $PackageInfo: require_system("ubuntu" "16.04") libmaxminddb-dev pkg-config
# pragma comment(lib, "libmaxminddb.lib")
#endif
-#include <maxminddb.h>
#include "inspircd.h"
#include "modules/geolocation.h"
+#include <maxminddb.h>
-class GeolocationExtItem : public LocalExtItem
+class GeolocationExtItem : public ExtensionItem
{
public:
GeolocationExtItem(Module* parent)
- : LocalExtItem("geolocation", ExtensionItem::EXT_USER, parent)
+ : ExtensionItem("geolocation", ExtensionItem::EXT_USER, parent)
+ {
+ }
+
+ std::string ToHuman(const Extensible* container, void* item) const CXX11_OVERRIDE
{
+ Geolocation::Location* location = static_cast<Geolocation::Location*>(item);
+ return location->GetName() + " [" + location->GetCode() + "]";
}
void free(Extensible* container, void* item) CXX11_OVERRIDE
Geolocation::Location* GetLocation(irc::sockets::sockaddrs& sa) CXX11_OVERRIDE
{
+ // Skip trying to look up a UNIX socket.
+ if (sa.family() != AF_INET && sa.family() != AF_INET6)
+ return NULL;
+
// Attempt to look up the socket address.
int result;
MMDB_lookup_result_s lookup = MMDB_lookup_sockaddr(&mmdb, &sa.sa, &result);
Version GetVersion() CXX11_OVERRIDE
{
- return Version("Provides Geolocation lookups using the libMaxMindDB library", VF_VENDOR);
+ return Version("Allows the server to perform geolocation lookups on both IP addresses and users.", VF_VENDOR);
}
void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
{
ConfigTag* tag = ServerInstance->Config->ConfValue("maxmind");
- const std::string file = ServerInstance->Config->Paths.PrependConfig(tag->getString("file", "GeoLite2-Country.mmdb"));
+ const std::string file = ServerInstance->Config->Paths.PrependConfig(tag->getString("file", "GeoLite2-Country.mmdb", 1));
// Try to read the new database.
MMDB_s mmdb;
void OnGarbageCollect() CXX11_OVERRIDE
{
for (LocationMap::iterator iter = geoapi.locations.begin(); iter != geoapi.locations.end(); )
- {
+ {
Geolocation::Location* location = iter->second;
if (location->GetUseCount())
{