X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_sqloper.cpp;h=3d5551eb0d1fb453195da155a2430d0bfff00e14;hb=acccaa39641500b8a691db4136e6571102a438ed;hp=281593cfa6b8a587ecb0e6a5b8c90ba85b6255b4;hpb=410de52634ddeabfe9a57aa15131311d16abb42c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_sqloper.cpp b/src/modules/m_sqloper.cpp index 281593cfa..3d5551eb0 100644 --- a/src/modules/m_sqloper.cpp +++ b/src/modules/m_sqloper.cpp @@ -1,62 +1,57 @@ -/* +------------------------------------+ - * | 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: Allows storage of oper credentials in an SQL table */ -static bool OneOfMatches(const char* host, const char* ip, const std::string& hostlist) -{ - std::stringstream hl(hostlist); - std::string xhost; - while (hl >> xhost) - { - if (InspIRCd::Match(host, xhost, ascii_case_insensitive_map) || InspIRCd::MatchCIDR(ip, xhost, ascii_case_insensitive_map)) - { - return true; - } - } - return false; -} +#include "inspircd.h" +#include "modules/sql.h" +#include "modules/hash.h" class OpMeQuery : public SQLQuery { public: const std::string uid, username, password; - OpMeQuery(Module* me, const std::string& db, const std::string& q, const std::string& u, const std::string& un, const std::string& pw) - : SQLQuery(me, db, q), uid(u), username(un), password(pw) {} + OpMeQuery(Module* me, const std::string& u, const std::string& un, const std::string& pw) + : SQLQuery(me), uid(u), username(un), password(pw) + { + } - void OnResult(SQLResult& res) + void OnResult(SQLResult& res) CXX11_OVERRIDE { + ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "result for %s", uid.c_str()); User* user = ServerInstance->FindNick(uid); if (!user) return; - // multiple rows may exist for multiple hosts - parameterlist row; + // multiple rows may exist + SQLEntries row; while (res.GetRow(row)) { - if (OperUser(user, row[2], row[3])) + if (OperUser(user, row[0], row[1])) return; } + ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "no matches for %s (checked %d rows)", uid.c_str(), res.Rows()); // nobody succeeded... fall back to OPER fallback(); } - void OnError(SQLerror& error) + void OnError(SQLerror& error) CXX11_OVERRIDE { + ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "query failed (%s)", error.Str()); fallback(); } @@ -66,7 +61,7 @@ class OpMeQuery : public SQLQuery if (!user) return; - Command* oper_command = ServerInstance->Parser->GetHandler("OPER"); + Command* oper_command = ServerInstance->Parser.GetHandler("OPER"); if (oper_command) { @@ -77,22 +72,25 @@ class OpMeQuery : public SQLQuery } else { - ServerInstance->Logs->Log("m_sqloper",SPARSE, "BUG: WHAT?! Why do we have no OPER command?!"); + ServerInstance->Logs->Log(MODNAME, LOG_SPARSE, "BUG: WHAT?! Why do we have no OPER command?!"); } } bool OperUser(User* user, const std::string &pattern, const std::string &type) { - OperIndex::iterator iter = ServerInstance->Config->oper_blocks.find(" " + type); - if (iter == ServerInstance->Config->oper_blocks.end()) + OperIndex::iterator iter = ServerInstance->Config->OperTypes.find(type); + if (iter == ServerInstance->Config->OperTypes.end()) + { + ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "bad type '%s' in returned row for oper %s", type.c_str(), username.c_str()); return false; + } OperInfo* ifo = iter->second; std::string hostname(user->ident); hostname.append("@").append(user->host); - if (OneOfMatches(hostname.c_str(), user->GetIPString(), pattern.c_str())) + if (InspIRCd::MatchMask(pattern, hostname, user->GetIPString())) { /* Opertype and host match, looks like this is it. */ @@ -106,36 +104,38 @@ class OpMeQuery : public SQLQuery class ModuleSQLOper : public Module { - std::string databaseid; + std::string query; std::string hashtype; dynamic_reference SQL; public: ModuleSQLOper() : SQL(this, "SQL") {} - void init() + void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE { - OnRehash(NULL); + ConfigTag* tag = ServerInstance->Config->ConfValue("sqloper"); - Implementation eventlist[] = { I_OnRehash, I_OnPreCommand }; - ServerInstance->Modules->Attach(eventlist, this, 2); - } - - void OnRehash(User* user) - { - ConfigReader Conf; + std::string dbid = tag->getString("dbid"); + if (dbid.empty()) + SQL.SetProvider("SQL"); + else + SQL.SetProvider("SQL/" + dbid); - databaseid = Conf.ReadValue("sqloper", "dbid", 0); /* Database ID of a database configured for the service provider module */ - hashtype = Conf.ReadValue("sqloper", "hash", 0); + hashtype = tag->getString("hash"); + query = tag->getString("query", "SELECT hostname as host, type FROM ircd_opers WHERE username='$username' AND password='$password'"); } - ModResult OnPreCommand(std::string &command, std::vector ¶meters, LocalUser *user, bool validated, const std::string &original_line) + ModResult OnPreCommand(std::string &command, std::vector ¶meters, LocalUser *user, bool validated, const std::string &original_line) CXX11_OVERRIDE { - if (validated && command == "OPER" && parameters.size() == 2 && SQL) + if (validated && command == "OPER" && parameters.size() >= 2) { - LookupOper(user, parameters[0], parameters[1]); - /* Query is in progress, it will re-invoke OPER if needed */ - return MOD_RES_DENY; + if (SQL) + { + LookupOper(user, parameters[0], parameters[1]); + /* Query is in progress, it will re-invoke OPER if needed */ + return MOD_RES_DENY; + } + ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "database not present"); } return MOD_RES_PASSTHRU; } @@ -144,20 +144,18 @@ public: { HashProvider* hash = ServerInstance->Modules->FindDataService("hash/" + hashtype); - parameterlist params; - params.push_back(username); - params.push_back(hash ? hash->hexsum(password) : password); + ParamM userinfo; + SQL->PopulateUserInfo(user, userinfo); + userinfo["username"] = username; + userinfo["password"] = hash ? hash->hexsum(password) : password; - SQL->submit(new OpMeQuery(this, databaseid, SQL->FormatQuery( - "SELECT username, password, hostname, type FROM ircd_opers WHERE username = '?' AND password='?'", params - ), user->uuid, username, password)); + SQL->submit(new OpMeQuery(this, user->uuid, username, password), query, userinfo); } - Version GetVersion() + Version GetVersion() CXX11_OVERRIDE { return Version("Allows storage of oper credentials in an SQL table", VF_VENDOR); } - }; MODULE_INIT(ModuleSQLOper)