From 6baf37fb3a688dd546567d4c929a8ed88c3c977d Mon Sep 17 00:00:00 2001 From: Marcin Nowak Date: Tue, 10 Feb 2026 12:24:37 +0100 Subject: [PATCH] UTF-8-BOM Added --- .vs/CommunityCommons/v17/.wsuo | Bin 0 -> 12800 bytes .vs/CommunityCommons/v17/DocumentLayout.json | 67 +++++++ .vs/VSWorkspaceState.json | 6 + .vs/slnx.sqlite | Bin 0 -> 249856 bytes src/CommunityCommons/CommunityCommons.mpr | Bin 1671168 -> 1675264 bytes .../communitycommons/StringUtils.java | 173 +++++++++++------- .../actions/StringFromFile.java | 25 ++- .../actions/StringToFile.java | 6 + 8 files changed, 201 insertions(+), 76 deletions(-) create mode 100644 .vs/CommunityCommons/v17/.wsuo create mode 100644 .vs/CommunityCommons/v17/DocumentLayout.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/slnx.sqlite diff --git a/.vs/CommunityCommons/v17/.wsuo b/.vs/CommunityCommons/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..d52b54eea0bd66c19e911919579858f067f1b435 GIT binary patch literal 12800 zcmeHN-)|g89iK~@G-(q`ni8Ot)TE|_#OvXw^IK@qh#m@PJhDz*E&y@x%jxH&pQee*u30YRu=ecY9u6?)Q~6M4r{` z&d#sT%=g!RXJ-HU;MhNZ`TooQ5^dpv*e@P#9~K8w`I%H&d{Kz!@y@)5+uPeLVj9W4 z@P9;s>!N}y5))!Ul<};JEwXapa6%kt@%-67t(N|F>qqx~{*TNN*84)E@)8g$;yrN% z=pj-IVzW;#yNgeVeJy;FeRpZ+Hyhay-#8@r#N7}jjG!tMVga;}h^kqy+hbDf%cR-e ztzJ6+HN31fGo-jDYGNKZ4fHLsjx;$jSa=2a)H~|wpz}}kl?X2(ewv;@Gkv_--(ftz z+)T6GQKZSb7Z6FqV~8gZS#}7|FClU)e18$oW_Np!CzJw@Q~$-(_gnh^5d{e$(Z9#3 z|9Rl<>3>ZAmVPF7fO^YFTTXpW^q+YQo%H`X)N7P(ZzuZC_XDZ?q+!oyIcT^4wDXDFbbEfSL!F7Xyvfx2w~#)K_-({9h-VR}5H-YU z#BMn0{3najPv&R}!pGIH!gobc1hMxs4gaSCZ>SDGq=-}*G{1_cMEM+^^_GWn0shBH z@Z%Lk&Jd5j!9oq%7KUN)B|N1_T!MEdf$xhuXn%18|1XDj>2(dqF-}NxcAS1jZ95MB z9Joxn*2D@pt>BH4zw|#FUTCe)phoe3siR4^^n5+Y(`{VzyH{hco4i#RQ~xkA0{>5; zTYm2t+VLq}3S(Gz108+VQy#@!x^0$M}m7oW?OE}ee6r<3;m;Nnc zzUx5cKEP^|7L|C7+8KXp1pdE_u9lnKwe!D$Nju+IiO)h3H^d^|${0-}H$4*apL8cr z2c`d4QJ20BLjm)ZF`w_mC`7)FJo25o|6S-k?GkNc4d1{b?op#@e0Q4o#AZkpbxo$} zpQiC5Mp8y>Si)(1m1%#8~FWG3_Ov0bz%+?^=)WbDUd;-3Rj>~}8$$PJm=~XyH*(ZPh%kTg6;h$HAXcAXl zm$gV$fAf=3+yC^;2Y<+&9=-jr<87}``aP}dKib*7(3=9SLz_gAj!+uZV$rWwYLzgW zUMbeQetr)R@lXorRoz zR!SvRoxWZ#7gQ7#%eQOuGLqaInVh*&yId@(X8x=n74NDGYqxG)lKvVhUM{Lq@Y)Po zl4i9l&=8#Y!!@u6)!jZQZD;fW61lISYoW&1>ORn6ibEVsGcWSDsm~*5@kg z>#`gytIg{pkt)}UUa?e+wx$<0 zl^>HPnHELn5JeQ>aJ*sl9|-vP{Zc5Ny(>#~b?cTmM3g3oILxhrV~M|bjBhMHx}RHO zJBOa1gZ{*l?Di*VN|HgwtrA#9G3Epxr&JtF_$CgMfX8^F^KkUJ1|^XkKE#J#!#8WS zpdXa5u9Z1NV%+xhL&w3VFUR&feQaFB>%d{$@ed5tqhg|I=_=#orTh6`r!y(akAjuh zl~LNV4f*~9#5r+Jyen?Nd**7jhV%?vJ^SN7zWM$qzkP80*Q?kJEC?rj>EnkVpS=33Uj)DV*~x#qU7L&35OnJB zr0zOFkhcuYk-n>0p6hE~-t@J+VTZPohHr;h{c=*Yn+P8jFLE2>(i?^4bB5`h)6f0T z&KZsq=vmEmTvM~8GBxRihGy!vVdhQC_EqkFx`AQj1JguZm9+!SGWCx{v{0vI{P<#D^yBK&9V&#{YzJKa&DlxmaoiQU^u2HQ`Mz34I?KF%>}$>Aj5w>Ed9_fbqle1#EKS);#~{&zXW4npG^7koE0=ZiZVFY` zEl*{0SuO9_AY|V5H8(Jn=1Skp`azfvtaSCjcJhYl+nVdTr$nR!RI@_`J@ zYR}lA*+=Je@#aPHZikY}@a(_{9nJN!zGk@| z_#RrJ=7oMfD;>wl=7LANiRrWZHm?2*bN=!)p8qVu65bFKv2{$JcTHf&t%&`Wey0$l z?7#B=1B(4;71ArbVf$>~e;r}}f9U_8p0fS_`1|uY?*GU1KLy594hG?WdjGlc|Cx_} z?yO{<85eS^5@+=a;kkM#Pdh`Q1llE#m}N{a{k-C z`?!PN2e?_x|L=&Kgh5)FsC2qnk$dYk_-M)QdI5XhJo$)l0zt~`-tB+1cg~;xZ1A59 zj^WW7kLGYkH93D<0Yb93%+sb#(4QV8{{`rG_Qjr00iVk^+Ot9N=}skn?<{yO!T&9c zgJ&!J9#!J~ehm^ihx5NIu32FU7k69ag@e{Rf#*Lw&l!gPZ=inSa?AsblurJ-OrHlV zp^T$S{(>@My6 z_Dy7;>0C5)?%w|Yc>Dj<8~#5)%^l_ZVcheBWoQ^RZ64<^Hsp=^WnsayfOrXa7tcJ_ zkMqz#0~$Dw97E(#hksEEf%C7H>qoAG2c3WV`~P3){1G(( literal 0 HcmV?d00001 diff --git a/.vs/CommunityCommons/v17/DocumentLayout.json b/.vs/CommunityCommons/v17/DocumentLayout.json new file mode 100644 index 00000000..90cf834f --- /dev/null +++ b/.vs/CommunityCommons/v17/DocumentLayout.json @@ -0,0 +1,67 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\NowakM1\\source\\repos\\CommunityCommons\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 1, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedHeight": 206, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:128:0:{75188d03-9892-4ae2-abf1-207126247ce5}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}" + } + ] + }, + { + "DockedHeight": 206, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{a80febb4-e7e0-4147-b476-21aaf2453969}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{004be353-6879-467c-9d1e-9ac23cdf6d49}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{d78612c7-9962-4b83-95d9-268046dad23a}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{34e76e81-ee4a-11d0-ae2e-00a0c90fffc3}" + } + ] + }, + { + "DockedHeight": 117, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{e1b7d1f8-9b3c-49b1-8f4f-bfc63a88835d}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 00000000..6b611411 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..841c6f65223a2e3c0daf42068c1847891ce39e6b GIT binary patch literal 249856 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�#F7!m`DtHK-25;-5LxrJzU?=cx@Z;bc!7W;a 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 R;4}r=rOmlr&z0>o8vt9jm_Psk delta 336 zcmWl|ze@s9902h5?!5QzQcL@74IXZisEJ(-YIY7K2RR7BiA4CTp+pX$=q8~-f&#U-ICtvG;&tUI65uV zl5M-TRn@gz&a(E4^|hL98l`;to3bB`JP8TP?>EU%a1k!SWj;0nH2DW` CT5;_F diff --git a/src/CommunityCommons/javasource/communitycommons/StringUtils.java b/src/CommunityCommons/javasource/communitycommons/StringUtils.java index b61b7b9f..1b0886c5 100644 --- a/src/CommunityCommons/javasource/communitycommons/StringUtils.java +++ b/src/CommunityCommons/javasource/communitycommons/StringUtils.java @@ -53,15 +53,11 @@ public class StringUtils { static final String SPECIAL = stringRange('!', '/'); private static final String ALPHANUMERIC = UPPERCASE_ALPHA + LOWERCASE_ALPHA + DIGITS; - static final Map SANITIZER_POLICIES = - Map.ofEntries( + static final Map SANITIZER_POLICIES = Map.ofEntries( new SimpleEntry<>(BLOCKS.name(), Sanitizers.BLOCKS), new SimpleEntry<>(FORMATTING.name(), Sanitizers.FORMATTING), - new SimpleEntry<>(IMAGES.name(), Sanitizers.IMAGES), - new SimpleEntry<>(LINKS.name(), Sanitizers.LINKS), - new SimpleEntry<>(STYLES.name(), Sanitizers.STYLES), - new SimpleEntry<>(TABLES.name(), Sanitizers.TABLES) - ); + new SimpleEntry<>(IMAGES.name(), Sanitizers.IMAGES), new SimpleEntry<>(LINKS.name(), Sanitizers.LINKS), + new SimpleEntry<>(STYLES.name(), Sanitizers.STYLES), new SimpleEntry<>(TABLES.name(), Sanitizers.TABLES)); public static final String HASH_ALGORITHM = "SHA-256"; @@ -93,16 +89,17 @@ public static String hash(String value, int length) throws NoSuchAlgorithmExcept } /** - * The default replaceAll microflow function doesn't support capture variables such as $1, $2 - * etc. so for that reason we do not deprecate this method. + * The default replaceAll microflow function doesn't support capture variables + * such as $1, $2 etc. so for that reason we do not deprecate this method. * * @param haystack The string to replace patterns in * @param needleRegex The regular expression pattern - * @param replacement The string that should come in place of the pattern matches. - * @return The resulting string, where all matches have been replaced by the replacement. + * @param replacement The string that should come in place of the pattern + * matches. + * @return The resulting string, where all matches have been replaced by the + * replacement. */ - public static String regexReplaceAll(String haystack, String needleRegex, - String replacement) { + public static String regexReplaceAll(String haystack, String needleRegex, String replacement) { Pattern pattern = Pattern.compile(needleRegex); Matcher matcher = pattern.matcher(haystack); return matcher.replaceAll(replacement); @@ -126,8 +123,8 @@ public static String randomString(int length) { return randomStringFromCharArray(length, ALPHANUMERIC.toCharArray()); } - public static String substituteTemplate(final IContext context, String template, - final IMendixObject substitute, final boolean HTMLEncode, final String datetimeformat) { + public static String substituteTemplate(final IContext context, String template, final IMendixObject substitute, + final boolean HTMLEncode, final String datetimeformat) { return regexReplaceAll(template, "\\{(@)?([\\w./]+)\\}", (MatchResult match) -> { String value; String path = match.group(2); @@ -144,7 +141,8 @@ public static String substituteTemplate(final IContext context, String template, }); } - public static String regexReplaceAll(String source, String regexString, Function replaceFunction) { + public static String regexReplaceAll(String source, String regexString, + Function replaceFunction) { if (source == null || source.trim().isEmpty()) // avoid NPE's, save CPU { return ""; @@ -214,6 +212,25 @@ public static String base64EncodeFile(IContext context, FileDocument file) throw } } + public static String stringFromFileUtf8Bom(IContext context, FileDocument source) throws IOException { + if (source == null) { + return null; + } + + // Read using normal UTF‑8 + String value = stringFromFile(context, source, StandardCharsets.UTF_8); + if (value == null || value.isEmpty()) { + return value; + } + + // Remove BOM character (U+FEFF) if present at the beginning + if (value.charAt(0) == '\uFEFF') { + return value.substring(1); + } + + return value; + } + public static String stringFromFile(IContext context, FileDocument source) throws IOException { return stringFromFile(context, source, StandardCharsets.UTF_8); } @@ -231,11 +248,25 @@ public static String stringFromInputStream(InputStream inputStream, Charset char return IOUtils.toString(BOMInputStream.builder().setInputStream(inputStream).get(), charset); } + public static void stringToFileUtf8Bom(IContext context, String value, FileDocument destination) + throws IOException { + if (destination == null) { + throw new IllegalArgumentException("Destination file is null"); + } + if (value == null) { + throw new IllegalArgumentException("Value to write is null"); + } + + // Prepend BOM as U+FEFF, then write with standard UTF-8 + stringToFile(context, "\uFEFF" + value, destination, StandardCharsets.UTF_8); + } + public static void stringToFile(IContext context, String value, FileDocument destination) throws IOException { stringToFile(context, value, destination, StandardCharsets.UTF_8); } - public static void stringToFile(IContext context, String value, FileDocument destination, Charset charset) throws IOException { + public static void stringToFile(IContext context, String value, FileDocument destination, Charset charset) + throws IOException { if (destination == null) { throw new IllegalArgumentException("Destination file is null"); } @@ -281,30 +312,32 @@ public void handleEndTag(HTML.Tag tag, int pos) { } /** - * Returns a random strong password containing a specified minimum number of uppercase, digits - * and the exact number of special characters. + * Returns a random strong password containing a specified minimum number of + * uppercase, digits and the exact number of special characters. * * @param minLen Minimum length * @param maxLen Maximum length * @param noOfCAPSAlpha Minimum number of capitals * @param noOfDigits Minimum number of digits * @param noOfSplChars Exact number of special characters - * @deprecated Use the overload randomStrongPassword instead + * @deprecated Use the overload randomStrongPassword instead */ @Deprecated - public static String randomStrongPassword(int minLen, int maxLen, int noOfCAPSAlpha, int noOfDigits, int noOfSplChars) { + public static String randomStrongPassword(int minLen, int maxLen, int noOfCAPSAlpha, int noOfDigits, + int noOfSplChars) { if (minLen > maxLen) { throw new IllegalArgumentException("Min. Length > Max. Length!"); } if ((noOfCAPSAlpha + noOfDigits + noOfSplChars) > minLen) { - throw new IllegalArgumentException("Min. Length should be atleast sum of (CAPS, DIGITS, SPL CHARS) Length!"); + throw new IllegalArgumentException( + "Min. Length should be atleast sum of (CAPS, DIGITS, SPL CHARS) Length!"); } return generateCommonLangPassword(minLen, maxLen, noOfCAPSAlpha, 0, noOfDigits, noOfSplChars); } /** - * Returns a random strong password containing a specified minimum number of uppercase, lowercase, digits - * and the exact number of special characters. + * Returns a random strong password containing a specified minimum number of + * uppercase, lowercase, digits and the exact number of special characters. * * @param minLen Minimum length * @param maxLen Maximum length @@ -313,19 +346,24 @@ public static String randomStrongPassword(int minLen, int maxLen, int noOfCAPSAl * @param noOfDigits Minimum number of digits * @param noOfSplChars Exact number of special characters */ - public static String randomStrongPassword(int minLen, int maxLen, int noOfCAPSAlpha, int noOfLowercaseAlpha, int noOfDigits, int noOfSplChars) { + public static String randomStrongPassword(int minLen, int maxLen, int noOfCAPSAlpha, int noOfLowercaseAlpha, + int noOfDigits, int noOfSplChars) { if (minLen > maxLen) { throw new IllegalArgumentException("Min. Length > Max. Length!"); } if ((noOfCAPSAlpha + noOfLowercaseAlpha + noOfDigits + noOfSplChars) > minLen) { - throw new IllegalArgumentException("Min. Length should be atleast sum of (CAPS, LOWER, DIGITS, SPL CHARS) Length!"); + throw new IllegalArgumentException( + "Min. Length should be atleast sum of (CAPS, LOWER, DIGITS, SPL CHARS) Length!"); } return generateCommonLangPassword(minLen, maxLen, noOfCAPSAlpha, noOfLowercaseAlpha, noOfDigits, noOfSplChars); } // See https://www.baeldung.com/java-generate-secure-password - // Implementation inspired by https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-string-apis (under MIT license) - private static String generateCommonLangPassword(int minLen, int maxLen, int noOfCapsAlpha, int noOfLowercaseAlpha, int noOfDigits, int noOfSplChars) { + // Implementation inspired by + // https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-string-apis + // (under MIT license) + private static String generateCommonLangPassword(int minLen, int maxLen, int noOfCapsAlpha, int noOfLowercaseAlpha, + int noOfDigits, int noOfSplChars) { String upperCaseLetters = randomStringFromCharArray(noOfCapsAlpha, UPPERCASE_ALPHA.toCharArray()); String lowerCaseLetters = randomStringFromCharArray(noOfLowercaseAlpha, LOWERCASE_ALPHA.toCharArray()); String numbers = randomStringFromCharArray(noOfDigits, DIGITS.toCharArray()); @@ -336,29 +374,24 @@ private static String generateCommonLangPassword(int minLen, int maxLen, int noO final int upperBound = maxLen - fixedNumber; String totalChars = randomStringFromCharArray(lowerBound, upperBound, ALPHANUMERIC.toCharArray()); - String combinedChars = upperCaseLetters - .concat(lowerCaseLetters) - .concat(numbers) - .concat(specialChar) - .concat(totalChars); - List pwdChars = combinedChars.chars() - .mapToObj(c -> (char) c) - .collect(Collectors.toList()); + String combinedChars = upperCaseLetters.concat(lowerCaseLetters).concat(numbers).concat(specialChar) + .concat(totalChars); + List pwdChars = combinedChars.chars().mapToObj(c -> (char) c).collect(Collectors.toList()); Collections.shuffle(pwdChars); - String password = pwdChars.stream() - .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) - .toString(); + String password = pwdChars.stream().collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString(); return password; } /** - * Generate a secure random string using the given array of characters, of which the resulting - * string will be composed of. + * Generate a secure random string using the given array of characters, of which + * the resulting string will be composed of. * * @param count The length of the random string. * @param allowedChars The characters used for constructing the random string. * @return A random string. - * @throws IllegalArgumentException if count is negative or allowedChars is null or empty. + * @throws IllegalArgumentException if count is negative or + * allowedChars is null or empty. */ private static String randomStringFromCharArray(int count, final char[] allowedChars) { if (count == 0) @@ -381,33 +414,44 @@ private static String randomStringFromCharArray(int count, final char[] allowedC } /** - * Generate a random string with a random length between minLengthBound and maxLengthBound (inclusive), + * Generate a random string with a random length between + * minLengthBound and maxLengthBound (inclusive), * using the given set of allowed characters. * * @param minLengthBound The lower bound for the random length of the string. * @param maxLengthBound The upper bound for the random length of the string. - * @param allowedChars An array of characters of which the resulting string will be made up of. - * @return A random string with a length between minLengthBound and maxLengthBound. - * @throws IllegalArgumentException if minLengthBound is larger than maxLengthBound. + * @param allowedChars An array of characters of which the resulting string + * will be made up of. + * @return A random string with a length between minLengthBound and + * maxLengthBound. + * @throws IllegalArgumentException if minLengthBound is larger + * than maxLengthBound. */ private static String randomStringFromCharArray(int minLengthBound, int maxLengthBound, final char[] allowedChars) { if (minLengthBound == maxLengthBound) return randomStringFromCharArray(minLengthBound, allowedChars); if (minLengthBound > maxLengthBound) - throw new IllegalArgumentException("The minimum bound (" + minLengthBound + ") was larger than the maximum bound (" + maxLengthBound + "."); - final int randomLength = minLengthBound + RANDOM.nextInt(maxLengthBound - minLengthBound + 1); // add one to make the range inclusive. + throw new IllegalArgumentException("The minimum bound (" + minLengthBound + + ") was larger than the maximum bound (" + maxLengthBound + "."); + final int randomLength = minLengthBound + RANDOM.nextInt(maxLengthBound - minLengthBound + 1); // add one to + // make the + // range + // inclusive. return randomStringFromCharArray(randomLength, allowedChars); } /** - * Produces a 'range' string starting from the begin character up to - * the end character (inclusive range). For example, for the range (a-z), - * this method will generate the lowercase alphabet. + * Produces a 'range' string starting from the begin character up + * to the end character (inclusive range). For example, for the + * range (a-z), this method will generate the lowercase alphabet. * * @param begin The starting point of the string. * @param end The ending point of the string. - * @return A string from begin to end (inclusive range). - * @throws IllegalArgumentException if the begin character has a higher code point than the end character. + * @return A string from begin to end (inclusive + * range). + * @throws IllegalArgumentException if the begin character has a + * higher code point than the end + * character. */ private static String stringRange(char begin, char end) { if (begin > end) { @@ -420,7 +464,8 @@ private static String stringRange(char begin, char end) { return builder.toString(); } - private static byte[] generateHmacSha256Bytes(String key, String valueToEncrypt) throws UnsupportedEncodingException, IllegalStateException, InvalidKeyException, NoSuchAlgorithmException { + private static byte[] generateHmacSha256Bytes(String key, String valueToEncrypt) + throws UnsupportedEncodingException, IllegalStateException, InvalidKeyException, NoSuchAlgorithmException { SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); Mac mac = Mac.getInstance("HmacSHA256"); mac.init(secretKey); @@ -438,7 +483,8 @@ public static String generateHmacSha256(String key, String valueToEncrypt) { result.append(String.format("%02x", b)); } return result.toString(); - } catch (UnsupportedEncodingException | IllegalStateException | InvalidKeyException | NoSuchAlgorithmException e) { + } catch (UnsupportedEncodingException | IllegalStateException | InvalidKeyException + | NoSuchAlgorithmException e) { throw new RuntimeException("CommunityCommons::generateHmacSha256::Unable to encode: " + e.getMessage(), e); } } @@ -446,18 +492,19 @@ public static String generateHmacSha256(String key, String valueToEncrypt) { public static String generateHmacSha256Hash(String key, String valueToEncrypt) { try { return Base64.getEncoder().encodeToString(generateHmacSha256Bytes(key, valueToEncrypt)); - } catch (UnsupportedEncodingException | IllegalStateException | InvalidKeyException | NoSuchAlgorithmException e) { - throw new RuntimeException("CommunityCommons::generateHmacSha256Hash::Unable to encode: " + e.getMessage(), e); + } catch (UnsupportedEncodingException | IllegalStateException | InvalidKeyException + | NoSuchAlgorithmException e) { + throw new RuntimeException("CommunityCommons::generateHmacSha256Hash::Unable to encode: " + e.getMessage(), + e); } } public static String escapeHTML(String input) { - return input.replace("&", "&") - .replace("<", "<") - .replace(">", ">") - .replace("\"", """) - .replace("'", "'");// notice this one: for xml "'" would be "'" (http://blogs.msdn.com/b/kirillosenkov/archive/2010/03/19/apos-is-in-xml-in-html-use-39.aspx) - // OWASP also advises to escape "/" but give no convincing reason why: https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet + return input.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """) + .replace("'", "'");// notice this one: for xml "'" would be "'" + // (http://blogs.msdn.com/b/kirillosenkov/archive/2010/03/19/apos-is-in-xml-in-html-use-39.aspx) + // OWASP also advises to escape "/" but give no convincing reason why: + // https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet } public static String regexQuote(String unquotedLiteral) { diff --git a/src/CommunityCommons/javasource/communitycommons/actions/StringFromFile.java b/src/CommunityCommons/javasource/communitycommons/actions/StringFromFile.java index 6ead9814..b1fa3e46 100644 --- a/src/CommunityCommons/javasource/communitycommons/actions/StringFromFile.java +++ b/src/CommunityCommons/javasource/communitycommons/actions/StringFromFile.java @@ -17,22 +17,17 @@ import com.mendix.systemwideinterfaces.core.UserAction; /** - * Reads the contents form the provided file document, using the specified encoding, and returns it as string. + * Reads the contents form the provided file document, using the specified + * encoding, and returns it as string. */ -public class StringFromFile extends UserAction -{ +public class StringFromFile extends UserAction { /** @deprecated use source.getMendixObject() instead. */ @java.lang.Deprecated(forRemoval = true) private final IMendixObject __source; private final system.proxies.FileDocument source; private final communitycommons.proxies.StandardEncodings encoding; - public StringFromFile( - IContext context, - IMendixObject _source, - java.lang.String _encoding - ) - { + public StringFromFile(IContext context, IMendixObject _source, java.lang.String _encoding) { super(context); this.__source = _source; this.source = _source == null ? null : system.proxies.FileDocument.initialize(getContext(), _source); @@ -40,9 +35,13 @@ public StringFromFile( } @java.lang.Override - public java.lang.String executeAction() throws Exception - { + public java.lang.String executeAction() throws Exception { // BEGIN USER CODE + + if (this.encoding == communitycommons.proxies.StandardEncodings.UTF_8_BOM) { + return StringUtils.stringFromFileUtf8Bom(getContext(), source); + } + Charset charset = StandardCharsets.UTF_8; if (this.encoding != null) charset = Charset.forName(this.encoding.name().replace('_', '-')); @@ -52,11 +51,11 @@ public java.lang.String executeAction() throws Exception /** * Returns a string representation of this action + * * @return a string representation of this action */ @java.lang.Override - public java.lang.String toString() - { + public java.lang.String toString() { return "StringFromFile"; } diff --git a/src/CommunityCommons/javasource/communitycommons/actions/StringToFile.java b/src/CommunityCommons/javasource/communitycommons/actions/StringToFile.java index ec76e711..a5ad1af1 100644 --- a/src/CommunityCommons/javasource/communitycommons/actions/StringToFile.java +++ b/src/CommunityCommons/javasource/communitycommons/actions/StringToFile.java @@ -47,6 +47,12 @@ public StringToFile( public java.lang.Boolean executeAction() throws Exception { // BEGIN USER CODE + + if (this.encoding == communitycommons.proxies.StandardEncodings.UTF_8_BOM) { + StringUtils.stringToFileUtf8Bom(getContext(), value, destination); + return true; + } + Charset charset = StandardCharsets.UTF_8; if (this.encoding != null) charset = Charset.forName(this.encoding.name().replace('_', '-'));