From 43d79e45b4b5d81e4066ab2d4e2a96063ed85316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=BA=E9=98=B3?= Date: Tue, 28 Feb 2023 18:50:44 +0800 Subject: [PATCH] Fix data quality pwd error (#13643) --- .../quality/flow/batch/reader/JdbcReader.java | 3 +- .../quality/flow/batch/writer/JdbcWriter.java | 3 +- .../data/quality/utils/ParserUtils.java | 58 +++++++++++++++++++ .../data/quality/utils/ParserUtilsTest.java | 39 +++++++++++++ .../plugin/task/dq/utils/RuleParserUtils.java | 9 +-- 5 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtils.java create mode 100644 dolphinscheduler-data-quality/src/test/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtilsTest.java diff --git a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/reader/JdbcReader.java b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/reader/JdbcReader.java index 96f980fcb79f..1fa6991fc436 100644 --- a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/reader/JdbcReader.java +++ b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/reader/JdbcReader.java @@ -31,6 +31,7 @@ import org.apache.dolphinscheduler.data.quality.execution.SparkRuntimeEnvironment; import org.apache.dolphinscheduler.data.quality.flow.batch.BatchReader; import org.apache.dolphinscheduler.data.quality.utils.ConfigUtils; +import org.apache.dolphinscheduler.data.quality.utils.ParserUtils; import org.apache.spark.sql.DataFrameReader; import org.apache.spark.sql.Dataset; @@ -79,7 +80,7 @@ private DataFrameReader jdbcReader(SparkSession sparkSession) { .option(URL, config.getString(URL)) .option(DB_TABLE, config.getString(TABLE)) .option(USER, config.getString(USER)) - .option(PASSWORD, config.getString(PASSWORD)) + .option(PASSWORD, ParserUtils.decode(config.getString(PASSWORD))) .option(DRIVER, config.getString(DRIVER)); Config jdbcConfig = ConfigUtils.extractSubConfig(config, JDBC + DOTS, false); diff --git a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/writer/JdbcWriter.java b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/writer/JdbcWriter.java index 0010c4c6e601..b66eccefb926 100644 --- a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/writer/JdbcWriter.java +++ b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/writer/JdbcWriter.java @@ -32,6 +32,7 @@ import org.apache.dolphinscheduler.data.quality.config.ValidateResult; import org.apache.dolphinscheduler.data.quality.execution.SparkRuntimeEnvironment; import org.apache.dolphinscheduler.data.quality.flow.batch.BatchWriter; +import org.apache.dolphinscheduler.data.quality.utils.ParserUtils; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; @@ -80,7 +81,7 @@ public void write(Dataset data, SparkRuntimeEnvironment env) { .option(URL, config.getString(URL)) .option(DB_TABLE, config.getString(TABLE)) .option(USER, config.getString(USER)) - .option(PASSWORD, config.getString(PASSWORD)) + .option(PASSWORD, ParserUtils.decode(config.getString(PASSWORD))) .mode(config.getString(SAVE_MODE)) .save(); } diff --git a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtils.java b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtils.java new file mode 100644 index 000000000000..e2b3fc5abfc8 --- /dev/null +++ b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtils.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.dolphinscheduler.data.quality.utils; + +import static java.nio.charset.StandardCharsets.UTF_8; + +import java.net.URLDecoder; +import java.net.URLEncoder; + +import lombok.extern.slf4j.Slf4j; + +/** + * ParserUtil + */ +@Slf4j +public class ParserUtils { + + private ParserUtils() { + throw new UnsupportedOperationException("Construct ParserUtils"); + } + + public static String encode(String str) { + String rs = str; + try { + rs = URLEncoder.encode(str, UTF_8.toString()); + } catch (Exception e) { + log.error("encode str exception!", e); + } + + return rs; + } + + public static String decode(String str) { + String rs = str; + try { + rs = URLDecoder.decode(str, UTF_8.toString()); + } catch (Exception e) { + log.error("decode str exception!", e); + } + + return rs; + } +} diff --git a/dolphinscheduler-data-quality/src/test/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtilsTest.java b/dolphinscheduler-data-quality/src/test/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtilsTest.java new file mode 100644 index 000000000000..328316cc391f --- /dev/null +++ b/dolphinscheduler-data-quality/src/test/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtilsTest.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.dolphinscheduler.data.quality.utils; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ParserUtilsTest { + + @Test + public void testParserUtils() { + String testStr = "aaa$bbb$ccc%ddd^eee#fff"; + String encode = ParserUtils.encode(testStr); + String decode = ParserUtils.decode(encode); + Assertions.assertEquals(testStr, decode); + + String blank = ""; + Assertions.assertEquals(ParserUtils.encode(blank), blank); + Assertions.assertEquals(ParserUtils.decode(blank), blank); + + Assertions.assertNull(ParserUtils.encode(null)); + Assertions.assertNull(ParserUtils.decode(null)); + } +} diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/main/java/org/apache/dolphinscheduler/plugin/task/dq/utils/RuleParserUtils.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/main/java/org/apache/dolphinscheduler/plugin/task/dq/utils/RuleParserUtils.java index da29b92dcd18..e8bc50ab4096 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/main/java/org/apache/dolphinscheduler/plugin/task/dq/utils/RuleParserUtils.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/main/java/org/apache/dolphinscheduler/plugin/task/dq/utils/RuleParserUtils.java @@ -60,6 +60,7 @@ import static org.apache.dolphinscheduler.plugin.task.api.utils.DataQualityConstants.USER; import org.apache.dolphinscheduler.common.utils.JSONUtils; +import org.apache.dolphinscheduler.data.quality.utils.ParserUtils; import org.apache.dolphinscheduler.plugin.datasource.api.utils.DataSourceUtils; import org.apache.dolphinscheduler.plugin.task.api.DataQualityTaskExecutionContext; import org.apache.dolphinscheduler.plugin.task.api.enums.dp.ExecuteSqlType; @@ -120,7 +121,7 @@ public static List getReaderConfigList( config.put(URL, DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getSourceType()), sourceDataSource)); config.put(USER, sourceDataSource.getUser()); - config.put(PASSWORD, sourceDataSource.getPassword()); + config.put(PASSWORD, ParserUtils.encode(sourceDataSource.getPassword())); config.put(DRIVER, DataSourceUtils .getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getSourceType()))); String outputTable = sourceDataSource.getDatabase() + "_" + inputParameterValue.get(SRC_TABLE); @@ -147,7 +148,7 @@ public static List getReaderConfigList( config.put(URL, DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getTargetType()), targetDataSource)); config.put(USER, targetDataSource.getUser()); - config.put(PASSWORD, targetDataSource.getPassword()); + config.put(PASSWORD, ParserUtils.encode(targetDataSource.getPassword())); config.put(DRIVER, DataSourceUtils .getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getTargetType()))); String outputTable = targetDataSource.getDatabase() + "_" + inputParameterValue.get(TARGET_TABLE); @@ -280,7 +281,7 @@ public static List getWriterConfigList( config.put(URL, DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getWriterType()), writerDataSource)); config.put(USER, writerDataSource.getUser()); - config.put(PASSWORD, writerDataSource.getPassword()); + config.put(PASSWORD, ParserUtils.encode(writerDataSource.getPassword())); config.put(DRIVER, DataSourceUtils .getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getWriterType()))); config.put(SQL, sql); @@ -350,7 +351,7 @@ public static BaseConfig getStatisticsValueConfig( config.put(URL, DataSourceUtils.getJdbcUrl( DbType.of(dataQualityTaskExecutionContext.getStatisticsValueType()), writerDataSource)); config.put(USER, writerDataSource.getUser()); - config.put(PASSWORD, writerDataSource.getPassword()); + config.put(PASSWORD, ParserUtils.encode(writerDataSource.getPassword())); config.put(DRIVER, DataSourceUtils .getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getWriterType()))); }