andrey Wed, 12 Jan 2011 21:40:05 +
Revision: http://svn.php.net/viewvc?view=revisionrevision=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_packet, options, mysql_flags TSRMLS_CC);
+ do {
+