summaryrefslogtreecommitdiff
path: root/ext/xsl/php_xsl.c
diff options
context:
space:
mode:
authorChristian Stocker <chregu@php.net>2004-01-19 15:07:08 +0000
committerChristian Stocker <chregu@php.net>2004-01-19 15:07:08 +0000
commit23b30e9a305ee1f06ef4dae8368cc19b5a012153 (patch)
tree77d627618731aaec1fbcd13ddbf20857fdd21d88 /ext/xsl/php_xsl.c
parentc0a1f294e98dc3d55718360cba6771580c7e1676 (diff)
downloadphp-git-23b30e9a305ee1f06ef4dae8368cc19b5a012153.tar.gz
@- added XsltProcessor->registerPhpFunctions() (Christian)
without that method call, it is not allowed to call php functions from xslt stylesheets for security reasons.
Diffstat (limited to 'ext/xsl/php_xsl.c')
-rw-r--r--ext/xsl/php_xsl.c160
1 files changed, 1 insertions, 159 deletions
diff --git a/ext/xsl/php_xsl.c b/ext/xsl/php_xsl.c
index 387dfedf7f..29255c991a 100644
--- a/ext/xsl/php_xsl.c
+++ b/ext/xsl/php_xsl.c
@@ -27,8 +27,6 @@
#include "ext/standard/info.h"
#include "php_xsl.h"
-static void xsl_ext_function_string_php(xmlXPathParserContextPtr ctxt, int nargs);
-static void xsl_ext_function_object_php(xmlXPathParserContextPtr ctxt, int nargs);
/* If you declare any globals in php_xsl.h uncomment this:
ZEND_DECLARE_MODULE_GLOBALS(xsl)
@@ -114,6 +112,7 @@ zend_object_value xsl_objects_new(zend_class_entry *class_type TSRMLS_DC)
intern->prop_handler = NULL;
intern->parameter = NULL;
intern->hasKeys = 0;
+ intern->registerPhpFunctions = 0;
ALLOC_HASHTABLE(intern->std.properties);
zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
@@ -140,12 +139,6 @@ PHP_MINIT_FUNCTION(xsl)
#if HAVE_XSL_EXSLT
exsltRegisterAll();
#endif
- xsltRegisterExtModuleFunction ((const xmlChar *) "functionString",
- (const xmlChar *) "http://php.net/xsl",
- xsl_ext_function_string_php);
- xsltRegisterExtModuleFunction ((const xmlChar *) "function",
- (const xmlChar *) "http://php.net/xsl",
- xsl_ext_function_object_php);
REGISTER_LONG_CONSTANT("XSL_CLONE_AUTO", 0, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XSL_CLONE_NEVER", -1, CONST_CS | CONST_PERSISTENT);
@@ -155,157 +148,6 @@ PHP_MINIT_FUNCTION(xsl)
}
/* }}} */
-
-static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int type)
-{
- xsltTransformContextPtr tctxt;
- zval **args;
- zval *retval;
- int result, i, ret;
- zend_fcall_info fci;
- zval handler;
- xmlXPathObjectPtr obj;
- char *str;
-
- TSRMLS_FETCH();
-
- tctxt = xsltXPathGetTransformContext(ctxt);
- if (tctxt == NULL) {
- xsltGenericError(xsltGenericErrorContext,
- "xsltExtFunctionTest: failed to get the transformation context\n");
- return;
- }
-
- fci.param_count = nargs - 1;
- fci.params = safe_emalloc(fci.param_count, sizeof(zval**), 0);
-
- args = safe_emalloc(nargs - 1, sizeof(zval *), 0);
- /* Reverse order to pop values off ctxt stack */
- for (i = nargs - 2; i >= 0; i--) {
- obj = valuePop(ctxt);
- MAKE_STD_ZVAL(args[i]);
- switch (obj->type) {
- case XPATH_STRING:
- ZVAL_STRING(args[i], obj->stringval, 1);
- break;
- case XPATH_BOOLEAN:
- ZVAL_BOOL(args[i], obj->boolval);
- break;
- case XPATH_NUMBER:
- ZVAL_DOUBLE(args[i], obj->floatval);
- break;
- case XPATH_NODESET:
- if (type == 1) {
- str = xmlXPathCastToString(obj);
- ZVAL_STRING(args[i], str, 1);
- xmlFree(str);
- } else if (type == 2) {
- int j;
- dom_object *intern;
- array_init(args[i]);
- if (obj->nodesetval->nodeNr > 0) {
- intern = (dom_object *) php_dom_object_get_data((void *) obj->nodesetval->nodeTab[0]->doc);
- for (j = 0; j < obj->nodesetval->nodeNr; j++) {
- xmlNodePtr node = obj->nodesetval->nodeTab[j];
- zval *child;
-
- MAKE_STD_ZVAL(child);
- /* not sure, if we need this... it's copied from xpath.c */
- if (node->type == XML_NAMESPACE_DECL) {
- xmlNsPtr curns;
- xmlNodePtr nsparent;
-
- nsparent = node->_private;
- curns = xmlNewNs(NULL, node->name, NULL);
- if (node->children) {
- curns->prefix = xmlStrdup((char *) node->children);
- }
- if (node->children) {
- node = xmlNewDocNode(node->doc, NULL, (char *) node->children, node->name);
- } else {
- node = xmlNewDocNode(node->doc, NULL, "xmlns", node->name);
- }
- node->type = XML_NAMESPACE_DECL;
- node->parent = nsparent;
- node->ns = curns;
- }
- child = php_dom_create_object(node, &ret, NULL, child, intern TSRMLS_CC);
- add_next_index_zval(args[i], child);
- }
- }
- }
- break;
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "php:function object type %d is not supported yet", obj->type);
- ZVAL_STRING(args[i], "", 0);
- }
- xmlXPathFreeObject(obj);
- fci.params[i] = &args[i];
- }
-
- fci.size = sizeof(fci);
- fci.function_table = EG(function_table);
-
- obj = valuePop(ctxt);
- if (obj->stringval == NULL) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Handler name must be a string");
- xmlXPathFreeObject(obj);
- for (i = 0; i < nargs - 1; i++) {
- zval_ptr_dtor(&args[i]);
- }
- efree(args);
- efree(fci.params);
- return;
- }
- INIT_PZVAL(&handler);
- ZVAL_STRING(&handler, obj->stringval, 1);
- xmlXPathFreeObject(obj);
-
- fci.function_name = &handler;
- fci.symbol_table = NULL;
- fci.object_pp = NULL;
- fci.retval_ptr_ptr = &retval;
- fci.no_separation = 0;
- /*fci.function_handler_cache = &function_ptr;*/
-
- result = zend_call_function(&fci, NULL TSRMLS_CC);
- if (result == FAILURE) {
- if (Z_TYPE(handler) == IS_STRING) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call handler %s()", Z_STRVAL_P(&handler));
- }
- } else {
- if (retval->type == IS_OBJECT && instanceof_function( Z_OBJCE_P(retval), dom_node_class_entry TSRMLS_CC)) {
- xmlNode *nodep;
- dom_object *obj;
- obj = (dom_object *)zend_object_store_get_object(retval TSRMLS_CC);
- nodep = dom_object_get_node(obj);
- valuePush(ctxt, xmlXPathNewNodeSet(nodep));
- } else if (retval->type == IS_BOOL) {
- valuePush(ctxt, xmlXPathNewBoolean(retval->value.lval));
- } else {
- convert_to_string_ex(&retval);
- valuePush(ctxt, xmlXPathNewString( Z_STRVAL_P(retval)));
- }
- zval_ptr_dtor(&retval);
- }
- zval_dtor(&handler);
- for (i = 0; i < nargs - 1; i++) {
- zval_ptr_dtor(&args[i]);
- }
- efree(args);
- efree(fci.params);
-}
-
-static void xsl_ext_function_string_php(xmlXPathParserContextPtr ctxt, int nargs)
-{
- xsl_ext_function_php(ctxt, nargs, 1);
-}
-
-static void xsl_ext_function_object_php(xmlXPathParserContextPtr ctxt, int nargs)
-{
- xsl_ext_function_php(ctxt, nargs, 2);
-}
-
/* {{{ xsl_object_get_data */
zval *xsl_object_get_data(void *obj)
{