/* +------------------------------------+ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * * InspIRCd: (C) 2002-2008 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- */ #include "inspircd.h" #include "xline.h" #include /* $ModDesc: Provides a way to restrict users by country using GeoIP lookup */ /* $LinkerFlags: -lGeoIP */ class ModuleGeoIP : public Module { GeoIP * gi; bool banunknown; std::map GeoBans; public: ModuleGeoIP(InspIRCd *Me) : Module(Me) { OnRehash(NULL, ""); Implementation eventlist[] = { I_OnRehash, I_OnUserRegister }; ServerInstance->Modules->Attach(eventlist, this, 2); gi = GeoIP_new(GEOIP_STANDARD); } virtual ~ModuleGeoIP() { } virtual Version GetVersion() { return Version(1, 2, 0, 0, VF_VENDOR, API_VERSION); } virtual void OnRehash(User* user, const std::string ¶meter) { GeoBans.clear(); ConfigReader conf(ServerInstance); banunknown = conf.ReadFlag("geoip", "banunknown", 0); for (int i = 0; i < conf.Enumerate("geoban"); ++i) { std::string countrycode = conf.ReadValue("geoban", "country", i); std::string reason = conf.ReadValue("geoban", "reason", i); GeoBans[countrycode] = reason; } } virtual int OnUserRegister(User* user) { /* only do lookups on local users */ if (IS_LOCAL(user)) { const char* c = GeoIP_country_code_by_addr(gi, user->GetIPString()); if (c) { std::map::iterator x = GeoBans.find(c); if (x != GeoBans.end()) User::QuitUser(ServerInstance, user, x->second); } else { if (banunknown) User::QuitUser(ServerInstance, user, "Could not identify your country of origin. Access denied."); } } return 0; } }; MODULE_INIT(ModuleGeoIP)