Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Dockerfile-base
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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<Integer, Common.DataMaskingRule>();
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) {
Expand All @@ -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<Integer, Common.DataMaskingRule>();
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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading