Skip to content

Commit 7523915

Browse files
committed
Use xml/xpath.dart instead of xpath_selector.
Also, update the tests to reflect the changes in the API and fix some issues with the test assertions. Thankfully, namespace-uri is now supported in xpath, so we can remove some of the workarounds we had to do before.
1 parent 2ce508c commit 7523915

15 files changed

Lines changed: 670 additions & 488 deletions

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 5.0.0
2+
3+
* Upgrade dependencies (Now Dart >= 3.11 is needed)
4+
* Use `xml/xpath.dart` instead of `xpath_selector`
5+
16
## 4.0.0
27

38
* Upgrade dependencies (Now Dart >= 3.8 is needed)

lib/src/enveloped_signature.dart

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// Author: rudyhuang
44

55
import 'package:xml/xml.dart';
6-
import 'package:xpath_selector_xml_parser/xpath_selector_xml_parser.dart';
76

87
import 'signed_xml.dart';
98
import 'utils.dart';
@@ -17,31 +16,31 @@ class EnvelopedSignature implements CanonicalizationAlgorithm<XmlNode> {
1716
XmlNode process(XmlNode node, [Map<String, dynamic> options = const {}]) {
1817
final signatureNode = options['signatureNode'];
1918
if (signatureNode == null) {
20-
// leave this for the moment...
21-
final signature = XmlXPath.node(node).query(
22-
'./*[local-name()="Signature""]'); // FIXME: namespace-uri() not supported
23-
// .query('./*[local-name()="Signature" and namespace-uri()="http://www.w3.org/2000/09/xmldsig#"]');
24-
final signatureNode = signature.node;
25-
if (signatureNode != null) {
26-
final child = signatureNode.node;
27-
child.parent?.children.remove(child);
19+
final signatures = findChilds(node, 'Signature', xmlDsigNamespace);
20+
if (signatures.isNotEmpty) {
21+
final signature = signatures.first;
22+
signature.parent?.children.remove(signature);
2823
}
2924
return node;
3025
}
3126

3227
assert(signatureNode is XmlElement);
33-
final expectedSignatureValue = findFirst(signatureNode as XmlElement,
34-
".//*[local-name()='SignatureValue']/text()")
35-
.innerText;
36-
final signatures = XmlXPath.node(node).query(
37-
'.//*[local-name()="Signature"]'); // FIXME: namespace-uri() not supported
38-
// .query('.//*[local-name()="Signature" and namespace-uri()="http://www.w3.org/2000/09/xmldsig#"]');
39-
for (final sig in signatures.nodes) {
40-
final child = sig.node;
41-
assert(child is XmlElement);
42-
final signatureValue = findFirst(
43-
child as XmlElement, ".//*[local-name()='SignatureValue']/text()")
44-
.innerText;
28+
final expectedSignatureValue = findChilds(
29+
signatureNode as XmlElement,
30+
'SignatureValue',
31+
xmlDsigNamespace,
32+
).first.innerText;
33+
final signatures = node.descendants.whereType<XmlElement>().where(
34+
(element) =>
35+
element.name.local == 'Signature' &&
36+
element.name.namespaceUri == xmlDsigNamespace,
37+
);
38+
for (final child in signatures) {
39+
final signatureValue = findChilds(
40+
child,
41+
'SignatureValue',
42+
xmlDsigNamespace,
43+
).first.innerText;
4544
if (expectedSignatureValue == signatureValue) {
4645
child.parent?.children.remove(child);
4746
}

lib/src/exclusive_canonicalization.dart

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//History: Wed Feb 09 16:08:31 CST 2022
33
// Author: rudyhuang
44

5-
import 'package:xml/xml.dart';
5+
import 'package:xml/xml.dart' hide XmlNamespace;
66

77
import 'c14n_canonicalization.dart';
88
import 'utils.dart';
@@ -27,11 +27,12 @@ class ExclusiveCanonicalization extends C14nCanonicalization {
2727
}
2828

2929
RenderNsResult _renderNs(
30-
XmlElement node,
31-
List<XmlNamespace> prefixesInScope,
32-
String defaultNs,
33-
Map<String, String> defaultNsForPrefix,
34-
List<String> inclusiveNamespacesPrefixList) {
30+
XmlElement node,
31+
List<XmlNamespace> prefixesInScope,
32+
String defaultNs,
33+
Map<String, String> defaultNsForPrefix,
34+
List<String> inclusiveNamespacesPrefixList,
35+
) {
3536
final res = <String>[];
3637
var newDefaultNs = defaultNs;
3738
final currNs = node.name.namespaceUri ?? '';
@@ -89,11 +90,12 @@ class ExclusiveCanonicalization extends C14nCanonicalization {
8990
}
9091

9192
String _processInner(
92-
XmlNode node,
93-
List<XmlNamespace> prefixesInScope,
94-
String defaultNs,
95-
Map<String, String> defaultNsForPrefix,
96-
List<String> inclusiveNamespacesPrefixList) {
93+
XmlNode node,
94+
List<XmlNamespace> prefixesInScope,
95+
String defaultNs,
96+
Map<String, String> defaultNsForPrefix,
97+
List<String> inclusiveNamespacesPrefixList,
98+
) {
9799
if (node.nodeType == XmlNodeType.COMMENT) {
98100
return renderComment(node);
99101
}
@@ -111,7 +113,7 @@ class ExclusiveCanonicalization extends C14nCanonicalization {
111113
tagName,
112114
ns.rendered,
113115
renderAttrs(node, ns.newDefaultNs),
114-
'>'
116+
'>',
115117
];
116118

117119
for (final child in node.children) {
@@ -164,8 +166,11 @@ class ExclusiveCanonicalization extends C14nCanonicalization {
164166
for (String prefix in prefixList) {
165167
for (final ancestorNamespace in ancestorNamespaces) {
166168
if (prefix == ancestorNamespace.prefix) {
167-
node.setAttribute('xmlns:$prefix', ancestorNamespace.namespaceURI,
168-
namespace: 'http://www.w3.org/2000/xmlns/');
169+
node.setAttribute(
170+
'xmlns:$prefix',
171+
ancestorNamespace.namespaceURI,
172+
namespaceUri: 'http://www.w3.org/2000/xmlns/',
173+
);
169174
}
170175
}
171176
}

0 commit comments

Comments
 (0)