nokogiri 1.6.1-java → 1.6.2-java
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of nokogiri might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.editorconfig +17 -0
- data/.travis.yml +6 -6
- data/CHANGELOG.ja.rdoc +61 -8
- data/CHANGELOG.rdoc +58 -3
- data/Gemfile +3 -3
- data/Manifest.txt +57 -1
- data/README.ja.rdoc +22 -17
- data/README.rdoc +23 -18
- data/ROADMAP.md +1 -2
- data/Rakefile +162 -58
- data/build_all +56 -31
- data/dependencies.yml +3 -3
- data/ext/java/nokogiri/NokogiriService.java +9 -5
- data/ext/java/nokogiri/XmlDocument.java +95 -54
- data/ext/java/nokogiri/XmlNode.java +93 -42
- data/ext/java/nokogiri/XmlReader.java +1 -1
- data/ext/java/nokogiri/XmlSaxParserContext.java +33 -0
- data/ext/java/nokogiri/XmlSchema.java +4 -2
- data/ext/java/nokogiri/XmlXpathContext.java +118 -76
- data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +20 -0
- data/ext/java/nokogiri/internals/NokogiriHandler.java +3 -10
- data/ext/java/nokogiri/internals/NokogiriHelpers.java +40 -23
- data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +59 -54
- data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +1 -1
- data/ext/java/nokogiri/internals/ParserContext.java +1 -4
- data/ext/java/nokogiri/internals/SaveContextVisitor.java +6 -2
- data/ext/java/nokogiri/internals/c14n/AttrCompare.java +119 -0
- data/ext/java/nokogiri/internals/c14n/C14nHelper.java +159 -0
- data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +37 -0
- data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +93 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +252 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +639 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +38 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +38 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +368 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +295 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +40 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +44 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +44 -0
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +43 -0
- data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +630 -0
- data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +173 -0
- data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +76 -0
- data/ext/java/nokogiri/internals/c14n/Constants.java +42 -0
- data/ext/java/nokogiri/internals/c14n/ElementProxy.java +293 -0
- data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +93 -0
- data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +79 -0
- data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +165 -0
- data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +76 -0
- data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +402 -0
- data/ext/java/nokogiri/internals/c14n/NodeFilter.java +51 -0
- data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +179 -0
- data/ext/java/nokogiri/internals/c14n/XMLUtils.java +507 -0
- data/ext/nokogiri/extconf.rb +429 -128
- data/ext/nokogiri/html_document.c +2 -2
- data/ext/nokogiri/nokogiri.c +6 -1
- data/ext/nokogiri/xml_document.c +5 -4
- data/ext/nokogiri/xml_node.c +76 -7
- data/ext/nokogiri/xml_reader.c +1 -1
- data/ext/nokogiri/xml_sax_parser_context.c +40 -0
- data/ext/nokogiri/xml_syntax_error.c +10 -5
- data/ext/nokogiri/xml_syntax_error.h +1 -1
- data/ext/nokogiri/xml_xpath_context.c +2 -14
- data/ext/nokogiri/xslt_stylesheet.c +1 -1
- data/lib/nokogiri.rb +31 -22
- data/lib/nokogiri/css/node.rb +0 -50
- data/lib/nokogiri/css/parser.rb +213 -218
- data/lib/nokogiri/css/parser.y +21 -30
- data/lib/nokogiri/css/xpath_visitor.rb +62 -14
- data/lib/nokogiri/html/document.rb +97 -18
- data/lib/nokogiri/html/sax/parser.rb +2 -2
- data/lib/nokogiri/nokogiri.jar +0 -0
- data/lib/nokogiri/version.rb +1 -1
- data/lib/nokogiri/xml/builder.rb +1 -1
- data/lib/nokogiri/xml/document.rb +2 -2
- data/lib/nokogiri/xml/dtd.rb +10 -0
- data/lib/nokogiri/xml/node.rb +26 -1
- data/lib/nokogiri/xml/sax/parser.rb +1 -1
- data/ports/patches/libxml2/0001-Fix-parser-local-buffers-size-problems.patch +265 -0
- data/ports/patches/libxml2/0002-Fix-entities-local-buffers-size-problems.patch +102 -0
- data/ports/patches/libxml2/0003-Fix-an-error-in-previous-commit.patch +26 -0
- data/ports/patches/libxml2/0004-Fix-potential-out-of-bound-access.patch +26 -0
- data/ports/patches/libxml2/0005-Detect-excessive-entities-expansion-upon-replacement.patch +158 -0
- data/ports/patches/libxml2/0006-Do-not-fetch-external-parsed-entities.patch +78 -0
- data/ports/patches/libxml2/0007-Enforce-XML_PARSER_EOF-state-handling-through-the-pa.patch +480 -0
- data/ports/patches/libxml2/0008-Improve-handling-of-xmlStopParser.patch +315 -0
- data/ports/patches/libxml2/0009-Fix-a-couple-of-return-without-value.patch +37 -0
- data/ports/patches/libxslt/0001-Adding-doc-update-related-to-1.1.28.patch +222 -0
- data/ports/patches/libxslt/0002-Fix-a-couple-of-places-where-f-printf-parameters-wer.patch +53 -0
- data/ports/patches/libxslt/0003-Initialize-pseudo-random-number-generator-with-curre.patch +60 -0
- data/ports/patches/libxslt/0004-EXSLT-function-str-replace-is-broken-as-is.patch +42 -0
- data/ports/patches/libxslt/0006-Fix-str-padding-to-work-with-UTF-8-strings.patch +164 -0
- data/ports/patches/libxslt/0007-Separate-function-for-predicate-matching-in-patterns.patch +587 -0
- data/ports/patches/libxslt/0008-Fix-direct-pattern-matching.patch +80 -0
- data/ports/patches/libxslt/0009-Fix-certain-patterns-with-predicates.patch +185 -0
- data/ports/patches/libxslt/0010-Fix-handling-of-UTF-8-strings-in-EXSLT-crypto-module.patch +126 -0
- data/ports/patches/libxslt/0013-Memory-leak-in-xsltCompileIdKeyPattern-error-path.patch +25 -0
- data/ports/patches/libxslt/0014-Fix-for-bug-436589.patch +43 -0
- data/ports/patches/libxslt/0015-Fix-mkdir-for-mingw.patch +41 -0
- data/suppressions/README.txt +1 -0
- data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
- data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
- data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
- data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
- data/test/css/test_nthiness.rb +65 -2
- data/test/css/test_parser.rb +27 -10
- data/test/css/test_tokenizer.rb +1 -1
- data/test/css/test_xpath_visitor.rb +6 -1
- data/test/files/atom.xml +344 -0
- data/test/files/shift_jis_no_charset.html +9 -0
- data/test/helper.rb +10 -0
- data/test/html/test_document.rb +74 -7
- data/test/html/test_document_encoding.rb +10 -0
- data/test/html/test_document_fragment.rb +9 -3
- data/test/namespaces/test_namespaces_aliased_default.rb +24 -0
- data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
- data/test/namespaces/test_namespaces_preservation.rb +31 -0
- data/test/test_nokogiri.rb +6 -0
- data/test/test_reader.rb +7 -4
- data/test/test_xslt_transforms.rb +25 -0
- data/test/xml/sax/test_parser.rb +16 -0
- data/test/xml/sax/test_parser_context.rb +9 -0
- data/test/xml/test_builder.rb +9 -0
- data/test/xml/test_c14n.rb +12 -2
- data/test/xml/test_document.rb +66 -0
- data/test/xml/test_document_fragment.rb +5 -0
- data/test/xml/test_dtd.rb +84 -0
- data/test/xml/test_entity_reference.rb +3 -3
- data/test/xml/test_node.rb +21 -3
- data/test/xml/test_node_attributes.rb +17 -0
- data/test/xml/test_schema.rb +26 -0
- data/test/xml/test_text.rb +15 -0
- data/test/xml/test_xpath.rb +87 -0
- data/test_all +3 -3
- metadata +119 -68
- data/tasks/cross_compile.rb +0 -134
@@ -0,0 +1,38 @@
|
|
1
|
+
/**
|
2
|
+
* Licensed to the Apache Software Foundation (ASF) under one
|
3
|
+
* or more contributor license agreements. See the NOTICE file
|
4
|
+
* distributed with this work for additional information
|
5
|
+
* regarding copyright ownership. The ASF licenses this file
|
6
|
+
* to you under the Apache License, Version 2.0 (the
|
7
|
+
* "License"); you may not use this file except in compliance
|
8
|
+
* with the License. You may obtain a copy of the License at
|
9
|
+
*
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
*
|
12
|
+
* Unless required by applicable law or agreed to in writing,
|
13
|
+
* software distributed under the License is distributed on an
|
14
|
+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
15
|
+
* KIND, either express or implied. See the License for the
|
16
|
+
* specific language governing permissions and limitations
|
17
|
+
* under the License.
|
18
|
+
*/
|
19
|
+
package nokogiri.internals.c14n;
|
20
|
+
|
21
|
+
|
22
|
+
/**
|
23
|
+
* @author Sean Mullan
|
24
|
+
*/
|
25
|
+
public class Canonicalizer11_OmitComments extends Canonicalizer11 {
|
26
|
+
|
27
|
+
public Canonicalizer11_OmitComments() {
|
28
|
+
super(false);
|
29
|
+
}
|
30
|
+
|
31
|
+
public final String engineGetURI() {
|
32
|
+
return Canonicalizer.ALGO_ID_C14N11_OMIT_COMMENTS;
|
33
|
+
}
|
34
|
+
|
35
|
+
public final boolean engineGetIncludeComments() {
|
36
|
+
return false;
|
37
|
+
}
|
38
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
/**
|
2
|
+
* Licensed to the Apache Software Foundation (ASF) under one
|
3
|
+
* or more contributor license agreements. See the NOTICE file
|
4
|
+
* distributed with this work for additional information
|
5
|
+
* regarding copyright ownership. The ASF licenses this file
|
6
|
+
* to you under the Apache License, Version 2.0 (the
|
7
|
+
* "License"); you may not use this file except in compliance
|
8
|
+
* with the License. You may obtain a copy of the License at
|
9
|
+
*
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
*
|
12
|
+
* Unless required by applicable law or agreed to in writing,
|
13
|
+
* software distributed under the License is distributed on an
|
14
|
+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
15
|
+
* KIND, either express or implied. See the License for the
|
16
|
+
* specific language governing permissions and limitations
|
17
|
+
* under the License.
|
18
|
+
*/
|
19
|
+
package nokogiri.internals.c14n;
|
20
|
+
|
21
|
+
|
22
|
+
/**
|
23
|
+
* @author Sean Mullan
|
24
|
+
*/
|
25
|
+
public class Canonicalizer11_WithComments extends Canonicalizer11 {
|
26
|
+
|
27
|
+
public Canonicalizer11_WithComments() {
|
28
|
+
super(true);
|
29
|
+
}
|
30
|
+
|
31
|
+
public final String engineGetURI() {
|
32
|
+
return Canonicalizer.ALGO_ID_C14N11_WITH_COMMENTS;
|
33
|
+
}
|
34
|
+
|
35
|
+
public final boolean engineGetIncludeComments() {
|
36
|
+
return true;
|
37
|
+
}
|
38
|
+
}
|
@@ -0,0 +1,368 @@
|
|
1
|
+
/**
|
2
|
+
* Licensed to the Apache Software Foundation (ASF) under one
|
3
|
+
* or more contributor license agreements. See the NOTICE file
|
4
|
+
* distributed with this work for additional information
|
5
|
+
* regarding copyright ownership. The ASF licenses this file
|
6
|
+
* to you under the Apache License, Version 2.0 (the
|
7
|
+
* "License"); you may not use this file except in compliance
|
8
|
+
* with the License. You may obtain a copy of the License at
|
9
|
+
*
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
*
|
12
|
+
* Unless required by applicable law or agreed to in writing,
|
13
|
+
* software distributed under the License is distributed on an
|
14
|
+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
15
|
+
* KIND, either express or implied. See the License for the
|
16
|
+
* specific language governing permissions and limitations
|
17
|
+
* under the License.
|
18
|
+
*/
|
19
|
+
package nokogiri.internals.c14n;
|
20
|
+
|
21
|
+
import java.util.ArrayList;
|
22
|
+
import java.util.Collection;
|
23
|
+
import java.util.HashMap;
|
24
|
+
import java.util.Iterator;
|
25
|
+
import java.util.List;
|
26
|
+
import java.util.Map;
|
27
|
+
import java.util.Set;
|
28
|
+
import java.util.SortedSet;
|
29
|
+
import java.util.TreeSet;
|
30
|
+
|
31
|
+
|
32
|
+
import org.w3c.dom.Attr;
|
33
|
+
import org.w3c.dom.Element;
|
34
|
+
import org.w3c.dom.NamedNodeMap;
|
35
|
+
import org.w3c.dom.Node;
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Implements <A HREF="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">Canonical
|
39
|
+
* XML Version 1.0</A>, a W3C Recommendation from 15 March 2001.
|
40
|
+
*
|
41
|
+
* @author Christian Geuer-Pollmann <geuerp@apache.org>
|
42
|
+
*/
|
43
|
+
public abstract class Canonicalizer20010315 extends CanonicalizerBase {
|
44
|
+
private static final String XMLNS_URI = Constants.NamespaceSpecNS;
|
45
|
+
private static final String XML_LANG_URI = Constants.XML_LANG_SPACE_SpecNS;
|
46
|
+
|
47
|
+
private boolean firstCall = true;
|
48
|
+
private final SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
|
49
|
+
|
50
|
+
private static class XmlAttrStack {
|
51
|
+
static class XmlsStackElement {
|
52
|
+
int level;
|
53
|
+
boolean rendered = false;
|
54
|
+
List<Attr> nodes = new ArrayList<Attr>();
|
55
|
+
};
|
56
|
+
|
57
|
+
int currentLevel = 0;
|
58
|
+
int lastlevel = 0;
|
59
|
+
XmlsStackElement cur;
|
60
|
+
List<XmlsStackElement> levels = new ArrayList<XmlsStackElement>();
|
61
|
+
|
62
|
+
void push(int level) {
|
63
|
+
currentLevel = level;
|
64
|
+
if (currentLevel == -1) {
|
65
|
+
return;
|
66
|
+
}
|
67
|
+
cur = null;
|
68
|
+
while (lastlevel >= currentLevel) {
|
69
|
+
levels.remove(levels.size() - 1);
|
70
|
+
int newSize = levels.size();
|
71
|
+
if (newSize == 0) {
|
72
|
+
lastlevel = 0;
|
73
|
+
return;
|
74
|
+
}
|
75
|
+
lastlevel = (levels.get(newSize - 1)).level;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
void addXmlnsAttr(Attr n) {
|
80
|
+
if (cur == null) {
|
81
|
+
cur = new XmlsStackElement();
|
82
|
+
cur.level = currentLevel;
|
83
|
+
levels.add(cur);
|
84
|
+
lastlevel = currentLevel;
|
85
|
+
}
|
86
|
+
cur.nodes.add(n);
|
87
|
+
}
|
88
|
+
|
89
|
+
void getXmlnsAttr(Collection<Attr> col) {
|
90
|
+
int size = levels.size() - 1;
|
91
|
+
if (cur == null) {
|
92
|
+
cur = new XmlsStackElement();
|
93
|
+
cur.level = currentLevel;
|
94
|
+
lastlevel = currentLevel;
|
95
|
+
levels.add(cur);
|
96
|
+
}
|
97
|
+
boolean parentRendered = false;
|
98
|
+
XmlsStackElement e = null;
|
99
|
+
if (size == -1) {
|
100
|
+
parentRendered = true;
|
101
|
+
} else {
|
102
|
+
e = levels.get(size);
|
103
|
+
if (e.rendered && e.level + 1 == currentLevel) {
|
104
|
+
parentRendered = true;
|
105
|
+
}
|
106
|
+
}
|
107
|
+
if (parentRendered) {
|
108
|
+
col.addAll(cur.nodes);
|
109
|
+
cur.rendered = true;
|
110
|
+
return;
|
111
|
+
}
|
112
|
+
|
113
|
+
Map<String, Attr> loa = new HashMap<String, Attr>();
|
114
|
+
for (; size >= 0; size--) {
|
115
|
+
e = levels.get(size);
|
116
|
+
Iterator<Attr> it = e.nodes.iterator();
|
117
|
+
while (it.hasNext()) {
|
118
|
+
Attr n = it.next();
|
119
|
+
if (!loa.containsKey(n.getName())) {
|
120
|
+
loa.put(n.getName(), n);
|
121
|
+
}
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
cur.rendered = true;
|
126
|
+
col.addAll(loa.values());
|
127
|
+
}
|
128
|
+
|
129
|
+
}
|
130
|
+
|
131
|
+
private final XmlAttrStack xmlattrStack = new XmlAttrStack();
|
132
|
+
|
133
|
+
/**
|
134
|
+
* Constructor Canonicalizer20010315
|
135
|
+
*
|
136
|
+
* @param includeComments
|
137
|
+
*/
|
138
|
+
public Canonicalizer20010315(boolean includeComments) {
|
139
|
+
super(includeComments);
|
140
|
+
}
|
141
|
+
|
142
|
+
/**
|
143
|
+
* Always throws a CanonicalizationException because this is inclusive c14n.
|
144
|
+
*
|
145
|
+
* @param xpathNodeSet
|
146
|
+
* @param inclusiveNamespaces
|
147
|
+
* @return none it always fails
|
148
|
+
* @throws CanonicalizationException always
|
149
|
+
*/
|
150
|
+
public byte[] engineCanonicalizeXPathNodeSet(Set<Node> xpathNodeSet, String inclusiveNamespaces, CanonicalFilter filter)
|
151
|
+
throws CanonicalizationException {
|
152
|
+
|
153
|
+
/** $todo$ well, should we throw UnsupportedOperationException ? */
|
154
|
+
throw new CanonicalizationException("c14n.Canonicalizer.UnsupportedOperation");
|
155
|
+
}
|
156
|
+
|
157
|
+
/**
|
158
|
+
* Always throws a CanonicalizationException because this is inclusive c14n.
|
159
|
+
*
|
160
|
+
* @param rootNode
|
161
|
+
* @param inclusiveNamespaces
|
162
|
+
* @return none it always fails
|
163
|
+
* @throws CanonicalizationException
|
164
|
+
*/
|
165
|
+
@Override
|
166
|
+
public byte[] engineCanonicalizeSubTree(Node rootNode, String inclusiveNamespaces, CanonicalFilter filter)
|
167
|
+
throws CanonicalizationException {
|
168
|
+
|
169
|
+
/** $todo$ well, should we throw UnsupportedOperationException ? */
|
170
|
+
throw new CanonicalizationException("c14n.Canonicalizer.UnsupportedOperation");
|
171
|
+
}
|
172
|
+
|
173
|
+
/**
|
174
|
+
* Returns the Attr[]s to be output for the given element.
|
175
|
+
* <br>
|
176
|
+
* The code of this method is a copy of {@link #handleAttributes(Element,
|
177
|
+
* NameSpaceSymbTable)},
|
178
|
+
* whereas it takes into account that subtree-c14n is -- well -- subtree-based.
|
179
|
+
* So if the element in question isRoot of c14n, it's parent is not in the
|
180
|
+
* node set, as well as all other ancestors.
|
181
|
+
*
|
182
|
+
* @param element
|
183
|
+
* @param ns
|
184
|
+
* @return the Attr[]s to be output
|
185
|
+
* @throws CanonicalizationException
|
186
|
+
*/
|
187
|
+
@Override
|
188
|
+
protected Iterator<Attr> handleAttributesSubtree(Element element, NameSpaceSymbTable ns)
|
189
|
+
throws CanonicalizationException {
|
190
|
+
if (!element.hasAttributes() && !firstCall) {
|
191
|
+
return null;
|
192
|
+
}
|
193
|
+
// result will contain the attrs which have to be output
|
194
|
+
final SortedSet<Attr> result = this.result;
|
195
|
+
result.clear();
|
196
|
+
|
197
|
+
if (element.hasAttributes()) {
|
198
|
+
NamedNodeMap attrs = element.getAttributes();
|
199
|
+
int attrsLength = attrs.getLength();
|
200
|
+
|
201
|
+
for (int i = 0; i < attrsLength; i++) {
|
202
|
+
Attr attribute = (Attr) attrs.item(i);
|
203
|
+
String NUri = attribute.getNamespaceURI();
|
204
|
+
String NName = attribute.getLocalName();
|
205
|
+
String NValue = attribute.getValue();
|
206
|
+
|
207
|
+
if (!XMLNS_URI.equals(NUri)) {
|
208
|
+
//It's not a namespace attr node. Add to the result and continue.
|
209
|
+
result.add(attribute);
|
210
|
+
} else if (!(XML.equals(NName) && XML_LANG_URI.equals(NValue))) {
|
211
|
+
//The default mapping for xml must not be output.
|
212
|
+
Node n = ns.addMappingAndRender(NName, NValue, attribute);
|
213
|
+
|
214
|
+
if (n != null) {
|
215
|
+
//Render the ns definition
|
216
|
+
result.add((Attr)n);
|
217
|
+
if (C14nHelper.namespaceIsRelative(attribute)) {
|
218
|
+
Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
|
219
|
+
throw new CanonicalizationException(
|
220
|
+
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
221
|
+
);
|
222
|
+
}
|
223
|
+
}
|
224
|
+
}
|
225
|
+
}
|
226
|
+
}
|
227
|
+
|
228
|
+
if (firstCall) {
|
229
|
+
//It is the first node of the subtree
|
230
|
+
//Obtain all the namespaces defined in the parents, and added to the output.
|
231
|
+
ns.getUnrenderedNodes(result);
|
232
|
+
//output the attributes in the xml namespace.
|
233
|
+
xmlattrStack.getXmlnsAttr(result);
|
234
|
+
firstCall = false;
|
235
|
+
}
|
236
|
+
|
237
|
+
return result.iterator();
|
238
|
+
}
|
239
|
+
|
240
|
+
/**
|
241
|
+
* Returns the Attr[]s to be output for the given element.
|
242
|
+
* <br>
|
243
|
+
* IMPORTANT: This method expects to work on a modified DOM tree, i.e. a DOM which has
|
244
|
+
* been prepared using {@link nokogiri.internals.c14n.security.utils.XMLUtils#circumventBug2650(
|
245
|
+
* org.w3c.dom.Document)}.
|
246
|
+
*
|
247
|
+
* @param element
|
248
|
+
* @param ns
|
249
|
+
* @return the Attr[]s to be output
|
250
|
+
* @throws CanonicalizationException
|
251
|
+
*/
|
252
|
+
@Override
|
253
|
+
protected Iterator<Attr> handleAttributes(Element element, NameSpaceSymbTable ns)
|
254
|
+
throws CanonicalizationException {
|
255
|
+
// result will contain the attrs which have to be output
|
256
|
+
xmlattrStack.push(ns.getLevel());
|
257
|
+
boolean isRealVisible = isVisibleDO(element, ns.getLevel()) == 1;
|
258
|
+
final SortedSet<Attr> result = this.result;
|
259
|
+
result.clear();
|
260
|
+
|
261
|
+
if (element.hasAttributes()) {
|
262
|
+
NamedNodeMap attrs = element.getAttributes();
|
263
|
+
int attrsLength = attrs.getLength();
|
264
|
+
|
265
|
+
for (int i = 0; i < attrsLength; i++) {
|
266
|
+
Attr attribute = (Attr) attrs.item(i);
|
267
|
+
String NUri = attribute.getNamespaceURI();
|
268
|
+
String NName = attribute.getLocalName();
|
269
|
+
String NValue = attribute.getValue();
|
270
|
+
|
271
|
+
if (!XMLNS_URI.equals(NUri)) {
|
272
|
+
//A non namespace definition node.
|
273
|
+
if (XML_LANG_URI.equals(NUri)) {
|
274
|
+
xmlattrStack.addXmlnsAttr(attribute);
|
275
|
+
} else if (isRealVisible) {
|
276
|
+
//The node is visible add the attribute to the list of output attributes.
|
277
|
+
result.add(attribute);
|
278
|
+
}
|
279
|
+
} else if (!XML.equals(NName) || !XML_LANG_URI.equals(NValue)) {
|
280
|
+
/* except omit namespace node with local name xml, which defines
|
281
|
+
* the xml prefix, if its string value is http://www.w3.org/XML/1998/namespace.
|
282
|
+
*/
|
283
|
+
//add the prefix binding to the ns symb table.
|
284
|
+
if (isVisible(attribute)) {
|
285
|
+
if (isRealVisible || !ns.removeMappingIfRender(NName)) {
|
286
|
+
//The xpath select this node output it if needed.
|
287
|
+
Node n = ns.addMappingAndRender(NName, NValue, attribute);
|
288
|
+
if (n != null) {
|
289
|
+
result.add((Attr)n);
|
290
|
+
if (C14nHelper.namespaceIsRelative(attribute)) {
|
291
|
+
Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
|
292
|
+
throw new CanonicalizationException(
|
293
|
+
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
294
|
+
);
|
295
|
+
}
|
296
|
+
}
|
297
|
+
}
|
298
|
+
} else {
|
299
|
+
if (isRealVisible && !XMLNS.equals(NName)) {
|
300
|
+
ns.removeMapping(NName);
|
301
|
+
} else {
|
302
|
+
ns.addMapping(NName, NValue, attribute);
|
303
|
+
}
|
304
|
+
}
|
305
|
+
}
|
306
|
+
}
|
307
|
+
}
|
308
|
+
if (isRealVisible) {
|
309
|
+
//The element is visible, handle the xmlns definition
|
310
|
+
Attr xmlns = element.getAttributeNodeNS(XMLNS_URI, XMLNS);
|
311
|
+
Node n = null;
|
312
|
+
if (xmlns == null) {
|
313
|
+
//No xmlns def just get the already defined.
|
314
|
+
n = ns.getMapping(XMLNS);
|
315
|
+
} else if (!isVisible(xmlns)) {
|
316
|
+
//There is a definition but the xmlns is not selected by the xpath.
|
317
|
+
//then xmlns=""
|
318
|
+
n = ns.addMappingAndRender(XMLNS, "", nullNode);
|
319
|
+
}
|
320
|
+
//output the xmlns def if needed.
|
321
|
+
if (n != null) {
|
322
|
+
result.add((Attr)n);
|
323
|
+
}
|
324
|
+
//Float all xml:* attributes of the unselected parent elements to this one.
|
325
|
+
xmlattrStack.getXmlnsAttr(result);
|
326
|
+
ns.getUnrenderedNodes(result);
|
327
|
+
}
|
328
|
+
|
329
|
+
return result.iterator();
|
330
|
+
}
|
331
|
+
|
332
|
+
@Override
|
333
|
+
protected void handleParent(Element e, NameSpaceSymbTable ns) {
|
334
|
+
if (!e.hasAttributes() && e.getNamespaceURI() == null) {
|
335
|
+
return;
|
336
|
+
}
|
337
|
+
xmlattrStack.push(-1);
|
338
|
+
NamedNodeMap attrs = e.getAttributes();
|
339
|
+
int attrsLength = attrs.getLength();
|
340
|
+
for (int i = 0; i < attrsLength; i++) {
|
341
|
+
Attr attribute = (Attr) attrs.item(i);
|
342
|
+
String NName = attribute.getLocalName();
|
343
|
+
String NValue = attribute.getNodeValue();
|
344
|
+
|
345
|
+
if (Constants.NamespaceSpecNS.equals(attribute.getNamespaceURI())) {
|
346
|
+
if (!XML.equals(NName) || !Constants.XML_LANG_SPACE_SpecNS.equals(NValue)) {
|
347
|
+
ns.addMapping(NName, NValue, attribute);
|
348
|
+
}
|
349
|
+
} else if (XML_LANG_URI.equals(attribute.getNamespaceURI())) {
|
350
|
+
xmlattrStack.addXmlnsAttr(attribute);
|
351
|
+
}
|
352
|
+
}
|
353
|
+
if (e.getNamespaceURI() != null) {
|
354
|
+
String NName = e.getPrefix();
|
355
|
+
String NValue = e.getNamespaceURI();
|
356
|
+
String Name;
|
357
|
+
if (NName == null || NName.equals("")) {
|
358
|
+
NName = "xmlns";
|
359
|
+
Name = "xmlns";
|
360
|
+
} else {
|
361
|
+
Name = "xmlns:" + NName;
|
362
|
+
}
|
363
|
+
Attr n = e.getOwnerDocument().createAttributeNS("http://www.w3.org/2000/xmlns/", Name);
|
364
|
+
n.setValue(NValue);
|
365
|
+
ns.addMapping(NName, NValue, n);
|
366
|
+
}
|
367
|
+
}
|
368
|
+
}
|
@@ -0,0 +1,295 @@
|
|
1
|
+
/**
|
2
|
+
* Licensed to the Apache Software Foundation (ASF) under one
|
3
|
+
* or more contributor license agreements. See the NOTICE file
|
4
|
+
* distributed with this work for additional information
|
5
|
+
* regarding copyright ownership. The ASF licenses this file
|
6
|
+
* to you under the Apache License, Version 2.0 (the
|
7
|
+
* "License"); you may not use this file except in compliance
|
8
|
+
* with the License. You may obtain a copy of the License at
|
9
|
+
*
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
*
|
12
|
+
* Unless required by applicable law or agreed to in writing,
|
13
|
+
* software distributed under the License is distributed on an
|
14
|
+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
15
|
+
* KIND, either express or implied. See the License for the
|
16
|
+
* specific language governing permissions and limitations
|
17
|
+
* under the License.
|
18
|
+
*/
|
19
|
+
package nokogiri.internals.c14n;
|
20
|
+
|
21
|
+
import java.util.Iterator;
|
22
|
+
import java.util.Set;
|
23
|
+
import java.util.SortedSet;
|
24
|
+
import java.util.TreeSet;
|
25
|
+
|
26
|
+
|
27
|
+
import org.w3c.dom.Attr;
|
28
|
+
import org.w3c.dom.Element;
|
29
|
+
import org.w3c.dom.NamedNodeMap;
|
30
|
+
import org.w3c.dom.Node;
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Implements " <A
|
34
|
+
* HREF="http://www.w3.org/TR/2002/REC-xml-exc-c14n-20020718/">Exclusive XML
|
35
|
+
* Canonicalization, Version 1.0 </A>" <BR />
|
36
|
+
* Credits: During restructuring of the Canonicalizer framework, Ren??
|
37
|
+
* Kollmorgen from Software AG submitted an implementation of ExclC14n which
|
38
|
+
* fitted into the old architecture and which based heavily on my old (and slow)
|
39
|
+
* implementation of "Canonical XML". A big "thank you" to Ren?? for this.
|
40
|
+
* <BR />
|
41
|
+
* <i>THIS </i> implementation is a complete rewrite of the algorithm.
|
42
|
+
*
|
43
|
+
* @author Christian Geuer-Pollmann <geuerp@apache.org>
|
44
|
+
* @version $Revision: 1147448 $
|
45
|
+
* @see <a href="http://www.w3.org/TR/2002/REC-xml-exc-c14n-20020718/ Exclusive#">
|
46
|
+
* XML Canonicalization, Version 1.0</a>
|
47
|
+
*/
|
48
|
+
public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
|
49
|
+
|
50
|
+
private static final String XML_LANG_URI = Constants.XML_LANG_SPACE_SpecNS;
|
51
|
+
private static final String XMLNS_URI = Constants.NamespaceSpecNS;
|
52
|
+
|
53
|
+
/**
|
54
|
+
* This Set contains the names (Strings like "xmlns" or "xmlns:foo") of
|
55
|
+
* the inclusive namespaces.
|
56
|
+
*/
|
57
|
+
private SortedSet<String> inclusiveNSSet;
|
58
|
+
|
59
|
+
private final SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Constructor Canonicalizer20010315Excl
|
63
|
+
*
|
64
|
+
* @param includeComments
|
65
|
+
*/
|
66
|
+
public Canonicalizer20010315Excl(boolean includeComments) {
|
67
|
+
super(includeComments);
|
68
|
+
}
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Method engineCanonicalizeSubTree
|
72
|
+
* @inheritDoc
|
73
|
+
* @param rootNode
|
74
|
+
*
|
75
|
+
* @throws CanonicalizationException
|
76
|
+
*/
|
77
|
+
@Override
|
78
|
+
public byte[] engineCanonicalizeSubTree(Node rootNode, CanonicalFilter filter)
|
79
|
+
throws CanonicalizationException {
|
80
|
+
return engineCanonicalizeSubTree(rootNode, "", null);
|
81
|
+
}
|
82
|
+
|
83
|
+
/**
|
84
|
+
* Method engineCanonicalizeSubTree
|
85
|
+
* @inheritDoc
|
86
|
+
* @param rootNode
|
87
|
+
* @param inclusiveNamespaces
|
88
|
+
*
|
89
|
+
* @throws CanonicalizationException
|
90
|
+
*/
|
91
|
+
@Override
|
92
|
+
public byte[] engineCanonicalizeSubTree(
|
93
|
+
Node rootNode, String inclusiveNamespaces, CanonicalFilter filter
|
94
|
+
) throws CanonicalizationException {
|
95
|
+
return engineCanonicalizeSubTree(rootNode, inclusiveNamespaces, null, filter);
|
96
|
+
}
|
97
|
+
|
98
|
+
/**
|
99
|
+
* Method engineCanonicalizeSubTree
|
100
|
+
* @param rootNode
|
101
|
+
* @param inclusiveNamespaces
|
102
|
+
* @param excl A element to exclude from the c14n process.
|
103
|
+
* @return the rootNode c14n.
|
104
|
+
* @throws CanonicalizationException
|
105
|
+
*/
|
106
|
+
public byte[] engineCanonicalizeSubTree(
|
107
|
+
Node rootNode, String inclusiveNamespaces, Node excl, CanonicalFilter filter
|
108
|
+
) throws CanonicalizationException{
|
109
|
+
inclusiveNSSet = InclusiveNamespaces.prefixStr2Set(inclusiveNamespaces);
|
110
|
+
return super.engineCanonicalizeSubTree(rootNode, excl, filter);
|
111
|
+
}
|
112
|
+
|
113
|
+
@Override
|
114
|
+
protected Iterator<Attr> handleAttributesSubtree(Element element, NameSpaceSymbTable ns)
|
115
|
+
throws CanonicalizationException {
|
116
|
+
// result will contain the attrs which have to be output
|
117
|
+
final SortedSet<Attr> result = this.result;
|
118
|
+
result.clear();
|
119
|
+
|
120
|
+
// The prefix visibly utilized (in the attribute or in the name) in
|
121
|
+
// the element
|
122
|
+
SortedSet<String> visiblyUtilized = new TreeSet<String>();
|
123
|
+
if (inclusiveNSSet != null && !inclusiveNSSet.isEmpty()) {
|
124
|
+
visiblyUtilized.addAll(inclusiveNSSet);
|
125
|
+
}
|
126
|
+
|
127
|
+
if (element.hasAttributes()) {
|
128
|
+
NamedNodeMap attrs = element.getAttributes();
|
129
|
+
int attrsLength = attrs.getLength();
|
130
|
+
for (int i = 0; i < attrsLength; i++) {
|
131
|
+
Attr attribute = (Attr) attrs.item(i);
|
132
|
+
String NName = attribute.getLocalName();
|
133
|
+
String NNodeValue = attribute.getNodeValue();
|
134
|
+
|
135
|
+
if (!XMLNS_URI.equals(attribute.getNamespaceURI())) {
|
136
|
+
// Not a namespace definition.
|
137
|
+
// The Element is output element, add the prefix (if used) to
|
138
|
+
// visiblyUtilized
|
139
|
+
String prefix = attribute.getPrefix();
|
140
|
+
if (prefix != null && !(prefix.equals(XML) || prefix.equals(XMLNS))) {
|
141
|
+
visiblyUtilized.add(prefix);
|
142
|
+
}
|
143
|
+
// Add to the result.
|
144
|
+
result.add(attribute);
|
145
|
+
} else if (!(XML.equals(NName) && XML_LANG_URI.equals(NNodeValue))
|
146
|
+
&& ns.addMapping(NName, NNodeValue, attribute)
|
147
|
+
&& C14nHelper.namespaceIsRelative(NNodeValue)) {
|
148
|
+
// The default mapping for xml must not be output.
|
149
|
+
// New definition check if it is relative.
|
150
|
+
Object exArgs[] = {element.getTagName(), NName, attribute.getNodeValue()};
|
151
|
+
throw new CanonicalizationException(
|
152
|
+
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
153
|
+
);
|
154
|
+
}
|
155
|
+
}
|
156
|
+
}
|
157
|
+
String prefix = null;
|
158
|
+
if (element.getNamespaceURI() != null
|
159
|
+
&& !(element.getPrefix() == null || element.getPrefix().length() == 0)) {
|
160
|
+
prefix = element.getPrefix();
|
161
|
+
} else {
|
162
|
+
prefix = XMLNS;
|
163
|
+
}
|
164
|
+
visiblyUtilized.add(prefix);
|
165
|
+
|
166
|
+
for (String s : visiblyUtilized) {
|
167
|
+
Attr key = ns.getMapping(s);
|
168
|
+
if (key != null) {
|
169
|
+
result.add(key);
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
return result.iterator();
|
174
|
+
}
|
175
|
+
|
176
|
+
/**
|
177
|
+
* @inheritDoc
|
178
|
+
* @param element
|
179
|
+
* @throws CanonicalizationException
|
180
|
+
*/
|
181
|
+
@Override
|
182
|
+
protected final Iterator<Attr> handleAttributes(Element element, NameSpaceSymbTable ns)
|
183
|
+
throws CanonicalizationException {
|
184
|
+
// result will contain the attrs which have to be output
|
185
|
+
final SortedSet<Attr> result = this.result;
|
186
|
+
result.clear();
|
187
|
+
|
188
|
+
// The prefix visibly utilized (in the attribute or in the name) in
|
189
|
+
// the element
|
190
|
+
Set<String> visiblyUtilized = null;
|
191
|
+
// It's the output selected.
|
192
|
+
boolean isOutputElement = isVisibleDO(element, ns.getLevel()) == 1;
|
193
|
+
if (isOutputElement) {
|
194
|
+
visiblyUtilized = new TreeSet<String>();
|
195
|
+
if (inclusiveNSSet != null && !inclusiveNSSet.isEmpty()) {
|
196
|
+
visiblyUtilized.addAll(inclusiveNSSet);
|
197
|
+
}
|
198
|
+
}
|
199
|
+
|
200
|
+
if (element.hasAttributes()) {
|
201
|
+
NamedNodeMap attrs = element.getAttributes();
|
202
|
+
int attrsLength = attrs.getLength();
|
203
|
+
for (int i = 0; i < attrsLength; i++) {
|
204
|
+
Attr attribute = (Attr) attrs.item(i);
|
205
|
+
|
206
|
+
String NName = attribute.getLocalName();
|
207
|
+
String NNodeValue = attribute.getNodeValue();
|
208
|
+
|
209
|
+
if (!XMLNS_URI.equals(attribute.getNamespaceURI())) {
|
210
|
+
if (isVisible(attribute) && isOutputElement) {
|
211
|
+
// The Element is output element, add the prefix (if used)
|
212
|
+
// to visibyUtilized
|
213
|
+
String prefix = attribute.getPrefix();
|
214
|
+
if (prefix != null && !(prefix.equals(XML) || prefix.equals(XMLNS))) {
|
215
|
+
visiblyUtilized.add(prefix);
|
216
|
+
}
|
217
|
+
// Add to the result.
|
218
|
+
result.add(attribute);
|
219
|
+
}
|
220
|
+
} else if (isOutputElement && !isVisible(attribute) && !XMLNS.equals(NName)) {
|
221
|
+
ns.removeMappingIfNotRender(NName);
|
222
|
+
} else {
|
223
|
+
if (!isOutputElement && isVisible(attribute)
|
224
|
+
&& inclusiveNSSet.contains(NName)
|
225
|
+
&& !ns.removeMappingIfRender(NName)) {
|
226
|
+
Node n = ns.addMappingAndRender(NName, NNodeValue, attribute);
|
227
|
+
if (n != null) {
|
228
|
+
result.add((Attr)n);
|
229
|
+
if (C14nHelper.namespaceIsRelative(attribute)) {
|
230
|
+
Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
|
231
|
+
throw new CanonicalizationException(
|
232
|
+
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
233
|
+
);
|
234
|
+
}
|
235
|
+
}
|
236
|
+
}
|
237
|
+
|
238
|
+
if (ns.addMapping(NName, NNodeValue, attribute)
|
239
|
+
&& C14nHelper.namespaceIsRelative(NNodeValue)) {
|
240
|
+
// New definition check if it is relative
|
241
|
+
Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
|
242
|
+
throw new CanonicalizationException(
|
243
|
+
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
244
|
+
);
|
245
|
+
}
|
246
|
+
}
|
247
|
+
}
|
248
|
+
}
|
249
|
+
|
250
|
+
if (isOutputElement) {
|
251
|
+
// The element is visible, handle the xmlns definition
|
252
|
+
Attr xmlns = element.getAttributeNodeNS(XMLNS_URI, XMLNS);
|
253
|
+
if (xmlns != null && !isVisible(xmlns)) {
|
254
|
+
// There is a definition but the xmlns is not selected by the
|
255
|
+
// xpath. then xmlns=""
|
256
|
+
ns.addMapping(XMLNS, "", nullNode);
|
257
|
+
}
|
258
|
+
|
259
|
+
String prefix = null;
|
260
|
+
if (element.getNamespaceURI() != null
|
261
|
+
&& !(element.getPrefix() == null || element.getPrefix().length() == 0)) {
|
262
|
+
prefix = element.getPrefix();
|
263
|
+
} else {
|
264
|
+
prefix = XMLNS;
|
265
|
+
}
|
266
|
+
visiblyUtilized.add(prefix);
|
267
|
+
|
268
|
+
for (String s : visiblyUtilized) {
|
269
|
+
Attr key = ns.getMapping(s);
|
270
|
+
if (key != null) {
|
271
|
+
result.add(key);
|
272
|
+
}
|
273
|
+
}
|
274
|
+
}
|
275
|
+
|
276
|
+
return result.iterator();
|
277
|
+
}
|
278
|
+
|
279
|
+
/*
|
280
|
+
protected void circumventBugIfNeeded(XMLSignatureInput input)
|
281
|
+
throws CanonicalizationException, ParserConfigurationException,
|
282
|
+
IOException, SAXException {
|
283
|
+
if (!input.isNeedsToBeExpanded() || inclusiveNSSet.isEmpty() || inclusiveNSSet.isEmpty()) {
|
284
|
+
return;
|
285
|
+
}
|
286
|
+
Document doc = null;
|
287
|
+
if (input.getSubNode() != null) {
|
288
|
+
doc = XMLUtils.getOwnerDocument(input.getSubNode());
|
289
|
+
} else {
|
290
|
+
doc = XMLUtils.getOwnerDocument(input.getNodeSet());
|
291
|
+
}
|
292
|
+
XMLUtils.circumventBug2650(doc);
|
293
|
+
}
|
294
|
+
*/
|
295
|
+
}
|