diff --git a/src/modules/Mysql/acconfig.h b/src/modules/Mysql/acconfig.h index 2b1b313e57912d547db69816ca08324ad8d2d3db..6515bb04745ec0a9490b5add01c6ff2987df6471 100644 --- a/src/modules/Mysql/acconfig.h +++ b/src/modules/Mysql/acconfig.h @@ -2,7 +2,7 @@ || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. -|| $Id: acconfig.h,v 1.9 2002/10/11 01:39:47 nilsson Exp $ +|| $Id: acconfig.h,v 1.10 2003/02/07 11:28:30 agehall Exp $ */ /* @@ -20,6 +20,9 @@ /* Define if you have mySQL */ #undef HAVE_MYSQL +/* Define if you have SSL support in MySQL */ +#undef HAVE_MYSQL_SSL + /* Return type of mysql_fetch_lengths(). Usually unsigned long. */ #undef FETCH_LENGTHS_TYPE diff --git a/src/modules/Mysql/configure.in b/src/modules/Mysql/configure.in index 6feb8eac0ec653f49c0ab269ce4657d669f98e41..f3b2ee1ea955cd69c03811d3ea0a62c2793082db 100644 --- a/src/modules/Mysql/configure.in +++ b/src/modules/Mysql/configure.in @@ -1,5 +1,5 @@ # -# $Id: configure.in,v 1.32 2002/07/16 19:46:28 per Exp $ +# $Id: configure.in,v 1.33 2003/02/07 11:28:30 agehall Exp $ # # Configure script for the mysql-module # @@ -307,6 +307,8 @@ fi PIKE_CHECK_MYSQL_FUNC(mysql_fetch_lengths) PIKE_CHECK_MYSQL_FUNC(mysql_options) + AC_CHECK_LIB(mysqlclient, mysql_ssl_set, [ AC_DEFINE(HAVE_MYSQL_SSL) ]) + # Note: The following two are variables: PIKE_CHECK_MYSQL_FUNC(mysql_port) PIKE_CHECK_MYSQL_FUNC(mysql_unix_port) diff --git a/src/modules/Mysql/mysql.c b/src/modules/Mysql/mysql.c index 581183326b6bbb3ca0d8ca5a960521b1f593deca..70b244f5d8469253e110d37acfea7f80941a7955 100644 --- a/src/modules/Mysql/mysql.c +++ b/src/modules/Mysql/mysql.c @@ -2,7 +2,7 @@ || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. -|| $Id: mysql.c,v 1.63 2002/11/26 21:31:14 grubba Exp $ +|| $Id: mysql.c,v 1.64 2003/02/07 11:28:30 agehall Exp $ */ /* @@ -73,6 +73,7 @@ #include "operators.h" #include "builtin_functions.h" #include "fd_control.h" +#include "mapping.h" /* System includes */ #ifdef HAVE_STRING_H @@ -82,6 +83,9 @@ #include <memory.h> #endif +#ifdef HAVE_MYSQL_SSL +#include <openssl/ssl.h> +#endif #define sp Pike_sp @@ -94,7 +98,7 @@ * Globals */ -RCSID("$Id: mysql.c,v 1.63 2002/11/26 21:31:14 grubba Exp $"); +RCSID("$Id: mysql.c,v 1.64 2003/02/07 11:28:30 agehall Exp $"); /*! @module Mysql *! @@ -212,13 +216,63 @@ static void exit_mysql_struct(struct object *o) DESTROY_MYSQL_LOCK(); } +void pike_mysql_set_ssl(struct mapping *options) { + +#ifdef HAVE_MYSQL_SSL + char *ssl_key = NULL; + char *ssl_cert = NULL; + char *ssl_ca = NULL; + char *ssl_capath = NULL; + char *ssl_cipher = NULL; + struct svalue *val = NULL; + + if ((val = simple_mapping_string_lookup(options, "ssl-key")) && + (val->type == T_STRING) && + (!val->u.string->size_shift)) + ssl_key = val->u.string->str; + + if ((val = simple_mapping_string_lookup(options, "ssl-cert")) && + (val->type == T_STRING) && + (!val->u.string->size_shift)) + ssl_cert = val->u.string->str; + + if ((val = simple_mapping_string_lookup(options, "ssl_ca")) && + (val->type == T_STRING) && + (!val->u.string->size_shift)) + ssl_ca = val->u.string->str; + + if ((val = simple_mapping_string_lookup(options, "ssl-capath")) && + (val->type == T_STRING) && + (!val->u.string->size_shift)) + ssl_capath = val->u.string->str; + + if ((val = simple_mapping_string_lookup(options, "ssl-cipher")) && + (val->type == T_STRING) && + (!val->u.string->size_shift)) + ssl_cipher = val->u.string->str; + + if (ssl_key || ssl_cert || ssl_ca || ssl_capath || ssl_cipher) + mysql_ssl_set(PIKE_MYSQL->mysql, + ssl_key, + ssl_cert, + ssl_ca, + ssl_capath, + ssl_cipher); +#endif /* HAVE_MYSQL_SSL */ +} static void pike_mysql_set_options(struct mapping *options) { struct svalue *val; + if ((val = simple_mapping_string_lookup(options, "mysql_group")) && + (val->type == T_STRING) && (!val->u.string->size_shift)) { + mysql_options(PIKE_MYSQL->mysql, MYSQL_READ_DEFAULT_GROUP, + val->u.string->str); + } #ifdef HAVE_MYSQL_OPTIONS #ifdef MYSQL_READ_DEFAULT_FILE + printf("\n\n\nREADING MYSQL DEFAULTS FILE\n\n\n"); if ((val = simple_mapping_string_lookup(options, "mysql_config_file")) && (val->type == T_STRING) && (!val->u.string->size_shift)) { mysql_options(PIKE_MYSQL->mysql, MYSQL_READ_DEFAULT_FILE, @@ -226,11 +280,6 @@ static void pike_mysql_set_options(struct mapping *options) } #endif /* MYSQL_READ_DEFAULT_FILE */ #ifdef MYSQL_READ_DEFAULT_GROUP - if ((val = simple_mapping_string_lookup(options, "mysql_group")) && - (val->type == T_STRING) && (!val->u.string->size_shift)) { - mysql_options(PIKE_MYSQL->mysql, MYSQL_READ_DEFAULT_GROUP, - val->u.string->str); - } #endif /* MYSQL_READ_DEFAULT_GROUP */ #ifdef MYSQL_INIT_COMMAND if ((val = simple_mapping_string_lookup(options, "init_command")) && @@ -302,6 +351,8 @@ static void pike_mysql_reconnect(void) char *saved_unix_port = NULL; unsigned int port = 0; unsigned int saved_port = 0; + unsigned int options = 0; + struct svalue *val; if (PIKE_MYSQL->host) { hostptr = strdup(PIKE_MYSQL->host->str); @@ -355,8 +406,13 @@ static void pike_mysql_reconnect(void) #endif /* HAVE_MYSQL_UNIX_PORT */ #ifdef HAVE_MYSQL_REAL_CONNECT + if ((val = simple_mapping_string_lookup((struct mapping *)PIKE_MYSQL->options, "connect_options")) && + (val->type == T_INT) && (val->u.integer)) { + options = (unsigned int)val->u.integer; + } + socket = mysql_real_connect(mysql, host, user, password, - NULL, port, portptr, 0); + NULL, port, portptr, options); #else socket = mysql_connect(mysql, host, user, password); #endif /* HAVE_MYSQL_REAL_CONNECT */ @@ -471,11 +527,35 @@ static void pike_mysql_reconnect(void) *! *! @member string "mysql_charset_name" *! Change charset name. + *! + *! @member string "ssl-key" + *! Path to SSL-key for use in SSL-communication. + *! + *! @member string "ssl-cert" + *! Path to SSL-cert for use in SSL-communication. + *! + *! @member string "ssl-ca" + *! Path to SSL-CA for use in SSL-communication. + *! + *! @member string "ssl-capath" + *! Path to SSL-CAPATH for use in SSL-communication. + *! + *! @member int "connect_options" + *! Options used when connecting to the server. See mysql documentation + *! for more information. + *! *! @endmapping *! *! @note *! Some options may not be implemented. Unimplemented options are *! silently ignored. + *! + *! To use SSL-connections, set the SSL-parameters correctly. They corespond to + *! the parameters given to the mysql-client with the same name so make sure that + *! the mysql-client works with SSL and set these parameters to the same values and + *! everything should work. + *! If SSL-options are loaded from a config-file, one may set the connect_options to + *! include CLIENT_SSL. */ static void f_create(INT32 args) { @@ -521,6 +601,7 @@ static void f_create(INT32 args) if (sp[4-args].type != T_MAPPING) { Pike_error("Bad argument 5 to mysql()\n"); } + add_ref(PIKE_MYSQL->options = sp[4-args].u.mapping); pike_mysql_set_options(sp[4-args].u.mapping); } } @@ -530,6 +611,8 @@ static void f_create(INT32 args) pop_n_elems(args); + pike_mysql_set_ssl(PIKE_MYSQL->options); + pike_mysql_reconnect(); } @@ -563,9 +646,18 @@ static void mysql__sprintf(INT32 args) info = mysql_get_host_info(socket); MYSQL_DISALLOW(); - push_text("mysql(/* %s */)"); + push_text("mysql(/* %s %s*/)"); push_text(info); - f_sprintf(2); +#ifdef HAVE_MYSQL_SSL + if (PIKE_MYSQL->mysql->options.use_ssl) { + push_text("using SSL"); + } + else push_text(""); +#else + push_text(""); +#endif /* HAVE_MYSQL_SSL */ + + f_sprintf(3); res = Pike_sp[-1].u.string; Pike_sp--; @@ -1677,6 +1769,17 @@ PIKE_MODULE_INIT /* function(void:int) */ ADD_FUNCTION("binary_data", f_binary_data,tFunc(tVoid,tInt), ID_PUBLIC); + add_integer_constant( "CLIENT_COMPRESS", CLIENT_COMPRESS, 0); + add_integer_constant( "CLIENT_FOUND_ROWS", CLIENT_FOUND_ROWS, 0); + add_integer_constant( "CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, 0); + add_integer_constant( "CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, 0); + add_integer_constant( "CLIENT_NO_SCHEMA", CLIENT_NO_SCHEMA, 0); + add_integer_constant( "CLIENT_ODBC", CLIENT_ODBC, 0); + +#ifdef HAVE_MYSQL_SSL + add_integer_constant( "CLIENT_SSL", CLIENT_SSL, 0); +#endif + set_init_callback(init_mysql_struct); set_exit_callback(exit_mysql_struct); diff --git a/src/modules/Mysql/precompiled_mysql.h b/src/modules/Mysql/precompiled_mysql.h index 6a8c11f00f076667f71e649858af27bf9acec337..9964c6e19c0ec2bfdcacd97e307b29c17b578fae 100644 --- a/src/modules/Mysql/precompiled_mysql.h +++ b/src/modules/Mysql/precompiled_mysql.h @@ -2,7 +2,7 @@ || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. -|| $Id: precompiled_mysql.h,v 1.15 2002/10/11 01:39:47 nilsson Exp $ +|| $Id: precompiled_mysql.h,v 1.16 2003/02/07 11:28:30 agehall Exp $ */ /* @@ -58,6 +58,7 @@ struct precompiled_mysql { MYSQL *mysql, *socket; struct pike_string *host, *database, *user, *password; /* Reconnect */ + struct mapping *options; }; struct precompiled_mysql_result {