20
20
#include "mariadb_python.h"
21
21
#include "docs/connection.h"
22
22
#include "docs/exception.h"
23
+ #include <datetime.h>
23
24
24
25
#define MADB_SET_OPTION (m ,o ,v )\
25
26
if (mysql_optionsv((m), (o), (v)))\
@@ -40,6 +41,7 @@ char *dsn_keys[]= {
40
41
"pool_reset_connection" , "plugin_dir" ,
41
42
"username" , "db" , "passwd" ,
42
43
"status_callback" , "tls_version" ,
44
+ "tls_fp" , "tls_fp_list" ,
43
45
NULL
44
46
};
45
47
@@ -193,6 +195,19 @@ PyMemberDef MrdbConnection_Members[] =
193
195
"Indicates if connection uses TLS/SSL" },
194
196
{NULL } /* always last */
195
197
};
198
+
199
+ int connection_datetime_init (void )
200
+ {
201
+ PyDateTime_IMPORT ;
202
+
203
+ if (!PyDateTimeAPI ) {
204
+ PyErr_SetString (PyExc_ImportError , "DateTimeAPI initialization failed" );
205
+ return 1 ;
206
+ }
207
+ return 0 ;
208
+ }
209
+
210
+
196
211
#if MARIADB_PACKAGE_VERSION_ID > 30301
197
212
void MrdbConnection_process_status_info (void * data , enum enum_mariadb_status_info type , ...)
198
213
{
@@ -296,7 +311,7 @@ MrdbConnection_Initialize(MrdbConnection *self,
296
311
* default_group = NULL ,
297
312
* ssl_key = NULL , * ssl_cert = NULL , * ssl_ca = NULL , * ssl_capath = NULL ,
298
313
* ssl_crl = NULL , * ssl_crlpath = NULL , * ssl_cipher = NULL ,
299
- * plugin_dir = NULL , * tls_version = NULL ;
314
+ * plugin_dir = NULL , * tls_version = NULL , * tls_fp = NULL , * tls_fp_list = NULL ;
300
315
char * pool_name = 0 ;
301
316
uint32_t pool_size = 0 ;
302
317
uint8_t ssl_enforce = 0 ;
@@ -308,7 +323,7 @@ MrdbConnection_Initialize(MrdbConnection *self,
308
323
PyObject * status_callback = NULL ;
309
324
310
325
if (!PyArg_ParseTupleAndKeywords (args , dsnargs ,
311
- "|zzzzziziiibbzzzzzzzzzzibizibzzzzOz :connect" ,
326
+ "|zzzzziziiibbzzzzzzzzzzibizibzzzzOzzz :connect" ,
312
327
dsn_keys ,
313
328
& dsn , & host , & user , & password , & schema , & port , & socket ,
314
329
& connect_timeout , & read_timeout , & write_timeout ,
@@ -320,7 +335,7 @@ MrdbConnection_Initialize(MrdbConnection *self,
320
335
& client_flags , & pool_name , & pool_size ,
321
336
& reset_session , & plugin_dir ,
322
337
& user , & schema , & password , & status_callback ,
323
- & tls_version ))
338
+ & tls_version , & tls_fp , & tls_fp_list ))
324
339
{
325
340
return -1 ;
326
341
}
@@ -424,7 +439,8 @@ MrdbConnection_Initialize(MrdbConnection *self,
424
439
}
425
440
426
441
/* set TLS/SSL options */
427
- if (ssl_enforce || ssl_key || ssl_ca || ssl_cert || ssl_capath || ssl_cipher || tls_version )
442
+ if (ssl_enforce || ssl_key || ssl_ca || ssl_cert || ssl_capath || ssl_cipher || tls_version ||
443
+ tls_fp || tls_fp_list )
428
444
mysql_ssl_set (self -> mysql , (const char * )ssl_key ,
429
445
(const char * )ssl_cert ,
430
446
(const char * )ssl_ca ,
@@ -447,6 +463,16 @@ MrdbConnection_Initialize(MrdbConnection *self,
447
463
if (mysql_options (self -> mysql , MARIADB_OPT_TLS_VERSION , tls_version ))
448
464
goto end ;
449
465
}
466
+ if (tls_fp )
467
+ {
468
+ if (mysql_options (self -> mysql , MARIADB_OPT_SSL_FP , tls_fp ))
469
+ goto end ;
470
+ }
471
+ if (tls_fp_list )
472
+ {
473
+ if (mysql_options (self -> mysql , MARIADB_OPT_SSL_FP_LIST , tls_fp_list ))
474
+ goto end ;
475
+ }
450
476
451
477
mysql_real_connect (self -> mysql , host , user , password , schema , port ,
452
478
socket , client_flags );
@@ -681,13 +707,67 @@ static int MrdbConnection_setreconnect(MrdbConnection *self,
681
707
}
682
708
/* }}} */
683
709
710
+ static PyObject *
711
+ MrdbConnection_X509info (MARIADB_X509_INFO * info )
712
+ {
713
+ PyObject * dict , * key , * val ;
714
+ struct tm * tmp ;
715
+ if (!info )
716
+ Py_RETURN_NONE ;
717
+
718
+ dict = PyDict_New ();
719
+
720
+ key = PyUnicode_FromString ("version" );
721
+ val = PyLong_FromLong ((long )info -> version );
722
+ PyDict_SetItem (dict , key , val );
723
+ Py_DECREF (key );
724
+ Py_DECREF (val );
725
+
726
+ key = PyUnicode_FromString ("subject" );
727
+ val = PyUnicode_FromString (info -> subject );
728
+ PyDict_SetItem (dict , key , val );
729
+ Py_DECREF (key );
730
+ Py_DECREF (val );
731
+
732
+ key = PyUnicode_FromString ("issuer" );
733
+ val = PyUnicode_FromString (info -> issuer );
734
+ PyDict_SetItem (dict , key , val );
735
+ Py_DECREF (key );
736
+ Py_DECREF (val );
737
+
738
+ key = PyUnicode_FromString ("fingerprint" );
739
+ val = PyUnicode_FromString (info -> fingerprint );
740
+ PyDict_SetItem (dict , key , val );
741
+ Py_DECREF (key );
742
+ Py_DECREF (val );
743
+
744
+ tmp = & info -> not_before ;
745
+ key = PyUnicode_FromString ("not_before" );
746
+ val = PyDateTime_FromDateAndTime (tmp -> tm_year + 1900 , tmp -> tm_mon + 1 , tmp -> tm_mday ,
747
+ tmp -> tm_hour , tmp -> tm_min , tmp -> tm_sec , 0 );
748
+ PyDict_SetItem (dict , key , val );
749
+ Py_DECREF (key );
750
+ Py_DECREF (val );
751
+
752
+ tmp = & info -> not_after ;
753
+ key = PyUnicode_FromString ("not_after" );
754
+ val = PyDateTime_FromDateAndTime (tmp -> tm_year + 1900 , tmp -> tm_mon + 1 , tmp -> tm_mday ,
755
+ tmp -> tm_hour , tmp -> tm_min , tmp -> tm_sec , 0 );
756
+ PyDict_SetItem (dict , key , val );
757
+ Py_DECREF (key );
758
+ Py_DECREF (val );
759
+
760
+ return dict ;
761
+ }
762
+
684
763
static PyObject *
685
764
MrdbConnection_getinfo (MrdbConnection * self , PyObject * optionval )
686
765
{
687
766
union {
688
767
char * str ;
689
768
uint64_t num ;
690
769
uint8_t b ;
770
+ void * ptr ;
691
771
} val ;
692
772
693
773
uint32_t option ;
@@ -709,43 +789,53 @@ MrdbConnection_getinfo(MrdbConnection *self, PyObject *optionval)
709
789
}
710
790
711
791
switch (option ) {
712
- case MARIADB_CONNECTION_UNIX_SOCKET :
713
- case MARIADB_CONNECTION_USER :
714
- case MARIADB_CHARSET_NAME :
715
- case MARIADB_TLS_LIBRARY :
716
- case MARIADB_CLIENT_VERSION :
717
- case MARIADB_CONNECTION_HOST :
718
- case MARIADB_CONNECTION_INFO :
719
- case MARIADB_CONNECTION_SCHEMA :
720
- case MARIADB_CONNECTION_SQLSTATE :
721
- case MARIADB_CONNECTION_SOCKET :
722
- case MARIADB_CONNECTION_SSL_CIPHER :
723
- case MARIADB_CONNECTION_TLS_VERSION :
724
- case MARIADB_CONNECTION_SERVER_VERSION :
792
+ case PYMARIADB_CONNECTION_UNIX_SOCKET :
793
+ case PYMARIADB_CONNECTION_USER :
794
+ case PYMARIADB_CHARSET_NAME :
795
+ case PYMARIADB_TLS_LIBRARY :
796
+ case PYMARIADB_CLIENT_VERSION :
797
+ case PYMARIADB_CONNECTION_HOST :
798
+ case PYMARIADB_CONNECTION_INFO :
799
+ case PYMARIADB_CONNECTION_SCHEMA :
800
+ case PYMARIADB_CONNECTION_SQLSTATE :
801
+ case PYMARIADB_CONNECTION_SOCKET :
802
+ case PYMARIADB_CONNECTION_SSL_CIPHER :
803
+ case PYMARIADB_CONNECTION_TLS_VERSION :
804
+ case PYMARIADB_CONNECTION_SERVER_VERSION :
725
805
return PyUnicode_FromString (val .str ? val .str : "" );
726
806
break ;
727
807
728
- case MARIADB_CHARSET_ID :
729
- case MARIADB_CLIENT_VERSION_ID :
730
- case MARIADB_CONNECTION_ASYNC_TIMEOUT :
731
- case MARIADB_CONNECTION_ASYNC_TIMEOUT_MS :
732
- case MARIADB_CONNECTION_PORT :
733
- case MARIADB_CONNECTION_PROTOCOL_VERSION_ID :
734
- case MARIADB_CONNECTION_SERVER_TYPE :
735
- case MARIADB_CONNECTION_SERVER_VERSION_ID :
736
- case MARIADB_CONNECTION_TLS_VERSION_ID :
737
- case MARIADB_MAX_ALLOWED_PACKET :
738
- case MARIADB_NET_BUFFER_LENGTH :
739
- case MARIADB_CONNECTION_SERVER_STATUS :
740
- case MARIADB_CONNECTION_SERVER_CAPABILITIES :
741
- case MARIADB_CONNECTION_EXTENDED_SERVER_CAPABILITIES :
742
- case MARIADB_CONNECTION_CLIENT_CAPABILITIES :
743
- #ifdef MARIADB_CONNECTION_BYTES_READ
744
- case MARIADB_CONNECTION_BYTES_READ :
745
- case MARIADB_CONNECTION_BYTES_SENT :
746
- #endif
808
+ case PYMARIADB_CHARSET_ID :
809
+ case PYMARIADB_CLIENT_VERSION_ID :
810
+ case PYMARIADB_CONNECTION_ASYNC_TIMEOUT :
811
+ case PYMARIADB_CONNECTION_ASYNC_TIMEOUT_MS :
812
+ case PYMARIADB_CONNECTION_PORT :
813
+ case PYMARIADB_CONNECTION_PROTOCOL_VERSION_ID :
814
+ case PYMARIADB_CONNECTION_SERVER_TYPE :
815
+ case PYMARIADB_CONNECTION_SERVER_VERSION_ID :
816
+ case PYMARIADB_CONNECTION_TLS_VERSION_ID :
817
+ case PYMARIADB_MAX_ALLOWED_PACKET :
818
+ case PYMARIADB_NET_BUFFER_LENGTH :
819
+ case PYMARIADB_CONNECTION_SERVER_STATUS :
820
+ case PYMARIADB_CONNECTION_SERVER_CAPABILITIES :
821
+ case PYMARIADB_CONNECTION_EXTENDED_SERVER_CAPABILITIES :
822
+ case PYMARIADB_CONNECTION_CLIENT_CAPABILITIES :
823
+ case PYMARIADB_CONNECTION_BYTES_READ :
824
+ case PYMARIADB_CONNECTION_BYTES_SENT :
825
+ case PYMARIADB_TLS_VERIFY_STATUS :
747
826
return PyLong_FromLong ((long )val .num );
748
827
break ;
828
+ case PYMARIADB_TLS_PEER_CERT_INFO :
829
+ {
830
+ MARIADB_X509_INFO * info ;
831
+
832
+ if (!self -> tls_in_use )
833
+ Py_RETURN_NONE ;
834
+
835
+ mariadb_get_infov (self -> mysql , option , & info , 256 );
836
+ return MrdbConnection_X509info (info );
837
+ break ;
838
+ }
749
839
default :
750
840
Py_RETURN_NONE ;
751
841
}
0 commit comments