On 2018-02-25 17:19, Wietse Venema wrote:
> olli hauer:
> [ Charset ISO-8859-15 converted... ]
>> >From https://dev.mysql.com/doc/refman/5.7/en/mysql-options.html
>> o MYSQL_OPT_SSL_VERIFY_SERVER_CERT (argument type: my_bool *)
>> This option is deprecated as of MySQL 5.7.11 and is removed in MySQL
>> 8.0.
>> Instead, use MYSQL_OPT_SSL_MODE with a value of
>> SSL_MODE_VERIFY_IDENTITY.
>>
>>
>> There are some issues in case postfix builds against mariadb or percona
>> instead
>> mysql, because both define MYSQL_VERSION_ID >= 50711 and only mariadb also
>> defines MARIADB_VERSION_ID.
>>
>> mariadb (10.2.13):
>> #define MYSQL_VERSION_ID 100212
>> #define MARIADB_VERSION_ID 100212
>>
>> percona (5.7.20-18):
>> #define MYSQL_VERSION_ID 50720
>>
>>
>> Given the listed MYSQL_VERSION_ID's the following diff should be safe.
>>
>> --- src/global/dict_mysql.c.orig 2017-02-19 01:58:20 UTC
>> +++ src/global/dict_mysql.c
>> @@ -656,7 +656,11 @@ static void plmysql_connect_single(DICT_
>> dict_mysql->tls_key_file, dict_mysql->tls_cert_file,
>> dict_mysql->tls_CAfile, dict_mysql->tls_CApath,
>> dict_mysql->tls_ciphers);
>> -#if MYSQL_VERSION_ID >= 50023
>> +#if MYSQL_VERSION_ID >= 80000 && !defined(MARIADB_VERSION_ID)
>> + if (dict_mysql->tls_verify_cert != -1)
>> + mysql_options(host->db, MYSQL_OPT_SSL_MODE,
>> + &dict_mysql->tls_verify_cert);
>> +#elif MYSQL_VERSION_ID >= 50023
>> if (dict_mysql->tls_verify_cert != -1)
>> mysql_options(host->db, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
>> &dict_mysql->tls_verify_cert);
>
>
> Couple suggestions. First. I wonder if this is complete - there are
> three instances of the ``#if MYSQL_VERSION_ID >= 50023'' guard.
>
> Second, I prefer not to litter the code with runs of nearly duplicate
> code. Instead I suggest defining a new macro:
>
> #if MYSQL_VERSION_ID >= 80000 && !defined(MARIADB_VERSION_ID)
> #define DICT_MYSQL_SSL_VERIFY_SERVER_CERT MYSQL_OPT_SSL_MODE
> #elif MYSQL_VERSION_ID >= 50023
> #define DICT_MYSQL_SSL_VERIFY_SERVER_CERT MYSQL_OPT_SSL_VERIFY_SERVER_CERT
> #endif
>
> Then, use DICT_MYSQL_SSL_VERIFY_SERVER_CERT in the code instead of
> the 'raw' defines from the mysql/mariadb libraries.
>
> #if defined(DICT_MYSQL_SSL_VERIFY_SERVER_CERT)
> int tls_verify_cert;
> #endif
>
> #if defined(DICT_MYSQL_SSL_VERIFY_SERVER_CERT)
> if (dict_mysql->tls_verify_cert != -1)
> mysql_options(host->db, DICT_MYSQL_SSL_VERIFY_SERVER_CERT,
> &dict_mysql->tls_verify_cert);
> #endif
>
> #if defined(DICT_MYSQL_SSL_VERIFY_SERVER_CERT)
> dict_mysql->tls_verify_cert = cfg_get_bool(p, "tls_verify_cert", -1);
> #endif
>
> But I dont have time to test this.
>
> Wietse
>
New patch with your suggestions:
https://people.freebsd.org/~ohauer/postfix.dict__mysql/patch-src_global_dict__mysql.c.diff
build logs (postfix-3.3.0) against:
- mysql56-client-5.6.39
- mysql80-client-8.0.2
- mariadb55-client-5.5.59
- mariadb102-client-10.2.12
- percona57-client-5.7.20.18
can reviewed here:
https://people.freebsd.org/~ohauer/postfix.dict__mysql/
log apply patch against:
- postfix-3.0.12
- postfix-3.1.8
- postfix-3.2.5
- postfix-3.3.0
- postfix-3.4-20180222
can reviewed here:
https://people.freebsd.org/~ohauer/postfix.dict__mysql/postfix-dict__mysql-patch.log
So far it looks good to me, but cross tests / reviews are welcome.
--
olli
--- src/global/dict_mysql.c.orig 2017-02-19 01:58:20 UTC
+++ src/global/dict_mysql.c
@@ -198,6 +198,15 @@
#include "dict_mysql.h"
+/* MySQL 8.x API change */
+
+#if MYSQL_VERSION_ID >= 80000 && !defined(MARIADB_VERSION_ID)
+#define DICT_MYSQL_SSL_VERIFY_SERVER_CERT MYSQL_OPT_SSL_MODE
+#elif MYSQL_VERSION_ID >= 50023
+#define DICT_MYSQL_SSL_VERIFY_SERVER_CERT MYSQL_OPT_SSL_VERIFY_SERVER_CERT
+#endif
+
+
/* need some structs to help organize things */
typedef struct {
MYSQL *db;
@@ -237,7 +246,7 @@ typedef struct {
char *tls_CAfile;
char *tls_CApath;
char *tls_ciphers;
-#if MYSQL_VERSION_ID >= 50023
+#if defined(DICT_MYSQL_SSL_VERIFY_SERVER_CERT)
int tls_verify_cert;
#endif
#endif
@@ -656,9 +665,9 @@ static void plmysql_connect_single(DICT_
dict_mysql->tls_key_file, dict_mysql->tls_cert_file,
dict_mysql->tls_CAfile, dict_mysql->tls_CApath,
dict_mysql->tls_ciphers);
-#if MYSQL_VERSION_ID >= 50023
+#if defined(DICT_MYSQL_SSL_VERIFY_SERVER_CERT)
if (dict_mysql->tls_verify_cert != -1)
- mysql_options(host->db, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
+ mysql_options(host->db, DICT_MYSQL_SSL_VERIFY_SERVER_CERT,
&dict_mysql->tls_verify_cert);
#endif
#endif
@@ -723,7 +732,7 @@ static void mysql_parse_config(DICT_MYSQ
dict_mysql->tls_CAfile = cfg_get_str(p, "tls_CAfile", NULL, 0, 0);
dict_mysql->tls_CApath = cfg_get_str(p, "tls_CApath", NULL, 0, 0);
dict_mysql->tls_ciphers = cfg_get_str(p, "tls_ciphers", NULL, 0, 0);
-#if MYSQL_VERSION_ID >= 50023
+#if defined(DICT_MYSQL_SSL_VERIFY_SERVER_CERT)
dict_mysql->tls_verify_cert = cfg_get_bool(p, "tls_verify_cert", -1);
#endif
#endif