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.

Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +17 -0
  3. data/.travis.yml +6 -6
  4. data/CHANGELOG.ja.rdoc +61 -8
  5. data/CHANGELOG.rdoc +58 -3
  6. data/Gemfile +3 -3
  7. data/Manifest.txt +57 -1
  8. data/README.ja.rdoc +22 -17
  9. data/README.rdoc +23 -18
  10. data/ROADMAP.md +1 -2
  11. data/Rakefile +162 -58
  12. data/build_all +56 -31
  13. data/dependencies.yml +3 -3
  14. data/ext/java/nokogiri/NokogiriService.java +9 -5
  15. data/ext/java/nokogiri/XmlDocument.java +95 -54
  16. data/ext/java/nokogiri/XmlNode.java +93 -42
  17. data/ext/java/nokogiri/XmlReader.java +1 -1
  18. data/ext/java/nokogiri/XmlSaxParserContext.java +33 -0
  19. data/ext/java/nokogiri/XmlSchema.java +4 -2
  20. data/ext/java/nokogiri/XmlXpathContext.java +118 -76
  21. data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +20 -0
  22. data/ext/java/nokogiri/internals/NokogiriHandler.java +3 -10
  23. data/ext/java/nokogiri/internals/NokogiriHelpers.java +40 -23
  24. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +59 -54
  25. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +1 -1
  26. data/ext/java/nokogiri/internals/ParserContext.java +1 -4
  27. data/ext/java/nokogiri/internals/SaveContextVisitor.java +6 -2
  28. data/ext/java/nokogiri/internals/c14n/AttrCompare.java +119 -0
  29. data/ext/java/nokogiri/internals/c14n/C14nHelper.java +159 -0
  30. data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +37 -0
  31. data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +93 -0
  32. data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +252 -0
  33. data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +639 -0
  34. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +38 -0
  35. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +38 -0
  36. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +368 -0
  37. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +295 -0
  38. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +40 -0
  39. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +44 -0
  40. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +44 -0
  41. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +43 -0
  42. data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +630 -0
  43. data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +173 -0
  44. data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +76 -0
  45. data/ext/java/nokogiri/internals/c14n/Constants.java +42 -0
  46. data/ext/java/nokogiri/internals/c14n/ElementProxy.java +293 -0
  47. data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +93 -0
  48. data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +79 -0
  49. data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +165 -0
  50. data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +76 -0
  51. data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +402 -0
  52. data/ext/java/nokogiri/internals/c14n/NodeFilter.java +51 -0
  53. data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +179 -0
  54. data/ext/java/nokogiri/internals/c14n/XMLUtils.java +507 -0
  55. data/ext/nokogiri/extconf.rb +429 -128
  56. data/ext/nokogiri/html_document.c +2 -2
  57. data/ext/nokogiri/nokogiri.c +6 -1
  58. data/ext/nokogiri/xml_document.c +5 -4
  59. data/ext/nokogiri/xml_node.c +76 -7
  60. data/ext/nokogiri/xml_reader.c +1 -1
  61. data/ext/nokogiri/xml_sax_parser_context.c +40 -0
  62. data/ext/nokogiri/xml_syntax_error.c +10 -5
  63. data/ext/nokogiri/xml_syntax_error.h +1 -1
  64. data/ext/nokogiri/xml_xpath_context.c +2 -14
  65. data/ext/nokogiri/xslt_stylesheet.c +1 -1
  66. data/lib/nokogiri.rb +31 -22
  67. data/lib/nokogiri/css/node.rb +0 -50
  68. data/lib/nokogiri/css/parser.rb +213 -218
  69. data/lib/nokogiri/css/parser.y +21 -30
  70. data/lib/nokogiri/css/xpath_visitor.rb +62 -14
  71. data/lib/nokogiri/html/document.rb +97 -18
  72. data/lib/nokogiri/html/sax/parser.rb +2 -2
  73. data/lib/nokogiri/nokogiri.jar +0 -0
  74. data/lib/nokogiri/version.rb +1 -1
  75. data/lib/nokogiri/xml/builder.rb +1 -1
  76. data/lib/nokogiri/xml/document.rb +2 -2
  77. data/lib/nokogiri/xml/dtd.rb +10 -0
  78. data/lib/nokogiri/xml/node.rb +26 -1
  79. data/lib/nokogiri/xml/sax/parser.rb +1 -1
  80. data/ports/patches/libxml2/0001-Fix-parser-local-buffers-size-problems.patch +265 -0
  81. data/ports/patches/libxml2/0002-Fix-entities-local-buffers-size-problems.patch +102 -0
  82. data/ports/patches/libxml2/0003-Fix-an-error-in-previous-commit.patch +26 -0
  83. data/ports/patches/libxml2/0004-Fix-potential-out-of-bound-access.patch +26 -0
  84. data/ports/patches/libxml2/0005-Detect-excessive-entities-expansion-upon-replacement.patch +158 -0
  85. data/ports/patches/libxml2/0006-Do-not-fetch-external-parsed-entities.patch +78 -0
  86. data/ports/patches/libxml2/0007-Enforce-XML_PARSER_EOF-state-handling-through-the-pa.patch +480 -0
  87. data/ports/patches/libxml2/0008-Improve-handling-of-xmlStopParser.patch +315 -0
  88. data/ports/patches/libxml2/0009-Fix-a-couple-of-return-without-value.patch +37 -0
  89. data/ports/patches/libxslt/0001-Adding-doc-update-related-to-1.1.28.patch +222 -0
  90. data/ports/patches/libxslt/0002-Fix-a-couple-of-places-where-f-printf-parameters-wer.patch +53 -0
  91. data/ports/patches/libxslt/0003-Initialize-pseudo-random-number-generator-with-curre.patch +60 -0
  92. data/ports/patches/libxslt/0004-EXSLT-function-str-replace-is-broken-as-is.patch +42 -0
  93. data/ports/patches/libxslt/0006-Fix-str-padding-to-work-with-UTF-8-strings.patch +164 -0
  94. data/ports/patches/libxslt/0007-Separate-function-for-predicate-matching-in-patterns.patch +587 -0
  95. data/ports/patches/libxslt/0008-Fix-direct-pattern-matching.patch +80 -0
  96. data/ports/patches/libxslt/0009-Fix-certain-patterns-with-predicates.patch +185 -0
  97. data/ports/patches/libxslt/0010-Fix-handling-of-UTF-8-strings-in-EXSLT-crypto-module.patch +126 -0
  98. data/ports/patches/libxslt/0013-Memory-leak-in-xsltCompileIdKeyPattern-error-path.patch +25 -0
  99. data/ports/patches/libxslt/0014-Fix-for-bug-436589.patch +43 -0
  100. data/ports/patches/libxslt/0015-Fix-mkdir-for-mingw.patch +41 -0
  101. data/suppressions/README.txt +1 -0
  102. data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
  103. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  104. data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
  105. data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
  106. data/test/css/test_nthiness.rb +65 -2
  107. data/test/css/test_parser.rb +27 -10
  108. data/test/css/test_tokenizer.rb +1 -1
  109. data/test/css/test_xpath_visitor.rb +6 -1
  110. data/test/files/atom.xml +344 -0
  111. data/test/files/shift_jis_no_charset.html +9 -0
  112. data/test/helper.rb +10 -0
  113. data/test/html/test_document.rb +74 -7
  114. data/test/html/test_document_encoding.rb +10 -0
  115. data/test/html/test_document_fragment.rb +9 -3
  116. data/test/namespaces/test_namespaces_aliased_default.rb +24 -0
  117. data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
  118. data/test/namespaces/test_namespaces_preservation.rb +31 -0
  119. data/test/test_nokogiri.rb +6 -0
  120. data/test/test_reader.rb +7 -4
  121. data/test/test_xslt_transforms.rb +25 -0
  122. data/test/xml/sax/test_parser.rb +16 -0
  123. data/test/xml/sax/test_parser_context.rb +9 -0
  124. data/test/xml/test_builder.rb +9 -0
  125. data/test/xml/test_c14n.rb +12 -2
  126. data/test/xml/test_document.rb +66 -0
  127. data/test/xml/test_document_fragment.rb +5 -0
  128. data/test/xml/test_dtd.rb +84 -0
  129. data/test/xml/test_entity_reference.rb +3 -3
  130. data/test/xml/test_node.rb +21 -3
  131. data/test/xml/test_node_attributes.rb +17 -0
  132. data/test/xml/test_schema.rb +26 -0
  133. data/test/xml/test_text.rb +15 -0
  134. data/test/xml/test_xpath.rb +87 -0
  135. data/test_all +3 -3
  136. metadata +119 -68
  137. 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 &quot; <A
34
+ * HREF="http://www.w3.org/TR/2002/REC-xml-exc-c14n-20020718/">Exclusive XML
35
+ * Canonicalization, Version 1.0 </A>&quot; <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
+ }