> -----Original Message-----
> D.Kingma wrote:
> 
> > Hi Rob / Chregu,
> > 
> > As a first (small) step to implementing xml-security specs 
> (dig-sign, 
> > encryption) I created a patch against HEAD to expose 
> (exclusive-)C14n 
> > functionality from libxml2. I allows you to canonize a single node 
> > (with it's children) or a whole document, with or without comments, 
> > exclusive or not. I also created a small test file to show it's 
> > functionality. Could you please review the patch or else 
> commit it (if 
> > it's ok with everybody)?
> 
> You have to use text file (.txt) in this list. Or provide a 
> link to the patch.
> 
> --Pierre

Once again, this time as a txt file.

Regards,

David
--TEST--
DOMDocument canonize function
--FILE--
<?php
$txt2 = "<foo:Root xmlns:bar=\"http://example.org/bar\"; 
xmlns:baz=\"http://example.org/baz\"; xmlns:foo=\"http://example.org/foo\"; 
xmlns=\"http://example.org/\"; xml:lang=\"en-ie\">
  <bar:Something xmlns:bar=\"http://example.org/bar\";>
     <foo:Something>
        <bar:Something>
           <foo:Something>
                <!-- Here some comment -->
             <baz:Something />
           </foo:Something>
        </bar:Something>
     </foo:Something>
  </bar:Something>
</foo:Root>";

$doc = new DOMDocument('1.0');
$doc->loadXML($txt2);
/*DOMDocument::canonize([boolean withComment, boolean exclusive, string 
inclusive_ns_prefixe, DOMNOde node]) */
var_dump($doc->canonize(true,true,"foo",$doc->documentElement->childNodes->item(1)));
?> 
--EXPECT--
string(325) "<bar:Something xmlns:bar="http://example.org/bar"; 
xmlns:foo="http://example.org/foo";>
     <foo:Something>
        <bar:Something>
           <foo:Something>
                <!-- Here some comment -->
             <baz:Something></baz:Something>
           </foo:Something>
        </bar:Something>
     </foo:Something>
  </bar:Something>"
 
Index: ext/dom/dom_fe.h
===================================================================
RCS file: /repository/php-src/ext/dom/dom_fe.h,v
retrieving revision 1.13
diff -u -r1.13 dom_fe.h
--- ext/dom/dom_fe.h    3 Oct 2004 09:55:29 -0000       1.13
+++ ext/dom/dom_fe.h    16 Feb 2005 18:31:17 -0000
@@ -126,6 +126,7 @@
        /* convienience methods */
 PHP_METHOD(domdocument, load);
 PHP_FUNCTION(dom_document_save);
+PHP_FUNCTION(dom_document_canonize);
 PHP_METHOD(domdocument, loadXML);
 PHP_FUNCTION(dom_document_savexml);
 PHP_FUNCTION(dom_document_validate);
Index: ext/dom/document.c
===================================================================
RCS file: /repository/php-src/ext/dom/document.c,v
retrieving revision 1.64
diff -u -r1.64 document.c
--- ext/dom/document.c  8 Jan 2005 13:24:39 -0000       1.64
+++ ext/dom/document.c  17 Feb 2005 00:36:19 -0000
@@ -30,6 +30,7 @@
 #ifdef LIBXML_SCHEMAS_ENABLED
 #include <libxml/relaxng.h>
 #include <libxml/xmlschemas.h>
+#include <libxml/c14n.h>
 #endif
 
 typedef struct _idsIterator idsIterator;
@@ -68,6 +69,7 @@
        PHP_FALIAS(renameNode, dom_document_rename_node, NULL)
        PHP_ME(domdocument, load, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
        PHP_FALIAS(save, dom_document_save, NULL)
+       PHP_FALIAS(canonize, dom_document_canonize, NULL)
        PHP_ME(domdocument, loadXML, NULL, 
ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
        PHP_FALIAS(saveXML, dom_document_savexml, NULL)
        PHP_ME(domdocument, __construct, NULL, ZEND_ACC_PUBLIC)
@@ -1653,6 +1655,81 @@
 }
 /* }}} end dom_document_save */
 
+int php_dom_document_canonize_visible(xmlNodePtr super, xmlNodePtr node, 
xmlNodePtr parent)
+{
+       if(super == NULL) {
+               return(1);
+    }
+       if(super == parent) return (1);
+       while(node != NULL && node != super && node->parent != NULL){
+               node = node->parent;
+       }
+       if(node == super){
+               return (1);
+       }else
+               return (0);
+}
+
+/* {{{ proto string dom_document_canonize([boolean bcomment, boolean 
bexclusive, string inclusive_ns_prefix, node n]);
+*/
+PHP_FUNCTION(dom_document_canonize)
+{
+       zval *id, *node_set = NULL, *nodep = NULL;
+       zend_bool bcomments = TRUE, bexclusive = FALSE;
+       char *str_inclusive_ns = NULL;
+       dom_object *intern = NULL, *nodeobj = NULL;
+       xmlDoc *docp;
+       xmlNode *node;
+       xmlChar *mem = NULL, *ns_prefix;
+       int str_inclusive_ns_len, ret;
+       /* Buffer */
+       xmlOutputBufferPtr buff = NULL;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), 
"O|bbsO", &id, dom_document_class_entry, &bcomments, 
+                       &bexclusive, &str_inclusive_ns, &str_inclusive_ns_len, 
&nodep, dom_node_class_entry) == FAILURE) {
+               return;
+       }
+
+       DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
+       
+       if(nodep != NULL){
+               DOM_GET_OBJ(node, nodep, xmlNodePtr, nodeobj);
+       }
+
+       buff =  xmlAllocOutputBuffer(NULL);
+       if (!buff) {
+               php_error(E_WARNING, "Could not fetch buffer");
+               RETURN_FALSE;
+       }
+
+       ns_prefix = xmlStrdup((const xmlChar *) str_inclusive_ns);
+
+       ret = xmlC14NExecute                    (docp,          //xmlDocPtr 
doc, 
+                                (xmlC14NIsVisibleCallback) 
php_dom_document_canonize_visible, //xmlC14NIsVisibleCallback 
is_visible_callback, 
+                                node,                                          
        //void * user_data, 
+                                (int) bexclusive,                              
// int exclusive, 
+                                &ns_prefix,                                    
// xmlChar ** inclusive_ns_prefixes, 
+                                (int) bcomments,                               
//int with_comments, 
+                                buff);                                         
        //xmlOutputBufferPtr buf)
+
+       xmlOutputBufferFlush(buff);
+       mem = xmlStrndup(buff->buffer->content, buff->buffer->use);
+       (void)xmlOutputBufferClose(buff);
+       
+       if (ret < 0) {
+               php_error(E_WARNING, "Error canonizing");
+               RETURN_FALSE;
+       }
+
+       if (!mem) {
+               php_error(E_WARNING, "Error dumping buffer");
+               RETURN_FALSE;
+       }
+       RETVAL_STRING(mem, 1);
+       xmlFree(mem);
+}
+/* }}} end dom_document_canonize */
+
 /* {{{ proto string dom_document_savexml([node n]);
 URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-saveXML
 Since: DOM Level 3

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to