From 9b15cd609c0e8291e1eb0a21566af111252b7dfd Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 31 Aug 2023 14:17:23 +0200 Subject: [PATCH] StringUtils: contains0x00 implemented to prevent org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 --- .../server/common/data/StringUtils.java | 7 ++++ .../server/common/data/StringUtilsTest.java | 40 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 common/data/src/test/java/org/thingsboard/server/common/data/StringUtilsTest.java diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java b/common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java index a7671f4327..7360f9b8ab 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java @@ -181,6 +181,13 @@ public class StringUtils { return org.apache.commons.lang3.StringUtils.contains(seq, searchSeq); } + /** + * Use this to prevent org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 + **/ + public static boolean contains0x00(final String s) { + return s != null && s.contains("\u0000"); + } + public static String randomNumeric(int length) { return RandomStringUtils.randomNumeric(length); } diff --git a/common/data/src/test/java/org/thingsboard/server/common/data/StringUtilsTest.java b/common/data/src/test/java/org/thingsboard/server/common/data/StringUtilsTest.java new file mode 100644 index 0000000000..4cf21baa99 --- /dev/null +++ b/common/data/src/test/java/org/thingsboard/server/common/data/StringUtilsTest.java @@ -0,0 +1,40 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * 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.thingsboard.server.common.data; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class StringUtilsTest { + + @ParameterizedTest + @ValueSource(strings = { + "\000", "\u0000", " \000", " \000 ", "\000 ", "\000\000", "\000 \000", + "世\000界", "F0929906\000\000\000\000\000\000\000\000\000", + }) + void testContains0x00_thenTrue(String sample) { + assertThat(StringUtils.contains0x00(sample)).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = {"", " ", "abc", "世界", "\001", "\uD83D\uDC0C"}) + void testContains0x00_thenFalse(String sample) { + assertThat(StringUtils.contains0x00(sample)).isFalse(); + } + +}