diff --git a/0001-replace-bundled-base64coder-with-java.util.Base64.patch b/0001-replace-bundled-base64coder-with-java.util.Base64.patch index 6f98b03..7cf43e6 100644 --- a/0001-replace-bundled-base64coder-with-java.util.Base64.patch +++ b/0001-replace-bundled-base64coder-with-java.util.Base64.patch @@ -1,41 +1,21 @@ -From c7ea35842ddebe7069024f284b543f1c10d00631 Mon Sep 17 00:00:00 2001 -From: Fabio Valentini -Date: Tue, 10 Sep 2019 13:38:15 +0200 -Subject: [PATCH 1/2] replace bundled base64coder with java.util.Base64 +From cdee7ec34fb56a84ae4dc6ccb21d5f07c2392df1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fridrich=20=C5=A0trba?= +Date: Wed, 12 Oct 2022 10:54:38 +0200 +Subject: [PATCH 1/3] replace bundled base64coder with java.util.Base64 --- - pom.xml | 6 +- .../constructor/SafeConstructor.java | 4 +- - .../external/biz/base64Coder/Base64Coder.java | 305 ------------------ - .../representer/SafeRepresenter.java | 6 +- - .../base64Coder/Base64CoderTest.java | 73 ----- - .../issues/issue99/YamlBase64Test.java | 6 +- - 6 files changed, 10 insertions(+), 390 deletions(-) + .../external/biz/base64Coder/Base64Coder.java | 281 ------------------ + .../representer/SafeRepresenter.java | 10 +- + .../base64Coder/Base64CoderTest.java | 16 +- + 4 files changed, 14 insertions(+), 297 deletions(-) delete mode 100644 src/main/java/org/yaml/snakeyaml/external/biz/base64Coder/Base64Coder.java - delete mode 100644 src/test/java/biz/source_code/base64Coder/Base64CoderTest.java -diff --git a/pom.xml b/pom.xml -index cff065a7..102381e7 100644 ---- a/pom.xml -+++ b/pom.xml -@@ -10,10 +10,8 @@ - bitbucket - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - https://oss.sonatype.org/content/repositories/snapshots/ -- 7 -- 7 -- 8 -- 8 -+ 8 -+ 8 - false - 3.5.0 - 3.0.2 diff --git a/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java b/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java -index f38c4e9a..cb29cf39 100644 +index e124489e..9ec73ccd 100644 --- a/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java +++ b/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java -@@ -17,6 +17,7 @@ package org.yaml.snakeyaml.constructor; +@@ -15,6 +15,7 @@ package org.yaml.snakeyaml.constructor; import java.math.BigInteger; import java.util.ArrayList; @@ -43,40 +23,40 @@ index f38c4e9a..cb29cf39 100644 import java.util.Calendar; import java.util.HashMap; import java.util.Iterator; -@@ -31,7 +32,6 @@ import java.util.regex.Pattern; - +@@ -28,7 +29,6 @@ import java.util.regex.Matcher; + import java.util.regex.Pattern; import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.error.YAMLException; -import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.nodes.NodeId; -@@ -383,7 +383,7 @@ public class SafeConstructor extends BaseConstructor { - // Ignore white spaces for base64 encoded scalar - String noWhiteSpaces = constructScalar((ScalarNode) node).toString().replaceAll("\\s", - ""); -- byte[] decoded = Base64Coder.decode(noWhiteSpaces.toCharArray()); -+ byte[] decoded = Base64.getDecoder().decode(noWhiteSpaces); - return decoded; - } +@@ -389,7 +389,7 @@ public class SafeConstructor extends BaseConstructor { + public Object construct(Node node) { + // Ignore white spaces for base64 encoded scalar + String noWhiteSpaces = constructScalar((ScalarNode) node).replaceAll("\\s", ""); +- byte[] decoded = Base64Coder.decode(noWhiteSpaces.toCharArray()); ++ byte[] decoded = Base64.getDecoder().decode(noWhiteSpaces); + return decoded; } + } diff --git a/src/main/java/org/yaml/snakeyaml/external/biz/base64Coder/Base64Coder.java b/src/main/java/org/yaml/snakeyaml/external/biz/base64Coder/Base64Coder.java deleted file mode 100644 -index 65923b65..00000000 +index db43b474..00000000 --- a/src/main/java/org/yaml/snakeyaml/external/biz/base64Coder/Base64Coder.java +++ /dev/null -@@ -1,305 +0,0 @@ +@@ -1,281 +0,0 @@ -// Copyright 2003-2010 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland -// www.source-code.biz, www.inventec.ch/chdh -// -// This module is multi-licensed and may be used under the terms -// of any of the following licenses: -// --// EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal --// LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html --// GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html --// AL, Apache License, V2.0 or later, http://www.apache.org/licenses --// BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php +-// EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal +-// LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html +-// GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html +-// AL, Apache License, V2.0 or later, http://www.apache.org/licenses +-// BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php -// -// Please contact the author if you need another license. -// This module is provided "as is", without warranties of any kind. @@ -85,447 +65,370 @@ index 65923b65..00000000 - -/** - * A Base64 encoder/decoder. -- * +- * - *

-- * This class is used to encode and decode data in Base64 format as described in -- * RFC 1521. -- * +- * This class is used to encode and decode data in Base64 format as described in RFC 1521. +- * - *

-- * Project home page: www. +- * Project home page: www. - * source-code.biz/base64coder/java
- * Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland
- * Multi-licensed: EPL / LGPL / GPL / AL / BSD. - */ -public class Base64Coder { - -- // The line separator string of the operating system. -- private static final String systemLineSeparator = System.getProperty("line.separator"); +- // The line separator string of the operating system. +- private static final String systemLineSeparator = System.getProperty("line.separator"); - -- // Mapping table from 6-bit nibbles to Base64 characters. -- private static char[] map1 = new char[64]; -- static { -- int i = 0; -- for (char c = 'A'; c <= 'Z'; c++) -- map1[i++] = c; -- for (char c = 'a'; c <= 'z'; c++) -- map1[i++] = c; -- for (char c = '0'; c <= '9'; c++) -- map1[i++] = c; -- map1[i++] = '+'; -- map1[i++] = '/'; -- } +- // Mapping table from 6-bit nibbles to Base64 characters. +- private static final char[] map1 = new char[64]; - -- // Mapping table from Base64 characters to 6-bit nibbles. -- private static byte[] map2 = new byte[128]; -- static { -- for (int i = 0; i < map2.length; i++) -- map2[i] = -1; -- for (int i = 0; i < 64; i++) -- map2[map1[i]] = (byte) i; +- static { +- int i = 0; +- for (char c = 'A'; c <= 'Z'; c++) { +- map1[i++] = c; - } +- for (char c = 'a'; c <= 'z'; c++) { +- map1[i++] = c; +- } +- for (char c = '0'; c <= '9'; c++) { +- map1[i++] = c; +- } +- map1[i++] = '+'; +- map1[i++] = '/'; +- } - -- /** -- * Encodes a string into Base64 format. No blanks or line breaks are -- * inserted. -- * -- * @param s -- * A String to be encoded. -- * @return A String containing the Base64 encoded data. -- */ -- public static String encodeString(String s) { -- return new String(encode(s.getBytes())); -- } +- // Mapping table from Base64 characters to 6-bit nibbles. +- private static final byte[] map2 = new byte[128]; - -- /** -- * Encodes a byte array into Base 64 format and breaks the output into lines -- * of 76 characters. This method is compatible with -- * sun.misc.BASE64Encoder.encodeBuffer(byte[]). -- * -- * @param in -- * An array containing the data bytes to be encoded. -- * @return A String containing the Base64 encoded data, broken into lines. -- */ -- public static String encodeLines(byte[] in) { -- return encodeLines(in, 0, in.length, 76, systemLineSeparator); +- static { +- for (int i = 0; i < map2.length; i++) { +- map2[i] = -1; - } +- for (int i = 0; i < 64; i++) { +- map2[map1[i]] = (byte) i; +- } +- } - -- /** -- * Encodes a byte array into Base 64 format and breaks the output into -- * lines. -- * -- * @param in -- * An array containing the data bytes to be encoded. -- * @param iOff -- * Offset of the first byte in in to be processed. -- * @param iLen -- * Number of bytes to be processed in in, starting -- * at iOff. -- * @param lineLen -- * Line length for the output data. Should be a multiple of 4. -- * @param lineSeparator -- * The line separator to be used to separate the output lines. -- * @return A String containing the Base64 encoded data, broken into lines. -- */ -- public static String encodeLines(byte[] in, int iOff, int iLen, int lineLen, -- String lineSeparator) { -- int blockLen = (lineLen * 3) / 4; -- if (blockLen <= 0) -- throw new IllegalArgumentException(); -- int lines = (iLen + blockLen - 1) / blockLen; -- int bufLen = ((iLen + 2) / 3) * 4 + lines * lineSeparator.length(); -- StringBuilder buf = new StringBuilder(bufLen); -- int ip = 0; -- while (ip < iLen) { -- int l = Math.min(iLen - ip, blockLen); -- buf.append(encode(in, iOff + ip, l)); -- buf.append(lineSeparator); -- ip += l; -- } -- return buf.toString(); -- } +- /** +- * Encodes a string into Base64 format. No blanks or line breaks are inserted. +- * +- * @param s A String to be encoded. +- * @return A String containing the Base64 encoded data. +- */ +- public static String encodeString(String s) { +- return new String(encode(s.getBytes())); +- } - -- /** -- * Encodes a byte array into Base64 format. No blanks or line breaks are -- * inserted in the output. -- * -- * @param in -- * An array containing the data bytes to be encoded. -- * @return A character array containing the Base64 encoded data. -- */ -- public static char[] encode(byte[] in) { -- return encode(in, 0, in.length); -- } +- /** +- * Encodes a byte array into Base 64 format and breaks the output into lines of 76 characters. +- * This method is compatible with sun.misc.BASE64Encoder.encodeBuffer(byte[]). +- * +- * @param in An array containing the data bytes to be encoded. +- * @return A String containing the Base64 encoded data, broken into lines. +- */ +- public static String encodeLines(byte[] in) { +- return encodeLines(in, 0, in.length, 76, systemLineSeparator); +- } - -- /** -- * Encodes a byte array into Base64 format. No blanks or line breaks are -- * inserted in the output. -- * -- * @param in -- * An array containing the data bytes to be encoded. -- * @param iLen -- * Number of bytes to process in in. -- * @return A character array containing the Base64 encoded data. -- */ -- public static char[] encode(byte[] in, int iLen) { -- return encode(in, 0, iLen); +- /** +- * Encodes a byte array into Base 64 format and breaks the output into lines. +- * +- * @param in An array containing the data bytes to be encoded. +- * @param iOff Offset of the first byte in in to be processed. +- * @param iLen Number of bytes to be processed in in, starting at iOff. +- * @param lineLen Line length for the output data. Should be a multiple of 4. +- * @param lineSeparator The line separator to be used to separate the output lines. +- * @return A String containing the Base64 encoded data, broken into lines. +- */ +- public static String encodeLines(byte[] in, int iOff, int iLen, int lineLen, +- String lineSeparator) { +- int blockLen = (lineLen * 3) / 4; +- if (blockLen <= 0) { +- throw new IllegalArgumentException(); - } +- int lines = (iLen + blockLen - 1) / blockLen; +- int bufLen = ((iLen + 2) / 3) * 4 + lines * lineSeparator.length(); +- StringBuilder buf = new StringBuilder(bufLen); +- int ip = 0; +- while (ip < iLen) { +- int l = Math.min(iLen - ip, blockLen); +- buf.append(encode(in, iOff + ip, l)); +- buf.append(lineSeparator); +- ip += l; +- } +- return buf.toString(); +- } - -- /** -- * Encodes a byte array into Base64 format. No blanks or line breaks are -- * inserted in the output. -- * -- * @param in -- * An array containing the data bytes to be encoded. -- * @param iOff -- * Offset of the first byte in in to be processed. -- * @param iLen -- * Number of bytes to process in in, starting at -- * iOff. -- * @return A character array containing the Base64 encoded data. -- */ -- public static char[] encode(byte[] in, int iOff, int iLen) { -- int oDataLen = (iLen * 4 + 2) / 3; // output length without padding -- int oLen = ((iLen + 2) / 3) * 4; // output length including padding -- char[] out = new char[oLen]; -- int ip = iOff; -- int iEnd = iOff + iLen; -- int op = 0; -- while (ip < iEnd) { -- int i0 = in[ip++] & 0xff; -- int i1 = ip < iEnd ? in[ip++] & 0xff : 0; -- int i2 = ip < iEnd ? in[ip++] & 0xff : 0; -- int o0 = i0 >>> 2; -- int o1 = ((i0 & 3) << 4) | (i1 >>> 4); -- int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6); -- int o3 = i2 & 0x3F; -- out[op++] = map1[o0]; -- out[op++] = map1[o1]; -- out[op] = op < oDataLen ? map1[o2] : '='; -- op++; -- out[op] = op < oDataLen ? map1[o3] : '='; -- op++; -- } -- return out; -- } +- /** +- * Encodes a byte array into Base64 format. No blanks or line breaks are inserted in the output. +- * +- * @param in An array containing the data bytes to be encoded. +- * @return A character array containing the Base64 encoded data. +- */ +- public static char[] encode(byte[] in) { +- return encode(in, 0, in.length); +- } - -- /** -- * Decodes a string from Base64 format. No blanks or line breaks are allowed -- * within the Base64 encoded input data. -- * -- * @param s -- * A Base64 String to be decoded. -- * @return A String containing the decoded data. -- * @throws IllegalArgumentException -- * If the input is not valid Base64 encoded data. -- */ -- public static String decodeString(String s) { -- return new String(decode(s)); -- } +- /** +- * Encodes a byte array into Base64 format. No blanks or line breaks are inserted in the output. +- * +- * @param in An array containing the data bytes to be encoded. +- * @param iLen Number of bytes to process in in. +- * @return A character array containing the Base64 encoded data. +- */ +- public static char[] encode(byte[] in, int iLen) { +- return encode(in, 0, iLen); +- } - -- /** -- * Decodes a byte array from Base64 format and ignores line separators, tabs -- * and blanks. CR, LF, Tab and Space characters are ignored in the input -- * data. This method is compatible with -- * sun.misc.BASE64Decoder.decodeBuffer(String). -- * -- * @param s -- * A Base64 String to be decoded. -- * @return An array containing the decoded data bytes. -- * @throws IllegalArgumentException -- * If the input is not valid Base64 encoded data. -- */ -- public static byte[] decodeLines(String s) { -- char[] buf = new char[s.length()]; -- int p = 0; -- for (int ip = 0; ip < s.length(); ip++) { -- char c = s.charAt(ip); -- if (c != ' ' && c != '\r' && c != '\n' && c != '\t') -- buf[p++] = c; -- } -- return decode(buf, 0, p); +- /** +- * Encodes a byte array into Base64 format. No blanks or line breaks are inserted in the output. +- * +- * @param in An array containing the data bytes to be encoded. +- * @param iOff Offset of the first byte in in to be processed. +- * @param iLen Number of bytes to process in in, starting at iOff. +- * @return A character array containing the Base64 encoded data. +- */ +- public static char[] encode(byte[] in, int iOff, int iLen) { +- int oDataLen = (iLen * 4 + 2) / 3; // output length without padding +- int oLen = ((iLen + 2) / 3) * 4; // output length including padding +- char[] out = new char[oLen]; +- int ip = iOff; +- int iEnd = iOff + iLen; +- int op = 0; +- while (ip < iEnd) { +- int i0 = in[ip++] & 0xff; +- int i1 = ip < iEnd ? in[ip++] & 0xff : 0; +- int i2 = ip < iEnd ? in[ip++] & 0xff : 0; +- int o0 = i0 >>> 2; +- int o1 = ((i0 & 3) << 4) | (i1 >>> 4); +- int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6); +- int o3 = i2 & 0x3F; +- out[op++] = map1[o0]; +- out[op++] = map1[o1]; +- out[op] = op < oDataLen ? map1[o2] : '='; +- op++; +- out[op] = op < oDataLen ? map1[o3] : '='; +- op++; - } +- return out; +- } - -- /** -- * Decodes a byte array from Base64 format. No blanks or line breaks are -- * allowed within the Base64 encoded input data. -- * -- * @param s -- * A Base64 String to be decoded. -- * @return An array containing the decoded data bytes. -- * @throws IllegalArgumentException -- * If the input is not valid Base64 encoded data. -- */ -- public static byte[] decode(String s) { -- return decode(s.toCharArray()); -- } +- /** +- * Decodes a string from Base64 format. No blanks or line breaks are allowed within the Base64 +- * encoded input data. +- * +- * @param s A Base64 String to be decoded. +- * @return A String containing the decoded data. +- * @throws IllegalArgumentException If the input is not valid Base64 encoded data. +- */ +- public static String decodeString(String s) { +- return new String(decode(s)); +- } - -- /** -- * Decodes a byte array from Base64 format. No blanks or line breaks are -- * allowed within the Base64 encoded input data. -- * -- * @param in -- * A character array containing the Base64 encoded data. -- * @return An array containing the decoded data bytes. -- * @throws IllegalArgumentException -- * If the input is not valid Base64 encoded data. -- */ -- public static byte[] decode(char[] in) { -- return decode(in, 0, in.length); +- /** +- * Decodes a byte array from Base64 format and ignores line separators, tabs and blanks. CR, LF, +- * Tab and Space characters are ignored in the input data. This method is compatible with +- * sun.misc.BASE64Decoder.decodeBuffer(String). +- * +- * @param s A Base64 String to be decoded. +- * @return An array containing the decoded data bytes. +- * @throws IllegalArgumentException If the input is not valid Base64 encoded data. +- */ +- public static byte[] decodeLines(String s) { +- char[] buf = new char[s.length()]; +- int p = 0; +- for (int ip = 0; ip < s.length(); ip++) { +- char c = s.charAt(ip); +- if (c != ' ' && c != '\r' && c != '\n' && c != '\t') { +- buf[p++] = c; +- } - } +- return decode(buf, 0, p); +- } - -- /** -- * Decodes a byte array from Base64 format. No blanks or line breaks are -- * allowed within the Base64 encoded input data. -- * -- * @param in -- * A character array containing the Base64 encoded data. -- * @param iOff -- * Offset of the first character in in to be -- * processed. -- * @param iLen -- * Number of characters to process in in, starting -- * at iOff. -- * @return An array containing the decoded data bytes. -- * @throws IllegalArgumentException -- * If the input is not valid Base64 encoded data. -- */ -- public static byte[] decode(char[] in, int iOff, int iLen) { -- if (iLen % 4 != 0) -- throw new IllegalArgumentException( -- "Length of Base64 encoded input string is not a multiple of 4."); -- while (iLen > 0 && in[iOff + iLen - 1] == '=') -- iLen--; -- int oLen = (iLen * 3) / 4; -- byte[] out = new byte[oLen]; -- int ip = iOff; -- int iEnd = iOff + iLen; -- int op = 0; -- while (ip < iEnd) { -- int i0 = in[ip++]; -- int i1 = in[ip++]; -- int i2 = ip < iEnd ? in[ip++] : 'A'; -- int i3 = ip < iEnd ? in[ip++] : 'A'; -- if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127) -- throw new IllegalArgumentException("Illegal character in Base64 encoded data."); -- int b0 = map2[i0]; -- int b1 = map2[i1]; -- int b2 = map2[i2]; -- int b3 = map2[i3]; -- if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0) -- throw new IllegalArgumentException("Illegal character in Base64 encoded data."); -- int o0 = (b0 << 2) | (b1 >>> 4); -- int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2); -- int o2 = ((b2 & 3) << 6) | b3; -- out[op++] = (byte) o0; -- if (op < oLen) -- out[op++] = (byte) o1; -- if (op < oLen) -- out[op++] = (byte) o2; -- } -- return out; -- } +- /** +- * Decodes a byte array from Base64 format. No blanks or line breaks are allowed within the Base64 +- * encoded input data. +- * +- * @param s A Base64 String to be decoded. +- * @return An array containing the decoded data bytes. +- * @throws IllegalArgumentException If the input is not valid Base64 encoded data. +- */ +- public static byte[] decode(String s) { +- return decode(s.toCharArray()); +- } - -- // Dummy constructor. -- private Base64Coder() { +- /** +- * Decodes a byte array from Base64 format. No blanks or line breaks are allowed within the Base64 +- * encoded input data. +- * +- * @param in A character array containing the Base64 encoded data. +- * @return An array containing the decoded data bytes. +- * @throws IllegalArgumentException If the input is not valid Base64 encoded data. +- */ +- public static byte[] decode(char[] in) { +- return decode(in, 0, in.length); +- } +- +- /** +- * Decodes a byte array from Base64 format. No blanks or line breaks are allowed within the Base64 +- * encoded input data. +- * +- * @param in A character array containing the Base64 encoded data. +- * @param iOff Offset of the first character in in to be processed. +- * @param iLen Number of characters to process in in, starting at iOff. +- * @return An array containing the decoded data bytes. +- * @throws IllegalArgumentException If the input is not valid Base64 encoded data. +- */ +- public static byte[] decode(char[] in, int iOff, int iLen) { +- if (iLen % 4 != 0) { +- throw new IllegalArgumentException( +- "Length of Base64 encoded input string is not a multiple of 4."); - } +- while (iLen > 0 && in[iOff + iLen - 1] == '=') { +- iLen--; +- } +- int oLen = (iLen * 3) / 4; +- byte[] out = new byte[oLen]; +- int ip = iOff; +- int iEnd = iOff + iLen; +- int op = 0; +- while (ip < iEnd) { +- int i0 = in[ip++]; +- int i1 = in[ip++]; +- int i2 = ip < iEnd ? in[ip++] : 'A'; +- int i3 = ip < iEnd ? in[ip++] : 'A'; +- if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127) { +- throw new IllegalArgumentException("Illegal character in Base64 encoded data."); +- } +- int b0 = map2[i0]; +- int b1 = map2[i1]; +- int b2 = map2[i2]; +- int b3 = map2[i3]; +- if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0) { +- throw new IllegalArgumentException("Illegal character in Base64 encoded data."); +- } +- int o0 = (b0 << 2) | (b1 >>> 4); +- int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2); +- int o2 = ((b2 & 3) << 6) | b3; +- out[op++] = (byte) o0; +- if (op < oLen) { +- out[op++] = (byte) o1; +- } +- if (op < oLen) { +- out[op++] = (byte) o2; +- } +- } +- return out; +- } +- +- // Dummy constructor. +- private Base64Coder() {} - -} // end class Base64Coder diff --git a/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java b/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java -index 810dbe97..cafc0be8 100644 +index f0951fb4..fdb5fb8c 100644 --- a/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java +++ b/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java -@@ -19,6 +19,7 @@ import java.io.UnsupportedEncodingException; - import java.math.BigInteger; +@@ -17,6 +17,7 @@ import java.math.BigInteger; + import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; +import java.util.Base64; import java.util.Calendar; import java.util.Date; import java.util.HashMap; -@@ -33,7 +34,6 @@ import java.util.regex.Pattern; - +@@ -30,7 +31,6 @@ import java.util.UUID; + import java.util.regex.Pattern; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.error.YAMLException; -import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.nodes.Tag; import org.yaml.snakeyaml.reader.StreamReader; -@@ -131,7 +131,7 @@ class SafeRepresenter extends BaseRepresenter { - if (!checkValue.equals(value)) { - throw new YAMLException("invalid string value has occurred"); - } -- binary = Base64Coder.encode(bytes); -+ binary = Base64.getEncoder().encodeToString(bytes).toCharArray(); - } catch (UnsupportedEncodingException e) { - throw new YAMLException(e); - } -@@ -433,7 +433,7 @@ class SafeRepresenter extends BaseRepresenter { - - protected class RepresentByteArray implements Represent { - public Node representData(Object data) { -- char[] binary = Base64Coder.encode((byte[]) data); -+ char[] binary = Base64.getEncoder().encodeToString((byte[]) data).toCharArray(); - return representScalar(Tag.BINARY, String.valueOf(binary), DumperOptions.ScalarStyle.LITERAL); +@@ -124,7 +124,6 @@ class SafeRepresenter extends BaseRepresenter { + if (nonPrintableStyle == DumperOptions.NonPrintableStyle.BINARY + && !StreamReader.isPrintable(value)) { + tag = Tag.BINARY; +- char[] binary; + final byte[] bytes = value.getBytes(StandardCharsets.UTF_8); + // sometimes above will just silently fail - it will return incomplete data + // it happens when String has invalid code points +@@ -133,8 +132,7 @@ class SafeRepresenter extends BaseRepresenter { + if (!checkValue.equals(value)) { + throw new YAMLException("invalid string value has occurred"); } +- binary = Base64Coder.encode(bytes); +- value = String.valueOf(binary); ++ value = Base64.getEncoder().encodeToString(bytes); + style = DumperOptions.ScalarStyle.LITERAL; + } + // if no other scalar style is explicitly set, use literal style for +@@ -455,8 +453,8 @@ class SafeRepresenter extends BaseRepresenter { + protected class RepresentByteArray implements Represent { + + public Node representData(Object data) { +- char[] binary = Base64Coder.encode((byte[]) data); +- return representScalar(Tag.BINARY, String.valueOf(binary), DumperOptions.ScalarStyle.LITERAL); ++ String binary = Base64.getEncoder().encodeToString((byte[]) data); ++ return representScalar(Tag.BINARY, binary, DumperOptions.ScalarStyle.LITERAL); } + } + diff --git a/src/test/java/biz/source_code/base64Coder/Base64CoderTest.java b/src/test/java/biz/source_code/base64Coder/Base64CoderTest.java -deleted file mode 100644 -index e8e32da1..00000000 +index 295eb729..dbe814bf 100644 --- a/src/test/java/biz/source_code/base64Coder/Base64CoderTest.java -+++ /dev/null -@@ -1,73 +0,0 @@ --/** -- * Copyright (c) 2008, SnakeYAML -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ --package biz.source_code.base64Coder; -- --import java.io.UnsupportedEncodingException; -- --import junit.framework.TestCase; -- --import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; -- --public class Base64CoderTest extends TestCase { -- -- public void testDecode() throws UnsupportedEncodingException { -- check("Aladdin:open sesame", "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); -- check("a", "YQ=="); -- check("aa", "YWE="); -- check("a=", "YT0="); -- check("", ""); -- } -- -- public void testFailure1() throws UnsupportedEncodingException { -- try { -- Base64Coder.decode("YQ=".toCharArray()); -- fail(); -- } catch (Exception e) { -- assertEquals("Length of Base64 encoded input string is not a multiple of 4.", -- e.getMessage()); -- } -- } -- -- public void testFailure2() throws UnsupportedEncodingException { -- checkInvalid("\tWE="); -- checkInvalid("Y\tE="); -- checkInvalid("YW\t="); -- checkInvalid("YWE\t"); -- // -- checkInvalid("©WE="); -- checkInvalid("Y©E="); -- checkInvalid("YW©="); -- checkInvalid("YWE©"); -- } -- -- private void checkInvalid(String encoded) { -- try { -- Base64Coder.decode(encoded.toCharArray()); -- fail("Illegal chanracter."); -- } catch (Exception e) { -- assertEquals("Illegal character in Base64 encoded data.", e.getMessage()); -- } -- } -- -- private void check(String text, String encoded) throws UnsupportedEncodingException { -- char[] s1 = Base64Coder.encode(text.getBytes("UTF-8")); -- String t1 = new String(s1); -- assertEquals(encoded, t1); -- byte[] s2 = Base64Coder.decode(encoded.toCharArray()); -- String t2 = new String(s2, "UTF-8"); -- assertEquals(text, t2); -- } --} -diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue99/YamlBase64Test.java b/src/test/java/org/yaml/snakeyaml/issues/issue99/YamlBase64Test.java -index bae02d29..5f3e62ed 100644 ---- a/src/test/java/org/yaml/snakeyaml/issues/issue99/YamlBase64Test.java -+++ b/src/test/java/org/yaml/snakeyaml/issues/issue99/YamlBase64Test.java -@@ -18,6 +18,7 @@ package org.yaml.snakeyaml.issues.issue99; - import java.io.BufferedInputStream; - import java.io.IOException; - import java.io.InputStream; -+import java.util.Base64; - import java.util.Map; ++++ b/src/test/java/biz/source_code/base64Coder/Base64CoderTest.java +@@ -13,10 +13,10 @@ + */ + package biz.source_code.base64Coder; ++import java.util.Base64; + import java.io.UnsupportedEncodingException; + import java.nio.charset.StandardCharsets; import junit.framework.TestCase; -@@ -27,7 +28,6 @@ import org.yaml.snakeyaml.Yaml; - import org.yaml.snakeyaml.YamlDocument; - import org.yaml.snakeyaml.constructor.AbstractConstruct; - import org.yaml.snakeyaml.constructor.Constructor; -import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; - import org.yaml.snakeyaml.nodes.Node; - import org.yaml.snakeyaml.nodes.ScalarNode; - import org.yaml.snakeyaml.nodes.Tag; -@@ -50,7 +50,7 @@ public class YamlBase64Test extends TestCase { - all = all + lines[i].trim(); - } - // System.out.println(all); -- byte[] decoded = Base64Coder.decode(all.toCharArray()); -+ byte[] decoded = Base64.getDecoder().decode(all); - assertEquals(3737, decoded.length); - checkBytes(decoded); + + public class Base64CoderTest extends TestCase { + +@@ -30,10 +30,10 @@ public class Base64CoderTest extends TestCase { + + public void testFailure1() throws UnsupportedEncodingException { + try { +- Base64Coder.decode("YQ=".toCharArray()); ++ Base64.getDecoder().decode("YQ=".getBytes(StandardCharsets.UTF_8)); + fail(); + } catch (Exception e) { +- assertEquals("Length of Base64 encoded input string is not a multiple of 4.", e.getMessage()); ++ assertEquals("Input byte array has wrong 4-byte ending unit", e.getMessage()); } -@@ -122,7 +122,7 @@ public class YamlBase64Test extends TestCase { - public Object construct(Node node) { - String contentWithNewLines = constructScalar((ScalarNode) node).toString(); - String noNewLines = contentWithNewLines.replaceAll("\\s", ""); -- byte[] decoded = Base64Coder.decode(noNewLines.toCharArray()); -+ byte[] decoded = Base64.getDecoder().decode(noNewLines); - return decoded; - } - } + } + +@@ -51,18 +51,18 @@ public class Base64CoderTest extends TestCase { + + private void checkInvalid(String encoded) { + try { +- Base64Coder.decode(encoded.toCharArray()); ++ Base64.getDecoder().decode(encoded.getBytes(StandardCharsets.UTF_8)); + fail("Illegal chanracter."); + } catch (Exception e) { +- assertEquals("Illegal character in Base64 encoded data.", e.getMessage()); ++ assertTrue(e.getMessage().startsWith("Illegal base64 character")); + } + } + + private void check(String text, String encoded) throws UnsupportedEncodingException { +- char[] s1 = Base64Coder.encode(text.getBytes(StandardCharsets.UTF_8)); +- String t1 = new String(s1); ++ byte[] s1 = Base64.getEncoder().encode(text.getBytes(StandardCharsets.UTF_8)); ++ String t1 = new String(s1, StandardCharsets.UTF_8); + assertEquals(encoded, t1); +- byte[] s2 = Base64Coder.decode(encoded.toCharArray()); ++ byte[] s2 = Base64.getDecoder().decode(encoded.getBytes(StandardCharsets.UTF_8)); + String t2 = new String(s2, StandardCharsets.UTF_8); + assertEquals(text, t2); + } -- 2.37.3 diff --git a/0002-Replace-bundled-gdata-java-client-classes-with-commo.patch b/0002-Replace-bundled-gdata-java-client-classes-with-commo.patch index 3866a58..445161c 100644 --- a/0002-Replace-bundled-gdata-java-client-classes-with-commo.patch +++ b/0002-Replace-bundled-gdata-java-client-classes-with-commo.patch @@ -1,981 +1,73 @@ -From 4e09236b88488cfc222d8e3419e344092548117b Mon Sep 17 00:00:00 2001 -From: Michal Srb -Date: Fri, 26 Apr 2013 07:32:04 +0200 -Subject: [PATCH 2/2] Replace bundled gdata-java-client classes with +From fe0ce4764ce3839f8019a2b0ecfc1d41c87595c6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fridrich=20=C5=A0trba?= +Date: Wed, 12 Oct 2022 10:58:47 +0200 +Subject: [PATCH 2/3] Replace bundled gdata-java-client classes with commons-codec --- - .../gdata/util/common/base/Escaper.java | 97 ---- - .../util/common/base/PercentEscaper.java | 281 ---------- - .../util/common/base/UnicodeEscaper.java | 506 ------------------ - .../org/yaml/snakeyaml/util/UriEncoder.java | 37 +- - 4 files changed, 28 insertions(+), 893 deletions(-) - delete mode 100644 src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/Escaper.java - delete mode 100644 src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/PercentEscaper.java - delete mode 100644 src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/UnicodeEscaper.java + .../org/yaml/snakeyaml/util/UriEncoder.java | 37 +++++++++++++++---- + 1 file changed, 29 insertions(+), 8 deletions(-) -diff --git a/src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/Escaper.java b/src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/Escaper.java -deleted file mode 100644 -index c26e3cb6..00000000 ---- a/src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/Escaper.java -+++ /dev/null -@@ -1,97 +0,0 @@ --/* Copyright (c) 2008 Google Inc. -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package org.yaml.snakeyaml.external.com.google.gdata.util.common.base; -- --/** -- * An object that converts literal text into a format safe for inclusion in a -- * particular context (such as an XML document). Typically (but not always), the -- * inverse process of "unescaping" the text is performed automatically by the -- * relevant parser. -- * -- *

-- * For example, an XML escaper would convert the literal string -- * {@code "Foo"} into {@code "Foo<Bar>"} to prevent {@code ""} -- * from being confused with an XML tag. When the resulting XML document is -- * parsed, the parser API will return this text as the original literal string -- * {@code "Foo"}. -- * -- *

-- * An {@code Escaper} instance is required to be stateless, and safe when used -- * concurrently by multiple threads. -- * -- *

-- * Several popular escapers are defined as constants in the class -- * {@link CharEscapers}. To create your own escapers, use -- * {@link CharEscaperBuilder}, or extend {@link CharEscaper} or -- * {@code UnicodeEscaper}. -- * -- * -- */ --public interface Escaper { -- /** -- * Returns the escaped form of a given literal string. -- * -- *

-- * Note that this method may treat input characters differently depending on -- * the specific escaper implementation. -- *

-- * -- * @param string -- * the literal string to be escaped -- * @return the escaped form of {@code string} -- * @throws NullPointerException -- * if {@code string} is null -- * @throws IllegalArgumentException -- * if {@code string} contains badly formed UTF-16 or cannot be -- * escaped for any other reason -- */ -- public String escape(String string); -- -- /** -- * Returns an {@code Appendable} instance which automatically escapes all -- * text appended to it before passing the resulting text to an underlying -- * {@code Appendable}. -- * -- *

-- * Note that this method may treat input characters differently depending on -- * the specific escaper implementation. -- *

-- * -- * @param out -- * the underlying {@code Appendable} to append escaped output to -- * @return an {@code Appendable} which passes text to {@code out} after -- * escaping it. -- */ -- public Appendable escape(Appendable out); --} -diff --git a/src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/PercentEscaper.java b/src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/PercentEscaper.java -deleted file mode 100644 -index 5e2f902d..00000000 ---- a/src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/PercentEscaper.java -+++ /dev/null -@@ -1,281 +0,0 @@ --/* Copyright (c) 2008 Google Inc. -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package org.yaml.snakeyaml.external.com.google.gdata.util.common.base; -- --/** -- * A {@code UnicodeEscaper} that escapes some set of Java characters using the -- * URI percent encoding scheme. The set of safe characters (those which remain -- * unescaped) can be specified on construction. -- * -- *

-- * For details on escaping URIs for use in web pages, see section 2.4 of RFC 3986. -- * -- *

-- * In most cases this class should not need to be used directly. If you have no -- * special requirements for escaping your URIs, you should use either -- * {@link CharEscapers#uriEscaper()} or {@link CharEscapers#uriEscaper(boolean)}. -- * -- *

-- * When encoding a String, the following rules apply: -- *

-- * -- *

-- * RFC 2396 specifies the set of unreserved characters as "-", "_", ".", "!", -- * "~", "*", "'", "(" and ")". It goes on to state: -- * -- *

-- * Unreserved characters can be escaped without changing the semantics of the -- * URI, but this should not be done unless the URI is being used in a context -- * that does not allow the unescaped character to appear. -- * -- *

-- * For performance reasons the only currently supported character encoding of -- * this class is UTF-8. -- * -- *

-- * Note: This escaper produces uppercase hexidecimal sequences. From RFC 3986:
-- * "URI producers and normalizers should use uppercase hexadecimal digits for -- * all percent-encodings." -- * -- * -- */ --public class PercentEscaper extends UnicodeEscaper { -- /** -- * A string of safe characters that mimics the behavior of -- * {@link java.net.URLEncoder}. -- * -- */ -- public static final String SAFECHARS_URLENCODER = "-_.*"; -- -- /** -- * A string of characters that do not need to be encoded when used in URI -- * path segments, as specified in RFC 3986. Note that some of these -- * characters do need to be escaped when used in other parts of the URI. -- */ -- public static final String SAFEPATHCHARS_URLENCODER = "-_.!~*'()@:$&,;="; -- -- /** -- * A string of characters that do not need to be encoded when used in URI -- * query strings, as specified in RFC 3986. Note that some of these -- * characters do need to be escaped when used in other parts of the URI. -- */ -- public static final String SAFEQUERYSTRINGCHARS_URLENCODER = "-_.!~*'()@:$,;/?:"; -- -- // In some uri escapers spaces are escaped to '+' -- private static final char[] URI_ESCAPED_SPACE = { '+' }; -- -- private static final char[] UPPER_HEX_DIGITS = "0123456789ABCDEF".toCharArray(); -- -- /** -- * If true we should convert space to the {@code +} character. -- */ -- private final boolean plusForSpace; -- -- /** -- * An array of flags where for any {@code char c} if {@code safeOctets[c]} -- * is true then {@code c} should remain unmodified in the output. If -- * {@code c > safeOctets.length} then it should be escaped. -- */ -- private final boolean[] safeOctets; -- -- /** -- * Constructs a URI escaper with the specified safe characters and optional -- * handling of the space character. -- * -- * @param safeChars -- * a non null string specifying additional safe characters for -- * this escaper (the ranges 0..9, a..z and A..Z are always safe -- * and should not be specified here) -- * @param plusForSpace -- * true if ASCII space should be escaped to {@code +} rather than -- * {@code %20} -- * @throws IllegalArgumentException -- * if any of the parameters were invalid -- */ -- public PercentEscaper(String safeChars, boolean plusForSpace) { -- // Avoid any misunderstandings about the behavior of this escaper -- if (safeChars.matches(".*[0-9A-Za-z].*")) { -- throw new IllegalArgumentException( -- "Alphanumeric characters are always 'safe' and should not be " -- + "explicitly specified"); -- } -- // Avoid ambiguous parameters. Safe characters are never modified so if -- // space is a safe character then setting plusForSpace is meaningless. -- if (plusForSpace && safeChars.contains(" ")) { -- throw new IllegalArgumentException( -- "plusForSpace cannot be specified when space is a 'safe' character"); -- } -- if (safeChars.contains("%")) { -- throw new IllegalArgumentException("The '%' character cannot be specified as 'safe'"); -- } -- this.plusForSpace = plusForSpace; -- this.safeOctets = createSafeOctets(safeChars); -- } -- -- /** -- * Creates a boolean[] with entries corresponding to the character values -- * for 0-9, A-Z, a-z and those specified in safeChars set to true. The array -- * is as small as is required to hold the given character information. -- */ -- private static boolean[] createSafeOctets(String safeChars) { -- int maxChar = 'z'; -- char[] safeCharArray = safeChars.toCharArray(); -- for (char c : safeCharArray) { -- maxChar = Math.max(c, maxChar); -- } -- boolean[] octets = new boolean[maxChar + 1]; -- for (int c = '0'; c <= '9'; c++) { -- octets[c] = true; -- } -- for (int c = 'A'; c <= 'Z'; c++) { -- octets[c] = true; -- } -- for (int c = 'a'; c <= 'z'; c++) { -- octets[c] = true; -- } -- for (char c : safeCharArray) { -- octets[c] = true; -- } -- return octets; -- } -- -- /* -- * Overridden for performance. For unescaped strings this improved the -- * performance of the uri escaper from ~760ns to ~400ns as measured by -- * {@link CharEscapersBenchmark}. -- */ -- @Override -- protected int nextEscapeIndex(CharSequence csq, int index, int end) { -- for (; index < end; index++) { -- char c = csq.charAt(index); -- if (c >= safeOctets.length || !safeOctets[c]) { -- break; -- } -- } -- return index; -- } -- -- /* -- * Overridden for performance. For unescaped strings this improved the -- * performance of the uri escaper from ~400ns to ~170ns as measured by -- * {@link CharEscapersBenchmark}. -- */ -- @Override -- public String escape(String s) { -- int slen = s.length(); -- for (int index = 0; index < slen; index++) { -- char c = s.charAt(index); -- if (c >= safeOctets.length || !safeOctets[c]) { -- return escapeSlow(s, index); -- } -- } -- return s; -- } -- -- /** -- * Escapes the given Unicode code point in UTF-8. -- */ -- @Override -- protected char[] escape(int cp) { -- // We should never get negative values here but if we do it will throw -- // an -- // IndexOutOfBoundsException, so at least it will get spotted. -- if (cp < safeOctets.length && safeOctets[cp]) { -- return null; -- } else if (cp == ' ' && plusForSpace) { -- return URI_ESCAPED_SPACE; -- } else if (cp <= 0x7F) { -- // Single byte UTF-8 characters -- // Start with "%--" and fill in the blanks -- char[] dest = new char[3]; -- dest[0] = '%'; -- dest[2] = UPPER_HEX_DIGITS[cp & 0xF]; -- dest[1] = UPPER_HEX_DIGITS[cp >>> 4]; -- return dest; -- } else if (cp <= 0x7ff) { -- // Two byte UTF-8 characters [cp >= 0x80 && cp <= 0x7ff] -- // Start with "%--%--" and fill in the blanks -- char[] dest = new char[6]; -- dest[0] = '%'; -- dest[3] = '%'; -- dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; -- cp >>>= 4; -- dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; -- cp >>>= 2; -- dest[2] = UPPER_HEX_DIGITS[cp & 0xF]; -- cp >>>= 4; -- dest[1] = UPPER_HEX_DIGITS[0xC | cp]; -- return dest; -- } else if (cp <= 0xffff) { -- // Three byte UTF-8 characters [cp >= 0x800 && cp <= 0xffff] -- // Start with "%E-%--%--" and fill in the blanks -- char[] dest = new char[9]; -- dest[0] = '%'; -- dest[1] = 'E'; -- dest[3] = '%'; -- dest[6] = '%'; -- dest[8] = UPPER_HEX_DIGITS[cp & 0xF]; -- cp >>>= 4; -- dest[7] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; -- cp >>>= 2; -- dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; -- cp >>>= 4; -- dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; -- cp >>>= 2; -- dest[2] = UPPER_HEX_DIGITS[cp]; -- return dest; -- } else if (cp <= 0x10ffff) { -- char[] dest = new char[12]; -- // Four byte UTF-8 characters [cp >= 0xffff && cp <= 0x10ffff] -- // Start with "%F-%--%--%--" and fill in the blanks -- dest[0] = '%'; -- dest[1] = 'F'; -- dest[3] = '%'; -- dest[6] = '%'; -- dest[9] = '%'; -- dest[11] = UPPER_HEX_DIGITS[cp & 0xF]; -- cp >>>= 4; -- dest[10] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; -- cp >>>= 2; -- dest[8] = UPPER_HEX_DIGITS[cp & 0xF]; -- cp >>>= 4; -- dest[7] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; -- cp >>>= 2; -- dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; -- cp >>>= 4; -- dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; -- cp >>>= 2; -- dest[2] = UPPER_HEX_DIGITS[cp & 0x7]; -- return dest; -- } else { -- // If this ever happens it is due to bug in UnicodeEscaper, not bad -- // input. -- throw new IllegalArgumentException("Invalid unicode character value " + cp); -- } -- } --} -diff --git a/src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/UnicodeEscaper.java b/src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/UnicodeEscaper.java -deleted file mode 100644 -index 54031850..00000000 ---- a/src/main/java/org/yaml/snakeyaml/external/com/google/gdata/util/common/base/UnicodeEscaper.java -+++ /dev/null -@@ -1,506 +0,0 @@ --/* Copyright (c) 2008 Google Inc. -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package org.yaml.snakeyaml.external.com.google.gdata.util.common.base; -- --import java.io.IOException; -- --/** -- * An {@link Escaper} that converts literal text into a format safe for -- * inclusion in a particular context (such as an XML document). Typically (but -- * not always), the inverse process of "unescaping" the text is performed -- * automatically by the relevant parser. -- * -- *

-- * For example, an XML escaper would convert the literal string -- * {@code "Foo"} into {@code "Foo<Bar>"} to prevent {@code ""} -- * from being confused with an XML tag. When the resulting XML document is -- * parsed, the parser API will return this text as the original literal string -- * {@code "Foo"}. -- * -- *

-- * Note: This class is similar to {@link CharEscaper} but with one very -- * important difference. A CharEscaper can only process Java UTF16 characters in isolation -- * and may not cope when it encounters surrogate pairs. This class facilitates -- * the correct escaping of all Unicode characters. -- * -- *

-- * As there are important reasons, including potential security issues, to -- * handle Unicode correctly if you are considering implementing a new escaper -- * you should favor using UnicodeEscaper wherever possible. -- * -- *

-- * A {@code UnicodeEscaper} instance is required to be stateless, and safe when -- * used concurrently by multiple threads. -- * -- *

-- * Several popular escapers are defined as constants in the class -- * {@link CharEscapers}. To create your own escapers extend this class and -- * implement the {@link #escape(int)} method. -- * -- * -- */ --public abstract class UnicodeEscaper implements Escaper { -- /** The amount of padding (chars) to use when growing the escape buffer. */ -- private static final int DEST_PAD = 32; -- -- /** -- * Returns the escaped form of the given Unicode code point, or {@code null} -- * if this code point does not need to be escaped. When called as part of an -- * escaping operation, the given code point is guaranteed to be in the range -- * {@code 0 <= cp <= Character#MAX_CODE_POINT}. -- * -- *

-- * If an empty array is returned, this effectively strips the input -- * character from the resulting text. -- * -- *

-- * If the character does not need to be escaped, this method should return -- * {@code null}, rather than an array containing the character -- * representation of the code point. This enables the escaping algorithm to -- * perform more efficiently. -- * -- *

-- * If the implementation of this method cannot correctly handle a particular -- * code point then it should either throw an appropriate runtime exception -- * or return a suitable replacement character. It must never silently -- * discard invalid input as this may constitute a security risk. -- * -- * @param cp -- * the Unicode code point to escape if necessary -- * @return the replacement characters, or {@code null} if no escaping was -- * needed -- */ -- protected abstract char[] escape(int cp); -- -- /** -- * Scans a sub-sequence of characters from a given {@link CharSequence}, -- * returning the index of the next character that requires escaping. -- * -- *

-- * Note: When implementing an escaper, it is a good idea to override -- * this method for efficiency. The base class implementation determines -- * successive Unicode code points and invokes {@link #escape(int)} for each -- * of them. If the semantics of your escaper are such that code points in -- * the supplementary range are either all escaped or all unescaped, this -- * method can be implemented more efficiently using -- * {@link CharSequence#charAt(int)}. -- * -- *

-- * Note however that if your escaper does not escape characters in the -- * supplementary range, you should either continue to validate the -- * correctness of any surrogate characters encountered or provide a clear -- * warning to users that your escaper does not validate its input. -- * -- *

-- * See {@link PercentEscaper} for an example. -- * -- * @param csq -- * a sequence of characters -- * @param start -- * the index of the first character to be scanned -- * @param end -- * the index immediately after the last character to be scanned -- * @throws IllegalArgumentException -- * if the scanned sub-sequence of {@code csq} contains invalid -- * surrogate pairs -- */ -- protected int nextEscapeIndex(CharSequence csq, int start, int end) { -- int index = start; -- while (index < end) { -- int cp = codePointAt(csq, index, end); -- if (cp < 0 || escape(cp) != null) { -- break; -- } -- index += Character.isSupplementaryCodePoint(cp) ? 2 : 1; -- } -- return index; -- } -- -- /** -- * Returns the escaped form of a given literal string. -- * -- *

-- * If you are escaping input in arbitrary successive chunks, then it is not -- * generally safe to use this method. If an input string ends with an -- * unmatched high surrogate character, then this method will throw -- * {@link IllegalArgumentException}. You should either ensure your input is -- * valid UTF-16 before -- * calling this method or use an escaped {@link Appendable} (as returned by -- * {@link #escape(Appendable)}) which can cope with arbitrarily split input. -- * -- *

-- * Note: When implementing an escaper it is a good idea to override -- * this method for efficiency by inlining the implementation of -- * {@link #nextEscapeIndex(CharSequence, int, int)} directly. Doing this for -- * {@link PercentEscaper} more than doubled the performance for unescaped -- * strings (as measured by {@link CharEscapersBenchmark}). -- * -- * @param string -- * the literal string to be escaped -- * @return the escaped form of {@code string} -- * @throws NullPointerException -- * if {@code string} is null -- * @throws IllegalArgumentException -- * if invalid surrogate characters are encountered -- */ -- public String escape(String string) { -- int end = string.length(); -- int index = nextEscapeIndex(string, 0, end); -- return index == end ? string : escapeSlow(string, index); -- } -- -- /** -- * Returns the escaped form of a given literal string, starting at the given -- * index. This method is called by the {@link #escape(String)} method when -- * it discovers that escaping is required. It is protected to allow -- * subclasses to override the fastpath escaping function to inline their -- * escaping test. See {@link CharEscaperBuilder} for an example usage. -- * -- *

-- * This method is not reentrant and may only be invoked by the top level -- * {@link #escape(String)} method. -- * -- * @param s -- * the literal string to be escaped -- * @param index -- * the index to start escaping from -- * @return the escaped form of {@code string} -- * @throws NullPointerException -- * if {@code string} is null -- * @throws IllegalArgumentException -- * if invalid surrogate characters are encountered -- */ -- protected final String escapeSlow(String s, int index) { -- int end = s.length(); -- -- // Get a destination buffer and setup some loop variables. -- char[] dest = DEST_TL.get(); -- int destIndex = 0; -- int unescapedChunkStart = 0; -- -- while (index < end) { -- int cp = codePointAt(s, index, end); -- if (cp < 0) { -- throw new IllegalArgumentException("Trailing high surrogate at end of input"); -- } -- char[] escaped = escape(cp); -- if (escaped != null) { -- int charsSkipped = index - unescapedChunkStart; -- -- // This is the size needed to add the replacement, not the full -- // size needed by the string. We only regrow when we absolutely -- // must. -- int sizeNeeded = destIndex + charsSkipped + escaped.length; -- if (dest.length < sizeNeeded) { -- int destLength = sizeNeeded + (end - index) + DEST_PAD; -- dest = growBuffer(dest, destIndex, destLength); -- } -- // If we have skipped any characters, we need to copy them now. -- if (charsSkipped > 0) { -- s.getChars(unescapedChunkStart, index, dest, destIndex); -- destIndex += charsSkipped; -- } -- if (escaped.length > 0) { -- System.arraycopy(escaped, 0, dest, destIndex, escaped.length); -- destIndex += escaped.length; -- } -- } -- unescapedChunkStart = index + (Character.isSupplementaryCodePoint(cp) ? 2 : 1); -- index = nextEscapeIndex(s, unescapedChunkStart, end); -- } -- -- // Process trailing unescaped characters - no need to account for -- // escaped -- // length or padding the allocation. -- int charsSkipped = end - unescapedChunkStart; -- if (charsSkipped > 0) { -- int endIndex = destIndex + charsSkipped; -- if (dest.length < endIndex) { -- dest = growBuffer(dest, destIndex, endIndex); -- } -- s.getChars(unescapedChunkStart, end, dest, destIndex); -- destIndex = endIndex; -- } -- return new String(dest, 0, destIndex); -- } -- -- /** -- * Returns an {@code Appendable} instance which automatically escapes all -- * text appended to it before passing the resulting text to an underlying -- * {@code Appendable}. -- * -- *

-- * Unlike {@link #escape(String)} it is permitted to append arbitrarily -- * split input to this Appendable, including input that is split over a -- * surrogate pair. In this case the pending high surrogate character will -- * not be processed until the corresponding low surrogate is appended. This -- * means that a trailing high surrogate character at the end of the input -- * cannot be detected and will be silently ignored. This is unavoidable -- * since the Appendable interface has no {@code close()} method, and it is -- * impossible to determine when the last characters have been appended. -- * -- *

-- * The methods of the returned object will propagate any exceptions thrown -- * by the underlying {@code Appendable}. -- * -- *

-- * For well formed UTF-16 -- * the escaping behavior is identical to that of {@link #escape(String)} and -- * the following code is equivalent to (but much slower than) -- * {@code escaper.escape(string)}: -- * -- *

--     * {
--     *     @code
--     *     StringBuilder sb = new StringBuilder();
--     *     escaper.escape(sb).append(string);
--     *     return sb.toString();
--     * }
--     * 
-- * -- * @param out -- * the underlying {@code Appendable} to append escaped output to -- * @return an {@code Appendable} which passes text to {@code out} after -- * escaping it -- * @throws NullPointerException -- * if {@code out} is null -- * @throws IllegalArgumentException -- * if invalid surrogate characters are encountered -- * -- */ -- public Appendable escape(final Appendable out) { -- assert out != null; -- -- return new Appendable() { -- int pendingHighSurrogate = -1; -- char[] decodedChars = new char[2]; -- -- public Appendable append(CharSequence csq) throws IOException { -- return append(csq, 0, csq.length()); -- } -- -- public Appendable append(CharSequence csq, int start, int end) throws IOException { -- int index = start; -- if (index < end) { -- // This is a little subtle: index must never reference the -- // middle of a -- // surrogate pair but unescapedChunkStart can. The first -- // time we enter -- // the loop below it is possible that index != -- // unescapedChunkStart. -- int unescapedChunkStart = index; -- if (pendingHighSurrogate != -1) { -- // Our last append operation ended halfway through a -- // surrogate pair -- // so we have to do some extra work first. -- char c = csq.charAt(index++); -- if (!Character.isLowSurrogate(c)) { -- throw new IllegalArgumentException( -- "Expected low surrogate character but got " + c); -- } -- char[] escaped = escape(Character.toCodePoint((char) pendingHighSurrogate, -- c)); -- if (escaped != null) { -- // Emit the escaped character and adjust -- // unescapedChunkStart to -- // skip the low surrogate we have consumed. -- outputChars(escaped, escaped.length); -- unescapedChunkStart += 1; -- } else { -- // Emit pending high surrogate (unescaped) but do -- // not modify -- // unescapedChunkStart as we must still emit the low -- // surrogate. -- out.append((char) pendingHighSurrogate); -- } -- pendingHighSurrogate = -1; -- } -- while (true) { -- // Find and append the next subsequence of unescaped -- // characters. -- index = nextEscapeIndex(csq, index, end); -- if (index > unescapedChunkStart) { -- out.append(csq, unescapedChunkStart, index); -- } -- if (index == end) { -- break; -- } -- // If we are not finished, calculate the next code -- // point. -- int cp = codePointAt(csq, index, end); -- if (cp < 0) { -- // Our sequence ended half way through a surrogate -- // pair so just -- // record the state and exit. -- pendingHighSurrogate = -cp; -- break; -- } -- // Escape the code point and output the characters. -- char[] escaped = escape(cp); -- if (escaped != null) { -- outputChars(escaped, escaped.length); -- } else { -- // This shouldn't really happen if nextEscapeIndex -- // is correct but -- // we should cope with false positives. -- int len = Character.toChars(cp, decodedChars, 0); -- outputChars(decodedChars, len); -- } -- // Update our index past the escaped character and -- // continue. -- index += (Character.isSupplementaryCodePoint(cp) ? 2 : 1); -- unescapedChunkStart = index; -- } -- } -- return this; -- } -- -- public Appendable append(char c) throws IOException { -- if (pendingHighSurrogate != -1) { -- // Our last append operation ended halfway through a -- // surrogate pair -- // so we have to do some extra work first. -- if (!Character.isLowSurrogate(c)) { -- throw new IllegalArgumentException( -- "Expected low surrogate character but got '" + c + "' with value " -- + (int) c); -- } -- char[] escaped = escape(Character.toCodePoint((char) pendingHighSurrogate, c)); -- if (escaped != null) { -- outputChars(escaped, escaped.length); -- } else { -- out.append((char) pendingHighSurrogate); -- out.append(c); -- } -- pendingHighSurrogate = -1; -- } else if (Character.isHighSurrogate(c)) { -- // This is the start of a (split) surrogate pair. -- pendingHighSurrogate = c; -- } else { -- if (Character.isLowSurrogate(c)) { -- throw new IllegalArgumentException("Unexpected low surrogate character '" -- + c + "' with value " + (int) c); -- } -- // This is a normal (non surrogate) char. -- char[] escaped = escape(c); -- if (escaped != null) { -- outputChars(escaped, escaped.length); -- } else { -- out.append(c); -- } -- } -- return this; -- } -- -- private void outputChars(char[] chars, int len) throws IOException { -- for (int n = 0; n < len; n++) { -- out.append(chars[n]); -- } -- } -- }; -- } -- -- /** -- * Returns the Unicode code point of the character at the given index. -- * -- *

-- * Unlike {@link Character#codePointAt(CharSequence, int)} or -- * {@link String#codePointAt(int)} this method will never fail silently when -- * encountering an invalid surrogate pair. -- * -- *

-- * The behaviour of this method is as follows: -- *

    -- *
  1. If {@code index >= end}, {@link IndexOutOfBoundsException} is thrown. -- *
  2. If the character at the specified index is not a surrogate, it is -- * returned. -- *
  3. If the first character was a high surrogate value, then an attempt is -- * made to read the next character. -- *
      -- *
    1. If the end of the sequence was reached, the negated value of the -- * trailing high surrogate is returned. -- *
    2. If the next character was a valid low surrogate, the code point -- * value of the high/low surrogate pair is returned. -- *
    3. If the next character was not a low surrogate value, then -- * {@link IllegalArgumentException} is thrown. -- *
    -- *
  4. If the first character was a low surrogate value, -- * {@link IllegalArgumentException} is thrown. -- *
-- * -- * @param seq -- * the sequence of characters from which to decode the code point -- * @param index -- * the index of the first character to decode -- * @param end -- * the index beyond the last valid character to decode -- * @return the Unicode code point for the given index or the negated value -- * of the trailing high surrogate character at the end of the -- * sequence -- */ -- protected static final int codePointAt(CharSequence seq, int index, int end) { -- if (index < end) { -- char c1 = seq.charAt(index++); -- if (c1 < Character.MIN_HIGH_SURROGATE || c1 > Character.MAX_LOW_SURROGATE) { -- // Fast path (first test is probably all we need to do) -- return c1; -- } else if (c1 <= Character.MAX_HIGH_SURROGATE) { -- // If the high surrogate was the last character, return its -- // inverse -- if (index == end) { -- return -c1; -- } -- // Otherwise look for the low surrogate following it -- char c2 = seq.charAt(index); -- if (Character.isLowSurrogate(c2)) { -- return Character.toCodePoint(c1, c2); -- } -- throw new IllegalArgumentException("Expected low surrogate but got char '" + c2 -- + "' with value " + (int) c2 + " at index " + index); -- } else { -- throw new IllegalArgumentException("Unexpected low surrogate character '" + c1 -- + "' with value " + (int) c1 + " at index " + (index - 1)); -- } -- } -- throw new IndexOutOfBoundsException("Index exceeds specified range"); -- } -- -- /** -- * Helper method to grow the character buffer as needed, this only happens -- * once in a while so it's ok if it's in a method call. If the index passed -- * in is 0 then no copying will be done. -- */ -- private static final char[] growBuffer(char[] dest, int index, int size) { -- char[] copy = new char[size]; -- if (index > 0) { -- System.arraycopy(dest, 0, copy, 0, index); -- } -- return copy; -- } -- -- /** -- * A thread-local destination buffer to keep us from creating new buffers. -- * The starting size is 1024 characters. If we grow past this we don't put -- * it back in the threadlocal, we just keep going and grow as needed. -- */ -- private static final ThreadLocal DEST_TL = new ThreadLocal() { -- @Override -- protected char[] initialValue() { -- return new char[1024]; -- } -- }; --} diff --git a/src/main/java/org/yaml/snakeyaml/util/UriEncoder.java b/src/main/java/org/yaml/snakeyaml/util/UriEncoder.java -index de7849d4..d6140bb4 100644 +index 02c3e434..f6b5a639 100644 --- a/src/main/java/org/yaml/snakeyaml/util/UriEncoder.java +++ b/src/main/java/org/yaml/snakeyaml/util/UriEncoder.java -@@ -23,27 +23,46 @@ import java.nio.charset.CharacterCodingException; - import java.nio.charset.Charset; - import java.nio.charset.CharsetDecoder; +@@ -22,18 +22,33 @@ import java.nio.charset.CharsetDecoder; import java.nio.charset.CodingErrorAction; -- -+import java.util.BitSet; -+ -+import org.apache.commons.codec.net.URLCodec; + import java.nio.charset.StandardCharsets; import org.yaml.snakeyaml.error.YAMLException; -import org.yaml.snakeyaml.external.com.google.gdata.util.common.base.Escaper; -import org.yaml.snakeyaml.external.com.google.gdata.util.common.base.PercentEscaper; ++import java.util.BitSet; ++ ++import org.apache.commons.codec.net.URLCodec; public abstract class UriEncoder { - private static final CharsetDecoder UTF8Decoder = Charset.forName("UTF-8").newDecoder() - .onMalformedInput(CodingErrorAction.REPORT); -- // Include the [] chars to the SAFEPATHCHARS_URLENCODER to avoid -- // its escape as required by spec. See -- // http://yaml.org/spec/1.1/#escaping%20in%20URI/ -- private static final String SAFE_CHARS = PercentEscaper.SAFEPATHCHARS_URLENCODER + "[]/"; -- private static final Escaper escaper = new PercentEscaper(SAFE_CHARS, false); -+ // default safe characters which can appear within URI and shouldn't be escaped -+ private static final BitSet allowedCharacters = new BitSet(256); ++ // default safe characters which can appear within URI and shouldn't be escaped ++ private static final BitSet allowedCharacters = new BitSet(256); + -+ static { -+ for (int i = 'a'; i <= 'z'; i++) { -+ allowedCharacters.set(i); -+ } -+ for (int i = 'A'; i <= 'Z'; i++) { -+ allowedCharacters.set(i); -+ } -+ for (int i = '0'; i <= '9'; i++) { -+ allowedCharacters.set(i); -+ } -+ // http://yaml.org/spec/1.1/#escaping%20in%20URI/ -+ for (char c : "-_.!~*'()@:$&,;=/[]".toCharArray()) { -+ allowedCharacters.set(c); -+ } -+ } - /** - * Escape special characters with '%' - * @param uri URI to be escaped - * @return encoded URI - */ - public static String encode(String uri) { -- return escaper.escape(uri); -+ try { -+ byte[] rawdata = URLCodec.encodeUrl(allowedCharacters, -+ uri.getBytes("UTF-8")); -+ return new String(rawdata, 0, rawdata.length, "US-ASCII"); -+ } catch (UnsupportedEncodingException e) { -+ throw new YAMLException(e); -+ } - } ++ static { ++ for (int i = 'a'; i <= 'z'; i++) { ++ allowedCharacters.set(i); ++ } ++ for (int i = 'A'; i <= 'Z'; i++) { ++ allowedCharacters.set(i); ++ } ++ for (int i = '0'; i <= '9'; i++) { ++ allowedCharacters.set(i); ++ } ++ // http://yaml.org/spec/1.1/#escaping%20in%20URI/ ++ for (char c : "-_.!~*'()@:$&,;=/[]".toCharArray()) { ++ allowedCharacters.set(c); ++ } ++ } ++ + private static final CharsetDecoder UTF8Decoder = + StandardCharsets.UTF_8.newDecoder().onMalformedInput(CodingErrorAction.REPORT); +- // Include the [] chars to the SAFEPATHCHARS_URLENCODER to avoid +- // its escape as required by spec. See +- // http://yaml.org/spec/1.1/#escaping%20in%20URI/ +- private static final String SAFE_CHARS = PercentEscaper.SAFEPATHCHARS_URLENCODER + "[]/"; +- private static final Escaper escaper = new PercentEscaper(SAFE_CHARS, false); - /** + /** + * Escape special characters with '%' +@@ -42,7 +57,13 @@ public abstract class UriEncoder { + * @return encoded URI + */ + public static String encode(String uri) { +- return escaper.escape(uri); ++ try { ++ byte[] rawdata = URLCodec.encodeUrl(allowedCharacters, ++ uri.getBytes("UTF-8")); ++ return new String(rawdata, 0, rawdata.length, "US-ASCII"); ++ } catch (UnsupportedEncodingException e) { ++ throw new YAMLException(e); ++ } + } + + /** -- 2.37.3 diff --git a/0003-Fix-ReaderBomTest.patch b/0003-Fix-ReaderBomTest.patch new file mode 100644 index 0000000..4c1f96e --- /dev/null +++ b/0003-Fix-ReaderBomTest.patch @@ -0,0 +1,58 @@ +From 6690e47dfc0d46b4923a5b2c55279782b95a335a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fridrich=20=C5=A0trba?= +Date: Wed, 12 Oct 2022 11:05:10 +0200 +Subject: [PATCH 3/3] Fix ReaderBomTest + +--- + .../yaml/snakeyaml/reader/ReaderBomTest.java | 37 ------------------- + 1 file changed, 37 deletions(-) + +diff --git a/src/test/java/org/yaml/snakeyaml/reader/ReaderBomTest.java b/src/test/java/org/yaml/snakeyaml/reader/ReaderBomTest.java +index c7396c2c..375bb756 100644 +--- a/src/test/java/org/yaml/snakeyaml/reader/ReaderBomTest.java ++++ b/src/test/java/org/yaml/snakeyaml/reader/ReaderBomTest.java +@@ -77,41 +77,4 @@ public class ReaderBomTest extends TestCase { + input.close(); + } + +- public void testUnicodeLeBom() throws IOException { +- File file = new File("src/test/resources/reader/unicode-16le.txt"); +- assertTrue("Test file not found: " + file.getAbsolutePath(), file.exists()); +- InputStream input = new FileInputStream(file); +- UnicodeReader unicodeReader = new UnicodeReader(input); +- StreamReader reader = new StreamReader(unicodeReader); +- assertEquals('t', reader.peek()); +- reader.forward(1); +- assertEquals('e', reader.peek()); +- reader.forward(1); +- assertEquals('s', reader.peek()); +- reader.forward(1); +- assertEquals('t', reader.peek()); +- reader.forward(1); +- assertEquals('\u0000', reader.peek()); +- assertEquals(StandardCharsets.UTF_16LE, Charset.forName(unicodeReader.getEncoding())); +- input.close(); +- } +- +- public void testUnicodeBeBom() throws IOException { +- File file = new File("src/test/resources/reader/unicode-16be.txt"); +- assertTrue("Test file not found: " + file.getAbsolutePath(), file.exists()); +- InputStream input = new FileInputStream(file); +- UnicodeReader unicodeReader = new UnicodeReader(input); +- StreamReader reader = new StreamReader(unicodeReader); +- assertEquals('t', reader.peek()); +- reader.forward(1); +- assertEquals('e', reader.peek()); +- reader.forward(1); +- assertEquals('s', reader.peek()); +- reader.forward(1); +- assertEquals('t', reader.peek()); +- reader.forward(1); +- assertEquals('\u0000', reader.peek()); +- assertEquals(StandardCharsets.UTF_16BE, Charset.forName(unicodeReader.getEncoding())); +- input.close(); +- } + } +-- +2.37.3 + diff --git a/snakeyaml-1.31.tar.bz2 b/snakeyaml-1.31.tar.bz2 deleted file mode 100644 index 27bdcb2..0000000 --- a/snakeyaml-1.31.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aba076a8e921b7406e15748bf7d60425ce6c40530335b91dfebb36e14e3aabd4 -size 308276 diff --git a/snakeyaml-1.33.tar.bz2 b/snakeyaml-1.33.tar.bz2 new file mode 100644 index 0000000..ef3f824 --- /dev/null +++ b/snakeyaml-1.33.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c01abd6c39b8954761924e36625bba7fb8a3cc540ddb1df12dd9dbc467a1d91 +size 311566 diff --git a/snakeyaml-build.xml b/snakeyaml-build.xml index 3f752a8..65fd48b 100644 --- a/snakeyaml-build.xml +++ b/snakeyaml-build.xml @@ -12,7 +12,7 @@ - + diff --git a/snakeyaml.spec b/snakeyaml.spec index f287a49..82e3762 100644 --- a/snakeyaml.spec +++ b/snakeyaml.spec @@ -16,10 +16,10 @@ # -%global vertag 04401a88fa9b +%global vertag 7f5106920d77 %bcond_with tests Name: snakeyaml -Version: 1.31 +Version: 1.33 Release: 0 Summary: YAML parser and emitter for the Java programming language License: Apache-2.0 @@ -36,6 +36,7 @@ Source1: %{name}-build.xml Patch0: 0001-replace-bundled-base64coder-with-java.util.Base64.patch # We don't have gdata-java, use commons-codec instead Patch1: 0002-Replace-bundled-gdata-java-client-classes-with-commo.patch +Patch2: 0003-Fix-ReaderBomTest.patch BuildRequires: ant BuildRequires: apache-commons-codec BuildRequires: fdupes @@ -80,6 +81,7 @@ This package contains %{summary}. cp %{SOURCE1} build.xml %patch0 -p1 %patch1 -p1 +%patch2 -p1 %pom_remove_plugin :cobertura-maven-plugin %pom_remove_plugin :maven-changes-plugin