diff --git a/Dockerfile-base b/Dockerfile-base index ee6d774..ebaecfa 100644 --- a/Dockerfile-base +++ b/Dockerfile-base @@ -27,7 +27,7 @@ RUN set -ex \ && chmod 755 /usr/local/bin/check \ && rm -f check-${CHECK_VERSION}-linux-${TARGETARCH}.tar.gz -ARG WISP_VERSION=v0.2.7 +ARG WISP_VERSION=v0.2.8 RUN set -ex \ && wget https://github.com/jumpserver/wisp/releases/download/${WISP_VERSION}/wisp-${WISP_VERSION}-linux-${TARGETARCH}.tar.gz \ && tar -xf wisp-${WISP_VERSION}-linux-${TARGETARCH}.tar.gz -C /usr/local/bin/ --strip-components=1 \ @@ -43,7 +43,7 @@ RUN --mount=type=cache,target=/usr/local/share/.cache/yarn,sharing=locked,id=che npm install # Install Maven dependencies -ARG MAVEN_VERSION=3.9.10 +ARG MAVEN_VERSION=3.9.11 ARG USER_HOME_DIR="/root" ARG BASE_URL=https://downloads.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries ARG MAVEN_MIRROR=https://repo.maven.apache.org/maven2 diff --git a/backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/base/BaseSQLActuator.java b/backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/base/BaseSQLActuator.java index f4b730c..41325d7 100644 --- a/backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/base/BaseSQLActuator.java +++ b/backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/base/BaseSQLActuator.java @@ -27,6 +27,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; @Slf4j public abstract class BaseSQLActuator implements SQLActuator { @@ -153,6 +155,8 @@ private void executeStatement(SQLExecutePlan plan, Statement statement, SQLQuery var fieldName = StringUtils.isNotEmpty(resultSet.getMetaData().getColumnLabel(i)) ? resultSet.getMetaData().getColumnLabel(i) : resultSet.getMetaData().getColumnName(i); field.setName(fieldName); + field.setColumnName(resultSet.getMetaData().getColumnName(i)); + field.setLabel(resultSet.getMetaData().getColumnLabel(i)); result.getFields().add(field); } @@ -184,34 +188,7 @@ private void executeStatement(SQLExecutePlan plan, Statement statement, SQLQuery result.setFetchFinishedTime(new Time(System.currentTimeMillis())); // 数据脱敏 - - var rules = SessionManager.getCurrentSession().getDataMaskingRules(); - var maskIndexes = new ArrayList<>(); - var maskRules = new HashMap(); - for (var i = 0; i < result.getFields().size(); i++) { - for (Common.DataMaskingRule rule : rules) { - if (result.getFields().get(i).getName().equalsIgnoreCase(rule.getFieldsPattern())) { - maskIndexes.add(i); - maskRules.put(i, rule); - } - } - } - - for (var i = 0; i < result.getData().size(); i++) { - for (var j = 0; j < result.getData().get(i).size(); j++) { - if (maskIndexes.contains(j)) { - var rule = maskRules.get(j); - var val = result.getData().get(i).get(j); - if (val instanceof String) { - var rep = this.replaceColumnVal(rule, (String) val); - result.getData().get(i).set(j, rep); - } else { - result.getData().get(i).set(j, rule.getMaskPattern()); - } - } - } - } - + this.handleDataMasking(result); var total = this.count(plan); if (total < 0) { @@ -230,9 +207,58 @@ private void executeStatement(SQLExecutePlan plan, Statement statement, SQLQuery } } + private void handleDataMasking(SQLQueryResult result) { + var rules = SessionManager.getCurrentSession().getDataMaskingRules(); + var maskIndexes = new ArrayList<>(); + var maskRules = new HashMap(); + for (var i = 0; i < result.getFields().size(); i++) { + for (Common.DataMaskingRule rule : rules) { + if (matchFiled(result.getFields().get(i), rule.getFieldsPattern())) { + maskIndexes.add(i); + maskRules.put(i, rule); + } + } + } + + for (var i = 0; i < result.getData().size(); i++) { + for (var j = 0; j < result.getData().get(i).size(); j++) { + if (maskIndexes.contains(j)) { + var rule = maskRules.get(j); + var val = result.getData().get(i).get(j); + if (val instanceof String) { + var rep = this.replaceColumnVal(rule, (String) val); + result.getData().get(i).set(j, rep); + } else { + result.getData().get(i).set(j, rule.getMaskPattern()); + } + } + } + } + } + + private boolean matchFiled(Field field, String pattern) { + var names = List.of(field.getColumnName(), field.getLabel()); + var ps = pattern.split(","); + + for (String name : names) { + for (String p : ps) { + + try { + int flags = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE; + var pa = Pattern.compile(p, flags); + if (pa.matcher(name).find()) { + return true; + } + } catch (PatternSyntaxException e) { + return false; + } + } + } + return false; + } - public String replaceColumnVal(Common.DataMaskingRule rule, String val) { + private String replaceColumnVal(Common.DataMaskingRule rule, String val) { if (rule == null) { return "####"; } else { diff --git a/backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/entity/resource/Field.java b/backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/entity/resource/Field.java index 2992b24..34d3ba4 100644 --- a/backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/entity/resource/Field.java +++ b/backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/entity/resource/Field.java @@ -7,6 +7,8 @@ public class Field implements ResourceNode { private String name; + private String label; + private String columnName; private String schema; private String table; private String type;