Skip to content

Commit 0034129

Browse files
committed
[Bug][Seatunnel-web] Support encyrption of datasource data
1 parent d110b97 commit 0034129

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/DatasourceServiceImpl.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.apache.seatunnel.app.service.ITableSchemaService;
3838
import org.apache.seatunnel.app.thirdparty.datasource.DataSourceClientFactory;
3939
import org.apache.seatunnel.app.thirdparty.framework.SeaTunnelOptionRuleWrapper;
40+
import org.apache.seatunnel.app.utils.ConfigShadeUtil;
4041
import org.apache.seatunnel.common.utils.JsonUtils;
4142
import org.apache.seatunnel.datasource.plugin.api.DataSourcePluginInfo;
4243
import org.apache.seatunnel.datasource.plugin.api.DatasourcePluginTypeEnum;
@@ -53,6 +54,7 @@
5354
import org.springframework.beans.BeansException;
5455
import org.springframework.beans.factory.annotation.Autowired;
5556
import org.springframework.beans.factory.annotation.Qualifier;
57+
import org.springframework.beans.factory.annotation.Value;
5658
import org.springframework.context.ApplicationContext;
5759
import org.springframework.context.ApplicationContextAware;
5860
import org.springframework.stereotype.Service;
@@ -93,6 +95,9 @@ public class DatasourceServiceImpl extends SeatunnelBaseServiceImpl
9395

9496
protected static final String DEFAULT_DATASOURCE_PLUGIN_VERSION = "1.0.0";
9597

98+
@Value("${datasource.encryption.type:default}")
99+
private String datasourceEncryptionType;
100+
96101
@Override
97102
public String createDatasource(
98103
Integer userId,
@@ -113,6 +118,7 @@ public String createDatasource(
113118
throw new SeatunnelException(
114119
SeatunnelErrorEnum.DATASOURCE_PRAM_NOT_ALLOWED_NULL, "datasourceConfig");
115120
}
121+
ConfigShadeUtil.encryptData(datasourceConfig, datasourceEncryptionType);
116122
String datasourceConfigStr = JsonUtils.toJsonString(datasourceConfig);
117123
Datasource datasource =
118124
Datasource.builder()
@@ -171,6 +177,7 @@ public boolean updateDatasource(
171177
datasource.setUpdateTime(new Date());
172178
datasource.setDescription(description);
173179
if (MapUtils.isNotEmpty(datasourceConfig)) {
180+
ConfigShadeUtil.encryptData(datasourceConfig, datasourceEncryptionType);
174181
String configJson = JsonUtils.toJsonString(datasourceConfig);
175182
datasource.setDatasourceConfig(configJson);
176183
}
@@ -208,6 +215,7 @@ public boolean testDatasourceConnectionAble(
208215
String pluginVersion,
209216
Map<String, String> datasourceConfig) {
210217
funcPermissionCheck(SeatunnelFuncPermissionKeyConstant.DATASOURCE_TEST_CONNECT, userId);
218+
ConfigShadeUtil.decryptData(datasourceConfig, datasourceEncryptionType);
211219
return DataSourceClientFactory.getDataSourceClient()
212220
.checkDataSourceConnectivity(pluginName, datasourceConfig);
213221
}
@@ -227,6 +235,7 @@ public boolean testDatasourceConnectionAble(Integer userId, Long datasourceId) {
227235
String configJson = datasource.getDatasourceConfig();
228236
Map<String, String> datasourceConfig =
229237
JsonUtils.toMap(configJson, String.class, String.class);
238+
ConfigShadeUtil.decryptData(datasourceConfig, datasourceEncryptionType);
230239
String pluginName = datasource.getPluginName();
231240
return DataSourceClientFactory.getDataSourceClient()
232241
.checkDataSourceConnectivity(pluginName, datasourceConfig);
@@ -276,6 +285,7 @@ public List<String> queryDatabaseByDatasourceName(String datasourceName) {
276285
Map<String, String> datasourceConfig =
277286
JsonUtils.toMap(config, String.class, String.class);
278287

288+
ConfigShadeUtil.decryptData(datasourceConfig, datasourceEncryptionType);
279289
return DataSourceClientFactory.getDataSourceClient()
280290
.getDatabases(pluginName, datasourceConfig);
281291
}
@@ -435,6 +445,7 @@ public PageInfo<DatasourceRes> queryDatasourceList(
435445
datasource.getDatasourceConfig(),
436446
String.class,
437447
String.class);
448+
ConfigShadeUtil.decryptData(datasourceConfig, datasourceEncryptionType);
438449
datasourceRes.setDatasourceConfig(datasourceConfig);
439450
datasourceRes.setCreateUserId(datasource.getCreateUserId());
440451
datasourceRes.setUpdateUserId(datasource.getUpdateUserId());
@@ -504,7 +515,10 @@ public Map<String, String> queryDatasourceConfigById(String datasourceId) {
504515
throw new SeatunnelException(SeatunnelErrorEnum.DATASOURCE_NOT_FOUND, datasourceId);
505516
}
506517
String configJson = datasource.getDatasourceConfig();
507-
return JsonUtils.toMap(configJson, String.class, String.class);
518+
Map<String, String> datasourceConfig =
519+
JsonUtils.toMap(configJson, String.class, String.class);
520+
ConfigShadeUtil.decryptData(datasourceConfig, datasourceEncryptionType);
521+
return datasourceConfig;
508522
}
509523

510524
@Override
@@ -604,6 +618,7 @@ private static DatasourceDetailRes getDatasourceDetailRes(Datasource datasource)
604618

605619
Map<String, String> datasourceConfig =
606620
JsonUtils.toMap(datasource.getDatasourceConfig(), String.class, String.class);
621+
ConfigShadeUtil.decryptData(datasourceConfig, datasourceEncryptionType);
607622
// convert option rule
608623
datasourceDetailRes.setDatasourceConfig(datasourceConfig);
609624
return datasourceDetailRes;

seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/JobInstanceServiceImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package org.apache.seatunnel.app.service.impl;
1919

20+
import org.apache.seatunnel.app.utils.ConfigShadeUtil;
2021
import org.apache.seatunnel.shade.com.fasterxml.jackson.core.type.TypeReference;
2122
import org.apache.seatunnel.shade.com.typesafe.config.Config;
2223
import org.apache.seatunnel.shade.com.typesafe.config.ConfigFactory;
@@ -73,6 +74,7 @@
7374
import org.apache.commons.collections4.CollectionUtils;
7475
import org.apache.commons.lang3.StringUtils;
7576

77+
import org.springframework.beans.factory.annotation.Value;
7678
import org.springframework.stereotype.Service;
7779

7880
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -123,6 +125,11 @@ public class JobInstanceServiceImpl extends SeatunnelBaseServiceImpl
123125

124126
@Resource private IJobMetricsService jobMetricsService;
125127

128+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
129+
130+
@Value("${datasource.encryption.type:default}")
131+
private String datasourceEncryptionType;
132+
126133
@Override
127134
public JobExecutorRes createExecuteResource(
128135
@NonNull Integer userId, @NonNull Long jobDefineId, JobExecParam executeParam) {
@@ -326,6 +333,7 @@ public String generateJobConfig(
326333
.setJson(false)
327334
.setComments(false)
328335
.setOriginComments(false));
336+
env = env + "\"shade.identifier\"=" + datasourceEncryptionType + "\n";
329337
String jobConfig = SeaTunnelConfigUtil.generateConfig(env, sources, transforms, sinks);
330338
return JobUtils.replaceJobConfigPlaceholders(jobConfig, executeParam);
331339
}
@@ -571,6 +579,7 @@ private Config parseConfigWithOptionRule(
571579
String connectorType,
572580
Map<String, String> config,
573581
OptionRule optionRule) {
582+
ConfigShadeUtil.encryptData(config, datasourceEncryptionType);
574583
return parseConfigWithOptionRule(
575584
pluginType, connectorType, ConfigFactory.parseMap(config), optionRule);
576585
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.apache.seatunnel.app.utils;
2+
3+
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.apache.seatunnel.app.common.Constants;
6+
import org.apache.seatunnel.core.starter.utils.ConfigShadeUtils;
7+
8+
import java.util.Map;
9+
10+
@Slf4j
11+
public class ConfigShadeUtil {
12+
13+
public static void encryptData(Map<String, String> datasourceConfig, String datasourceEncryptionType) {
14+
String password = datasourceConfig.get(Constants.PASSWORD);
15+
if(!password.isEmpty()) {
16+
try {
17+
datasourceConfig.replace(
18+
Constants.PASSWORD,
19+
ConfigShadeUtils.encryptOption(
20+
datasourceEncryptionType, password));
21+
} catch (IllegalArgumentException ex) {
22+
log.warn("encrypt password failed");
23+
}
24+
}
25+
}
26+
27+
public static void decryptData(Map<String, String> datasourceConfig, String datasourceEncryptionType) {
28+
String password = datasourceConfig.get(Constants.PASSWORD);
29+
if(!password.isEmpty()) {
30+
try {
31+
datasourceConfig.replace(
32+
Constants.PASSWORD,
33+
ConfigShadeUtils.decryptOption(
34+
datasourceEncryptionType, password));
35+
} catch (IllegalArgumentException ex) {
36+
log.warn("decrypt password failed as password is not encrypted");
37+
}
38+
}
39+
}
40+
41+
42+
}

seatunnel-server/seatunnel-app/src/main/resources/application.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ jwt:
3838
secretKey:
3939
algorithm: HS256
4040

41+
datasource:
42+
encryption:
43+
type: base64
44+
4145
---
4246
spring:
4347
config:

0 commit comments

Comments
 (0)