int dom_node_node_value_write(dom_object *obj, zval *newval) { xmlNode *nodep = dom_object_get_node(obj); if (nodep == NULL) { php_dom_throw_error(INVALID_STATE_ERR, 0); return FAILURE; } /* Access to Element node is implemented as a convience method */ switch (nodep->type) { case XML_ELEMENT_NODE: case XML_ATTRIBUTE_NODE: if (nodep->children) { node_list_unlink(nodep->children); php_libxml_node_free_list((xmlNodePtr) nodep->children); nodep->children = NULL; } case XML_TEXT_NODE: case XML_COMMENT_NODE: case XML_CDATA_SECTION_NODE: case XML_PI_NODE: { zend_string *str = zval_get_string(newval); xmlNodeSetContentLen(nodep, (xmlChar *) ZSTR_VAL(str), ZSTR_LEN(str) + 1); zend_string_release_ex(str, 0); break; } default: break; } return SUCCESS; }
static int xmlSecEncCtxEncDataNodeWrite(xmlSecEncCtxPtr encCtx) { int ret; xmlSecAssert2(encCtx != NULL, -1); xmlSecAssert2(encCtx->result != NULL, -1); xmlSecAssert2(encCtx->encKey != NULL, -1); /* write encrypted data to xml (if requested) */ if(encCtx->cipherValueNode != NULL) { xmlSecAssert2(xmlSecBufferGetData(encCtx->result) != NULL, -1); xmlNodeSetContentLen(encCtx->cipherValueNode, xmlSecBufferGetData(encCtx->result), xmlSecBufferGetSize(encCtx->result)); encCtx->resultReplaced = 1; } /* update <enc:KeyInfo/> node */ if(encCtx->keyInfoNode != NULL) { ret = xmlSecKeyInfoNodeWrite(encCtx->keyInfoNode, encCtx->encKey, &(encCtx->keyInfoWriteCtx)); if(ret < 0) { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "xmlSecKeyInfoNodeWrite", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); return(-1); } } return(0); }
int dom_characterdata_data_write(dom_object *obj, zval *newval) { xmlNode *nodep = dom_object_get_node(obj); zend_string *str; if (nodep == NULL) { php_dom_throw_error(INVALID_STATE_ERR, 0); return FAILURE; } str = zval_get_string(newval); xmlNodeSetContentLen(nodep, (xmlChar *) str->val, str->len + 1); zend_string_release(str); return SUCCESS; }
int dom_attr_value_write(dom_object *obj, zval *newval) { zend_string *str; xmlAttrPtr attrp = (xmlAttrPtr) dom_object_get_node(obj); if (attrp == NULL) { php_dom_throw_error(INVALID_STATE_ERR, 0); return FAILURE; } if (attrp->children) { node_list_unlink(attrp->children); } str = zval_get_string(newval); xmlNodeSetContentLen((xmlNodePtr) attrp, (xmlChar *) ZSTR_VAL(str), ZSTR_LEN(str) + 1); zend_string_release(str); return SUCCESS; }
/* {{{ proto void DOMElement::__construct(string name, [string value], [string uri]); */ PHP_METHOD(domelement, __construct) { zval *id; xmlNodePtr nodep = NULL, oldnode = NULL; dom_object *intern; char *name, *value = NULL, *uri = NULL; char *localname = NULL, *prefix = NULL; int errorcode = 0, uri_len = 0; int name_len, value_len = 0, name_valid; xmlNsPtr nsptr = NULL; zend_error_handling error_handling; zend_replace_error_handling(EH_THROW, dom_domexception_class_entry, &error_handling TSRMLS_CC); if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s!s", &id, dom_element_class_entry, &name, &name_len, &value, &value_len, &uri, &uri_len) == FAILURE) { zend_restore_error_handling(&error_handling TSRMLS_CC); return; } zend_restore_error_handling(&error_handling TSRMLS_CC); name_valid = xmlValidateName((xmlChar *) name, 0); if (name_valid != 0) { php_dom_throw_error(INVALID_CHARACTER_ERR, 1 TSRMLS_CC); RETURN_FALSE; } /* Namespace logic is separate and only when uri passed in to insure no BC breakage */ if (uri_len > 0) { errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len); if (errorcode == 0) { nodep = xmlNewNode (NULL, (xmlChar *)localname); if (nodep != NULL && uri != NULL) { nsptr = dom_get_ns(nodep, uri, &errorcode, prefix); xmlSetNs(nodep, nsptr); } } xmlFree(localname); if (prefix != NULL) { xmlFree(prefix); } if (errorcode != 0) { if (nodep != NULL) { xmlFreeNode(nodep); } php_dom_throw_error(errorcode, 1 TSRMLS_CC); RETURN_FALSE; } } else { /* If you don't pass a namespace uri, then you can't set a prefix */ localname = xmlSplitQName2((xmlChar *)name, (xmlChar **) &prefix); if (prefix != NULL) { xmlFree(localname); xmlFree(prefix); php_dom_throw_error(NAMESPACE_ERR, 1 TSRMLS_CC); RETURN_FALSE; } nodep = xmlNewNode(NULL, (xmlChar *) name); } if (!nodep) { php_dom_throw_error(INVALID_STATE_ERR, 1 TSRMLS_CC); RETURN_FALSE; } if (value_len > 0) { xmlNodeSetContentLen(nodep, (xmlChar *) value, value_len); } intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC); if (intern != NULL) { oldnode = dom_object_get_node(intern); if (oldnode != NULL) { php_libxml_node_free_resource(oldnode TSRMLS_CC); } php_libxml_increment_node_ptr((php_libxml_node_object *)intern, nodep, (void *)intern TSRMLS_CC); } }
/* {{{ proto void DOMElement::__construct(string name, [string value], [string uri]) */ PHP_METHOD(domelement, __construct) { zval *id = getThis(); xmlNodePtr nodep = NULL, oldnode = NULL; dom_object *intern; char *name, *value = NULL, *uri = NULL; char *localname = NULL, *prefix = NULL; int errorcode = 0; size_t name_len, value_len = 0, uri_len = 0; int name_valid; xmlNsPtr nsptr = NULL; if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "s|s!s", &name, &name_len, &value, &value_len, &uri, &uri_len) == FAILURE) { return; } name_valid = xmlValidateName((xmlChar *) name, 0); if (name_valid != 0) { php_dom_throw_error(INVALID_CHARACTER_ERR, 1); RETURN_FALSE; } /* Namespace logic is separate and only when uri passed in to insure no BC breakage */ if (uri_len > 0) { errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len); if (errorcode == 0) { nodep = xmlNewNode (NULL, (xmlChar *)localname); if (nodep != NULL && uri != NULL) { nsptr = dom_get_ns(nodep, uri, &errorcode, prefix); xmlSetNs(nodep, nsptr); } } xmlFree(localname); if (prefix != NULL) { xmlFree(prefix); } if (errorcode != 0) { if (nodep != NULL) { xmlFreeNode(nodep); } php_dom_throw_error(errorcode, 1); RETURN_FALSE; } } else { /* If you don't pass a namespace uri, then you can't set a prefix */ localname = (char *) xmlSplitQName2((xmlChar *) name, (xmlChar **) &prefix); if (prefix != NULL) { xmlFree(localname); xmlFree(prefix); php_dom_throw_error(NAMESPACE_ERR, 1); RETURN_FALSE; } nodep = xmlNewNode(NULL, (xmlChar *) name); } if (!nodep) { php_dom_throw_error(INVALID_STATE_ERR, 1); RETURN_FALSE; } if (value_len > 0) { xmlNodeSetContentLen(nodep, (xmlChar *) value, value_len); } intern = Z_DOMOBJ_P(id); oldnode = dom_object_get_node(intern); if (oldnode != NULL) { php_libxml_node_free_resource(oldnode ); } php_libxml_increment_node_ptr((php_libxml_node_object *)intern, nodep, (void *)intern); }
bool rewrite_urls(xmlNode *n, const char *base, struct save_complete_entry *list) { xmlNode *child; assert(n->type == XML_ELEMENT_NODE); /** * We only need to consider the following cases: * * Attribute: Elements: * * 1) data <object> * 2) href <a> <area> <link> * 3) src <script> <input> <frame> <iframe> <img> * 4) n/a <style> * 5) n/a any <base> tag * 6) background any (except those above) */ if (!n->name) { /* ignore */ } /* 1 */ else if (strcmp((const char *) n->name, "object") == 0) { if (!rewrite_url(n, "data", base, list)) return false; } /* 2 */ else if (strcmp((const char *) n->name, "a") == 0 || strcmp((const char *) n->name, "area") == 0 || strcmp((const char *) n->name, "link") == 0) { if (!rewrite_url(n, "href", base, list)) return false; } /* 3 */ else if (strcmp((const char *) n->name, "frame") == 0 || strcmp((const char *) n->name, "iframe") == 0 || strcmp((const char *) n->name, "input") == 0 || strcmp((const char *) n->name, "img") == 0 || strcmp((const char *) n->name, "script") == 0) { if (!rewrite_url(n, "src", base, list)) return false; } /* 4 */ else if (strcmp((const char *) n->name, "style") == 0) { unsigned int len; xmlChar *content; for (child = n->children; child != 0; child = child->next) { char *rewritten; /* Get current content */ content = xmlNodeGetContent(child); if (!content) /* unfortunately we don't know if this is * due to memory exhaustion, or because * there is no content for this node */ continue; /* Rewrite @import rules */ rewritten = rewrite_stylesheet_urls( (const char *) content, strlen((const char *) content), (int *) &len, base, list); xmlFree(content); if (!rewritten) return false; /* set new content */ xmlNodeSetContentLen(child, (const xmlChar*)rewritten, len); } return true; } /* 5 */ else if (strcmp((const char *) n->name, "base") == 0) { /* simply remove any <base> tags from the document */ xmlUnlinkNode(n); xmlFreeNode(n); /* base tags have no content, so there's no point recursing * additionally, we've just destroyed this node, so trying * to recurse would result in bad things happening */ return true; } /* 6 */ else { if (!rewrite_url(n, "background", base, list)) return false; } /* now recurse */ for (child = n->children; child;) { /* we must extract the next child now, as if the current * child is a <base> element, it will be removed from the * tree (see 5, above), thus preventing extraction of the * next child */ xmlNode *next = child->next; if (child->type == XML_ELEMENT_NODE) { if (!rewrite_urls(child, base, list)) return false; } child = next; } return true; }