summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/session/php_session.h3
-rw-r--r--ext/session/session.c39
-rw-r--r--ext/standard/url_scanner_ex.h7
-rw-r--r--ext/standard/url_scanner_ex.re32
4 files changed, 72 insertions, 9 deletions
diff --git a/ext/session/php_session.h b/ext/session/php_session.h
index ed54dd4da5..3ccbeef80d 100644
--- a/ext/session/php_session.h
+++ b/ext/session/php_session.h
@@ -93,6 +93,8 @@ typedef struct _php_ps_globals {
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_cache_limiter);
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)
diff --git a/ext/session/session.c b/ext/session/session.c
index 6588d0992f..3cbf896132 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -71,10 +71,13 @@ function_entry session_functions[] = {
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_end_output_handler(TSRMLS_D);
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 @@ PHP_FUNCTION(session_unset)
}
/* }}} */
+/* {{{ 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 @@ static void php_rshutdown_session_globals(TSRMLS_D)
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));
}
diff --git a/ext/standard/url_scanner_ex.h b/ext/standard/url_scanner_ex.h
index a9b105d687..535119f634 100644
--- a/ext/standard/url_scanner_ex.h
+++ b/ext/standard/url_scanner_ex.h
@@ -24,9 +24,9 @@ PHP_MSHUTDOWN_FUNCTION(url_scanner_ex);
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);
@@ -46,6 +46,9 @@ typedef struct {
smart_str q_name;
smart_str q_value;
+ smart_str q_udata_name;
+ smart_str q_udata_value;
+
char *lookup_data;
int state;
diff --git a/ext/standard/url_scanner_ex.re b/ext/standard/url_scanner_ex.re
index 4d7c507894..6d2b935958 100644
--- a/ext/standard/url_scanner_ex.re
+++ b/ext/standard/url_scanner_ex.re
@@ -96,7 +96,7 @@ alpha = [a-zA-Z];
#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 @@ done:
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 @@ static inline void tag_arg(url_adapt_state_ex_t *ctx, char quotes, char type TSR
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 @@ static inline void handle_form(STD_PARA)
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 @@ stop:
}
-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 @@ char *url_adapt_single_url(const char *url, size_t urllen, const char *name, con
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 @@ char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char
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;