24#include <libxslt/variables.h>
49static void xsl_proxy_factory(xmlNodePtr node,
zval *child,
dom_object *intern, xmlXPathParserContextPtr ctxt)
62 xsltTransformContextPtr transform_ctxt = (xsltTransformContextPtr) ctxt->context->extra;
63 if (node->doc != transform_ctxt->document->doc) {
64 node = xmlDocCopyNode(node, intern->document->ptr, 1);
69static xsl_object *xsl_ext_fetch_intern(xmlXPathParserContextPtr ctxt)
72 xsltGenericError(xsltGenericErrorContext,
73 "xsltExtFunctionTest: Function called from outside of PHP\n");
77 xsltTransformContextPtr tctxt = xsltXPathGetTransformContext(ctxt);
79 xsltGenericError(xsltGenericErrorContext,
80 "xsltExtFunctionTest: failed to get the transformation context\n");
86 xsltGenericError(xsltGenericErrorContext,
87 "xsltExtFunctionTest: failed to get the internal object\n");
95 xsl_object *intern = xsl_ext_fetch_intern(ctxt);
116static void xsl_ext_function_trampoline(xmlXPathParserContextPtr ctxt,
int nargs)
118 xsl_object *intern = xsl_ext_fetch_intern(ctxt);
126static void xsl_add_ns_to_map(xmlHashTablePtr table, xsltStylesheetPtr sheet,
const xmlNode *cur,
const xmlChar *
prefix,
const xmlChar *uri)
128 const xmlChar *existing_url = xmlHashLookup(table,
prefix);
129 if (existing_url !=
NULL && !xmlStrEqual(existing_url, uri)) {
130 xsltTransformError(
NULL, sheet, (xmlNodePtr) cur,
"Namespaces prefix %s used for multiple namespaces\n",
prefix);
132 }
else if (existing_url ==
NULL) {
133 xmlHashUpdateEntry(table,
prefix, (
void *) uri,
NULL);
138static void xsl_build_ns_map(xmlHashTablePtr table, xsltStylesheetPtr sheet,
php_dom_libxml_ns_mapper *ns_mapper,
const xmlDoc *doc)
140 const xmlNode *cur = xmlDocGetRootElement(doc);
142 while (cur !=
NULL) {
144 if (cur->ns !=
NULL && cur->ns->prefix !=
NULL) {
145 xsl_add_ns_to_map(table, sheet, cur, cur->ns->prefix, cur->ns->href);
155 xsl_add_ns_to_map(table, sheet, cur,
prefix, ns->href);
160 cur = php_dom_next_in_tree_order(cur, (
const xmlNode *) doc);
173 if (sheetp->nsHash ==
NULL) {
175 if (node_intern !=
NULL && php_dom_follow_spec_intern(node_intern)) {
176 sheetp->nsHash = xmlHashCreate(10);
194 xsltStylesheetPtr sheetp;
195 bool clone_docu =
false;
196 xmlNode *nodep =
NULL;
205 nodep = php_libxml_import_node(docp);
217 newdoc = xmlCopyDoc(doc, 1);
218 xmlNodeSetBase((xmlNodePtr) newdoc, (xmlChar *)doc->URL);
219 PHP_LIBXML_SANITIZE_GLOBALS(parse);
221 xmlSubstituteEntitiesDefault(1);
222 xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
225 sheetp = xsltParseStylesheetDoc(newdoc);
226 PHP_LIBXML_RESTORE_GLOBALS(parse);
237 xsltFreeStylesheet(sheetp);
245 php_libxml_decrement_doc_ref_directly(intern->
sheet_ref_obj);
259 nodep = xmlDocGetRootElement(sheetp->doc);
260 if (nodep && (nodep = nodep->children)) {
263 if (nodep->type ==
XML_ELEMENT_NODE && xmlStrEqual(nodep->name, (
const xmlChar *)
"key") && xmlStrEqual(nodep->ns->href, XSLT_NAMESPACE)) {
283 xsltTransformContextPtr xsl = (xsltTransformContextPtr) ctxt;
284 xsltRegisterExtFunction(xsl, (
const xmlChar *)
ZSTR_VAL(
name), (
const xmlChar *)
ZSTR_VAL(ns), xsl_ext_function_trampoline);
287static xmlDocPtr php_xsl_apply_stylesheet(
zval *
id,
xsl_object *intern, xsltStylesheetPtr style,
zval *docp)
289 xmlDocPtr newdocp =
NULL;
290 xmlDocPtr doc =
NULL;
291 xmlNodePtr node =
NULL;
292 xsltTransformContextPtr ctxt;
293 php_libxml_node_object *
object;
297 int secPrefsError = 0;
298 xsltSecurityPrefsPtr secPrefs =
NULL;
300 node = php_libxml_import_node(docp);
315 zend_string_release(
name);
329 intern->
doc =
emalloc(
sizeof(php_libxml_node_object));
330 memset(intern->
doc, 0,
sizeof(php_libxml_node_object));
333 doc = xmlCopyDoc(doc, 1);
335 object = Z_LIBXML_NODE_P(docp);
336 intern->
doc->document =
object->document;
339 php_libxml_increment_doc_ref(intern->
doc, doc);
341 ctxt = xsltNewTransformContext(style, doc);
342 ctxt->_private = (
void *) intern;
358 ctxt->maxTemplateDepth =
Z_LVAL_P(max_template_depth);
362 ctxt->maxTemplateVars =
Z_LVAL_P(max_template_vars);
368 secPrefs = xsltNewSecurityPrefs();
370 if (0 != xsltSetSecurityPrefs(secPrefs, XSLT_SECPREF_READ_FILE, xsltSecurityForbid)) {
375 if (0 != xsltSetSecurityPrefs(secPrefs, XSLT_SECPREF_WRITE_FILE, xsltSecurityForbid)) {
380 if (0 != xsltSetSecurityPrefs(secPrefs, XSLT_SECPREF_CREATE_DIRECTORY, xsltSecurityForbid)) {
385 if (0 != xsltSetSecurityPrefs(secPrefs, XSLT_SECPREF_READ_NETWORK, xsltSecurityForbid)) {
390 if (0 != xsltSetSecurityPrefs(secPrefs, XSLT_SECPREF_WRITE_NETWORK, xsltSecurityForbid)) {
395 if (0 != xsltSetCtxtSecurityPrefs(secPrefs, ctxt)) {
402 if (secPrefsError == 1) {
405 newdocp = xsltApplyStylesheetUser(style, doc,
NULL,
NULL, f, ctxt);
413 xsltFreeTransformContext(ctxt);
415 xsltFreeSecurityPrefs(secPrefs);
420 php_libxml_decrement_doc_ref(intern->
doc);
436 xsltStylesheetPtr sheetp;
442 sheetp = (xsltStylesheetPtr) intern->
ptr;
448 newdocp = php_xsl_apply_stylesheet(
id, intern, sheetp, docp);
454 php_libxml_node_object *interndoc;
457 curclass_name = curce->
name;
462 if (!instanceof_function(ret_class, curce)) {
473 php_libxml_increment_doc_ref(interndoc, newdocp);
474 php_libxml_increment_node_ptr(interndoc, (xmlNodePtr)newdocp, (
void *)interndoc);
489 xsltStylesheetPtr sheetp;
497 sheetp = (xsltStylesheetPtr) intern->
ptr;
503 newdocp = php_xsl_apply_stylesheet(
id, intern, sheetp, docp);
507 ret = xsltSaveResultToFilename(uri, newdocp, sheetp, 0);
520 xsltStylesheetPtr sheetp;
522 xmlChar *doc_txt_ptr;
528 sheetp = (xsltStylesheetPtr) intern->
ptr;
534 newdocp = php_xsl_apply_stylesheet(
id, intern, sheetp, docp);
538 ret = xsltSaveResultToString(&doc_txt_ptr, &doc_txt_len, newdocp, sheetp);
539 if (doc_txt_ptr && doc_txt_len) {
541 xmlFree(doc_txt_ptr);
557 zval *entry, new_string;
561 size_t namespace_len;
583 if (string_key ==
NULL) {
593 str = zval_try_get_string(entry);
599 zend_string_release(str);
632 size_t namespace_len = 0;
653 size_t namespace_len = 0;
743 if (filename !=
NULL) {
744 intern->
profiling = zend_string_copy(filename);
758 zend_long securityPrefs, oldSecurityPrefs;
memset(ptr, 0, type->size)
PHPAPI int php_check_open_basedir(const char *path)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
PHP_DOM_EXPORT const php_dom_ns_magic_token * php_dom_ns_is_xmlns_magic_token
PHP_DOM_EXPORT bool php_dom_ns_is_fast_ex(xmlNsPtr ns, const php_dom_ns_magic_token *magic_token)
PHP_DOM_EXPORT php_dom_libxml_ns_mapper * php_dom_get_ns_mapper(dom_object *object)
PHP_DOM_EXPORT xmlNsPtr php_dom_libxml_ns_mapper_get_ns_raw_strings_nullsafe(php_dom_libxml_ns_mapper *mapper, const char *prefix, const char *uri)
void xsl_free_sheet(xsl_object *intern)
void php_xsl_set_object(zval *wrapper, void *obj)
#define XSL_SECPREF_WRITE_FILE
#define XSL_SECPREF_CREATE_DIRECTORY
zval * xsl_prop_max_template_vars(zend_object *object)
#define XSL_SECPREF_READ_NETWORK
#define XSL_SECPREF_READ_FILE
zval * xsl_prop_max_template_depth(zend_object *object)
#define XSL_SECPREF_WRITE_NETWORK
zend_class_entry * parent
php_libxml_node_object * doc
php_libxml_ref_obj * sheet_ref_obj
php_dom_xpath_callbacks xpath_callbacks
struct _dom_object dom_object
PHP_DOM_EXPORT dom_object * php_dom_object_get_data(xmlNodePtr obj)
PHP_DOM_EXPORT bool php_dom_create_object(xmlNodePtr obj, zval *return_value, dom_object *domobj)
PHP_DOM_EXPORT void php_dom_xpath_callbacks_clean_argument_stack(xmlXPathParserContextPtr ctxt, uint32_t num_args)
PHP_DOM_EXPORT zend_result php_dom_xpath_callbacks_update_method_handler(php_dom_xpath_callbacks *registry, xmlXPathContextPtr ctxt, zend_string *ns, zend_string *name, const HashTable *callable_ht, php_dom_xpath_callback_name_validation name_validation, php_dom_xpath_callbacks_register_func_ctx register_func)
PHP_DOM_EXPORT zend_result php_dom_xpath_callbacks_call_custom_ns(php_dom_xpath_callbacks *xpath_callbacks, xmlXPathParserContextPtr ctxt, int num_args, php_dom_xpath_nodeset_evaluation_mode evaluation_mode, dom_object *intern, php_dom_xpath_callbacks_proxy_factory proxy_factory)
PHP_DOM_EXPORT zend_result php_dom_xpath_callbacks_call_php_ns(php_dom_xpath_callbacks *xpath_callbacks, xmlXPathParserContextPtr ctxt, int num_args, php_dom_xpath_nodeset_evaluation_mode evaluation_mode, dom_object *intern, php_dom_xpath_callbacks_proxy_factory proxy_factory)
PHP_DOM_EXPORT void php_dom_xpath_callbacks_clean_node_list(php_dom_xpath_callbacks *registry)
@ PHP_DOM_XPATH_CALLBACK_NAME_VALIDATE_NCNAME
@ PHP_DOM_XPATH_CALLBACK_NAME_VALIDATE_NULLS
php_dom_xpath_nodeset_evaluation_mode
@ PHP_DOM_XPATH_EVALUATE_NODESET_TO_STRING
@ PHP_DOM_XPATH_EVALUATE_NODESET_TO_NODESET
PHP_DOM_EXPORT zend_result php_dom_xpath_callbacks_update_single_method_handler(php_dom_xpath_callbacks *registry, xmlXPathContextPtr ctxt, zend_string *ns, zend_string *name, const zend_fcall_info_cache *fcc, php_dom_xpath_callback_name_validation name_validation, php_dom_xpath_callbacks_register_func_ctx register_func)
PHP_DOM_EXPORT void php_dom_xpath_callbacks_delayed_lib_registration(const php_dom_xpath_callbacks *registry, void *ctxt, php_dom_xpath_callbacks_register_func_ctx register_func)
void xsl_ext_function_string_php(xmlXPathParserContextPtr ctxt, int nargs)
xsl_ns_hash_correction_status
@ XSL_NS_HASH_CORRECTION_FAILED
@ XSL_NS_HASH_CORRECTION_APPLIED
@ XSL_NS_HASH_CORRECTION_NONE
void xsl_ext_function_object_php(xmlXPathParserContextPtr ctxt, int nargs)
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *class_type)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API void zend_release_fcall_info_cache(zend_fcall_info_cache *fcc)
ZEND_API ZEND_COLD void zend_argument_type_error(uint32_t arg_num, const char *format,...)
#define Z_PARAM_PATH_STR(dest)
#define CHECK_NULL_PATH(p, l)
struct _zend_fcall_info_cache zend_fcall_info_cache
#define Z_PARAM_ARRAY_HT_OR_STR_OR_NULL(dest_ht, dest_str)
#define ZEND_PARSE_PARAMETERS_END()
#define zend_parse_parameters_none()
#define Z_PARAM_STRING(dest, dest_len)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_ARRAY_HT_OR_STR(dest_ht, dest_str)
struct _zend_fcall_info zend_fcall_info
#define Z_PARAM_FUNC_NO_TRAMPOLINE_FREE(dest_fci, dest_fcc)
#define RETVAL_STRINGL(s, l)
#define Z_PARAM_PATH_STR_OR_NULL(dest)
#define RETURN_STR_COPY(s)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API bool zend_is_executing(void)
ZEND_API zend_string * get_active_function_or_method_name(void)
ZEND_API zval *ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData)
ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key)
ZEND_API zval *ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key)
#define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val)
#define ZEND_HASH_FOREACH_END()
#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht, _key, _val)
struct _zend_string zend_string
ZEND_API zval * zend_std_read_property(zend_object *zobj, zend_string *name, int type, void **cache_slot, zval *rv)
ZEND_API bool ZEND_FASTCALL zend_is_true(const zval *op)
#define ZEND_DIAGNOSTIC_IGNORED_END
#define zend_always_inline
#define ZEND_DIAGNOSTIC_IGNORED_START(warning)
#define UNEXPECTED(condition)
struct _zend_class_entry zend_class_entry
#define ZSTR_INIT_LITERAL(s, persistent)
#define zend_string_equals_literal(str, literal)
#define Z_STRVAL_P(zval_p)
#define ZVAL_STR_COPY(z, s)
struct _zend_array HashTable
#define Z_OBJCE_P(zval_p)
ZEND_RESULT_CODE zend_result
#define VCWD_FOPEN(path, mode)