@@ -36,13 +36,18 @@ PERFORMANCE OF THIS SOFTWARE.
3636#endif
3737
3838#if ((MYSQL_VERSION_ID >= 50555 && MYSQL_VERSION_ID <= 50599 ) || \
39- (MYSQL_VERSION_ID >= 50636 && MYSQL_VERSION_ID <= 50699 ) || \
40- (MYSQL_VERSION_ID >= 50711 && MYSQL_VERSION_ID <= 50799 ) || \
41- (MYSQL_VERSION_ID >= 80000 )) && \
42- !defined(MARIADB_BASE_VERSION ) && !defined(MARIADB_VERSION_ID )
39+ (MYSQL_VERSION_ID >= 50636 && MYSQL_VERSION_ID <= 50699 ) || \
40+ (MYSQL_VERSION_ID >= 50711 && MYSQL_VERSION_ID <= 50799 ) || \
41+ (MYSQL_VERSION_ID >= 80000 )) && \
42+ !defined(MARIADB_BASE_VERSION ) && !defined(MARIADB_VERSION_ID )
4343#define HAVE_ENUM_MYSQL_OPT_SSL_MODE
4444#endif
4545
46+ #if defined(MARIADB_VERSION_ID ) && MARIADB_VERSION_ID >= 100403 || \
47+ !defined(MARIADB_VERSION_ID ) && MYSQL_VERSION_ID >= 50723
48+ #define HAVE_MYSQL_SERVER_PUBLIC_KEY
49+ #endif
50+
4651#define PY_SSIZE_T_CLEAN 1
4752#include "Python.h"
4853
@@ -431,7 +436,7 @@ _mysql_ConnectionObject_Initialize(
431436 "client_flag" , "ssl" , "ssl_mode" ,
432437 "local_infile" ,
433438 "read_timeout" , "write_timeout" , "charset" ,
434- "auth_plugin" ,
439+ "auth_plugin" , "server_public_key_path" ,
435440 NULL } ;
436441 int connect_timeout = 0 ;
437442 int read_timeout = 0 ;
@@ -442,7 +447,8 @@ _mysql_ConnectionObject_Initialize(
442447 * read_default_file = NULL ,
443448 * read_default_group = NULL ,
444449 * charset = NULL ,
445- * auth_plugin = NULL ;
450+ * auth_plugin = NULL ,
451+ * server_public_key_path = NULL ;
446452
447453 self -> converter = NULL ;
448454 self -> open = false;
@@ -462,10 +468,19 @@ _mysql_ConnectionObject_Initialize(
462468 & read_timeout ,
463469 & write_timeout ,
464470 & charset ,
465- & auth_plugin
471+ & auth_plugin ,
472+ & server_public_key_path
466473 ))
467474 return -1 ;
468475
476+ #ifndef HAVE_MYSQL_SERVER_PUBLIC_KEY
477+ if (server_public_key_path ) {
478+ PyErr_SetString (_mysql_NotSupportedError , "server_public_key_path is not supported" );
479+ return -1 ;
480+ }
481+ #endif
482+ // For compatibility with PyPy, we need to keep strong reference
483+ // to unicode objects until we use UTF8.
469484#define _stringsuck (d ,t ,s ) {t=PyMapping_GetItemString(s,#d);\
470485 if(t){d=PyUnicode_AsUTF8(t);ssl_keepref[n_ssl_keepref++]=t;}\
471486 PyErr_Clear();}
@@ -542,6 +557,10 @@ _mysql_ConnectionObject_Initialize(
542557 mysql_options (& (self -> connection ), MYSQL_OPT_SSL_CAPATH , capath );
543558 mysql_options (& (self -> connection ), MYSQL_OPT_SSL_CIPHER , cipher );
544559 }
560+ for (int i = 0 ; i < n_ssl_keepref ; i ++ ) {
561+ Py_DECREF (ssl_keepref [i ]);
562+ ssl_keepref [i ] = NULL ;
563+ }
545564
546565#ifdef HAVE_ENUM_MYSQL_OPT_SSL_MODE
547566 if (ssl_mode_set ) {
@@ -557,14 +576,14 @@ _mysql_ConnectionObject_Initialize(
557576 my_bool my_true = 1 ;
558577 my_bool my_false = 0 ;
559578 if (ssl_mode_num >= SSLMODE_REQUIRED ) {
560- mysql_optionsv (& (self -> connection ), MYSQL_OPT_SSL_ENFORCE , (void * )& my_true );
579+ mysql_options (& (self -> connection ), MYSQL_OPT_SSL_ENFORCE , (void * )& my_true );
561580 } else {
562- mysql_optionsv (& (self -> connection ), MYSQL_OPT_SSL_ENFORCE , (void * )& my_false );
581+ mysql_options (& (self -> connection ), MYSQL_OPT_SSL_ENFORCE , (void * )& my_false );
563582 }
564583 if (ssl_mode_num >= SSLMODE_VERIFY_CA ) {
565- mysql_optionsv (& (self -> connection ), MYSQL_OPT_SSL_VERIFY_SERVER_CERT , (void * )& my_true );
584+ mysql_options (& (self -> connection ), MYSQL_OPT_SSL_VERIFY_SERVER_CERT , (void * )& my_true );
566585 } else {
567- mysql_optionsv (& (self -> connection ), MYSQL_OPT_SSL_VERIFY_SERVER_CERT , (void * )& my_false );
586+ mysql_options (& (self -> connection ), MYSQL_OPT_SSL_VERIFY_SERVER_CERT , (void * )& my_false );
568587 }
569588#endif
570589
@@ -574,17 +593,17 @@ _mysql_ConnectionObject_Initialize(
574593 if (auth_plugin ) {
575594 mysql_options (& (self -> connection ), MYSQL_DEFAULT_AUTH , auth_plugin );
576595 }
596+ #ifdef HAVE_MYSQL_SERVER_PUBLIC_KEY
597+ if (server_public_key_path ) {
598+ mysql_options (& (self -> connection ), MYSQL_SERVER_PUBLIC_KEY , server_public_key_path );
599+ }
600+ #endif
577601
578602 Py_BEGIN_ALLOW_THREADS
579603 conn = mysql_real_connect (& (self -> connection ), host , user , passwd , db ,
580604 port , unix_socket , client_flag );
581605 Py_END_ALLOW_THREADS
582606
583- for (int i = 0 ; i < n_ssl_keepref ; i ++ ) {
584- Py_DECREF (ssl_keepref [i ]);
585- ssl_keepref [i ] = NULL ;
586- }
587-
588607 if (!conn ) {
589608 _mysql_Exception (self );
590609 return -1 ;
0 commit comments