X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_sqlauth.cpp;h=df97145be95d51744ae1588b127e0bd38a521e6e;hb=a5d110282a864fd2e91b51ce360a977cd0643657;hp=df2dd019065978ae99f2532088e824d2db80a3db;hpb=410de52634ddeabfe9a57aa15131311d16abb42c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_sqlauth.cpp b/src/modules/m_sqlauth.cpp index df2dd0190..df97145be 100644 --- a/src/modules/m_sqlauth.cpp +++ b/src/modules/m_sqlauth.cpp @@ -1,21 +1,27 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2010 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits + * Copyright (C) 2009-2010 Daniel De Graaf * - * This program is free but copyrighted software; see - * the file COPYING for details. + * 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 + * License as published by the Free Software Foundation, version 2. * - * --------------------------------------------------- + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + #include "inspircd.h" #include "sql.h" #include "hash.h" -/* $ModDesc: Allow/Deny connections based upon an arbitary SQL table */ +/* $ModDesc: Allow/Deny connections based upon an arbitrary SQL table */ enum AuthState { AUTH_STATE_NONE = 0, @@ -29,8 +35,10 @@ class AuthQuery : public SQLQuery const std::string uid; LocalIntExt& pendingExt; bool verbose; - AuthQuery(Module* me, const std::string& db, const std::string& q, const std::string& u, LocalIntExt& e, bool v) - : SQLQuery(me, db, q), uid(u), pendingExt(e), verbose(v) {} + AuthQuery(Module* me, const std::string& u, LocalIntExt& e, bool v) + : SQLQuery(me), uid(u), pendingExt(e), verbose(v) + { + } void OnResult(SQLResult& res) { @@ -44,7 +52,7 @@ class AuthQuery : public SQLQuery else { if (verbose) - ServerInstance->SNO->WriteGlobalSno('a', "Forbidden connection from %s!%s@%s (SQL query returned no matches)", user->nick.c_str(), user->ident.c_str(), user->host.c_str()); + ServerInstance->SNO->WriteGlobalSno('a', "Forbidden connection from %s (SQL query returned no matches)", user->GetFullRealHost().c_str()); pendingExt.set(user, AUTH_STATE_FAIL); } } @@ -56,7 +64,7 @@ class AuthQuery : public SQLQuery return; pendingExt.set(user, AUTH_STATE_FAIL); if (verbose) - ServerInstance->SNO->WriteGlobalSno('a', "Forbidden connection from %s!%s@%s (SQL query failed: %s)", user->nick.c_str(), user->ident.c_str(), user->host.c_str(), error.Str()); + ServerInstance->SNO->WriteGlobalSno('a', "Forbidden connection from %s (SQL query failed: %s)", user->GetFullRealHost().c_str(), error.Str()); } }; @@ -68,7 +76,6 @@ class ModuleSQLAuth : public Module std::string freeformquery; std::string killreason; std::string allowpattern; - std::string databaseid; bool verbose; public: @@ -80,19 +87,22 @@ class ModuleSQLAuth : public Module { ServerInstance->Modules->AddService(pendingExt); OnRehash(NULL); - Implementation eventlist[] = { I_OnUserDisconnect, I_OnCheckReady, I_OnRehash, I_OnUserRegister }; - ServerInstance->Modules->Attach(eventlist, this, 4); + Implementation eventlist[] = { I_OnCheckReady, I_OnRehash, I_OnUserRegister }; + ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); } void OnRehash(User* user) { - ConfigReader Conf; - - databaseid = Conf.ReadValue("sqlauth", "dbid", 0); /* Database ID, given to the SQL service provider */ - freeformquery = Conf.ReadValue("sqlauth", "query", 0); /* Field name where username can be found */ - killreason = Conf.ReadValue("sqlauth", "killreason", 0); /* Reason to give when access is denied to a user (put your reg details here) */ - allowpattern = Conf.ReadValue("sqlauth", "allowpattern",0 ); /* Allow nicks matching this pattern without requiring auth */ - verbose = Conf.ReadFlag("sqlauth", "verbose", 0); /* Set to true if failed connects should be reported to operators */ + ConfigTag* conf = ServerInstance->Config->ConfValue("sqlauth"); + std::string dbid = conf->getString("dbid"); + if (dbid.empty()) + SQL.SetProvider("SQL"); + else + SQL.SetProvider("SQL/" + dbid); + freeformquery = conf->getString("query"); + killreason = conf->getString("killreason"); + allowpattern = conf->getString("allowpattern"); + verbose = conf->getBool("verbose"); } ModResult OnUserRegister(LocalUser* user) @@ -108,18 +118,18 @@ class ModuleSQLAuth : public Module if (pendingExt.get(user)) return MOD_RES_PASSTHRU; + if (!SQL) + { + ServerInstance->SNO->WriteGlobalSno('a', "Forbiding connection from %s (SQL database not present)", user->GetFullRealHost().c_str()); + ServerInstance->Users->QuitUser(user, killreason); + return MOD_RES_PASSTHRU; + } + pendingExt.set(user, AUTH_STATE_BUSY); - std::string thisquery = freeformquery; ParamM userinfo; - userinfo["nick"] = user->nick; + SQL->PopulateUserInfo(user, userinfo); userinfo["pass"] = user->password; - userinfo["host"] = user->host; - userinfo["ip"] = user->GetIPString(); - userinfo["gecos"] = user->fullname; - userinfo["ident"] = user->ident; - userinfo["server"] = user->server; - userinfo["uuid"] = user->uuid; HashProvider* md5 = ServerInstance->Modules->FindDataService("hash/md5"); if (md5) @@ -127,9 +137,9 @@ class ModuleSQLAuth : public Module HashProvider* sha256 = ServerInstance->Modules->FindDataService("hash/sha256"); if (sha256) - userinfo["$sha256pass"] = sha256->hexsum(user->password); + userinfo["sha256pass"] = sha256->hexsum(user->password); - SQL->submit(new AuthQuery(this, databaseid, SQL->FormatQuery(freeformquery, userinfo), user->uuid, pendingExt, verbose)); + SQL->submit(new AuthQuery(this, user->uuid, pendingExt, verbose), freeformquery, userinfo); return MOD_RES_PASSTHRU; } @@ -151,7 +161,7 @@ class ModuleSQLAuth : public Module Version GetVersion() { - return Version("Allow/Deny connections based upon an arbitary SQL table", VF_VENDOR); + return Version("Allow/Deny connections based upon an arbitrary SQL table", VF_VENDOR); } };