pollita Fri Jan 5 03:57:57 2007 UTC Modified files: /php-src NEWS /php-src/ext/session php_session.h session.c CREDITS Log: Allow ext/session to use ext/hash's algorithms for generating IDs http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2134&r2=1.2135&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2134 php-src/NEWS:1.2135 --- php-src/NEWS:1.2134 Sat Dec 16 19:15:25 2006 +++ php-src/NEWS Fri Jan 5 03:57:56 2007 @@ -54,6 +54,7 @@ . stream_resolve_include_path(). (Sara) - Added shm_has_var() function. (Mike) - Added str_getcsv() function. (Sara) +- Added ext/hash support to ext/session's ID generator. (Sara) - Fixed bug #39504 (xmlwriter_write_dtd_entity() creates Attlist tag, not enity). (Hannes Magnusson) http://cvs.php.net/viewvc.cgi/php-src/ext/session/php_session.h?r1=1.112&r2=1.113&diff_format=u Index: php-src/ext/session/php_session.h diff -u php-src/ext/session/php_session.h:1.112 php-src/ext/session/php_session.h:1.113 --- php-src/ext/session/php_session.h:1.112 Fri Jan 5 02:07:59 2007 +++ php-src/ext/session/php_session.h Fri Jan 5 03:57:57 2007 @@ -16,13 +16,17 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_session.h,v 1.112 2007/01/05 02:07:59 pollita Exp $ */ +/* $Id: php_session.h,v 1.113 2007/01/05 03:57:57 pollita Exp $ */ #ifndef PHP_SESSION_H #define PHP_SESSION_H #include "ext/standard/php_var.h" +#ifdef HAVE_HASH_EXT +# include "ext/hash/php_hash.h" +#endif + #define PHP_SESSION_API 20020330 #define PS_OPEN_ARGS void **mod_data, const char *save_path, const char *session_name TSRMLS_DC @@ -121,6 +125,9 @@ zend_bool apply_trans_sid; /* whether or not to enable trans-sid for the current request */ long hash_func; +#ifdef HAVE_HASH_EXT + php_hash_ops *hash_ops; +#endif long hash_bits_per_character; int send_cookie; int define_sid; http://cvs.php.net/viewvc.cgi/php-src/ext/session/session.c?r1=1.463&r2=1.464&diff_format=u Index: php-src/ext/session/session.c diff -u php-src/ext/session/session.c:1.463 php-src/ext/session/session.c:1.464 --- php-src/ext/session/session.c:1.463 Fri Jan 5 02:07:59 2007 +++ php-src/ext/session/session.c Fri Jan 5 03:57:57 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: session.c,v 1.463 2007/01/05 02:07:59 pollita Exp $ */ +/* $Id: session.c,v 1.464 2007/01/05 03:57:57 pollita Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -218,7 +218,8 @@ enum { PS_HASH_FUNC_MD5, - PS_HASH_FUNC_SHA1 + PS_HASH_FUNC_SHA1, + PS_HASH_FUNC_OTHER }; /* returns a pointer to the byte after the last valid character in out */ @@ -259,11 +260,15 @@ return out; } +#define PS_ID_INITIAL_SIZE 100 PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS) { PHP_MD5_CTX md5_context; PHP_SHA1_CTX sha1_context; - unsigned char digest[21]; +#ifdef HAVE_HASH_EXT + void *hash_context; +#endif + unsigned char *digest; int digest_len; int j; char *buf; @@ -282,7 +287,7 @@ remote_addr = Z_STRVAL_PP(token); } - buf = emalloc(100); + buf = emalloc(PS_ID_INITIAL_SIZE); /* maximum 15+19+19+10 bytes */ sprintf(buf, "%.15s%ld%ld%0.8F", remote_addr ? remote_addr : "", @@ -299,6 +304,20 @@ PHP_SHA1Update(&sha1_context, (unsigned char *) buf, strlen(buf)); digest_len = 20; break; +#ifdef HAVE_HASH_EXT + case PS_HASH_FUNC_OTHER: + if (!PS(hash_ops)) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid session hash function"); + efree(buf); + return NULL; + } + + hash_context = emalloc(PS(hash_ops)->context_size); + PS(hash_ops)->hash_init(hash_context); + PS(hash_ops)->hash_update(hash_context, (unsigned char *) buf, strlen(buf)); + digest_len = PS(hash_ops)->digest_size; + break; +#endif /* HAVE_HASH_EXT */ default: php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid session hash function"); efree(buf); @@ -325,6 +344,11 @@ case PS_HASH_FUNC_SHA1: PHP_SHA1Update(&sha1_context, rbuf, n); break; +#ifdef HAVE_HASH_EXT + case PS_HASH_FUNC_OTHER: + PS(hash_ops)->hash_update(hash_context, rbuf, n); + break; +#endif /* HAVE_HASH_EXT */ } to_read -= n; } @@ -332,6 +356,7 @@ } } + digest = emalloc(digest_len + 1); switch (PS(hash_func)) { case PS_HASH_FUNC_MD5: PHP_MD5Final(digest, &md5_context); @@ -339,6 +364,12 @@ case PS_HASH_FUNC_SHA1: PHP_SHA1Final(digest, &sha1_context); break; +#ifdef HAVE_HASH_EXT + case PS_HASH_FUNC_OTHER: + PS(hash_ops)->hash_final(digest, hash_context); + efree(hash_context); + break; +#endif /* HAVE_HASH_EXT */ } if (PS(hash_bits_per_character) < 4 @@ -347,7 +378,14 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ini setting hash_bits_per_character is out of range (should be 4, 5, or 6) - using 4 for now"); } + + if (PS_ID_INITIAL_SIZE < ((digest_len + 2) * (8 / PS(hash_bits_per_character))) ) { + /* 100 bytes is enough for most, but not all hash algos */ + buf = erealloc(buf, (digest_len + 2) * (8 / PS(hash_bits_per_character)) ); + } + j = (int) (bin_to_readable((char *)digest, digest_len, buf, PS(hash_bits_per_character)) - buf); + efree(digest); if (newlen) { *newlen = j; @@ -526,6 +564,53 @@ return SUCCESS; } +static PHP_INI_MH(OnUpdateHashFunc) +{ + long val; + char *endptr = NULL; + +#ifdef HAVE_HASH_EXT + PS(hash_ops) = NULL; +#endif + + val = strtol(new_value, &endptr, 10); + if (endptr && (*endptr == '\0')) { + /* Numeric value */ + PS(hash_func) = val ? 1 : 0; + + return SUCCESS; + } + + if (new_value_length == (sizeof("md5") - 1) && + strncasecmp(new_value, "md5", sizeof("md5") - 1) == 0) { + PS(hash_func) = PS_HASH_FUNC_MD5; + + return SUCCESS; + } + + if (new_value_length == (sizeof("sha1") - 1) && + strncasecmp(new_value, "sha1", sizeof("sha1") - 1) == 0) { + PS(hash_func) = PS_HASH_FUNC_SHA1; + + return SUCCESS; + } + +#ifdef HAVE_HASH_EXT +{ + php_hash_ops *ops = php_hash_fetch_ops(new_value, new_value_length); + + if (ops) { + PS(hash_func) = PS_HASH_FUNC_OTHER; + PS(hash_ops) = ops; + + return SUCCESS; + } +} +#endif /* HAVE_HASH_EXT */ + + return FAILURE; +} + /* {{{ PHP_INI */ PHP_INI_BEGIN() @@ -550,7 +635,7 @@ STD_PHP_INI_ENTRY("session.cache_limiter", "nocache", PHP_INI_ALL, OnUpdateString, cache_limiter, php_ps_globals, ps_globals) STD_PHP_INI_ENTRY("session.cache_expire", "180", PHP_INI_ALL, OnUpdateLong, cache_expire, php_ps_globals, ps_globals) PHP_INI_ENTRY("session.use_trans_sid", "0", PHP_INI_ALL, OnUpdateTransSid) - STD_PHP_INI_ENTRY("session.hash_function", "0", PHP_INI_ALL, OnUpdateLong, hash_func, php_ps_globals, ps_globals) + PHP_INI_ENTRY("session.hash_function", "0", PHP_INI_ALL, OnUpdateHashFunc) STD_PHP_INI_ENTRY("session.hash_bits_per_character", "4", PHP_INI_ALL, OnUpdateLong, hash_bits_per_character, php_ps_globals, ps_globals) /* Commented out until future discussion */ http://cvs.php.net/viewvc.cgi/php-src/ext/session/CREDITS?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/session/CREDITS diff -u php-src/ext/session/CREDITS:1.1 php-src/ext/session/CREDITS:1.2 --- php-src/ext/session/CREDITS:1.1 Mon Nov 20 10:31:35 2000 +++ php-src/ext/session/CREDITS Fri Jan 5 03:57:57 2007 @@ -1,2 +1,2 @@ Sessions -Sascha Schumann, Andrei Zmievski +Sascha Schumann, Andrei Zmievski, Sara Golemon
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php