@@ -83,6 +83,43 @@ struct nogvl_select_db_args {
83
83
char * db ;
84
84
};
85
85
86
+ static VALUE rb_set_ssl_mode_option (VALUE self , VALUE setting ) {
87
+ unsigned long version = mysql_get_client_version ();
88
+
89
+ if (version < 50703 ) {
90
+ rb_warn ( "Your mysql client library does not support setting ssl_mode; full support comes with 5.7.11." );
91
+ return Qnil ;
92
+ }
93
+ #ifdef HAVE_CONST_MYSQL_OPT_SSL_ENFORCE
94
+ GET_CLIENT (self );
95
+ int val = NUM2INT ( setting );
96
+ if (version >= 50703 && version < 50711 ) {
97
+ if (val == SSL_MODE_DISABLED || val == SSL_MODE_REQUIRED ) {
98
+ bool b = ( val == SSL_MODE_REQUIRED );
99
+ int result = mysql_options ( wrapper -> client , MYSQL_OPT_SSL_ENFORCE , & b );
100
+ return INT2NUM (result );
101
+
102
+ } else {
103
+ rb_warn ( "MySQL client libraries between 5.7.3 and 5.7.10 only support SSL_MODE_DISABLED and SSL_MODE_REQUIRED" );
104
+ return Qnil ;
105
+ }
106
+ }
107
+ #endif
108
+ #ifdef FULL_SSL_MODE_SUPPORT
109
+ GET_CLIENT (self );
110
+ int val = NUM2INT ( setting );
111
+
112
+ if (val != SSL_MODE_DISABLED && val != SSL_MODE_PREFERRED && val != SSL_MODE_REQUIRED && val != SSL_MODE_VERIFY_CA && val != SSL_MODE_VERIFY_IDENTITY ) {
113
+ rb_raise (cMysql2Error , "ssl_mode= takes DISABLED, PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY, you passed: %d" , val );
114
+ }
115
+ int result = mysql_options ( wrapper -> client , MYSQL_OPT_SSL_MODE , & val );
116
+
117
+ return INT2NUM (result );
118
+ #endif
119
+ #ifdef NO_SSL_MODE_SUPPORT
120
+ return Qnil ;
121
+ #endif
122
+ }
86
123
/*
87
124
* non-blocking mysql_*() functions that we won't be wrapping since
88
125
* they do not appear to hit the network nor issue any interruptible
@@ -1337,6 +1374,7 @@ void init_mysql2_client() {
1337
1374
rb_define_private_method (cMysql2Client , "default_group=" , set_read_default_group , 1 );
1338
1375
rb_define_private_method (cMysql2Client , "init_command=" , set_init_command , 1 );
1339
1376
rb_define_private_method (cMysql2Client , "ssl_set" , set_ssl_options , 5 );
1377
+ rb_define_private_method (cMysql2Client , "ssl_mode=" , rb_set_ssl_mode_option , 1 );
1340
1378
rb_define_private_method (cMysql2Client , "initialize_ext" , initialize_ext , 0 );
1341
1379
rb_define_private_method (cMysql2Client , "connect" , rb_connect , 7 );
1342
1380
rb_define_private_method (cMysql2Client , "_query" , rb_query , 2 );
@@ -1464,4 +1502,35 @@ void init_mysql2_client() {
1464
1502
rb_const_set (cMysql2Client , rb_intern ("BASIC_FLAGS" ),
1465
1503
LONG2NUM (CLIENT_BASIC_FLAGS ));
1466
1504
#endif
1505
+ #ifdef FULL_SSL_MODE_SUPPORT
1506
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_DISABLED" ), INT2NUM (SSL_MODE_DISABLED ));
1507
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_PREFERRED" ), INT2NUM (SSL_MODE_PREFERRED ));
1508
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_REQUIRED" ), INT2NUM (SSL_MODE_REQUIRED ));
1509
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_VERIFY_CA" ), INT2NUM (SSL_MODE_VERIFY_CA ));
1510
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_VERIFY_IDENTITY" ), INT2NUM (SSL_MODE_VERIFY_IDENTITY ));
1511
+ #endif
1512
+ #ifdef HAVE_CONST_MYSQL_OPT_SSL_ENFORCE
1513
+ #define SSL_MODE_DISABLED 1
1514
+ #define SSL_MODE_REQUIRED 3
1515
+ #define HAVE_CONST_SSL_MODE_DISABLED
1516
+ #define HAVE_CONST_SSL_MODE_REQUIRED
1517
+
1518
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_DISABLED" ), INT2NUM (SSL_MODE_DISABLED ));
1519
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_REQUIRED" ), INT2NUM (SSL_MODE_REQUIRED ));
1520
+ #endif
1521
+ #ifndef HAVE_CONST_SSL_MODE_DISABLED
1522
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_DISABLED" ), INT2NUM (0 ));
1523
+ #endif
1524
+ #ifndef HAVE_CONST_SSL_MODE_PREFERRED
1525
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_PREFERRED" ), INT2NUM (0 ));
1526
+ #endif
1527
+ #ifndef HAVE_CONST_SSL_MODE_REQUIRED
1528
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_REQUIRED" ), INT2NUM (0 ));
1529
+ #endif
1530
+ #ifndef HAVE_CONST_SSL_MODE_VERIFY_CA
1531
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_VERIFY_CA" ), INT2NUM (0 ));
1532
+ #endif
1533
+ #ifndef HAVE_CONST_SSL_MODE_VERIFY_IDENTITY
1534
+ rb_const_set (cMysql2Client , rb_intern ("SSL_MODE_VERIFY_IDENTITY" ), INT2NUM (0 ));
1535
+ #endif
1467
1536
}
0 commit comments