8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-22 22:43:03 +01:00

Added support for changing configuration (client and embedded) from API

This commit is contained in:
alexpeshkoff 2013-04-04 13:17:57 +00:00
parent 57c12dd405
commit 8780552b94
29 changed files with 340 additions and 161 deletions

View File

@ -19,9 +19,9 @@
# To activate an entry, remove the leading "#"s and supply the desired
# value.
#
# Please note, a number of the values are specified in **Bytes** (Not KB).
# Accordingly, we have provided some simple conversion tables at the bottom
# of this file.
# Please note, by default a number of the values are specified in **Bytes** (Not KB).
# You may add obvious abbreviations k, m and g in the end of a numver to specify
# kilobytes, megabytes and gigabytes.
#
# There are three types of configuration values: integer, boolean and string.
#
@ -31,12 +31,13 @@
# 1
# 42
# 4711
# 24M # 24 * 1024 * 1024
#
# Boolean
# -------
# Boolean is expressed as integer values with 0 (zero) being "false" and
# non-zero is taken to mean "true". For consistency we recommend you
# only use 0/1.
# only use 0/1. Also strings 'y', 'yes' and 'true' stand for "true".
#
# String
# ------
@ -44,6 +45,14 @@
# RemoteServiceName = gds_db
# RemotePipeName = pipe47
#
# Scopes
# ------
# Some parameters are marked as per-database / per-connection configurable.
# Per-database configuration is done in file databases.conf (former aliases.conf).
# Per-connection configuration is primarily client tool and done using
# isc_dpb_config parameter in DPB (isc_spb_config for services).
# Notice that per-database entries also may be tuned using DPB in case of
# embedded engine when attaching to database first time.
#
# Portions of this file have been reproduced/made available with the
# permission of Ann Harrison @ IBPhoenix.
@ -350,12 +359,16 @@
# is default one. On windows Sspi is also used when no login/password is given.
# Client can use legacy authentication to talk to old servers.
#
# Per-database & per-connection configurable.
#
#AuthServer = Srp, Win_Sspi
#AuthClient = Srp, Win_Sspi, Legacy_Auth
# UserManager sets plugin used to work with security database. If more than
# one plugin is given, first plugin from the list is used.
#
# Per-database configurable.
#
#UserManager = Srp
# TracePlugin is used by firebird trace facility to send trace data to the user
@ -366,10 +379,14 @@
# Crypt plugins are used to crypt data transferred over the wire.
# In default case wire is encrypted using Alleged RC4
# (key must be generated by auth plugin).
#
# Per-connection configurable.
#
#CryptPlugin = Arc4
# Key holder is a kind of temp storage for DB crypt keys.
# There is no default for this kind of plugins.
#
#KeyHolderPlugin =
@ -381,6 +398,8 @@
#
# Type: string
#
# Per-database & per-connection configurable.
#
#Providers = Remote,Engine12,Loopback
@ -475,10 +494,27 @@
#
# Seconds to wait before concluding an attempt to connect has failed.
#
# Per-connection configurable.
#
# Type: integer
#
#ConnectionTimeout = 180
#
# Should connection over the wire be encrypted?
# Has 3 different values: Required, Enabled or Disabled. Enabled behavior
# depends another side requirements. If both sides set to enabled, connection
# is encrypted.
#
# Attention: default depends upon connection type: incoming (server)
# or outgoing (client).
#
# Per-connection configurable.
#
# Type: integer
#
#WireCrypt = Enabled (for client) / Required (for server)
#
# Seconds to wait on a silent client connection before the server sends
# dummy packets to request acknowledgment.
@ -495,6 +531,8 @@
# follow instrutions of this article:
# http://support.microsoft.com/default.aspx?kbid=140325
#
# Per-connection configurable.
#
# Type: integer
#
#DummyPacketInterval = 0
@ -510,6 +548,8 @@
# order of precendence is the 'RemoteServiceName' (if an entry is
# found in the 'services.' file) then the 'RemoteServicePort'.
#
# Per-connection configurable.
#
# Type: string, integer
#
#RemoteServiceName = gds_db
@ -520,6 +560,8 @@
# messages. The value of 0 (Zero) means that the server will choose
# a port number randomly.
#
# Per-connection configurable.
#
# Type: integer
#
#RemoteAuxPort = 0
@ -540,6 +582,8 @@
#
# Note: Currently is a default for classic and super servers.
#
# Per-connection configurable.
#
# Type: boolean
#
#TcpNoNagle = 1
@ -701,6 +745,8 @@
# Windows Vista/XP SP2/2000 SP4 it will not be accessible using the
# local protocol from other sessions.
#
# Per-connection configurable.
#
# Type: string
#
#IpcName = FIREBIRD
@ -710,6 +756,8 @@
# Has the same meaning as a port number for TCP/IP. The default value is
# compatible with IB/FB1.
#
# Per-connection configurable.
#
# Type: string
#
#RemotePipeName = interbas

View File

@ -32,6 +32,8 @@
#include "../common/classes/ClumpletWriter.h"
#include "../auth/SecureRemotePassword/Message.h"
#include "../jrd/EngineInterface.h"
using namespace Firebird;
namespace {
@ -122,6 +124,8 @@ int SrpServer::authenticate(IStatus* status, IServerBlock* sb, IWriter* writerIn
dpb.insertByte(isc_dpb_sec_attach, TRUE);
const char* str = "SYSDBA";
dpb.insertString(isc_dpb_user_name, str, strlen(str));
const char* providers = "Providers=" CURRENT_ENGINE;
dpb.insertString(isc_dpb_config, providers, strlen(providers));
DispatcherPtr p;

View File

@ -28,6 +28,7 @@
#include <stdio.h>
#include <ctype.h>
#include "../common/utils_proto.h"
#include "../jrd/EngineInterface.h"
using namespace Firebird;
@ -196,7 +197,7 @@ isc_svc_handle attachRemoteServiceManager(ISC_STATUS* status,
return 0;
}
return attachRemoteServiceManager(status, username, password, trusted, service);
return attachRemoteServiceManager(status, username, password, trusted, service, true);
}
@ -218,7 +219,8 @@ isc_svc_handle attachRemoteServiceManager(ISC_STATUS* status,
const TEXT* username,
const TEXT* password,
bool trusted,
const TEXT* server)
const TEXT* server,
bool forceLoopback)
{
char service[SERVICE_SIZE];
@ -242,6 +244,10 @@ isc_svc_handle attachRemoteServiceManager(ISC_STATUS* status,
{
stuffSpb(spb, isc_spb_trusted_auth, "");
}
if ((!server[0]) && forceLoopback && (!Config::getSharedDatabase()))
{ // local connection & force & superserver
stuffSpb(spb, isc_spb_config, "Providers=Loopback," CURRENT_ENGINE);
}
fb_assert((size_t)(spb - spb_buffer) <= sizeof(spb_buffer));
isc_svc_handle svc_handle = 0;

View File

@ -30,7 +30,7 @@
isc_svc_handle attachRemoteServiceManager(ISC_STATUS*, const TEXT*, const TEXT*,
bool, int, const TEXT*);
isc_svc_handle attachRemoteServiceManager(ISC_STATUS*, const TEXT*, const TEXT*, bool, const TEXT*);
isc_svc_handle attachRemoteServiceManager(ISC_STATUS*, const TEXT*, const TEXT*, bool, const TEXT*, bool);
void callRemoteServiceManager(ISC_STATUS*, isc_svc_handle, Auth::UserData&, Auth::IListUsers*);
void detachRemoteServiceManager(ISC_STATUS*, isc_svc_handle);

View File

@ -28,6 +28,7 @@
#include "../common/classes/init.h"
#include "../common/dllinst.h"
#include "../common/os/fbsyslog.h"
#include "../jrd/EngineInterface.h"
#include "firebird/Plugin.h"
#ifdef HAVE_STDLIB_H
@ -72,7 +73,7 @@ public:
defaultConfig = newConfig;
}
*/
Firebird::RefPtr<Config> getDefaultConfig() const
const Firebird::RefPtr<Config>& getDefaultConfig() const
{
return defaultConfig;
}
@ -176,7 +177,7 @@ const Config::ConfigEntry Config::entries[MAX_CONFIG_KEY] =
{TYPE_STRING, "AuditTraceConfigFile", (ConfigValue) ""}, // location of audit trace configuration file
{TYPE_INTEGER, "MaxUserTraceLogSize", (ConfigValue) 10}, // maximum size of user session trace log
{TYPE_INTEGER, "FileSystemCacheSize", (ConfigValue) 0}, // percent
{TYPE_STRING, "Providers", (ConfigValue) "Remote, Engine12, Loopback"},
{TYPE_STRING, "Providers", (ConfigValue) "Remote, " CURRENT_ENGINE ", Loopback"},
{TYPE_STRING, "AuthServer", (ConfigValue) "Srp, Win_Sspi"},
{TYPE_STRING, "AuthClient", (ConfigValue) "Srp, Win_Sspi, Legacy_Auth"},
{TYPE_STRING, "UserManager", (ConfigValue) "Srp"},
@ -197,7 +198,7 @@ const Config::ConfigEntry Config::entries[MAX_CONFIG_KEY] =
Config::Config(const ConfigFile& file)
{
// Array to save string temporarily
// Will be finally save by loadValues() in the end of ctor
// Will be finally saved by loadValues() in the end of ctor
Firebird::ObjectsArray<ConfigFile::String> tempStrings(getPool());
// Iterate through the known configuration entries
@ -231,6 +232,15 @@ Config::Config(const ConfigFile& file, const Config& base)
loadValues(file);
}
void Config::merge(Firebird::RefPtr<Config>& config, const Firebird::string* dpbConfig)
{
if (dpbConfig && dpbConfig->hasData())
{
ConfigFile txtStream(ConfigFile::USE_TEXT, dpbConfig->c_str());
config = new Config(txtStream, *(config.hasData() ? config : getDefaultConfig()));
}
}
void Config::loadValues(const ConfigFile& file)
{
// Iterate through the known configuration entries
@ -296,7 +306,7 @@ Config::~Config()
* Public interface
*/
const Firebird::RefPtr<Config> Config::getDefaultConfig()
const Firebird::RefPtr<Config>& Config::getDefaultConfig()
{
return firebirdConf().getDefaultConfig();
}
@ -413,9 +423,9 @@ int Config::getTcpRemoteBufferSize()
return rc;
}
bool Config::getTcpNoNagle()
bool Config::getTcpNoNagle() const
{
return (bool) getDefaultConfig()->values[KEY_TCP_NO_NAGLE];
return get<bool>(KEY_TCP_NO_NAGLE);
}
int Config::getDefaultDbCachePages() const
@ -428,14 +438,14 @@ int Config::getDefaultDbCachePages() const
return rc;
}
int Config::getConnectionTimeout()
int Config::getConnectionTimeout() const
{
return (int) getDefaultConfig()->values[KEY_CONNECTION_TIMEOUT];
return get<int>(KEY_CONNECTION_TIMEOUT);
}
int Config::getDummyPacketInterval()
int Config::getDummyPacketInterval() const
{
return (int) getDefaultConfig()->values[KEY_DUMMY_PACKET_INTERVAL];
return get<int>(KEY_DUMMY_PACKET_INTERVAL);
}
int Config::getLockMemSize() const
@ -463,24 +473,24 @@ int Config::getDeadlockTimeout() const
return get<int>(KEY_DEADLOCK_TIMEOUT);
}
const char *Config::getRemoteServiceName()
const char *Config::getRemoteServiceName() const
{
return (const char*) getDefaultConfig()->values[KEY_REMOTE_SERVICE_NAME];
return get<const char*>(KEY_REMOTE_SERVICE_NAME);
}
unsigned short Config::getRemoteServicePort()
unsigned short Config::getRemoteServicePort() const
{
return (unsigned short) getDefaultConfig()->values[KEY_REMOTE_SERVICE_PORT];
return get<unsigned short>(KEY_REMOTE_SERVICE_PORT);
}
const char *Config::getRemotePipeName()
const char *Config::getRemotePipeName() const
{
return (const char*) getDefaultConfig()->values[KEY_REMOTE_PIPE_NAME];
return get<const char*>(KEY_REMOTE_PIPE_NAME);
}
const char *Config::getIpcName()
const char *Config::getIpcName() const
{
return (const char*) getDefaultConfig()->values[KEY_IPC_NAME];
return get<const char*>(KEY_IPC_NAME);
}
int Config::getMaxUnflushedWrites() const
@ -498,9 +508,9 @@ int Config::getProcessPriorityLevel()
return (int) getDefaultConfig()->values[KEY_PROCESS_PRIORITY_LEVEL];
}
int Config::getRemoteAuxPort()
int Config::getRemoteAuxPort() const
{
return (int) getDefaultConfig()->values[KEY_REMOTE_AUX_PORT];
return get<int>(KEY_REMOTE_AUX_PORT);
}
const char *Config::getRemoteBindAddress()
@ -644,17 +654,6 @@ bool Config::getSharedDatabase()
return (bool) getDefaultConfig()->values[KEY_SHARED_DATABASE];
}
bool Config::getMultiClientServer()
{
// AP - absolutely wrong for superclassic assumption
// should be set by server in case of 'super' mode in it
#ifdef SUPERSERVER
return true;
#else
return false;
#endif
}
const char* Config::getPlugins(unsigned int type) const
{
switch (type)
@ -715,8 +714,8 @@ const char* Config::getSecurityDatabase() const
return get<const char*>(KEY_SECURITY_DATABASE);
}
const char* Config::getWireCrypt(WireCryptMode wcMode)
const char* Config::getWireCrypt(WireCryptMode wcMode) const
{
const char* rc = getDefaultConfig()->get<const char*>(KEY_WIRE_CRYPT);
const char* rc = get<const char*>(KEY_WIRE_CRYPT);
return rc ? rc : wcMode == WC_CLIENT ? WIRE_CRYPT_ENABLED : WIRE_CRYPT_REQUIRED;
}

View File

@ -192,7 +192,10 @@ public:
static const Firebird::PathName* getCommandLineRootDirectory();
// Master config - needed to provide per-database config
static const Firebird::RefPtr<Config> getDefaultConfig();
static const Firebird::RefPtr<Config>& getDefaultConfig();
// Merge config entries from DPB into existing config
static void merge(Firebird::RefPtr<Config>& config, const Firebird::string* dpbConfig);
// reports key to be used by the following functions
static unsigned int getKeyByName(ConfigName name);
@ -229,16 +232,16 @@ public:
static int getTcpRemoteBufferSize();
// Disable Nagle algorithm
static bool getTcpNoNagle();
bool getTcpNoNagle() const;
// Default database cache size
int getDefaultDbCachePages() const;
// Connection timeout
static int getConnectionTimeout();
int getConnectionTimeout() const;
// Dummy packet interval
static int getDummyPacketInterval();
int getDummyPacketInterval() const;
// Lock manager memory size
int getLockMemSize() const;
@ -256,16 +259,16 @@ public:
int getDeadlockTimeout() const;
// Service name for remote protocols
static const char* getRemoteServiceName();
const char* getRemoteServiceName() const;
// Service port for INET
static unsigned short getRemoteServicePort();
unsigned short getRemoteServicePort() const;
// Pipe name for WNET
static const char* getRemotePipeName();
const char* getRemotePipeName() const;
// Name for IPC-related objects
static const char* getIpcName();
const char* getIpcName() const;
// Unflushed writes number
int getMaxUnflushedWrites() const;
@ -277,7 +280,7 @@ public:
static int getProcessPriorityLevel();
// Port for event processing
static int getRemoteAuxPort();
int getRemoteAuxPort() const;
// Server binding NIC address
static const char* getRemoteBindAddress();
@ -328,13 +331,11 @@ public:
static bool getSharedDatabase();
static bool getMultiClientServer();
const char* getPlugins(unsigned int type) const;
const char* getSecurityDatabase() const;
static const char* getWireCrypt(WireCryptMode wcMode);
const char* getWireCrypt(WireCryptMode wcMode) const;
};
// Implementation of interface to access master configuration file

View File

@ -760,6 +760,11 @@ public:
{
return NULL;
}
virtual int FB_CARG serverMode(int mode)
{
return -1;
}
};

View File

@ -119,6 +119,7 @@
#define isc_dpb_specific_auth_data 84
#define isc_dpb_auth_plugin_list 85
#define isc_dpb_auth_plugin_name 86
#define isc_dpb_config 87
/**************************************************/
/* clumplet tags used inside isc_dpb_address_path */
@ -280,6 +281,7 @@
#define isc_spb_remote_protocol 120
#define isc_spb_host_name 121
#define isc_spb_os_user 122
#define isc_spb_config 123
#define isc_spb_connect_timeout isc_dpb_connect_timeout
#define isc_spb_dummy_packet_interval isc_dpb_dummy_packet_interval

View File

@ -75,8 +75,4 @@
#define TRUSTED_AUTH
#endif
#if defined(SUPERSERVER)
#define SHARED_METADATA_CACHE
#endif
#endif // INCLUDE_Firebird_H

View File

@ -121,8 +121,9 @@ public:
virtual IMetadataBuilder* FB_CARG getMetadataBuilder(IStatus* status, unsigned fieldCount) = 0;
virtual Firebird::IDebug* FB_CARG getDebug() = 0;
virtual int FB_CARG serverMode(int mode) = 0;
};
#define FB_MASTER_VERSION (FB_VERSIONED_VERSION + 12)
#define FB_MASTER_VERSION (FB_VERSIONED_VERSION + 13)
} // namespace Firebird

View File

@ -28,6 +28,8 @@
#include "../common/StatementMetadata.h"
#include "../common/classes/RefCounted.h"
#define CURRENT_ENGINE "Engine12"
namespace Jrd {
// Engine objects used by interface objects

View File

@ -355,7 +355,7 @@ static Static<EngineFactory> engineFactory;
void registerEngine(IPluginManager* iPlugin)
{
myModule->setCleanup(shutdownBeforeUnload);
iPlugin->registerPluginFactory(PluginType::Provider, "Engine12", &engineFactory);
iPlugin->registerPluginFactory(PluginType::Provider, CURRENT_ENGINE, &engineFactory);
myModule->registerMe();
}
@ -739,6 +739,7 @@ public:
string dpb_trusted_login;
PathName dpb_remote_process;
PathName dpb_org_filename;
string dpb_config;
public:
DatabaseOptions()
@ -1281,12 +1282,10 @@ JAttachment* FB_CARG JProvider::attachDatabase(IStatus* user_status, const char*
if (options.dpb_set_page_buffers)
{
#ifdef SHARED_METADATA_CACHE
// Here we do not let anyone except SYSDBA (like DBO) to change dbb_page_buffers,
// cause other flags is UserId can be set only when DB is opened.
// No idea how to test for other cases before init is complete.
if (userId.locksmith())
#endif
if (config->getSharedDatabase() ? userId.locksmith() : true)
dbb->dbb_page_buffers = options.dpb_page_buffers;
}
@ -5585,6 +5584,10 @@ void DatabaseOptions::get(const UCHAR* dpb, USHORT dpb_length, bool& invalid_cli
ERR_post(Arg::Gds(isc_exec_sql_max_call_exceeded));
break;
case isc_dpb_config:
getString(rdr, dpb_config);
break;
default:
break;
}
@ -5681,6 +5684,13 @@ static JAttachment* init(thread_db* tdbb,
tdbb->setDatabase(dbb);
jAtt = create_attachment(alias_name, dbb, options);
tdbb->setAttachment(jAtt->getHandle());
if (options.dpb_config.hasData())
{
ERR_post_warning(Arg::Warning(isc_random) <<
"Secondary attachment - config data from DPB ignored");
}
return jAtt;
}
@ -5690,6 +5700,8 @@ static JAttachment* init(thread_db* tdbb,
}
}
Config::merge(config, &options.dpb_config);
dbb = Database::create();
dbb->dbb_config = config;
dbb->dbb_filename = expanded_name;

View File

@ -60,6 +60,7 @@
#include "../jrd/msg_encode.h"
#include "../jrd/trace/TraceManager.h"
#include "../jrd/trace/TraceObjects.h"
#include "../jrd/EngineInterface.h"
#include "../common/classes/DbImplementation.h"
@ -637,6 +638,8 @@ unsigned int Service::getAuthBlock(const unsigned char** bytes)
void Service::fillDpb(ClumpletWriter& dpb)
{
const char* providers = "Providers=" CURRENT_ENGINE;
dpb.insertString(isc_dpb_config, providers, strlen(providers));
if (svc_address_path.hasData())
{
dpb.insertString(isc_dpb_address_path, svc_address_path);
@ -684,14 +687,19 @@ namespace
val |= QUOTED_FILENAME_SUPPORT;
#endif // WIN_NT
if (Config::getMultiClientServer())
Firebird::MasterInterfacePtr master;
switch (master->serverMode(-1))
{
case 1: // super
val |= MULTI_CLIENT_SUPPORT;
}
else
{
break;
case 0: // classic
val |= NO_SERVER_SHUTDOWN_SUPPORT;
break;
default: // none-server mode
break;
}
return val;
}
}

View File

@ -650,7 +650,7 @@ static Rvnt* add_event(rem_port*);
static void add_other_params(rem_port*, ClumpletWriter&, const ParametersSet&);
static void add_working_directory(ClumpletWriter&, const PathName&);
static rem_port* analyze(ClntAuthBlock&, PathName&, bool, ClumpletReader&, PathName&, bool);
static rem_port* analyze_service(PathName&, bool, ClumpletReader&, bool);
static rem_port* analyze_service(ClntAuthBlock&, PathName&, bool, ClumpletReader&, bool);
static void batch_gds_receive(rem_port*, struct rmtque *, USHORT);
static void batch_dsql_fetch(rem_port*, struct rmtque *, USHORT);
static void clear_queue(rem_port*);
@ -746,7 +746,7 @@ IAttachment* Provider::attach(IStatus* status, const char* filename, unsigned in
PathName expanded_name(filename);
PathName node_name;
ClntAuthBlock cBlock(&expanded_name);
ClntAuthBlock cBlock(&expanded_name, &newDpb, &dpbParam);
rem_port* port = analyze(cBlock, expanded_name, user_verification, newDpb, node_name, loopback);
if (!port)
@ -1322,7 +1322,7 @@ Firebird::IAttachment* Provider::create(IStatus* status, const char* filename,
PathName expanded_name(filename);
PathName node_name;
ClntAuthBlock cBlock(&expanded_name);
ClntAuthBlock cBlock(&expanded_name, &newDpb, &dpbParam);
rem_port* port = analyze(cBlock, expanded_name, user_verification, newDpb, node_name, loopback);
if (!port)
@ -4375,7 +4375,9 @@ Firebird::IService* Provider::attachSvc(IStatus* status, const char* service,
ClumpletWriter newSpb(ClumpletReader::spbList, MAX_DPB_SIZE, spb, spbLength);
const bool user_verification = get_new_dpb(newSpb, spbParam);
rem_port* port = analyze_service(expanded_name, user_verification, newSpb, loopback);
ClntAuthBlock cBlock(NULL, &newSpb, &spbParam);
cBlock.loadClnt(newSpb, &spbParam);
rem_port* port = analyze_service(cBlock, expanded_name, user_verification, newSpb, loopback);
RefMutexGuard portGuard(*port->port_sync, FB_FUNCTION);
Rdb* rdb = port->port_context;
@ -4386,8 +4388,6 @@ Firebird::IService* Provider::attachSvc(IStatus* status, const char* service,
add_other_params(port, newSpb, spbParam);
ClntAuthBlock cBlock(NULL);
cBlock.load(newSpb, &spbParam);
IntlSpb intl;
init(status, cBlock, port, op_service_attach, expanded_name, newSpb, intl, cryptCallback);
@ -4528,7 +4528,7 @@ void Service::query(IStatus* status,
rem_port* port = rdb->rdb_port;
RefMutexGuard portGuard(*port->port_sync, FB_FUNCTION);
ClntAuthBlock cBlock(NULL);
ClntAuthBlock cBlock(NULL, NULL, NULL);
cBlock.loadServiceDataFrom(port);
info(status, rdb, op_service_info, rdb->rdb_id, 0,
@ -5146,7 +5146,7 @@ static rem_port* analyze(ClntAuthBlock& cBlock,
// Analyze the file name to see if a remote connection is required. If not,
// quietly (sic) return.
cBlock.load(dpb, &dpbParam);
cBlock.loadClnt(dpb, &dpbParam);
authenticateStep0(cBlock);
rem_port* port = NULL;
@ -5154,7 +5154,7 @@ static rem_port* analyze(ClntAuthBlock& cBlock,
#ifdef WIN_NT
if (ISC_analyze_protocol(PROTOCOL_XNET, file_name, node_name))
{
port = XNET_analyze(&cBlock, file_name, uv_flag);
port = XNET_analyze(&cBlock, file_name, uv_flag, cBlock.getConfig());
}
else if (ISC_analyze_protocol(PROTOCOL_WNET, file_name, node_name) ||
ISC_analyze_pclan(file_name, node_name))
@ -5167,7 +5167,7 @@ static rem_port* analyze(ClntAuthBlock& cBlock,
ISC_utf8ToSystem(node_name);
}
port = WNET_analyze(&cBlock, file_name, node_name.c_str(), uv_flag);
port = WNET_analyze(&cBlock, file_name, node_name.c_str(), uv_flag, cBlock.getConfig());
}
else
#endif
@ -5183,7 +5183,7 @@ static rem_port* analyze(ClntAuthBlock& cBlock,
ISC_utf8ToSystem(node_name);
}
port = INET_analyze(&cBlock, file_name, node_name.c_str(), uv_flag, dpb);
port = INET_analyze(&cBlock, file_name, node_name.c_str(), uv_flag, dpb, cBlock.getConfig());
}
// We have a local connection string. If it's a file on a network share,
@ -5197,7 +5197,7 @@ static rem_port* analyze(ClntAuthBlock& cBlock,
ISC_unescape(node_name);
ISC_utf8ToSystem(node_name);
port = WNET_analyze(&cBlock, expanded_name, node_name.c_str(), uv_flag);
port = WNET_analyze(&cBlock, expanded_name, node_name.c_str(), uv_flag, cBlock.getConfig());
}
#endif
@ -5210,7 +5210,7 @@ static rem_port* analyze(ClntAuthBlock& cBlock,
ISC_unescape(node_name);
ISC_utf8ToSystem(node_name);
port = INET_analyze(&cBlock, expanded_name, node_name.c_str(), uv_flag, dpb);
port = INET_analyze(&cBlock, expanded_name, node_name.c_str(), uv_flag, dpb, cBlock.getConfig());
}
}
#endif
@ -5225,17 +5225,17 @@ static rem_port* analyze(ClntAuthBlock& cBlock,
#ifdef WIN_NT
if (!port)
{
port = XNET_analyze(&cBlock, file_name, uv_flag);
port = XNET_analyze(&cBlock, file_name, uv_flag, cBlock.getConfig());
}
if (!port)
{
port = WNET_analyze(&cBlock, file_name, WNET_LOCALHOST, uv_flag);
port = WNET_analyze(&cBlock, file_name, WNET_LOCALHOST, uv_flag, cBlock.getConfig());
}
#endif
if (!port)
{
port = INET_analyze(&cBlock, file_name, INET_LOCALHOST, uv_flag, dpb);
port = INET_analyze(&cBlock, file_name, INET_LOCALHOST, uv_flag, dpb, cBlock.getConfig());
}
}
}
@ -5244,7 +5244,8 @@ static rem_port* analyze(ClntAuthBlock& cBlock,
}
static rem_port* analyze_service(PathName& service_name,
static rem_port* analyze_service(ClntAuthBlock& cBlock,
PathName& service_name,
bool uv_flag,
ClumpletReader& spb,
bool loopback)
@ -5272,7 +5273,7 @@ static rem_port* analyze_service(PathName& service_name,
#if defined(WIN_NT)
if (ISC_analyze_protocol(PROTOCOL_XNET, service_name, node_name))
{
return XNET_analyze(NULL, service_name, uv_flag);
return XNET_analyze(NULL, service_name, uv_flag, cBlock.getConfig());
}
if (ISC_analyze_protocol(PROTOCOL_WNET, service_name, node_name) ||
@ -5282,7 +5283,7 @@ static rem_port* analyze_service(PathName& service_name,
{
node_name = WNET_LOCALHOST;
}
return WNET_analyze(NULL, service_name, node_name.c_str(), uv_flag);
return WNET_analyze(NULL, service_name, node_name.c_str(), uv_flag, cBlock.getConfig());
}
#endif
@ -5293,7 +5294,7 @@ static rem_port* analyze_service(PathName& service_name,
{
node_name = INET_LOCALHOST;
}
return INET_analyze(NULL, service_name, node_name.c_str(), uv_flag, spb);
return INET_analyze(NULL, service_name, node_name.c_str(), uv_flag, spb, cBlock.getConfig());
}
rem_port* port = NULL;
@ -5309,17 +5310,17 @@ static rem_port* analyze_service(PathName& service_name,
#if defined(WIN_NT)
if (!port)
{
port = XNET_analyze(NULL, service_name, uv_flag);
port = XNET_analyze(NULL, service_name, uv_flag, cBlock.getConfig());
}
if (!port)
{
port = WNET_analyze(NULL, service_name, WNET_LOCALHOST, uv_flag);
port = WNET_analyze(NULL, service_name, WNET_LOCALHOST, uv_flag, cBlock.getConfig());
}
#endif
if (!port)
{
port = INET_analyze(NULL, service_name, INET_LOCALHOST, uv_flag, spb);
port = INET_analyze(NULL, service_name, INET_LOCALHOST, uv_flag, spb, cBlock.getConfig());
}
}
}
@ -7102,7 +7103,7 @@ static void svcstart(IStatus* status,
IntlSpbStart().fromUtf8(send, 0);
}
ClntAuthBlock cBlock(NULL);
ClntAuthBlock cBlock(NULL, NULL, NULL);
cBlock.loadServiceDataFrom(rdb->rdb_port);
HANDSHAKE_DEBUG(fprintf(stderr, "start calls authFillParametersBlock\n"));
authFillParametersBlock(cBlock, send, &spbStartParam, rdb->rdb_port);
@ -7249,14 +7250,19 @@ static void cleanDpb(Firebird::ClumpletWriter& dpb, const ParametersSet* tags)
} //namespace Remote
ClntAuthBlock::ClntAuthBlock(const Firebird::PathName* fileName)
ClntAuthBlock::ClntAuthBlock(const Firebird::PathName* fileName, Firebird::ClumpletReader* dpb,
const ParametersSet* tags)
: pluginList(getPool()), userName(getPool()), password(getPool()),
dataForPlugin(getPool()), dataFromPlugin(getPool()),
hasCryptKey(false),
cryptKeys(getPool()), dpbConfig(getPool()), hasCryptKey(false),
plugins(PluginType::AuthClient, FB_AUTH_CLIENT_VERSION, upInfo),
authComplete(false), firstTime(true)
{
reset(fileName);
if (dpb && tags && dpb->find(tags->config_text))
{
dpb->getString(dpbConfig);
}
resetClnt(fileName);
}
void ClntAuthBlock::resetDataFromPlugin()
@ -7317,7 +7323,7 @@ static inline void makeUtfString(bool uft8Convert, Firebird::string& s)
ISC_unescape(s);
}
void ClntAuthBlock::load(Firebird::ClumpletReader& dpb, const ParametersSet* tags)
void ClntAuthBlock::loadClnt(Firebird::ClumpletReader& dpb, const ParametersSet* tags)
{
bool uft8Convert = !dpb.find(isc_dpb_utf8_filename);

View File

@ -447,7 +447,8 @@ static rem_port* inet_try_connect( PACKET*,
Rdb*,
const PathName&,
const TEXT*,
ClumpletReader&);
ClumpletReader&,
RefPtr<Config>*);
static bool_t inet_write(XDR*); //, int);
#ifdef DEBUG
@ -521,7 +522,8 @@ rem_port* INET_analyze(ClntAuthBlock* cBlock,
const PathName& file_name,
const TEXT* node_name,
bool uv_flag,
ClumpletReader &dpb)
ClumpletReader &dpb,
RefPtr<Config>* config)
{
/**************************************
*
@ -604,7 +606,7 @@ rem_port* INET_analyze(ClntAuthBlock* cBlock,
// Try connection using first set of protocols
rem_port* port = inet_try_connect(packet, rdb, file_name, node_name, dpb);
rem_port* port = inet_try_connect(packet, rdb, file_name, node_name, dpb, config);
P_ACPT* accept = NULL;
switch (packet->p_operation)
@ -623,7 +625,7 @@ rem_port* INET_analyze(ClntAuthBlock* cBlock,
case op_accept:
if (cBlock)
{
cBlock->reset(&file_name);
cBlock->resetClnt(&file_name);
}
accept = &packet->p_acpt;
break;
@ -678,7 +680,8 @@ rem_port* INET_analyze(ClntAuthBlock* cBlock,
rem_port* INET_connect(const TEXT* name,
PACKET* packet,
USHORT flag,
ClumpletReader* dpb)
ClumpletReader* dpb,
RefPtr<Config>* config)
{
/**************************************
*
@ -709,6 +712,10 @@ rem_port* INET_connect(const TEXT* name,
#endif
rem_port* const port = alloc_port(NULL);
if (config)
{
port->port_config = *config;
}
REMOTE_get_timeout_params(port, dpb);
string host;
@ -736,12 +743,12 @@ rem_port* INET_connect(const TEXT* name,
if (protocol.isEmpty())
{
const unsigned short port2 = Config::getRemoteServicePort();
const unsigned short port2 = port->getPortConfig()->getRemoteServicePort();
if (port2) {
protocol.printf("%hu", port2);
}
else {
protocol = Config::getRemoteServiceName();
protocol = port->getPortConfig()->getRemoteServiceName();
}
}
@ -1462,7 +1469,7 @@ static rem_port* aux_request( rem_port* port, PACKET* packet)
address.sin_family = AF_INET;
in_addr bind_addr = get_bind_address();
memcpy(&address.sin_addr, &bind_addr, sizeof(address.sin_addr));
address.sin_port = htons(Config::getRemoteAuxPort());
address.sin_port = htons(port->getPortConfig()->getRemoteAuxPort());
SOCKET n = socket(AF_INET, SOCK_STREAM, 0);
if (n == INVALID_SOCKET)
@ -2672,7 +2679,8 @@ static rem_port* inet_try_connect(PACKET* packet,
Rdb* rdb,
const PathName& file_name,
const TEXT* node_name,
ClumpletReader& dpb)
ClumpletReader& dpb,
RefPtr<Config>* config)
{
/**************************************
*
@ -2702,7 +2710,7 @@ static rem_port* inet_try_connect(PACKET* packet,
rem_port* port = NULL;
try
{
port = INET_connect(node_name, packet, FALSE, &dpb);
port = INET_connect(node_name, packet, FALSE, &dpb, config);
}
catch (const Exception&)
{
@ -3203,7 +3211,7 @@ static bool setNoNagleOption(rem_port* port)
* in case of unexpected error
*
**************************************/
if (Config::getTcpNoNagle())
if (port->getPortConfig()->getTcpNoNagle())
{
int optval = TRUE;
int n = setsockopt(port->port_handle, IPPROTO_TCP, TCP_NODELAY,

View File

@ -25,6 +25,8 @@
#define REMOTE_INET_PROTO_H
#include "../common/classes/fb_string.h"
#include "../common/classes/RefCounted.h"
#include "../common/config/config.h"
namespace Firebird
{
@ -32,8 +34,9 @@ namespace Firebird
}
rem_port* INET_analyze(ClntAuthBlock*, const Firebird::PathName&, const TEXT*,
bool, Firebird::ClumpletReader&);
rem_port* INET_connect(const TEXT*, struct packet*, USHORT, Firebird::ClumpletReader*);
bool, Firebird::ClumpletReader&, Firebird::RefPtr<Config>*);
rem_port* INET_connect(const TEXT*, struct packet*, USHORT, Firebird::ClumpletReader*,
Firebird::RefPtr<Config>*);
rem_port* INET_reconnect(SOCKET);
rem_port* INET_server(SOCKET);
void setStopMainThread(FPTR_INT func);

View File

@ -73,7 +73,7 @@ static void disconnect(rem_port*);
static void exit_handler(void*);
#endif
static void force_close(rem_port*);
static rem_str* make_pipe_name(const TEXT*, const TEXT*, const TEXT*);
static rem_str* make_pipe_name(const RefPtr<Config>&, const TEXT*, const TEXT*, const TEXT*);
static rem_port* receive(rem_port*, PACKET*);
static int send_full(rem_port*, PACKET*);
static int send_partial(rem_port*, PACKET*);
@ -104,7 +104,8 @@ static xdr_t::xdr_ops wnet_ops =
rem_port* WNET_analyze(ClntAuthBlock* cBlock,
const PathName& file_name,
const TEXT* node_name,
bool uv_flag)
bool uv_flag,
RefPtr<Config>* config)
{
/**************************************
*
@ -181,7 +182,7 @@ rem_port* WNET_analyze(ClntAuthBlock* cBlock,
rem_port* port = NULL;
try
{
port = WNET_connect(node_name, packet, 0);
port = WNET_connect(node_name, packet, 0, config);
}
catch (const Exception&)
{
@ -260,7 +261,7 @@ rem_port* WNET_analyze(ClntAuthBlock* cBlock,
}
rem_port* WNET_connect(const TEXT* name, PACKET* packet, USHORT flag)
rem_port* WNET_connect(const TEXT* name, PACKET* packet, USHORT flag, Firebird::RefPtr<Config>* config)
{
/**************************************
*
@ -275,9 +276,13 @@ rem_port* WNET_connect(const TEXT* name, PACKET* packet, USHORT flag)
*
**************************************/
rem_port* const port = alloc_port(0);
if (config)
{
port->port_config = *config;
}
delete port->port_connection;
port->port_connection = make_pipe_name(name, SERVER_PIPE_SUFFIX, 0);
port->port_connection = make_pipe_name(port->getPortConfig(), name, SERVER_PIPE_SUFFIX, 0);
// If we're a host, just make the connection
@ -412,7 +417,7 @@ rem_port* WNET_reconnect(HANDLE handle)
rem_port* const port = alloc_port(0);
delete port->port_connection;
port->port_connection = make_pipe_name(NULL, SERVER_PIPE_SUFFIX, 0);
port->port_connection = make_pipe_name(port->getPortConfig(), NULL, SERVER_PIPE_SUFFIX, 0);
port->port_pipe = handle;
port->port_server_flags |= SRVR_server;
@ -582,7 +587,7 @@ static rem_port* aux_connect( rem_port* port, PACKET* packet)
port->port_async = new_port;
new_port->port_flags = port->port_flags & PORT_no_oob;
new_port->port_flags |= PORT_async;
new_port->port_connection = make_pipe_name(port->port_connection->str_data, EVENT_PIPE_SUFFIX, p);
new_port->port_connection = make_pipe_name(port->getPortConfig(), port->port_connection->str_data, EVENT_PIPE_SUFFIX, p);
while (true)
{
@ -631,7 +636,7 @@ static rem_port* aux_request( rem_port* vport, PACKET* packet)
TEXT str_pid[32];
wnet_make_file_name(str_pid, server_pid);
new_port->port_connection =
make_pipe_name(vport->port_connection->str_data, EVENT_PIPE_SUFFIX, str_pid);
make_pipe_name(vport->getPortConfig(), vport->port_connection->str_data, EVENT_PIPE_SUFFIX, str_pid);
new_port->port_pipe =
CreateNamedPipe(new_port->port_connection->str_data,
@ -791,7 +796,7 @@ static void exit_handler(void* main_port)
#endif
static rem_str* make_pipe_name(const TEXT* connect_name, const TEXT* suffix_name, const TEXT* str_pid)
static rem_str* make_pipe_name(RefPtr<Config>& config, const TEXT* connect_name, const TEXT* suffix_name, const TEXT* str_pid)
{
/**************************************
*
@ -820,7 +825,7 @@ static rem_str* make_pipe_name(const TEXT* connect_name, const TEXT* suffix_name
switch (*p)
{
case 0:
protocol = Config::getRemoteServiceName();
protocol = config->getRemoteServiceName();
break;
case '@':
protocol = p + 1;
@ -836,7 +841,7 @@ static rem_str* make_pipe_name(const TEXT* connect_name, const TEXT* suffix_name
buffer += '\\';
buffer += PIPE_PREFIX;
buffer += '\\';
const char *pipe_name = Config::getRemotePipeName();
const char *pipe_name = config->getRemotePipeName();
buffer += pipe_name;
buffer += '\\';
buffer += suffix_name;

View File

@ -31,8 +31,8 @@ extern "C" {
#endif
rem_port* WNET_analyze(ClntAuthBlock*, const Firebird::PathName&, const TEXT*, bool);
rem_port* WNET_connect(const TEXT*, struct packet*, USHORT);
rem_port* WNET_analyze(ClntAuthBlock*, const Firebird::PathName&, const TEXT*, bool, Firebird::RefPtr<Config>*);
rem_port* WNET_connect(const TEXT*, struct packet*, USHORT, Firebird::RefPtr<Config>*);
rem_port* WNET_reconnect(HANDLE);

View File

@ -61,7 +61,7 @@ static rem_port* aux_request(rem_port*, PACKET*);
static void cleanup_comm(XCC);
static void cleanup_mapping(XPM);
static void cleanup_port(rem_port*);
static rem_port* connect_client(PACKET*);
static rem_port* connect_client(PACKET*, const Firebird::RefPtr<Config>*);
static rem_port* connect_server(USHORT);
static void disconnect(rem_port*);
static void force_close(rem_port*);
@ -189,7 +189,10 @@ static void xnet_log_error(const char* err_msg)
#define ERR_STR(str) (str)
#endif
rem_port* XNET_analyze(ClntAuthBlock* cBlock, const PathName& file_name, bool uv_flag)
rem_port* XNET_analyze(ClntAuthBlock* cBlock,
const PathName& file_name,
bool uv_flag,
RefPtr<Config>* config)
{
/**************************************
*
@ -264,7 +267,7 @@ rem_port* XNET_analyze(ClntAuthBlock* cBlock, const PathName& file_name, bool uv
rem_port* port = NULL;
try
{
port = XNET_connect(packet, 0);
port = XNET_connect(packet, 0, config);
}
catch (const Exception&)
{
@ -345,7 +348,8 @@ rem_port* XNET_analyze(ClntAuthBlock* cBlock, const PathName& file_name, bool uv
rem_port* XNET_connect(PACKET* packet,
USHORT flag)
USHORT flag,
Firebird::RefPtr<Config>* config)
{
/**************************************
*
@ -366,7 +370,7 @@ rem_port* XNET_connect(PACKET* packet,
if (packet)
{
return connect_client(packet);
return connect_client(packet, config);
}
return connect_server(flag);
@ -392,7 +396,7 @@ rem_port* XNET_reconnect(ULONG client_pid)
// Initialize server-side IPC endpoint to a value we know we have permissions to listen at
if (strcmp(xnet_endpoint, "") == 0)
{
fb_utils::copy_terminate(xnet_endpoint, Config::getIpcName(), sizeof(xnet_endpoint));
fb_utils::copy_terminate(xnet_endpoint, Config::getDefaultConfig()->getIpcName(), sizeof(xnet_endpoint));
fb_utils::prefix_kernel_object_name(xnet_endpoint, sizeof(xnet_endpoint));
}
@ -1020,7 +1024,7 @@ static void raise_lostconn_or_syserror(const char* msg)
}
static rem_port* connect_client(PACKET* packet)
static rem_port* connect_client(PACKET* packet, Firebird::RefPtr<Config>* config)
{
/**************************************
*
@ -1033,6 +1037,8 @@ static rem_port* connect_client(PACKET* packet)
*
**************************************/
Firebird::RefPtr<Config>& conf(config ? *config : Config::getDefaultConfig());
if (!xnet_initialized)
{
MutexLockGuard guard(xnet_mutex, FB_FUNCTION);
@ -1055,7 +1061,7 @@ static rem_port* connect_client(PACKET* packet)
// First, try to connect using default kernel namespace.
// This should work on Win9X, NT4 and on later OS when server is running
// under restricted account in the same session as the client
fb_utils::copy_terminate(xnet_endpoint, Config::getIpcName(), sizeof(xnet_endpoint));
fb_utils::copy_terminate(xnet_endpoint, conf->getIpcName(), sizeof(xnet_endpoint));
try
{
@ -1066,7 +1072,7 @@ static rem_port* connect_client(PACKET* packet)
// The client may not have permissions to create global objects,
// but still be able to connect to a local server that has such permissions.
// This is why we try to connect using Global\ namespace unconditionally
fb_utils::snprintf(xnet_endpoint, sizeof(xnet_endpoint), "Global\\%s", Config::getIpcName());
fb_utils::snprintf(xnet_endpoint, sizeof(xnet_endpoint), "Global\\%s", conf->getIpcName());
if (!connect_init()) {
return NULL;
@ -1078,7 +1084,7 @@ static rem_port* connect_client(PACKET* packet)
Arg::StatusVector temp;
temp << Arg::Gds(isc_net_read_err);
static const int timeout = Config::getConnectionTimeout() * 1000;
static const int timeout = conf->getConnectionTimeout() * 1000;
// waiting for XNET connect lock to release
@ -1281,6 +1287,10 @@ static rem_port* connect_client(PACKET* packet)
port->port_xcc = xcc;
xnet_ports->registerPort(port);
send_full(port, packet);
if (config)
{
port->port_config = *config;
}
return port;
}
@ -2126,7 +2136,7 @@ static bool server_init(USHORT flag)
// Initialize server-side IPC endpoint to a value we know we have permissions to listen at
if (strcmp(xnet_endpoint, "") == 0)
{
fb_utils::copy_terminate(xnet_endpoint, Config::getIpcName(), sizeof(name_buffer));
fb_utils::copy_terminate(xnet_endpoint, Config::getDefaultConfig()->getIpcName(), sizeof(name_buffer));
fb_utils::prefix_kernel_object_name(xnet_endpoint, sizeof(xnet_endpoint));
}

View File

@ -32,8 +32,8 @@
#define rem_port void
#endif
rem_port* XNET_analyze(ClntAuthBlock*, const Firebird::PathName&, bool);
rem_port* XNET_connect(struct packet*, USHORT);
rem_port* XNET_analyze(ClntAuthBlock*, const Firebird::PathName&, bool, Firebird::RefPtr<Config>*);
rem_port* XNET_connect(struct packet*, USHORT, Firebird::RefPtr<Config>*);
rem_port* XNET_reconnect(ULONG);
#endif // REMOTE_XNET_PROTO_H

View File

@ -58,7 +58,7 @@ void REMOTE_reset_statement (struct Rsr *);
void REMOTE_save_status_strings (ISC_STATUS *);
bool_t REMOTE_getbytes (XDR*, SCHAR*, u_int);
bool REMOTE_legacy_auth(const char* nm, int protocol);
Firebird::RefPtr<Config> REMOTE_get_config(const Firebird::PathName* dbName);
Firebird::RefPtr<Config> REMOTE_get_config(const Firebird::PathName* dbName, const Firebird::string* dpb_config);
void REMOTE_parseList(Remote::ParsedList&, Firebird::PathName);
void REMOTE_makeList(Firebird::PathName& list, const Remote::ParsedList& parsed);
void REMOTE_check_response(Firebird::IStatus* warning, Rdb* rdb, PACKET* packet, bool checkKeys = false);

View File

@ -65,7 +65,8 @@ const ParametersSet dpbParam =
isc_dpb_client_version,
isc_dpb_remote_protocol,
isc_dpb_host_name,
isc_dpb_os_user
isc_dpb_os_user,
isc_dpb_config
};
const ParametersSet spbParam =
@ -86,7 +87,8 @@ const ParametersSet spbParam =
isc_spb_client_version,
isc_spb_remote_protocol,
isc_spb_host_name,
isc_spb_os_user
isc_spb_os_user,
isc_spb_config
};
const ParametersSet spbStartParam =
@ -107,6 +109,7 @@ const ParametersSet spbStartParam =
0,
0,
0,
0,
0
};
@ -128,6 +131,7 @@ const ParametersSet spbInfoParam =
0,
0,
0,
0,
0
};
@ -438,10 +442,10 @@ void REMOTE_get_timeout_params(rem_port* port, Firebird::ClumpletReader* pb)
fb_assert(isc_dpb_connect_timeout == isc_spb_connect_timeout);
port->port_connect_timeout =
pb && pb->find(isc_dpb_connect_timeout) ? pb->getInt() : Config::getConnectionTimeout();
pb && pb->find(isc_dpb_connect_timeout) ? pb->getInt() : port->getPortConfig()->getConnectionTimeout();
port->port_flags |= PORT_dummy_pckt_set;
port->port_dummy_packet_interval = Config::getDummyPacketInterval();
port->port_dummy_packet_interval = port->getPortConfig()->getDummyPacketInterval();
if (port->port_dummy_packet_interval < 0)
port->port_dummy_packet_interval = DUMMY_INTERVAL;
@ -682,10 +686,16 @@ void rem_port::linkParent(rem_port* const parent)
this->port_next = parent->port_clients;
this->port_server = parent->port_server;
this->port_server_flags = parent->port_server_flags;
this->port_config = parent->port_config;
parent->port_clients = parent->port_next = this;
}
const Firebird::RefPtr<Config>& rem_port::getPortConfig() const
{
return port_config.hasData() ? port_config : Config::getDefaultConfig();
}
void rem_port::unlinkParent()
{
if (this->port_parent == NULL)
@ -1063,32 +1073,42 @@ void ClntAuthBlock::extractDataFromPluginTo(Firebird::ClumpletWriter& user_id)
}
}
void ClntAuthBlock::reset(const Firebird::PathName* fileName)
void ClntAuthBlock::resetClnt(const Firebird::PathName* fileName)
{
dataForPlugin.clear();
dataFromPlugin.clear();
authComplete = false;
firstTime = true;
pluginList = REMOTE_get_config(fileName)->getPlugins(Firebird::PluginType::AuthClient);
config = REMOTE_get_config(fileName, &dpbConfig);
pluginList = config->getPlugins(Firebird::PluginType::AuthClient);
plugins.set(pluginList.c_str());
}
Firebird::RefPtr<Config>* ClntAuthBlock::getConfig()
{
return config.hasData() ? &config : NULL;
}
void ClntAuthBlock::storeDataForPlugin(unsigned int length, const unsigned char* data)
{
dataForPlugin.assign(data, length);
HANDSHAKE_DEBUG(fprintf(stderr, "Cln: accepted data for plugin length=%d\n", length));
}
Firebird::RefPtr<Config> REMOTE_get_config(const Firebird::PathName* dbName)
Firebird::RefPtr<Config> REMOTE_get_config(const Firebird::PathName* dbName,
const Firebird::string* dpb_config)
{
Firebird::RefPtr<Config> rc = Config::getDefaultConfig();
if (dbName)
{
Firebird::RefPtr<Config> rc;
Firebird::PathName dummy;
expandDatabaseName(*dbName, dummy, &rc);
return rc;
}
return Config::getDefaultConfig();
Config::merge(rc, dpb_config);
return rc;
}
void REMOTE_parseList(Remote::ParsedList& parsed, Firebird::PathName list)
@ -1276,7 +1296,7 @@ bool rem_port::tryKeyType(const KnownServerKey& srvKey, InternalCryptKey* cryptK
return false;
}
if (Config::getWireCrypt(WC_CLIENT) == WIRE_CRYPT_DISABLED)
if (getPortConfig()->getWireCrypt(WC_CLIENT) == WIRE_CRYPT_DISABLED)
{
port_crypt_complete = true;
return true;
@ -1285,7 +1305,7 @@ bool rem_port::tryKeyType(const KnownServerKey& srvKey, InternalCryptKey* cryptK
// we got correct key's type pair
// check what about crypt plugin for it
Remote::ParsedList clientPlugins;
REMOTE_parseList(clientPlugins, Config::getDefaultConfig()->getPlugins(Firebird::PluginType::WireCrypt));
REMOTE_parseList(clientPlugins, getPortConfig()->getPlugins(Firebird::PluginType::WireCrypt));
for (unsigned n = 0; n < clientPlugins.getCount(); ++n)
{
Firebird::PathName p(clientPlugins[n]);

View File

@ -113,7 +113,7 @@ struct ParametersSet
plugin_name, plugin_list, specific_data,
address_path, process_id, process_name,
encrypt_key, client_version, remote_protocol,
host_name, os_user;
host_name, os_user, config_text;
};
extern const ParametersSet dpbParam, spbParam, spbStartParam, spbInfoParam;
@ -639,6 +639,8 @@ private:
// These two are legacy encrypted password, trusted auth data and so on - what plugin needs
Firebird::UCharBuffer dataForPlugin, dataFromPlugin;
Firebird::HalfStaticArray<InternalCryptKey*, 1> cryptKeys; // Wire crypt keys that came from plugin(s) last time
Firebird::string dpbConfig; // Used to recreate config with new filename
Firebird::RefPtr<Config> config; // Used to get plugins list and pass to port
unsigned nextKey; // First key to be analyzed
bool hasCryptKey; // DPB contains disk crypt key, may be passed only over encrypted wire
@ -648,7 +650,7 @@ public:
bool authComplete; // Set as response from client that authentication accepted
bool firstTime; // Invoked first time after reset
explicit ClntAuthBlock(const Firebird::PathName* fileName);
ClntAuthBlock(const Firebird::PathName* fileName, Firebird::ClumpletReader* dpb, const ParametersSet* tags);
~ClntAuthBlock()
{
@ -660,15 +662,16 @@ public:
void extractDataFromPluginTo(Firebird::ClumpletWriter& dpb, const ParametersSet* tags, int protocol);
void extractDataFromPluginTo(CSTRING* to);
void extractDataFromPluginTo(P_AUTH_CONT* to);
void load(Firebird::ClumpletReader& dpb, const ParametersSet*);
void loadClnt(Firebird::ClumpletReader& dpb, const ParametersSet*);
void extractDataFromPluginTo(Firebird::ClumpletWriter& user_id);
void reset(const Firebird::PathName* fileName);
void resetClnt(const Firebird::PathName* fileName);
bool checkPluginName(Firebird::PathName& nameToCheck);
void saveServiceDataTo(rem_port*);
void loadServiceDataFrom(rem_port*);
Firebird::PathName getPluginName();
void tryNewKeys(rem_port*);
void releaseKeys(unsigned from);
Firebird::RefPtr<Config>* getConfig();
// Auth::IClientBlock implementation
int FB_CARG release();
@ -873,6 +876,7 @@ struct rem_port : public Firebird::GlobalStorage, public Firebird::RefCounted
OBJCT port_last_object_id; // cached last id
Firebird::ObjectsArray< Firebird::Array<char> > port_queue;
size_t port_qoffset; // current packet in the queue
Firebird::RefPtr<Config> port_config; // connection-specific configuration info
// Authentication and crypt stuff
ServerAuthBase* port_srv_auth;
@ -934,8 +938,8 @@ private: // this is refCounted object
public:
void linkParent(rem_port* const parent);
void unlinkParent();
const Firebird::RefPtr<Config>& getPortConfig() const;
template <typename T>
void getHandle(T*& blk, OBJCT id)

View File

@ -292,6 +292,11 @@ int CLIB_ROUTINE main( int argc, char** argv)
INET_SERVER_flag |= SRVR_multi_client;
super = true;
}
{ // scope
Firebird::MasterInterfacePtr master;
master->serverMode(super ? 1 : 0);
}
if (debug)
{
INET_SERVER_flag |= SRVR_debug;
@ -356,7 +361,7 @@ int CLIB_ROUTINE main( int argc, char** argv)
{
try
{
port = INET_connect(protocol, 0, INET_SERVER_flag, 0);
port = INET_connect(protocol, 0, INET_SERVER_flag, 0, NULL);
}
catch (const Firebird::Exception& ex)
{

View File

@ -1890,6 +1890,9 @@ void DatabaseAuth::accept(PACKET* send, Auth::WriterImplementation* authBlock)
case isc_dpb_user_name:
case isc_dpb_password:
case isc_dpb_password_enc:
// remove client's config information
case isc_dpb_config:
pb->deleteClumplet();
break;
@ -1973,7 +1976,8 @@ static void aux_request( rem_port* port, /*P_REQ* request,*/ PACKET* send)
send->p_resp.p_resp_data.cstr_address = buffer;
// To be retrieved via an overloaded class member once our ports become real classes
const int aux_port_id = (port->port_type == rem_port::INET) ? Config::getRemoteAuxPort() : 0;
const int aux_port_id = (port->port_type == rem_port::INET) ?
Config::getDefaultConfig()->getRemoteAuxPort() : 0;
GlobalPortLock auxPortLock(aux_port_id);
rem_port* const aux_port = port->request(send);
@ -5091,10 +5095,6 @@ ISC_STATUS rem_port::service_attach(const char* service_name,
// Now insert additional clumplets into spb
addClumplets(spb, spbParam, this);
// See if user has specified parameters relevent to the connection,
// they will be stuffed in the SPB if so.
REMOTE_get_timeout_params(this, spb);
// Get ready to cache old-style auth parameters
ClumpletWriter* cache = NULL;
if (!authenticated)
@ -5120,6 +5120,9 @@ ISC_STATUS rem_port::service_attach(const char* service_name,
// remove trusted auth & trusted role if present (security measure)
case isc_spb_trusted_role:
case isc_spb_trusted_auth:
// remove user config info (security measure)
case isc_spb_config:
spb->deleteClumplet();
break;
@ -5129,6 +5132,10 @@ ISC_STATUS rem_port::service_attach(const char* service_name,
}
}
// See if user has specified parameters relevent to the connection,
// they will be stuffed in the SPB if so.
REMOTE_get_timeout_params(this, spb);
if (!authenticated)
{
// add fake auth block to have additional guarantee that this service never reachs database
@ -6369,7 +6376,7 @@ void SrvAuthBlock::createPluginsItr()
Remote::ParsedList fromClient;
REMOTE_parseList(fromClient, pluginList);
RefPtr<Config> myConfig = REMOTE_get_config(dbPath.hasData() ? &dbPath : NULL);
RefPtr<Config> myConfig = REMOTE_get_config(dbPath.hasData() ? &dbPath : NULL, NULL);
Remote::ParsedList onServer;
REMOTE_parseList(onServer, myConfig->getPlugins(PluginType::AuthServer));
@ -6426,7 +6433,7 @@ void SrvAuthBlock::createPluginsItr()
REMOTE_makeList(pluginList, final);
plugins = new AuthServerPlugins(PluginType::AuthServer, FB_AUTH_SERVER_VERSION, upInfo,
myConfig, pluginList.c_str());
myConfig, pluginList.c_str());
}
void SrvAuthBlock::reset()

View File

@ -333,7 +333,8 @@ int gsec(Firebird::UtilSvc* uSvc)
#else
false,
#endif
serverName.c_str());
serverName.c_str(),
!databaseNameEntered);
if (! sHandle)
{
GSEC_print(GsecMsg101); // use gsec -? to get help

View File

@ -264,6 +264,14 @@ IDebug* FB_CARG MasterImplementation::getDebug()
#endif
}
int FB_CARG MasterImplementation::serverMode(int mode)
{
static int currentMode = -1;
if (mode >= 0)
currentMode = mode;
return currentMode;
}
} // namespace Why
//

View File

@ -68,6 +68,7 @@ namespace Why
int FB_CARG same(IVersioned* first, IVersioned* second);
Firebird::IMetadataBuilder* FB_CARG getMetadataBuilder(Firebird::IStatus* status, unsigned fieldCount);
Firebird::IDebug* FB_CARG getDebug();
int FB_CARG serverMode(int mode);
};
void shutdownTimers();

View File

@ -4884,8 +4884,18 @@ static IService* getServiceManagerByName(IProvider** provider, IStatus* status,
const char* serviceName, unsigned int spbLength, const unsigned char* spb,
Firebird::ICryptKeyCallback* cryptCallback)
{
RefPtr<Config> config(Config::getDefaultConfig());
ClumpletReader readSpb(ClumpletReader::spbList, spb, spbLength);
if (readSpb.find(isc_spb_config))
{
string spb_config;
readSpb.getString(spb_config);
Config::merge(config, &spb_config);
}
for (GetPlugins<IProvider> providerIterator(PluginType::Provider,
FB_PROVIDER_VERSION, upInfo);
FB_PROVIDER_VERSION, upInfo, config);
providerIterator.hasData();
providerIterator.next())
{
@ -5211,6 +5221,13 @@ YAttachment* Dispatcher::attachOrCreateDatabase(Firebird::IStatus* status, bool
expandedFilename = orgFilename;
}
if (newDpb.find(isc_dpb_config))
{
string dpb_config;
newDpb.getString(dpb_config);
Config::merge(config, &dpb_config);
}
// Convert to UTF8
ISC_systemToUtf8(orgFilename);
ISC_systemToUtf8(expandedFilename);
@ -5249,7 +5266,7 @@ YAttachment* Dispatcher::attachOrCreateDatabase(Firebird::IStatus* status, bool
{
// Now we can expand, the file exists
ISC_utf8ToSystem(orgFilename);
if (expandDatabaseName(orgFilename, expandedFilename, &config))
if (expandDatabaseName(orgFilename, expandedFilename, NULL))
{
expandedFilename = orgFilename;
}