andrey Wed, 12 Jan 2011 21:40:05 +
Revision: http://svn.php.net/viewvc?view=revision&revision=307423
Log:
grok the MySQL 5.5 extended handshake.
Move the authentication routines, the native ones, to
separate file and encapsulate them in a plugin.
Depending on the server version and what the server
requests (or doesn't in old versions) load the authentication
plugin to handle it.
Currently only the 4.1+ authentication is supported. More to come
Changed paths:
U php/php-src/trunk/ext/mysqlnd/config.w32
U php/php-src/trunk/ext/mysqlnd/config9.m4
U php/php-src/trunk/ext/mysqlnd/mysqlnd.c
A php/php-src/trunk/ext/mysqlnd/mysqlnd_auth.c
U php/php-src/trunk/ext/mysqlnd/mysqlnd_enum_n_def.h
U php/php-src/trunk/ext/mysqlnd/mysqlnd_priv.h
U php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h
U php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c
U php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h
Modified: php/php-src/trunk/ext/mysqlnd/config.w32
===
--- php/php-src/trunk/ext/mysqlnd/config.w32 2011-01-12 21:14:47 UTC (rev 307422)
+++ php/php-src/trunk/ext/mysqlnd/config.w32 2011-01-12 21:40:05 UTC (rev 307423)
@@ -7,6 +7,7 @@
if (CHECK_LIB("ws2_32.lib", "mysqlnd")) {
mysqlnd_source =
"mysqlnd.c " +
+ "mysqlnd_auth.c" +
"mysqlnd_block_alloc.c " +
"mysqlnd_charset.c " +
"mysqlnd_debug.c " +
Modified: php/php-src/trunk/ext/mysqlnd/config9.m4
===
--- php/php-src/trunk/ext/mysqlnd/config9.m4 2011-01-12 21:14:47 UTC (rev 307422)
+++ php/php-src/trunk/ext/mysqlnd/config9.m4 2011-01-12 21:40:05 UTC (rev 307423)
@@ -16,7 +16,7 @@
if test "$PHP_MYSQLND_ENABLED" = "yes"; then
mysqlnd_sources="mysqlnd.c mysqlnd_charset.c mysqlnd_wireprotocol.c \
mysqlnd_ps.c mysqlnd_loaddata.c mysqlnd_net.c \
- mysqlnd_ps_codec.c mysqlnd_statistics.c \
+ mysqlnd_ps_codec.c mysqlnd_statistics.c mysqlnd_auth.c \
mysqlnd_result.c mysqlnd_result_meta.c mysqlnd_debug.c\
mysqlnd_block_alloc.c mysqlnd_plugin.c php_mysqlnd.c"
Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd.c
===
--- php/php-src/trunk/ext/mysqlnd/mysqlnd.c 2011-01-12 21:14:47 UTC (rev 307422)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd.c 2011-01-12 21:40:05 UTC (rev 307423)
@@ -92,6 +92,10 @@
mnd_pefree(conn->options.charset_name, pers);
conn->options.charset_name = NULL;
}
+ if (conn->options.auth_protocol) {
+ mnd_pefree(conn->options.auth_protocol, pers);
+ conn->options.auth_protocol = NULL;
+ }
if (conn->options.num_commands) {
unsigned int i;
for (i = 0; i < conn->options.num_commands; i++) {
@@ -427,9 +431,8 @@
/* }}} */
-#define MYSQLND_ASSEMBLED_PACKET_MAX_SIZE 3UL*1024UL*1024UL*1024UL
/* {{{ mysqlnd_switch_to_ssl_if_needed */
-static MYSQLND_PACKET_AUTH *
+static enum_func_status
mysqlnd_switch_to_ssl_if_needed(
MYSQLND * conn,
const MYSQLND_PACKET_GREET * const greet_packet,
@@ -438,13 +441,15 @@
TSRMLS_DC
)
{
- const MYSQLND_CHARSET * charset = NULL;
- MYSQLND_PACKET_AUTH * auth_packet = conn->protocol->m.get_auth_packet(conn->protocol, FALSE TSRMLS_CC);
+ enum_func_status ret = FAIL;
+ const MYSQLND_CHARSET * charset;
+ MYSQLND_PACKET_AUTH * auth_packet;
DBG_ENTER("mysqlnd_switch_to_ssl_if_needed");
+ auth_packet = conn->protocol->m.get_auth_packet(conn->protocol, FALSE TSRMLS_CC);
if (!auth_packet) {
SET_OOM_ERROR(conn->error_info);
- goto err;
+ goto end;
}
auth_packet->client_flags = mysql_flags;
auth_packet->max_packet_size = MYSQLND_ASSEMBLED_PACKET_MAX_SIZE;
@@ -466,20 +471,20 @@
if (!PACKET_WRITE(auth_packet, conn)) {
CONN_SET_STATE(conn, CONN_QUIT_SENT);
SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
- goto err;
+ goto end;
}
conn->net->m.set_client_option(conn->net, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, (const char *) &verify TSRMLS_CC);
if (FAIL == conn->net->m.enable_ssl(conn->net TSRMLS_CC)) {
- goto err;
+ goto end;
}
}
#endif
- DBG_RETURN(auth_packet);
-err:
+ ret = PASS;
+end:
PACKET_FREE(auth_packet);
- DBG_RETURN(NULL);
+ DBG_RETURN(ret);
}
/* }}} */
@@ -498,76 +503,52 @@
TSRMLS_DC)
{
enum_func_status ret = FAIL;
- MYSQLND_PACKET_AUTH * auth_packet = NULL;
- MYSQLND_PACKET_OK * ok_packet = conn->protocol->m.get_ok_packet(conn->protocol, FALSE TSRMLS_CC);
-
DBG_ENTER("mysqlnd_connect_run_authentication");
- if (!ok_packet) {
- SET_OOM_ERROR(conn->error_info);
- goto err;
- }
+ ret = mysqlnd_switch_to_ssl_if_needed(conn, greet_packet, options, mysql_flags TSRMLS_CC);
+ if (PASS == ret) {
+ char * switch_to_auth_protocol = NULL;
+ char * requested_protocol = NULL;
- auth_packet = mysqlnd_switch_to_ssl_if_needed(conn, greet_pac