In `dm.xmlsec.binding` ("https://pypi.org/project/dm.xmlsec.binding/";),
I integrate
Aleksey Sanin's XML security library ("http://www.aleksey.com/xmlsec";)
with `lxml`, both `libxml2` based.

Recently, one of its encryption/decryption tests started to fail.
This test uses a tree of the form:
<root>
  ...
  <to_be_encrypted>...</to_be_encrypted>
  ...
</root>
The encryption transforms it (directly at the `libxml2` level)
to the form
<root>
  ...
  <encrypted>...</encypted>
  ...
</root>
An `lxml` proxy to the new node `encrypted` is returned.
The test calls `getroottree` on this proxy to update
`lxml`'s view of the modified tree.
In older `lxml` versions, this has been successful.
However, in `lxml==4.9.1` (maybe already before this version)
the view is inconsistent:
with `ENC="{http://www.w3.org/2001/04/xmlenc#}EncryptedData`
and an element `E`, I get:
`E[0].tag == ENC` but `E.find(ENC) is None`.
Apparently, `__getitem__` (behind `E[0]`) is aware of the modification
but `find` is not.

How the `lxml` view of a tree modified at the `libxml2` leval
can be reliably updated?


For preciseness
===============
The XML serialization of the inconsistent view is:
<!--
XML Security Library example: Original XML doc file before encryption (encrypt2 
example).
-->
<Envelope xmlns="urn:envelope">
  <EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#"; 
Type="http://www.w3.org/2001/04/xmlenc#Element";>
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#";>
<KeyName>deskey.bin</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>FwsuAoPgBzvCjr3K2q+VLcX4U+NzpHZ6orcSzbe3OrTcu3PrxWnHqg==</CipherValue>
</CipherData>
</EncryptedData>
</Envelope>

The `E` in the section above is this document's root element
(i.e. `{urn:envelope}Envelope`). Its child `0` has been
replaced by the encryption. It is this element which is not seen
by `find`.




--
Dieter

_______________________________________________
lxml - The Python XML Toolkit mailing list -- lxml@python.org
To unsubscribe send an email to lxml-le...@python.org
https://mail.python.org/mailman3/lists/lxml.python.org/
Member address: arch...@mail-archive.com

Reply via email to