From 53faf9e514b9c9b44c8fe415deca4007bc492e07 Mon Sep 17 00:00:00 2001 From: Alex Peshkoff Date: Tue, 7 Apr 2020 12:42:11 +0300 Subject: [PATCH] Fixed CORE-6230: Unable to connect with database if security.db reference is removed from databases.conf file --- src/common/config/config.cpp | 21 +++++++++++++--- src/include/firebird/FirebirdInterface.idl | 3 +++ src/include/firebird/IdlFbInterfaces.h | 28 +++++++++++++++++++++- src/yvalve/MasterImplementation.cpp | 11 --------- src/yvalve/MasterImplementation.h | 1 - src/yvalve/PluginManager.cpp | 24 +++++++++++++++---- 6 files changed, 67 insertions(+), 21 deletions(-) diff --git a/src/common/config/config.cpp b/src/common/config/config.cpp index e2573d8140d..20f8ec18b45 100644 --- a/src/common/config/config.cpp +++ b/src/common/config/config.cpp @@ -201,7 +201,7 @@ const Config::ConfigEntry Config::entries[MAX_CONFIG_KEY] = #endif {TYPE_STRING, "UserManager", (ConfigValue) "Srp"}, {TYPE_STRING, "TracePlugin", (ConfigValue) "fbtrace"}, - {TYPE_STRING, "SecurityDatabase", (ConfigValue) "security.db"}, // sec/db alias - rely on databases.conf + {TYPE_STRING, "SecurityDatabase", (ConfigValue) NULL}, // sec/db alias - rely on ConfigManager::getDefaultSecurityDb() {TYPE_STRING, "ServerMode", (ConfigValue) ""}, // actual value differs in boot/regular cases {TYPE_STRING, "WireCrypt", (ConfigValue) NULL}, {TYPE_STRING, "WireCryptPlugin", (ConfigValue) "ChaCha, Arc4"}, @@ -440,6 +440,14 @@ const char* Config::getString(unsigned int key) const { if (key >= MAX_CONFIG_KEY) return NULL; + + // irregular case + switch(key) + { + case KEY_SECURITY_DATABASE: + return getSecurityDatabase(); + } + return get(static_cast(key)); } @@ -832,10 +840,17 @@ int FirebirdConf::release() return 1; } - const char* Config::getSecurityDatabase() const { - return get(KEY_SECURITY_DATABASE); + const char* strVal = get(KEY_SECURITY_DATABASE); + if (!strVal) + { + strVal = Firebird::MasterInterfacePtr()->getConfigManager()->getDefaultSecurityDb(); + if (!strVal) + strVal = "security.db"; + } + + return strVal; } int Config::getWireCrypt(WireCryptMode wcMode) const diff --git a/src/include/firebird/FirebirdInterface.idl b/src/include/firebird/FirebirdInterface.idl index dab727e22b8..e6ff278a580 100644 --- a/src/include/firebird/FirebirdInterface.idl +++ b/src/include/firebird/FirebirdInterface.idl @@ -317,6 +317,9 @@ interface ConfigManager : Versioned Config getPluginConfig(const string configuredPlugin); const string getInstallDirectory(); const string getRootDirectory(); + +version: // 3.0 => 4.0 + const string getDefaultSecurityDb(); } diff --git a/src/include/firebird/IdlFbInterfaces.h b/src/include/firebird/IdlFbInterfaces.h index b6e6e2ea284..76643232cdc 100644 --- a/src/include/firebird/IdlFbInterfaces.h +++ b/src/include/firebird/IdlFbInterfaces.h @@ -925,6 +925,7 @@ namespace Firebird IConfig* (CLOOP_CARG *getPluginConfig)(IConfigManager* self, const char* configuredPlugin) throw(); const char* (CLOOP_CARG *getInstallDirectory)(IConfigManager* self) throw(); const char* (CLOOP_CARG *getRootDirectory)(IConfigManager* self) throw(); + const char* (CLOOP_CARG *getDefaultSecurityDb)(IConfigManager* self) throw(); }; protected: @@ -938,7 +939,7 @@ namespace Firebird } public: - static const unsigned VERSION = 2; + static const unsigned VERSION = 3; static const unsigned DIR_BIN = 0; static const unsigned DIR_SBIN = 1; @@ -994,6 +995,16 @@ namespace Firebird const char* ret = static_cast(this->cloopVTable)->getRootDirectory(this); return ret; } + + const char* getDefaultSecurityDb() + { + if (cloopVTable->version < 3) + { + return 0; + } + const char* ret = static_cast(this->cloopVTable)->getDefaultSecurityDb(this); + return ret; + } }; class IEventCallback : public IReferenceCounted @@ -7931,6 +7942,7 @@ namespace Firebird this->getPluginConfig = &Name::cloopgetPluginConfigDispatcher; this->getInstallDirectory = &Name::cloopgetInstallDirectoryDispatcher; this->getRootDirectory = &Name::cloopgetRootDirectoryDispatcher; + this->getDefaultSecurityDb = &Name::cloopgetDefaultSecurityDbDispatcher; } } vTable; @@ -8014,6 +8026,19 @@ namespace Firebird return static_cast(0); } } + + static const char* CLOOP_CARG cloopgetDefaultSecurityDbDispatcher(IConfigManager* self) throw() + { + try + { + return static_cast(self)->Name::getDefaultSecurityDb(); + } + catch (...) + { + StatusType::catchException(0); + return static_cast(0); + } + } }; template > > @@ -8035,6 +8060,7 @@ namespace Firebird virtual IConfig* getPluginConfig(const char* configuredPlugin) = 0; virtual const char* getInstallDirectory() = 0; virtual const char* getRootDirectory() = 0; + virtual const char* getDefaultSecurityDb() = 0; }; template diff --git a/src/yvalve/MasterImplementation.cpp b/src/yvalve/MasterImplementation.cpp index d836f37959a..fb814f24c77 100644 --- a/src/yvalve/MasterImplementation.cpp +++ b/src/yvalve/MasterImplementation.cpp @@ -119,17 +119,6 @@ IMetadataBuilder* MasterImplementation::getMetadataBuilder(CheckStatusWrapper* s } } -/*** -IDebug* MasterImplementation::getDebug() -{ -#ifdef DEV_BUILD - return getImpDebug(); -#else - return NULL; -#endif -} -***/ - int MasterImplementation::serverMode(int mode) { static int currentMode = -1; diff --git a/src/yvalve/MasterImplementation.h b/src/yvalve/MasterImplementation.h index 60f276d6c38..cdf90099970 100644 --- a/src/yvalve/MasterImplementation.h +++ b/src/yvalve/MasterImplementation.h @@ -60,7 +60,6 @@ namespace Why Firebird::ITransaction* transaction); Dtc* getDtc(); Firebird::IMetadataBuilder* getMetadataBuilder(Firebird::CheckStatusWrapper* status, unsigned fieldCount); - //Firebird::IDebug* getDebug(); int serverMode(int mode); Firebird::IUtil* getUtilInterface(); Firebird::IConfigManager* getConfigManager(); diff --git a/src/yvalve/PluginManager.cpp b/src/yvalve/PluginManager.cpp index bd63166db48..c44bcc05845 100644 --- a/src/yvalve/PluginManager.cpp +++ b/src/yvalve/PluginManager.cpp @@ -1199,17 +1199,19 @@ void PluginManager::threadDetach() namespace { -class DirCache +class DataCache { public: - explicit DirCache(MemoryPool &p) - : cache(p) + explicit DataCache(MemoryPool &p) + : cache(p), db(p) { cache.resize(IConfigManager::DIR_COUNT); for (unsigned i = 0; i < IConfigManager::DIR_COUNT; ++i) { cache[i] = fb_utils::getPrefix(i, ""); } + + db = fb_utils::getPrefix(IConfigManager::DIR_SECDB, "security4.fdb"); } const char* getDir(unsigned code) @@ -1218,11 +1220,17 @@ class DirCache return cache[code].c_str(); } + const char* getDb() + { + return db.c_str(); + } + private: ObjectsArray cache; + PathName db; }; -InitInstance dirCache; +InitInstance dataCache; } // anonymous namespace @@ -1244,7 +1252,7 @@ class ConfigManager : public AutoIface