cvs: php4 /ext/session php_session.h session.c /ext/standard url_scanner_ex.h url_scanner_ex.re
| From: | Thies C. Arntzen | Date: | Sat, 27 Apr 2002 14:07:52 +0000 |
| Subject: | cvs: php4 /ext/session php_session.h session.c /ext/standard url_scanner_ex.h url_scanner_ex.re | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-11475@lists.php.net to get a copy of this message | ||
thies Sat Apr 27 10:07:52 2002 EDT
Modified files:
/php4/ext/session php_session.h session.c
/php4/ext/standard url_scanner_ex.re url_scanner_ex.h
Log:
@ - added session_set_userdata() which enables you to specify one variable
@ that will be kept in the browser in addition to the session-id. This
@ only works when using trans-sid sessions (no cookie). (thies)
Index: php4/ext/session/php_session.h diff -u php4/ext/session/php_session.h:1.75 php4/ext/session/php_session.h:1.76 --- php4/ext/session/php_session.h:1.75 Sat Mar 30 11:29:15 2002 +++ php4/ext/session/php_session.h Sat Apr 27 10:07:50 2002 @@ -93,6 +93,8 @@ char *save_path; char *session_name; char *id; + char *udata_name; + char *udata_value; char *extern_referer_chk; char *entropy_file; char *cache_limiter; @@ -141,6 +143,7 @@ PHP_FUNCTION(session_set_cookie_params); PHP_FUNCTION(session_get_cookie_params); PHP_FUNCTION(session_write_close); +PHP_FUNCTION(session_set_userdata); #ifdef ZTS #define PS(v) TSRMG(ps_globals_id, php_ps_globals *, v) Index: php4/ext/session/session.c diff -u php4/ext/session/session.c:1.297 php4/ext/session/session.c:1.298 --- php4/ext/session/session.c:1.297 Fri Apr 26 17:27:38 2002 +++ php4/ext/session/session.c Sat Apr 27 10:07:50 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: session.c,v 1.297 2002/04/26 21:27:38 sas Exp $ */ +/* $Id: session.c,v 1.298 2002/04/27 14:07:50 thies Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -71,10 +71,13 @@ PHP_FE(session_set_cookie_params, NULL) PHP_FE(session_get_cookie_params, NULL) PHP_FE(session_write_close, NULL) + PHP_FE(session_set_userdata, NULL) {NULL, NULL, NULL} }; /* }}} */ +#define SAFE_STRING(s) ((s)?(s):"") + ZEND_DECLARE_MODULE_GLOBALS(ps); static ps_module *_php_find_ps_module(char *name TSRMLS_DC); @@ -84,7 +87,7 @@ static void php_session_output_handler(char *output, uint output_len, char **handled_output, uint *handled_output_len, int mode TSRMLS_DC) { if ((PS(session_status) == php_session_active)) { - *handled_output = url_adapt_ext_ex(output, output_len, PS(session_name), PS(id), handled_output_len, (zend_bool) (mode&PHP_OUTPUT_HANDLER_END ? 1 : 0) TSRMLS_CC); + *handled_output = url_adapt_ext_ex(output, output_len, PS(session_name), PS(id), SAFE_STRING(PS(udata_name)), SAFE_STRING(PS(udata_value)), handled_output_len, (zend_bool) (mode&PHP_OUTPUT_HANDLER_END ? 1 : 0) TSRMLS_CC); } else { *handled_output = NULL; } @@ -1403,11 +1406,32 @@ } /* }}} */ +/* {{{ proto bool session_set_userdata(string var, string value) + sets one additional variable that will be added by in trans-SID mode */ +PHP_FUNCTION(session_set_userdata) +{ + zval **str; + zval **val; + + if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &str, &val) == FAILURE) + WRONG_PARAM_COUNT; + + if ((Z_TYPE_PP(str) != IS_STRING) || (Z_TYPE_PP(val) != IS_STRING)) { + php_error(E_ERROR,"session_set_userdata expects both parameters to be strings"); + RETURN_FALSE; + } + + PS(udata_name) = estrndup(Z_STRVAL_PP(str), Z_STRLEN_PP(str)); + PS(udata_value) = estrndup(Z_STRVAL_PP(val), Z_STRLEN_PP(val)); + + RETURN_TRUE; +} +/* }}} */ PHPAPI void session_adapt_url(const char *url, size_t urllen, char **new, size_t *newlen TSRMLS_DC) { if (PS(apply_trans_sid) && (PS(session_status) == php_session_active)) { - *new = url_adapt_single_url(url, urllen, PS(session_name), PS(id), newlen TSRMLS_CC); + *new = url_adapt_single_url(url, urllen, PS(session_name), PS(id), PS(udata_name), PS(udata_value), newlen TSRMLS_CC); } } @@ -1430,6 +1454,17 @@ if (PS(id)) { efree(PS(id)); } + + if (PS(udata_name)) { + efree(PS(udata_name)); + PS(udata_name) = NULL; + } + + if (PS(udata_value)) { + efree(PS(udata_value)); + PS(udata_value) = NULL; + } + zend_hash_destroy(&PS(vars)); } Index: php4/ext/standard/url_scanner_ex.re diff -u php4/ext/standard/url_scanner_ex.re:1.49 php4/ext/standard/url_scanner_ex.re:1.50 --- php4/ext/standard/url_scanner_ex.re:1.49 Thu Apr 25 18:12:38 2002 +++ php4/ext/standard/url_scanner_ex.re Sat Apr 27 10:07:52 2002 @@ -96,7 +96,7 @@ #define YYLIMIT q #define YYMARKER r -static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *name, smart_str *val, const char *separator) +static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *name, smart_str *val, smart_str *udata_name, smart_str *udata_value, const char *separator) { register const char *p, *q; const char *bash = NULL; @@ -128,6 +128,12 @@ smart_str_append(dest, name); smart_str_appendc(dest, '='); smart_str_append(dest, val); + if (udata_name->len && udata_value->len) { + smart_str_appends(dest, separator); + smart_str_append(dest, udata_name); + smart_str_appendc(dest, '='); + smart_str_append(dest, udata_value); + } if (bash) smart_str_appendl(dest, bash, q - bash); @@ -150,7 +156,7 @@ if (quotes) smart_str_appendc(&ctx->result, type); if (f) { - append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, PG(arg_separator).output); + append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, &ctx->q_udata_name, &ctx->q_udata_value, PG(arg_separator).output); } else { smart_str_append(&ctx->result, &ctx->val); } @@ -190,6 +196,14 @@ smart_str_appends(&ctx->result, "\" value=\""); smart_str_append(&ctx->result, &ctx->q_value); smart_str_appends(&ctx->result, "\" />"); + + if (ctx->q_udata_name.len) { + smart_str_appends(&ctx->result, "<input type=\"hidden\" name=\""); + smart_str_append(&ctx->result, &ctx->q_udata_name); + smart_str_appends(&ctx->result, "\" value=\""); + smart_str_append(&ctx->result, &ctx->q_udata_value); + smart_str_appends(&ctx->result, "\" />"); + } } } @@ -318,18 +332,22 @@ } -char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen TSRMLS_DC) +char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, char *udata_name, char *udata_value, size_t *newlen TSRMLS_DC) { smart_str surl = {0}; smart_str buf = {0}; smart_str sname = {0}; smart_str sval = {0}; + smart_str aname = {0}; + smart_str avalue = {0}; smart_str_setl(&surl, url, urllen); smart_str_sets(&sname, name); smart_str_sets(&sval, value); + smart_str_sets(&aname, udata_name); + smart_str_sets(&avalue, udata_value); - append_modified_url(&surl, &buf, &sname, &sval, PG(arg_separator).output); + append_modified_url(&surl, &buf, &sname, &sval, &aname, &avalue, PG(arg_separator).output); smart_str_0(&buf); if (newlen) *newlen = buf.len; @@ -337,7 +355,7 @@ return buf.c; } -char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen, zend_bool do_flush TSRMLS_DC) +char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, char *udata_name, char *udata_value, size_t *newlen, zend_bool do_flush TSRMLS_DC) { url_adapt_state_ex_t *ctx; char *retval; @@ -346,6 +364,10 @@ smart_str_sets(&ctx->q_name, name); smart_str_sets(&ctx->q_value, value); + + smart_str_sets(&ctx->q_udata_name, udata_name); + smart_str_sets(&ctx->q_udata_value, udata_value); + xx_mainloop(ctx, src, srclen TSRMLS_CC); *newlen = ctx->result.len; Index: php4/ext/standard/url_scanner_ex.h diff -u php4/ext/standard/url_scanner_ex.h:1.16 php4/ext/standard/url_scanner_ex.h:1.17 --- php4/ext/standard/url_scanner_ex.h:1.16 Thu Feb 28 03:26:50 2002 +++ php4/ext/standard/url_scanner_ex.h Sat Apr 27 10:07:52 2002 @@ -24,9 +24,9 @@ int php_url_scanner_ex_activate(TSRMLS_D); int php_url_scanner_ex_deactivate(TSRMLS_D); -char *url_adapt_ext_ex(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen, zend_bool do_flush TSRMLS_DC); +char *url_adapt_ext_ex(const char *src, size_t srclen, const char *name, const char *value, char *udata_name, char *udata_value, size_t *newlen, zend_bool do_flush TSRMLS_DC); -char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen TSRMLS_DC); +char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, char *udata_name, char *udata_value, size_t *newlen TSRMLS_DC); char *url_adapt_flush(size_t * TSRMLS_DC); @@ -45,6 +45,9 @@ /* The data which is appended to each relative URL */ smart_str q_name; smart_str q_value; + + smart_str q_udata_name; + smart_str q_udata_value; char *lookup_data; int state;
Index: php4/ext/session/php_session.h diff -u php4/ext/session/php_session.h:1.75 php4/ext/session/php_session.h:1.76 --- php4/ext/session/php_session.h:1.75 Sat Mar 30 11:29:15 2002 +++ php4/ext/session/php_session.h Sat Apr 27 10:07:50 2002 @@ -93,6 +93,8 @@ char *save_path; char *session_name; char *id; + char *udata_name; + char *udata_value; char *extern_referer_chk; char *entropy_file; char *cache_limiter; @@ -141,6 +143,7 @@ PHP_FUNCTION(session_set_cookie_params); PHP_FUNCTION(session_get_cookie_params); PHP_FUNCTION(session_write_close); +PHP_FUNCTION(session_set_userdata); #ifdef ZTS #define PS(v) TSRMG(ps_globals_id, php_ps_globals *, v) Index: php4/ext/session/session.c diff -u php4/ext/session/session.c:1.297 php4/ext/session/session.c:1.298 --- php4/ext/session/session.c:1.297 Fri Apr 26 17:27:38 2002 +++ php4/ext/session/session.c Sat Apr 27 10:07:50 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: session.c,v 1.297 2002/04/26 21:27:38 sas Exp $ */ +/* $Id: session.c,v 1.298 2002/04/27 14:07:50 thies Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -71,10 +71,13 @@ PHP_FE(session_set_cookie_params, NULL) PHP_FE(session_get_cookie_params, NULL) PHP_FE(session_write_close, NULL) + PHP_FE(session_set_userdata, NULL) {NULL, NULL, NULL} }; /* }}} */ +#define SAFE_STRING(s) ((s)?(s):"") + ZEND_DECLARE_MODULE_GLOBALS(ps); static ps_module *_php_find_ps_module(char *name TSRMLS_DC); @@ -84,7 +87,7 @@ static void php_session_output_handler(char *output, uint output_len, char **handled_output, uint *handled_output_len, int mode TSRMLS_DC) { if ((PS(session_status) == php_session_active)) { - *handled_output = url_adapt_ext_ex(output, output_len, PS(session_name), PS(id), handled_output_len, (zend_bool) (mode&PHP_OUTPUT_HANDLER_END ? 1 : 0) TSRMLS_CC); + *handled_output = url_adapt_ext_ex(output, output_len, PS(session_name), PS(id), SAFE_STRING(PS(udata_name)), SAFE_STRING(PS(udata_value)), handled_output_len, (zend_bool) (mode&PHP_OUTPUT_HANDLER_END ? 1 : 0) TSRMLS_CC); } else { *handled_output = NULL; } @@ -1403,11 +1406,32 @@ } /* }}} */ +/* {{{ proto bool session_set_userdata(string var, string value) + sets one additional variable that will be added by in trans-SID mode */ +PHP_FUNCTION(session_set_userdata) +{ + zval **str; + zval **val; + + if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &str, &val) == FAILURE) + WRONG_PARAM_COUNT; + + if ((Z_TYPE_PP(str) != IS_STRING) || (Z_TYPE_PP(val) != IS_STRING)) { + php_error(E_ERROR,"session_set_userdata expects both parameters to be strings"); + RETURN_FALSE; + } + + PS(udata_name) = estrndup(Z_STRVAL_PP(str), Z_STRLEN_PP(str)); + PS(udata_value) = estrndup(Z_STRVAL_PP(val), Z_STRLEN_PP(val)); + + RETURN_TRUE; +} +/* }}} */ PHPAPI void session_adapt_url(const char *url, size_t urllen, char **new, size_t *newlen TSRMLS_DC) { if (PS(apply_trans_sid) && (PS(session_status) == php_session_active)) { - *new = url_adapt_single_url(url, urllen, PS(session_name), PS(id), newlen TSRMLS_CC); + *new = url_adapt_single_url(url, urllen, PS(session_name), PS(id), PS(udata_name), PS(udata_value), newlen TSRMLS_CC); } } @@ -1430,6 +1454,17 @@ if (PS(id)) { efree(PS(id)); } + + if (PS(udata_name)) { + efree(PS(udata_name)); + PS(udata_name) = NULL; + } + + if (PS(udata_value)) { + efree(PS(udata_value)); + PS(udata_value) = NULL; + } + zend_hash_destroy(&PS(vars)); } Index: php4/ext/standard/url_scanner_ex.re diff -u php4/ext/standard/url_scanner_ex.re:1.49 php4/ext/standard/url_scanner_ex.re:1.50 --- php4/ext/standard/url_scanner_ex.re:1.49 Thu Apr 25 18:12:38 2002 +++ php4/ext/standard/url_scanner_ex.re Sat Apr 27 10:07:52 2002 @@ -96,7 +96,7 @@ #define YYLIMIT q #define YYMARKER r -static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *name, smart_str *val, const char *separator) +static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *name, smart_str *val, smart_str *udata_name, smart_str *udata_value, const char *separator) { register const char *p, *q; const char *bash = NULL; @@ -128,6 +128,12 @@ smart_str_append(dest, name); smart_str_appendc(dest, '='); smart_str_append(dest, val); + if (udata_name->len && udata_value->len) { + smart_str_appends(dest, separator); + smart_str_append(dest, udata_name); + smart_str_appendc(dest, '='); + smart_str_append(dest, udata_value); + } if (bash) smart_str_appendl(dest, bash, q - bash); @@ -150,7 +156,7 @@ if (quotes) smart_str_appendc(&ctx->result, type); if (f) { - append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, PG(arg_separator).output); + append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, &ctx->q_udata_name, &ctx->q_udata_value, PG(arg_separator).output); } else { smart_str_append(&ctx->result, &ctx->val); } @@ -190,6 +196,14 @@ smart_str_appends(&ctx->result, "\" value=\""); smart_str_append(&ctx->result, &ctx->q_value); smart_str_appends(&ctx->result, "\" />"); + + if (ctx->q_udata_name.len) { + smart_str_appends(&ctx->result, "<input type=\"hidden\" name=\""); + smart_str_append(&ctx->result, &ctx->q_udata_name); + smart_str_appends(&ctx->result, "\" value=\""); + smart_str_append(&ctx->result, &ctx->q_udata_value); + smart_str_appends(&ctx->result, "\" />"); + } } } @@ -318,18 +332,22 @@ } -char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen TSRMLS_DC) +char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, char *udata_name, char *udata_value, size_t *newlen TSRMLS_DC) { smart_str surl = {0}; smart_str buf = {0}; smart_str sname = {0}; smart_str sval = {0}; + smart_str aname = {0}; + smart_str avalue = {0}; smart_str_setl(&surl, url, urllen); smart_str_sets(&sname, name); smart_str_sets(&sval, value); + smart_str_sets(&aname, udata_name); + smart_str_sets(&avalue, udata_value); - append_modified_url(&surl, &buf, &sname, &sval, PG(arg_separator).output); + append_modified_url(&surl, &buf, &sname, &sval, &aname, &avalue, PG(arg_separator).output); smart_str_0(&buf); if (newlen) *newlen = buf.len; @@ -337,7 +355,7 @@ return buf.c; } -char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen, zend_bool do_flush TSRMLS_DC) +char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, char *udata_name, char *udata_value, size_t *newlen, zend_bool do_flush TSRMLS_DC) { url_adapt_state_ex_t *ctx; char *retval; @@ -346,6 +364,10 @@ smart_str_sets(&ctx->q_name, name); smart_str_sets(&ctx->q_value, value); + + smart_str_sets(&ctx->q_udata_name, udata_name); + smart_str_sets(&ctx->q_udata_value, udata_value); + xx_mainloop(ctx, src, srclen TSRMLS_CC); *newlen = ctx->result.len; Index: php4/ext/standard/url_scanner_ex.h diff -u php4/ext/standard/url_scanner_ex.h:1.16 php4/ext/standard/url_scanner_ex.h:1.17 --- php4/ext/standard/url_scanner_ex.h:1.16 Thu Feb 28 03:26:50 2002 +++ php4/ext/standard/url_scanner_ex.h Sat Apr 27 10:07:52 2002 @@ -24,9 +24,9 @@ int php_url_scanner_ex_activate(TSRMLS_D); int php_url_scanner_ex_deactivate(TSRMLS_D); -char *url_adapt_ext_ex(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen, zend_bool do_flush TSRMLS_DC); +char *url_adapt_ext_ex(const char *src, size_t srclen, const char *name, const char *value, char *udata_name, char *udata_value, size_t *newlen, zend_bool do_flush TSRMLS_DC); -char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen TSRMLS_DC); +char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, char *udata_name, char *udata_value, size_t *newlen TSRMLS_DC); char *url_adapt_flush(size_t * TSRMLS_DC); @@ -45,6 +45,9 @@ /* The data which is appended to each relative URL */ smart_str q_name; smart_str q_value; + + smart_str q_udata_name; + smart_str q_udata_value; char *lookup_data; int state;