/* The following code was contributed by Russell Levy russell@rentmagic.ca on 2007-03-15 The copyright was assigned and transferred under the terms of the MySQL Contributor License Agreement (CLA#nnnn) */ Index: SDK/Installer/include/MYODBCInsDataSource.h =================================================================== --- SDK/Installer/include/MYODBCInsDataSource.h (revision 814) +++ SDK/Installer/include/MYODBCInsDataSource.h (working copy) @@ -107,7 +107,13 @@ BOOL setMode( DATASOURCE_MODE nMode ); BOOL setScope( DATASOURCE_SCOPE nScope ); - QString getName(); + BOOL setSSLKEY(const QString &stringSSLKEY); + BOOL setSSLCERT(const QString &stringSSLCERT); + BOOL setSSLCA(const QString &stringSSLCA); + BOOL setSSLCAPATH(const QString &stringSSLCAPATH); + BOOL setSSLCIPHER(const QString &stringSSLCIPHER); + + QString getName(); QString getDRIVER(); QString getDESCRIPTION(); QString getSERVER(); @@ -121,6 +127,12 @@ DATASOURCE_MODE getMode(); DATASOURCE_SCOPE getScope(); + QString getSSLKEY(); + QString getSSLCERT(); + QString getSSLCA(); + QString getSSLCAPATH(); + QString getSSLCIPHER(); + BOOL doRead( const QString &stringDataSourceName, DATASOURCE_SCOPE nScope ); BOOL doRead( const QString &stringDataSourceName ); BOOL doRead(); Index: SDK/Installer/include/MYODBCInsDriverConnect.h =================================================================== --- SDK/Installer/include/MYODBCInsDriverConnect.h (revision 814) +++ SDK/Installer/include/MYODBCInsDriverConnect.h (working copy) @@ -86,6 +86,12 @@ BOOL setFILEDSN( const QString &stringFILEDSN ); BOOL setSAVEFILE( const QString &stringSAVEFILE ); + BOOL setSSLKEY(const QString &stringSSLKEY); + BOOL setSSLCERT(const QString &stringSSLCERT); + BOOL setSSLCA(const QString &stringSSLCA); + BOOL setSSLCAPATH(const QString &stringSSLCAPATH); + BOOL setSSLCIPHER(const QString &stringSSLCACIPHER); + QString getAttributes(); /*!< Returns a comma delimited set of key=value attributes. */ QString getDSN(); QString getDRIVER(); @@ -105,7 +111,13 @@ QString getSAVEFILE(); static QString getSETUP( const QString &stringDRIVER ); - void doClear(); /*!< Sets all attributes to QString::null - does not change Method nor Prompt. */ + QString getSSLKEY(); + QString getSSLCERT(); + QString getSSLCA(); + QString getSSLCAPATH(); + QString getSSLCIPHER(); + + void doClear(); /*!< Sets all attributes to QString::null - does not change Method nor Prompt. */ BOOL doRead(); protected: Index: SDK/Installer/Library/MYODBCInsDataSource.cpp =================================================================== --- SDK/Installer/Library/MYODBCInsDataSource.cpp (revision 814) +++ SDK/Installer/Library/MYODBCInsDataSource.cpp (working copy) @@ -187,6 +187,51 @@ MYODBCDbgReturn3( "%d", true ) } +BOOL MYODBCInsDataSource::setSSLKEY( const QString &stringSSLKEY ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLKEY"] = stringSSLKEY; + + MYODBCDbgReturn3( "%d", true ) +} + +BOOL MYODBCInsDataSource::setSSLCERT( const QString &stringSSLCERT ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLCERT"] = stringSSLCERT; + + MYODBCDbgReturn3( "%d", true ) +} + +BOOL MYODBCInsDataSource::setSSLCA( const QString &stringSSLCA ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLCA"] = stringSSLCA; + + MYODBCDbgReturn3( "%d", true ) +} + +BOOL MYODBCInsDataSource::setSSLCAPATH( const QString &stringSSLCAPATH ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLCAPATH"] = stringSSLCAPATH; + + MYODBCDbgReturn3( "%d", true ) +} + +BOOL MYODBCInsDataSource::setSSLCIPHER( const QString &stringSSLCIPHER ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLCIPHER"] = stringSSLCIPHER; + + MYODBCDbgReturn3( "%d", true ) +} + /* QString MYODBCInsDataSource::getDriverFileName() { @@ -273,6 +318,41 @@ MYODBCDbgReturn1( hashAttributes["OPTION"] ); } +QString MYODBCInsDataSource::getSSLKEY() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLKEY"] ); +} + +QString MYODBCInsDataSource::getSSLCERT() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLCERT"] ); +} + +QString MYODBCInsDataSource::getSSLCA() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLCA"] ); +} + +QString MYODBCInsDataSource::getSSLCAPATH() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLCAPATH"] ); +} + +QString MYODBCInsDataSource::getSSLCIPHER() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLCIPHER"] ); +} + MYODBCInsDataSource::DATASOURCE_MODE MYODBCInsDataSource::getMode() { MYODBCDbgEnter(); @@ -515,7 +595,13 @@ hashAttributes["SOCKET"] = QString::null; /*!< Unix socket file or Windows named pipe to connect to. */ hashAttributes["STMT"] = QString::null; /*!< Statement that will be exec when connecting to MySQL. */ hashAttributes["OPTION"] = QString::null; /*!< Options that specify how MyODBC should work. */ + hashAttributes[ "SSLKEY" ] = QString::null; /*!< SSL Key to use for SSL connections. */ + hashAttributes[ "SSLCERT" ] = QString::null; /*!< SSL certificate to use for SSL connections. */ + hashAttributes[ "SSLCA" ] = QString::null; /*!< SSL CA certificate to use for SSL connections. */ + hashAttributes[ "SSLCAPATH" ] = QString::null; /*!< Path to look for SSL CA certificate to use for SSL connections. */ + hashAttributes[ "SSLCIPHER" ] = QString::null; /*!< Cipher(s) to use for SSL connections. */ + MYODBCDbgReturn2(); } Index: SDK/Installer/Library/MYODBCInsDriverConnect.cpp =================================================================== --- SDK/Installer/Library/MYODBCInsDriverConnect.cpp (revision 814) +++ SDK/Installer/Library/MYODBCInsDriverConnect.cpp (working copy) @@ -54,6 +54,11 @@ vectorAttributesValid.append( "OPTION" ); /*!< Options that specify how MyODBC should work. */ vectorAttributesValid.append( "FILEDSN" ); /*!< This is to support case where app is linked directly to driver. */ vectorAttributesValid.append( "SAVEFILE" ); /*!< This is to support case where app is linked directly to driver. */ + vectorAttributesValid.append( "SSLKEY" ); /*!< SSL Key to use for SSL connections. */ + vectorAttributesValid.append( "SSLCERT" ); /*!< SSL certificate to use for SSL connections. */ + vectorAttributesValid.append( "SSLCA" ); /*!< SSL CA certificate to use for SSL connections. */ + vectorAttributesValid.append( "SSLCAPATH" ); /*!< Path to look for SSL CA certificate to use for SSL connections. */ + vectorAttributesValid.append( "SSLCIPHER" ); /*!< Cipher(s) to use for SSL connections. */ doClear(); @@ -222,6 +227,51 @@ MYODBCDbgReturn3( "%d", true ) } +BOOL MYODBCInsDriverConnect::setSSLKEY( const QString &stringSSLKEY ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLKEY"] = stringSSLKEY; + + MYODBCDbgReturn3( "%d", true ) +} + +BOOL MYODBCInsDriverConnect::setSSLCERT( const QString &stringSSLCERT ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLCERT"] = stringSSLCERT; + + MYODBCDbgReturn3( "%d", true ) +} + +BOOL MYODBCInsDriverConnect::setSSLCA( const QString &stringSSLCA ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLCA"] = stringSSLCA; + + MYODBCDbgReturn3( "%d", true ) +} + +BOOL MYODBCInsDriverConnect::setSSLCAPATH( const QString &stringSSLCAPATH ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLCAPATH"] = stringSSLCAPATH; + + MYODBCDbgReturn3( "%d", true ) +} + +BOOL MYODBCInsDriverConnect::setSSLCIPHER( const QString &stringSSLCIPHER ) +{ + MYODBCDbgEnter(); + + hashAttributes["SSLCIPHER"] = stringSSLCIPHER; + + MYODBCDbgReturn3( "%d", true ) +} + BOOL MYODBCInsDriverConnect::setSETUP( const QString &stringSETUP ) { MYODBCDbgEnter(); @@ -367,6 +417,42 @@ MYODBCDbgReturn1( hashAttributes["OPTION"] ); } + +QString MYODBCInsDriverConnect::getSSLKEY() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLKEY"] ); +} + +QString MYODBCInsDriverConnect::getSSLCERT() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLCERT"] ); +} + +QString MYODBCInsDriverConnect::getSSLCA() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLCA"] ); +} + +QString MYODBCInsDriverConnect::getSSLCAPATH() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLCAPATH"] ); +} + +QString MYODBCInsDriverConnect::getSSLCIPHER() +{ + MYODBCDbgEnter(); + + MYODBCDbgReturn1( hashAttributes["SSLCIPHER"] ); +} + QString MYODBCInsDriverConnect::getSETUP() { MYODBCDbgEnter(); Index: SDK/MYSQLPlus/include/MConnection.h =================================================================== --- SDK/MYSQLPlus/include/MConnection.h (revision 814) +++ SDK/MYSQLPlus/include/MConnection.h (working copy) @@ -392,6 +392,10 @@ SQLRETURN doTransactionCommit(); SQLRETURN doTransactionRollback(); + + SQLRETURN sslSetup(MYODBCInsDataSource *pDataSource); + SQLRETURN sslSetup(MYODBCInsDriverConnect *pDriverConnect); + /* iser */ BOOL isConnected(); BOOL isTransaction(); Index: SDK/MYSQLPlus/Library/MConnection.cpp =================================================================== --- SDK/MYSQLPlus/Library/MConnection.cpp (revision 814) +++ SDK/MYSQLPlus/Library/MConnection.cpp (working copy) @@ -1322,6 +1322,23 @@ MYODBCDbgReturn( nReturn ); } +SQLRETURN MConnection::sslSetup( MYODBCInsDataSource *pDataSource ) +{ + QString key = "", cert = "", ca = "", capath = "", cipher = ""; + key = pDataSource->getSSLKEY(); + cert = pDataSource->getSSLCERT(); + ca = pDataSource->getSSLCA(); + capath = pDataSource->getSSLCAPATH(); + cipher = pDataSource->getSSLCIPHER(); + mysql_ssl_set((MYSQL*)pMySQL, + key.isEmpty() ? NULL : key.toUtf8().data(), + cert.isEmpty() ? NULL : cert.toUtf8().data(), + ca.isEmpty() ? NULL : ca.toUtf8().data(), + capath.isEmpty() ? NULL : capath.toUtf8().data(), + cipher.isEmpty() ? NULL : cipher.toUtf8().data()); + return 0; +} + SQLRETURN MConnection::doConnectInternal( MYODBCInsDataSource *pDataSource ) { MYODBCDbgEnter(); @@ -1329,9 +1346,10 @@ /* allocate the MYSQL handle (this will silently do the library init as needed) */ pMySQL = mysql_init( NULL ); + sslSetup(pDataSource); /* translate our flags into client while appling pre-connect flags */ ulong nFlags = getClientFlag( pDataSource->getOPTION().toULong(), pDataSource->getSTMT() ); - + /* ask mysql for a connection */ if ( !mysql_real_connect( (MYSQL*)pMySQL, pDataSource->getSERVER().toUtf8().data(), @@ -1342,7 +1360,7 @@ pDataSource->getSOCKET().toUtf8().data(), (uint)nFlags ) || /* use utf8 for all server communication */ - mysql_set_character_set( (MYSQL*)pMySQL, "utf8" ) ) + mysql_set_character_set( (MYSQL*)pMySQL, "utf8" )) { getDiagnostic()->doAppend( MDiagnostic::STATE_08001, mysql_errno( (MYSQL*)pMySQL ), mysql_error( (MYSQL*)pMySQL ) ); mysql_close( (MYSQL*)pMySQL ); @@ -1384,6 +1402,24 @@ MYODBCDbgReturn( SQL_SUCCESS ); } + +SQLRETURN MConnection::sslSetup( MYODBCInsDriverConnect *pDriverConnect ) +{ + QString key = "", cert = "", ca = "", capath = "", cipher = ""; + key = pDriverConnect->getSSLKEY(); + cert = pDriverConnect->getSSLCERT(); + ca = pDriverConnect->getSSLCA(); + capath = pDriverConnect->getSSLCAPATH(); + cipher = pDriverConnect->getSSLCIPHER(); + mysql_ssl_set((MYSQL*)pMySQL, + key.isEmpty() ? NULL : key.toUtf8().data(), + cert.isEmpty() ? NULL : cert.toUtf8().data(), + ca.isEmpty() ? NULL : ca.toUtf8().data(), + capath.isEmpty() ? NULL : capath.toUtf8().data(), + cipher.isEmpty() ? NULL : cipher.toUtf8().data()); + return 0; +} + SQLRETURN MConnection::doConnectInternal( MYODBCInsDriverConnect *pDriverConnect ) { MYODBCDbgEnter(); @@ -1393,8 +1429,9 @@ /* translate our flags into client while appling pre-connect flags */ ulong nFlags = getClientFlag( pDriverConnect->getOPTION().toULong(), pDriverConnect->getSTMT() ); - - /* ask mysql for a connection */ + sslSetup(pDriverConnect); + // mysql_ssl_set((MYSQL*)pMySQL, NULL, NULL, "C:\\odbc\\mysql-5.0.37-win32\\mysql-test\\std_data\\cacert.pem", NULL, NULL); + /* ask mysql for a connection */ if ( !mysql_real_connect( (MYSQL*)pMySQL, pDriverConnect->getSERVER().toUtf8().data(), pDriverConnect->getUID().toUtf8().data(), @@ -1407,6 +1444,7 @@ mysql_set_character_set( (MYSQL*)pMySQL, "utf8" ) ) { getDiagnostic()->doAppend( MDiagnostic::STATE_08001, mysql_errno( (MYSQL*)pMySQL ), mysql_error( (MYSQL*)pMySQL ) ); + mysql_close( (MYSQL*)pMySQL ); pMySQL = NULL; MYODBCDbgReturn( SQL_ERROR ); /* End of the code contribution by Russell Levy russell@rentmagic.ca on 2007-03-15 (CLA#nnnn) */