void RS_CONN_INFO::readMoreConnectPropsFromRegistry()

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
}