in src/odbc/rsodbc/rsconnect.cpp [2852:3078]
void RS_CONN_INFO::readMoreConnectPropsFromRegistry(int readUser)
{
RS_CONN_INFO *pConn = this;
RS_CONNECT_PROPS_INFO *pConnectProps = pConn->pConnectProps;
RS_CONN_ATTR_INFO *pConnAttr = pConn->pConnAttr;
int len;
char temp[MAX_IAM_BUF_VAL];
bool bVal;
if(pConnectProps->szDSN[0] != '\0')
{
RS_CONN_INFO::readBoolValFromDsn(pConnectProps->szDSN, RS_IAM, &(pConnectProps->isIAMAuth));
if(pConnectProps->isIAMAuth && pConnectProps->szUser[0] == '\0')
readUser = TRUE;
if(pConnectProps->szHost[0] == '\0') {
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_HOST_NAME, "", pConnectProps->szHost, MAX_IDEN_LEN, ODBC_INI);
if(pConnectProps->szHost[0] == '\0') {
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_HOST, "", pConnectProps->szHost, MAX_IDEN_LEN, ODBC_INI);
if(pConnectProps->szHost[0] == '\0')
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_SERVER, "", pConnectProps->szHost, MAX_IDEN_LEN, ODBC_INI);
}
}
if(pConnectProps->szPort[0] == '\0') {
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_PORT_NUMBER, "", pConnectProps->szPort, MAX_IDEN_LEN, ODBC_INI);
if(pConnectProps->szPort[0] == '\0')
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_PORT, "", pConnectProps->szPort, MAX_IDEN_LEN, ODBC_INI);
if (pConnectProps->szPort[0] == '\0')
strncpy(pConnectProps->szPort, DEFAULT_PORT, sizeof(pConnectProps->szPort));
}
if(pConnectProps->szDatabase[0] == '\0')
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_DATABASE, "", pConnectProps->szDatabase, MAX_IDEN_LEN, ODBC_INI);
if(readUser)
{
if(pConnectProps->szUser[0] == '\0') {
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_LOGON_ID, "", pConnectProps->szUser, MAX_IDEN_LEN, ODBC_INI);
if(pConnectProps->szUser[0] == '\0') {
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_UID, "", pConnectProps->szUser, MAX_IDEN_LEN, ODBC_INI);
if(pConnectProps->szUser[0] == '\0') {
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_USER, "", pConnectProps->szUser, MAX_IDEN_LEN, ODBC_INI);
}
}
}
if(pConnectProps->szPassword[0] == '\0') {
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_PASSWORD, "", pConnectProps->szPassword, MAX_IDEN_LEN, ODBC_INI);
#ifdef WIN32
if (pConnectProps->szPassword[0] != '\0')
{
// Decrypt the password
char *pwd = (char *)decode64Password((const char *)(pConnectProps->szPassword), strlen(pConnectProps->szPassword));
if (pwd)
{
strncpy(pConnectProps->szPassword, pwd, sizeof(pConnectProps->szPassword));
free(pwd);
}
}
#endif
if(pConnectProps->szPassword[0] == '\0') {
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_PWD, "", pConnectProps->szPassword, MAX_IDEN_LEN, ODBC_INI);
}
}
}
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_LOGIN_TIMEOUT, &(pConnAttr->iLoginTimeout));
// RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_ENABLE_DESCRIBE_PARAM, &(pConnectProps->iEnableDescribeParam));
// RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_EXTENDED_COLUMN_METADATA, &(pConnectProps->iExtendedColumnMetaData));
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_APPLICATION_USING_THREADS, &(pConnectProps->iApplicationUsingThreads));
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_FETCH_REF_CURSOR, &(pConnectProps->iFetchRefCursor));
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_TRANSACTION_ERROR_BEHAVIOR, &(pConnectProps->iTransactionErrorBehavior));
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_CONNECTION_RETRY_COUNT, &(pConnectProps->iConnectionRetryCount));
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_CONNECTION_RETRY_DELAY, &(pConnectProps->iConnectionRetryDelay));
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_QUERY_TIMEOUT, &(pConnectProps->iQueryTimeout));
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_CLIENT_PROTOCOL_VERSION, &(pConnectProps->iClientProtocolVersion));
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_STRING_TYPE, pConnectProps->szStringType, pConnectProps->szStringType, sizeof(pConnectProps->szStringType), ODBC_INI);
if(pConnectProps->pInitializationString == NULL)
{
len = ON_CONNECT_CMD_MAX_LEN;
if(len > 0)
{
pConnectProps->pInitializationString = (char *)rs_calloc(1, len + 1);
if(pConnectProps->pInitializationString)
{
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_INITIALIZATION_STRING, "", pConnectProps->pInitializationString, len, ODBC_INI);
}
}
}
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_TRACE, &(pConnAttr->iTrace));
if(pConnAttr->iTrace == SQL_OPT_TRACE_ON)
pConnectProps->iTraceLevel = LOG_LEVEL_DEBUG;
else
if(pConnAttr->iTrace == SQL_OPT_TRACE_OFF)
pConnectProps->iTraceLevel = LOG_LEVEL_OFF;
if(pConnAttr->pTraceFile == NULL || pConnAttr->pTraceFile[0] == '\0')
{
pConnAttr->pTraceFile = (char *)rs_free(pConnAttr->pTraceFile);
pConnAttr->pTraceFile = (char *)rs_calloc(1, MAX_PATH + 1);
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_TRACE_FILE, "", pConnAttr->pTraceFile, MAX_PATH, ODBC_INI);
}
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_TRACE_LEVEL, &(pConnectProps->iTraceLevel));
if(pConnectProps->iTraceLevel == LOG_LEVEL_DEBUG)
pConnAttr->iTrace = SQL_OPT_TRACE_ON;
else
if(pConnectProps->iTraceLevel == LOG_LEVEL_OFF)
pConnAttr->iTrace = SQL_OPT_TRACE_OFF;
// Read CSC related parameters
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_CSC_ENABLE, &(pConnectProps->iCscEnable));
if((pConnectProps->iCscEnable) && (pConnectProps->iCscEnable != 1))
pConnectProps->iCscEnable = 0;
RS_CONN_INFO::readLongLongValFromDsn(pConnectProps->szDSN, RS_CSC_THRESHOLD, &(pConnectProps->llCscThreshold));
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_CSC_PATH, "", pConnectProps->szCscPath, MAX_PATH, ODBC_INI);
RS_CONN_INFO::readLongLongValFromDsn(pConnectProps->szDSN, RS_CSC_MAX_FILE_SIZE, &(pConnectProps->llCscMaxFileSize));
// Read SSL related parameters
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_SSL_MODE, "", pConnectProps->szSslMode, MAX_IDEN_LEN, ODBC_INI);
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_ENCRYPTION_METHOD, &(pConnectProps->iEncryptionMethod));
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_VALIDATE_SERVER_CERTIFICATE, &(pConnectProps->iValidateServerCertificate));
// RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_HOST_NAME_IN_CERTIFICATE, "", pConnectProps->szHostNameInCertificate, MAX_IDEN_LEN, ODBC_INI);
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_TRUST_STORE, "", pConnectProps->szTrustStore, MAX_PATH, ODBC_INI);
// moving cafile and capath from iam props to conection props
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_IAM_CA_PATH, "", pConnectProps->szCaPath, sizeof(pConnectProps->szCaPath), ODBC_INI);
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_IAM_CA_FILE, "", pConnectProps->szCaFile, sizeof(pConnectProps->szCaFile), ODBC_INI);
// Read Multi-Insert command conversion
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_MULTI_INSERT_CMD_CONVERT_ENABLE, &(pConnectProps->iMultiInsertCmdConvertEnable));
// Read KSN
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_KERBEROS_SERVICE_NAME, "", pConnectProps->szKerberosServiceName, MAX_IDEN_LEN, ODBC_INI);
#ifdef WIN32
// Read KSA
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_KERBEROS_API, "", pConnectProps->szKerberosAPI, MAX_IDEN_LEN, ODBC_INI);
#endif
// Read Streaming Cursor Rows
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_STREAMING_CURSOR_ROWS, &(pConnectProps->iStreamingCursorRows));
if(pConnectProps->iCscEnable)
pConnectProps->iStreamingCursorRows = 0;
else
if(pConnectProps->iStreamingCursorRows < 0)
pConnectProps->iStreamingCursorRows = 0;
// Read current db only or multiple db
// If user didn't include DatabaseMetadataCurrentDbOnly flag in dsn, RS_SQLGetPrivateProfileString would return empty string, which will cause readBoolValFromDsn returning false to bVal
// In this case, we would use default value in iDatabaseMetadataCurrentDbOnly instead of calling readBoolValFromDsn
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_DATABASE_METADATA_CURRENT_DB_ONLY, "", temp, MAX_IAM_BUF_VAL, ODBC_INI);
if(temp[0] != '\0') {
bVal = (pConnectProps->iDatabaseMetadataCurrentDbOnly == 1);
RS_CONN_INFO::readBoolValFromDsn(pConnectProps->szDSN, RS_DATABASE_METADATA_CURRENT_DB_ONLY, &bVal);
pConnectProps->iDatabaseMetadataCurrentDbOnly = (bVal) ? 1 : 0;
}
// Read READ ONLY session
bVal = (pConnectProps->iReadOnly == 1);
RS_CONN_INFO::readBoolValFromDsn(pConnectProps->szDSN, RS_READ_ONLY, &bVal);
pConnectProps->iReadOnly = (bVal) ? 1 : 0;
// Read Application name
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_APPLICATION_NAME, "", pConnAttr->szApplicationName, sizeof(pConnAttr->szApplicationName), ODBC_INI);
// Read Compression
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_COMPRESSION, "", pConnAttr->szCompression, sizeof(pConnAttr->szCompression), ODBC_INI);
// Read Keep alive values
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_KEEP_ALIVE, "1", pConnectProps->szKeepAlive, MAX_NUMBER_BUF_LEN, ODBC_INI);
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_KEEP_ALIVE_COUNT, "", pConnectProps->szKeepAliveCount, MAX_NUMBER_BUF_LEN, ODBC_INI);
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_KEEP_ALIVE_IDLE, "", pConnectProps->szKeepAliveIdle, MAX_NUMBER_BUF_LEN, ODBC_INI);
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_KEEP_ALIVE_INTERVAL, "", pConnectProps->szKeepAliveInterval, MAX_NUMBER_BUF_LEN, ODBC_INI);
// Min TLS
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_MIN_TLS, "", pConnectProps->szMinTLS, MAX_NUMBER_BUF_LEN, ODBC_INI);
char pluginName[MAX_IDEN_LEN];
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_PLUGIN_NAME, "", pluginName, MAX_IDEN_LEN, ODBC_INI);
if(_stricmp(pluginName, PLUGIN_IDP_TOKEN_AUTH) == 0 || _stricmp(pluginName, PLUGIN_BROWSER_IDC_AUTH) == 0) {
pConnectProps->isNativeAuth = true;
}
// Read IAM props
if(pConnectProps->isIAMAuth || pConnectProps->isNativeAuth)
readIamConnectPropsFromRegistry();
// Read HTTPS Proxy settings
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_HTTPS_PROXY_HOST, "", temp, MAX_IAM_BUF_VAL, ODBC_INI);
if(temp[0] != '\0') {
pConnectProps->pHttpsProps = (RS_PROXY_CONN_PROPS_INFO *)rs_calloc(1,sizeof(RS_PROXY_CONN_PROPS_INFO));
RS_PROXY_CONN_PROPS_INFO *pHttpsProps = pConnectProps->pHttpsProps;
rs_strncpy(pHttpsProps->szHttpsHost,temp,sizeof(pHttpsProps->szHttpsHost));
RS_CONN_INFO::readIntValFromDsn(pConnectProps->szDSN, RS_HTTPS_PROXY_PORT, &(pHttpsProps->iHttpsPort));
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_HTTPS_PROXY_USER_NAME, "", pHttpsProps->szHttpsUser, MAX_IDEN_LEN, ODBC_INI);
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_HTTPS_PROXY_PASSWORD, "", pHttpsProps->szHttpsPassword, MAX_IDEN_LEN, ODBC_INI);
RS_CONN_INFO::readBoolValFromDsn(pConnectProps->szDSN, RS_IDP_USE_HTTPS_PROXY, &(pHttpsProps->isUseProxyForIdp));
}
// Read TCP Proxy settings
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_TCP_PROXY_HOST, "", temp, MAX_IAM_BUF_VAL, ODBC_INI);
if (temp[0] != '\0') {
pConnectProps->pTcpProxyProps = (RS_TCP_PROXY_CONN_PROPS_INFO *)rs_calloc(1, sizeof(RS_TCP_PROXY_CONN_PROPS_INFO));
RS_TCP_PROXY_CONN_PROPS_INFO *pTcpProxyProps = pConnectProps->pTcpProxyProps;
rs_strncpy(pTcpProxyProps->szHost, temp,sizeof(pTcpProxyProps->szHost));
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_TCP_PROXY_PORT, "", pTcpProxyProps->szPort, MAX_IDEN_LEN, ODBC_INI);
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_TCP_PROXY_USER_NAME, "", pTcpProxyProps->szUser, MAX_IDEN_LEN, ODBC_INI);
RS_SQLGetPrivateProfileString(pConnectProps->szDSN, RS_TCP_PROXY_PASSWORD, "", pTcpProxyProps->szPassword, MAX_IDEN_LEN, ODBC_INI);
}
} // DSN is not empty
}