From 5c372857cf74d3b85e2f093b4bdd2db2ec21c2e5 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Thu, 16 Sep 2021 14:56:31 +0800 Subject: [PATCH 1/4] =?UTF-8?q?REPORT-56220=20=E6=95=B0=E6=8D=AE=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E8=B6=8A=E6=9D=83=E6=BC=8F=E6=B4=9E=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/JTemplate.java | 21 ++- .../authority/DSColumnAuthorityChecker.java | 16 ++ .../authority/ElementAuthorityChecker.java | 26 ++++ .../authority/FormulaAuthorityChecker.java | 27 ++++ .../authority/JTemplateAuthorityChecker.java | 147 ++++++++++++++++++ ...ameDatabaseConnectionAuthorityChecker.java | 17 ++ .../NameTableDataAuthorityChecker.java | 16 ++ 7 files changed, 262 insertions(+), 8 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/authority/JTemplateAuthorityChecker.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 70d1f3e0e..aac3268be 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -43,6 +43,7 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.authority.JTemplateAuthorityChecker; import com.fr.design.mainframe.chart.info.ChartInfoCollector; import com.fr.design.mainframe.check.CheckButton; import com.fr.design.mainframe.template.info.TemplateProcessInfo; @@ -247,6 +248,7 @@ public abstract class JTemplate> } } } + private void stopListenThemeConfig() { if (themeConfigChangeListener != null) { TemplateThemeConfig config = getUsingTemplateThemeConfig(); @@ -269,7 +271,7 @@ public abstract class JTemplate> public void fireTabChange() { // do nothing } - + protected void addPane(PropertyItemPaneProvider provider) { // do nothing } @@ -1404,7 +1406,7 @@ public abstract class JTemplate> * @return 按钮组 */ public UIButton[] createExtraButtons() { - UIButton[] uiButtons = new UIButton[] { + UIButton[] uiButtons = new UIButton[]{ (UIButton) new CompileAction().createToolBarComponent() }; Set providers = ExtraDesignClassManager.getInstance().getArray(DesignerFrameUpButtonProvider.XML_TAG); @@ -1549,13 +1551,16 @@ public abstract class JTemplate> } private boolean saveRealFile() throws Exception { - FILE editingFILE = this.getEditingFILE(); - if (editingFILE == null || editingFILE instanceof MemFILE) { - return false; + if (new JTemplateAuthorityChecker(this).isAuthority()) { + FILE editingFILE = this.getEditingFILE(); + if (editingFILE == null || editingFILE instanceof MemFILE) { + return false; + } + this.getTarget().export(TemplateResourceManager.getResource().saveTemplate(editingFILE)); + this.editingFILE = editingFILE; + return true; } - this.getTarget().export(TemplateResourceManager.getResource().saveTemplate(editingFILE)); - this.editingFILE = editingFILE; - return true; + return false; } private CallbackSaveWorker saveAs(boolean showLoc) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java new file mode 100644 index 000000000..b27418ebf --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java @@ -0,0 +1,16 @@ +package com.fr.design.mainframe.authority; + +import com.fr.report.cell.cellattr.core.group.DSColumn; +import java.util.Set; + +public class DSColumnAuthorityChecker extends ElementAuthorityChecker { + + @Override + String checkDatasetName(DSColumn dsColumn, Set authDatasetNames) { + if (!authDatasetNames.contains(dsColumn.getDSName())) { + return dsColumn.getDSName(); + } + return null; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java new file mode 100644 index 000000000..020dda470 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java @@ -0,0 +1,26 @@ +package com.fr.design.mainframe.authority; + +import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl; + +import java.lang.reflect.Type; +import java.util.Set; + + +public abstract class ElementAuthorityChecker { + //检查是否有越权的数据连接,如果有返回名称,没有返回null + String checkConnectionName(T t, Set authConnectionNames) { + return null; + } + + //检查是否有越权的服务器数据集,如果有返回名称,没有返回null + String checkDatasetName(T t, Set authDatasetNames) { + return null; + } + + //要检查对象的className + String getCheckClassName() { + ParameterizedTypeImpl parameterizedType = (ParameterizedTypeImpl) this.getClass().getGenericSuperclass(); + Type type = parameterizedType.getActualTypeArguments()[0]; + return type.getTypeName(); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java new file mode 100644 index 000000000..7333678c2 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java @@ -0,0 +1,27 @@ +package com.fr.design.mainframe.authority; + +import com.fr.base.Formula; +import com.fr.parser.FunctionCall; +import com.fr.parser.StringLiteral; +import com.fr.script.Calculator; + +import java.lang.reflect.Field; +import java.util.Set; + +public class FormulaAuthorityChecker extends ElementAuthorityChecker { + @Override + public String checkConnectionName(Formula formula, Set authConnectionNames) { + String content = formula.getContent(); + try { + FunctionCall functionCall = (FunctionCall) Calculator.createCalculator().parse(content).getConditionalExpression(); + StringLiteral stringLiteral = (StringLiteral) functionCall.getArguments()[0]; + String connectionName = (String) Calculator.createCalculator().evalValue(stringLiteral); + if (!authConnectionNames.contains(connectionName)) { + return connectionName; + } + } catch (Exception ignore) { + + } + return null; + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/JTemplateAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/JTemplateAuthorityChecker.java new file mode 100644 index 000000000..47ad2e215 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/JTemplateAuthorityChecker.java @@ -0,0 +1,147 @@ +package com.fr.design.mainframe.authority; + + +import com.fr.design.dialog.FineJOptionPane; + +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; +import com.fr.invoke.ClassHelper; + +import com.fr.log.FineLoggerFactory; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.authority.user.UserAuthority; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + + +import static javax.swing.JOptionPane.WARNING_MESSAGE; + + +public class JTemplateAuthorityChecker { + JTemplate jTemplate; + Set authConnectionNames; + Set authDatasetNames; + Map checkerMap = new HashMap<>(); + Set authFailConnectionNames = new HashSet<>(); + Set authFailDatasetNames = new HashSet<>(); + + + public JTemplateAuthorityChecker(JTemplate jTemplate) { + long s = System.currentTimeMillis(); + this.jTemplate = jTemplate; + this.initAuthNames(); + this.initChecker(); + FineLoggerFactory.getLogger().info("JTemplateAuthorityChecker init time consume:" + (System.currentTimeMillis() - s)); + } + + private void initAuthNames() { + UserAuthority templateAuthority = WorkContext.getCurrent().get(UserAuthority.class); + Map> allAuthNames = templateAuthority.getAuthServerDataSetAndConnectionNames(); + //有权限的数据连接名称 + authConnectionNames = allAuthNames.get(UserAuthority.AUTH_CONNECTION_NAMES); + //有权限的数据集名称(模板数据集和服务器数据集) + authDatasetNames = allAuthNames.get(UserAuthority.AUTH_SERVER_DATASET_NAMES); + Iterator iterator = jTemplate.getTarget().getTableDataNameIterator(); + while (iterator.hasNext()) { + String datasetName = iterator.next(); + authDatasetNames.add(datasetName); + } + } + + private void initChecker() { + registerChecker(new NameDatabaseConnectionAuthorityChecker()); + registerChecker(new DSColumnAuthorityChecker()); + registerChecker(new FormulaAuthorityChecker()); + registerChecker(new NameTableDataAuthorityChecker()); + } + + private void registerChecker(ElementAuthorityChecker checker) { + checkerMap.put(checker.getCheckClassName(), checker); + } + + + public boolean isAuthority() { + long s = System.currentTimeMillis(); + //遍历模板对象,根据checkerMap.keySet()把感兴趣的对象找出来 + Map> targetObjects = ClassHelper.searchObject(jTemplate.getTarget(), checkerMap.keySet()); + + //找到对应的checker,对对象进行检查 + for (String name : targetObjects.keySet()) { + ElementAuthorityChecker checker = checkerMap.get(name); + for (Object object : targetObjects.get(name)) { + String authFailName = checker.checkConnectionName(object, authConnectionNames); + if (authFailName != null) { + authFailConnectionNames.add(authFailName); + } + authFailName = checker.checkDatasetName(object, authDatasetNames); + if (authFailName != null) { + authFailDatasetNames.add(authFailName); + } + } + } + + FineLoggerFactory.getLogger().info("JTemplateAuthorityChecker check time consume:" + (System.currentTimeMillis() - s)); + if (authFailConnectionNames.size() == 0 && authFailDatasetNames.size() == 0) { + return true; + } else { + //如果存在越权的,弹出弹框,并返回false + authorityFailPrompt(); + return false; + } + } + + private void authorityFailPrompt() { + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append(Toolkit.i18nText("Fine-Design-Basic_Save_Failure")); + stringBuffer.append("\n"); + if (authFailDatasetNames.size() > 0) { + stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Current_Operator_Miss")); + stringBuffer.append(authFailDatasetNames.size()); + stringBuffer.append(Toolkit.i18nText("Fine-Design_Report_Ge")); + stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Server_Dataset_Authority")); + stringBuffer.append("\n"); + stringBuffer.append(getNoAuthNameSequence(authFailDatasetNames)); + } + + if (authFailConnectionNames.size() > 0) { + stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Current_Operator_Miss")); + stringBuffer.append(authFailConnectionNames.size()); + stringBuffer.append(Toolkit.i18nText("Fine-Design_Report_Ge")); + stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Data_Connection_Authority")); + stringBuffer.append("\n"); + stringBuffer.append(getNoAuthNameSequence(authFailConnectionNames)); + } + + FineJOptionPane.showMessageDialog( + DesignerContext.getDesignerFrame(), + stringBuffer.toString(), + Toolkit.i18nText("Fine-Design_Basic_Alert"), + WARNING_MESSAGE); + } + + private String getNoAuthNameSequence(Set names) { + StringBuffer stringBuffer = new StringBuffer(); + int showMaxCount = 3; + int count = 0; + for (String name : names) { + if (count == showMaxCount) { + stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Etc")); + break; + } + stringBuffer.append(name); + if (count != names.size() - 1 && count != showMaxCount - 1) { + stringBuffer.append(";"); + } + count++; + } + stringBuffer.append("\n"); + return stringBuffer.toString(); + } +} + diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java new file mode 100644 index 000000000..fcb975730 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java @@ -0,0 +1,17 @@ +package com.fr.design.mainframe.authority; + +import com.fr.data.impl.NameDatabaseConnection; + +import java.util.Set; + +public class NameDatabaseConnectionAuthorityChecker extends ElementAuthorityChecker { + @Override + String checkConnectionName(NameDatabaseConnection nameDatabaseConnection, Set authConnectionNames) { + String name = nameDatabaseConnection.getName(); + if (!authConnectionNames.contains(name)) { + return name; + } + return null; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java new file mode 100644 index 000000000..d11cbc958 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java @@ -0,0 +1,16 @@ +package com.fr.design.mainframe.authority; + +import com.fr.data.impl.NameTableData; + +import java.util.Set; + +public class NameTableDataAuthorityChecker extends ElementAuthorityChecker { + @Override + String checkDatasetName(NameTableData nameTableData, Set authDatasetNames) { + if (!authDatasetNames.contains(nameTableData.getName())) { + return nameTableData.getName(); + } + return null; + + } +} From 69d6de2bcd21f9010ad861facd3d8e13d8518e70 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Thu, 16 Sep 2021 20:35:50 +0800 Subject: [PATCH 2/4] =?UTF-8?q?REPORT-56220=20=E6=95=B0=E6=8D=AE=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E8=B6=8A=E6=9D=83=E6=BC=8F=E6=B4=9E=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/JTemplate.java | 7 +- .../authority/DSColumnAuthorityChecker.java | 8 +- .../authority/ElementAuthorityChecker.java | 25 +++- .../authority/FormulaAuthorityChecker.java | 23 ++-- .../authority/JTemplateAuthorityChecker.java | 121 ++++++++++++------ ...ameDatabaseConnectionAuthorityChecker.java | 7 +- .../NameTableDataAuthorityChecker.java | 7 +- 7 files changed, 129 insertions(+), 69 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index aac3268be..89bb1b798 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1551,7 +1551,8 @@ public abstract class JTemplate> } private boolean saveRealFile() throws Exception { - if (new JTemplateAuthorityChecker(this).isAuthority()) { + JTemplateAuthorityChecker jTemplateAuthorityChecker = new JTemplateAuthorityChecker(this); + if (jTemplateAuthorityChecker.isAuthority()) { FILE editingFILE = this.getEditingFILE(); if (editingFILE == null || editingFILE instanceof MemFILE) { return false; @@ -1559,8 +1560,10 @@ public abstract class JTemplate> this.getTarget().export(TemplateResourceManager.getResource().saveTemplate(editingFILE)); this.editingFILE = editingFILE; return true; + } else { + jTemplateAuthorityChecker.showAuthorityFailPromptDialog(); + return false; } - return false; } private CallbackSaveWorker saveAs(boolean showLoc) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java index b27418ebf..7a4ae7ce7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java @@ -1,16 +1,18 @@ package com.fr.design.mainframe.authority; import com.fr.report.cell.cellattr.core.group.DSColumn; + +import java.util.Arrays; +import java.util.HashSet; import java.util.Set; public class DSColumnAuthorityChecker extends ElementAuthorityChecker { @Override - String checkDatasetName(DSColumn dsColumn, Set authDatasetNames) { + Set getNoAuthDatasetNames(DSColumn dsColumn, Set authDatasetNames) { if (!authDatasetNames.contains(dsColumn.getDSName())) { - return dsColumn.getDSName(); + return new HashSet<>(Arrays.asList(dsColumn.getDSName())); } return null; } - } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java index 020dda470..558643c04 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java @@ -7,17 +7,34 @@ import java.util.Set; public abstract class ElementAuthorityChecker { - //检查是否有越权的数据连接,如果有返回名称,没有返回null - String checkConnectionName(T t, Set authConnectionNames) { + + + /** + * @Description 获取越权的数据连接 + * @param: t 待检查的对象 + * @param: authConnectionNames 有权限的数据连接名 + * @return 如果有返回名称,没有返回null + */ + Set getNoAuthConnectionNames(T t, Set authConnectionNames) { return null; } //检查是否有越权的服务器数据集,如果有返回名称,没有返回null - String checkDatasetName(T t, Set authDatasetNames) { + + /** + * @Description 获取越权的服务器数据集 + * @param: t 待检查的对象 + * @param: authDatasetNames 有权限的服务器数据集名 + * @return 如果有返回名称,没有返回null + */ + Set getNoAuthDatasetNames(T t, Set authDatasetNames) { return null; } - //要检查对象的className + /** + * @Description 要检查对象的className + * @return className + */ String getCheckClassName() { ParameterizedTypeImpl parameterizedType = (ParameterizedTypeImpl) this.getClass().getGenericSuperclass(); Type type = parameterizedType.getActualTypeArguments()[0]; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java index 7333678c2..73a3965a7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java @@ -1,26 +1,23 @@ package com.fr.design.mainframe.authority; import com.fr.base.Formula; -import com.fr.parser.FunctionCall; -import com.fr.parser.StringLiteral; -import com.fr.script.Calculator; -import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashSet; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class FormulaAuthorityChecker extends ElementAuthorityChecker { @Override - public String checkConnectionName(Formula formula, Set authConnectionNames) { + public Set getNoAuthConnectionNames(Formula formula, Set authConnectionNames) { String content = formula.getContent(); - try { - FunctionCall functionCall = (FunctionCall) Calculator.createCalculator().parse(content).getConditionalExpression(); - StringLiteral stringLiteral = (StringLiteral) functionCall.getArguments()[0]; - String connectionName = (String) Calculator.createCalculator().evalValue(stringLiteral); - if (!authConnectionNames.contains(connectionName)) { - return connectionName; + Pattern pattern = Pattern.compile("^=SQL\\(\"(.+?)\","); + Matcher matcher = pattern.matcher(content); + if (matcher.find()) { + if (!authConnectionNames.contains(matcher.group(1))) { + return new HashSet<>(Arrays.asList(matcher.group(1))); } - } catch (Exception ignore) { - } return null; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/JTemplateAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/JTemplateAuthorityChecker.java index 47ad2e215..f8b2c8ce6 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/JTemplateAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/JTemplateAuthorityChecker.java @@ -6,9 +6,13 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; +import com.fr.design.mod.ModClassFilter; import com.fr.invoke.ClassHelper; import com.fr.log.FineLoggerFactory; +import com.fr.rpc.ExceptionHandler; +import com.fr.rpc.RPCInvokerExceptionInfo; +import com.fr.stable.Filter; import com.fr.workspace.WorkContext; import com.fr.workspace.server.authority.user.UserAuthority; @@ -42,15 +46,17 @@ public class JTemplateAuthorityChecker { private void initAuthNames() { UserAuthority templateAuthority = WorkContext.getCurrent().get(UserAuthority.class); - Map> allAuthNames = templateAuthority.getAuthServerDataSetAndConnectionNames(); - //有权限的数据连接名称 - authConnectionNames = allAuthNames.get(UserAuthority.AUTH_CONNECTION_NAMES); - //有权限的数据集名称(模板数据集和服务器数据集) - authDatasetNames = allAuthNames.get(UserAuthority.AUTH_SERVER_DATASET_NAMES); - Iterator iterator = jTemplate.getTarget().getTableDataNameIterator(); - while (iterator.hasNext()) { - String datasetName = iterator.next(); - authDatasetNames.add(datasetName); + Map> authNamesMap = templateAuthority.getAuthServerDataSetAndConnectionNames(); + if (authNamesMap != null) { + //有权限的数据连接名称 + authConnectionNames = authNamesMap.get(UserAuthority.AUTH_CONNECTION_NAMES); + //有权限的数据集名称(模板数据集和服务器数据集) + authDatasetNames = authNamesMap.get(UserAuthority.AUTH_SERVER_DATASET_NAMES); + Iterator iterator = jTemplate.getTarget().getTableDataNameIterator(); + while (iterator.hasNext()) { + String datasetName = iterator.next(); + authDatasetNames.add(datasetName); + } } } @@ -69,55 +75,39 @@ public class JTemplateAuthorityChecker { public boolean isAuthority() { long s = System.currentTimeMillis(); //遍历模板对象,根据checkerMap.keySet()把感兴趣的对象找出来 - Map> targetObjects = ClassHelper.searchObject(jTemplate.getTarget(), checkerMap.keySet()); + Map> targetObjects = ClassHelper.searchObject(jTemplate.getTarget(), checkerMap.keySet(), ClassFilter.getInstance()); //找到对应的checker,对对象进行检查 for (String name : targetObjects.keySet()) { ElementAuthorityChecker checker = checkerMap.get(name); for (Object object : targetObjects.get(name)) { - String authFailName = checker.checkConnectionName(object, authConnectionNames); - if (authFailName != null) { - authFailConnectionNames.add(authFailName); + if (authConnectionNames != null) { + Set noAuthName = checker.getNoAuthConnectionNames(object, authConnectionNames); + if (noAuthName != null) { + authFailConnectionNames.addAll(noAuthName); + } } - authFailName = checker.checkDatasetName(object, authDatasetNames); - if (authFailName != null) { - authFailDatasetNames.add(authFailName); + if (authDatasetNames != null) { + Set noAuthName = checker.getNoAuthDatasetNames(object, authDatasetNames); + if (noAuthName != null) { + authFailDatasetNames.addAll(noAuthName); + } } } } FineLoggerFactory.getLogger().info("JTemplateAuthorityChecker check time consume:" + (System.currentTimeMillis() - s)); - if (authFailConnectionNames.size() == 0 && authFailDatasetNames.size() == 0) { - return true; - } else { - //如果存在越权的,弹出弹框,并返回false - authorityFailPrompt(); - return false; - } + return authFailConnectionNames.size() == 0 && authFailDatasetNames.size() == 0; } - private void authorityFailPrompt() { + public void showAuthorityFailPromptDialog() { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(Toolkit.i18nText("Fine-Design-Basic_Save_Failure")); stringBuffer.append("\n"); - if (authFailDatasetNames.size() > 0) { - stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Current_Operator_Miss")); - stringBuffer.append(authFailDatasetNames.size()); - stringBuffer.append(Toolkit.i18nText("Fine-Design_Report_Ge")); - stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Server_Dataset_Authority")); - stringBuffer.append("\n"); - stringBuffer.append(getNoAuthNameSequence(authFailDatasetNames)); - } - - if (authFailConnectionNames.size() > 0) { - stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Current_Operator_Miss")); - stringBuffer.append(authFailConnectionNames.size()); - stringBuffer.append(Toolkit.i18nText("Fine-Design_Report_Ge")); - stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Data_Connection_Authority")); - stringBuffer.append("\n"); - stringBuffer.append(getNoAuthNameSequence(authFailConnectionNames)); - } - + stringBuffer.append(getPromptInfo(authFailDatasetNames, + Toolkit.i18nText("Fine-Design_Template_Authority_Check_Server_Dataset_Authority"))); + stringBuffer.append(getPromptInfo(authFailConnectionNames, + Toolkit.i18nText("Fine-Design_Template_Authority_Check_Data_Connection_Authority"))); FineJOptionPane.showMessageDialog( DesignerContext.getDesignerFrame(), stringBuffer.toString(), @@ -125,6 +115,19 @@ public class JTemplateAuthorityChecker { WARNING_MESSAGE); } + private String getPromptInfo(Set authFailNames, String message) { + StringBuffer stringBuffer = new StringBuffer(); + if (authFailNames.size() > 0) { + stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Current_Operator_Miss")); + stringBuffer.append(authFailNames.size()); + stringBuffer.append(Toolkit.i18nText("Fine-Design_Report_Ge")); + stringBuffer.append(message); + stringBuffer.append("\n"); + stringBuffer.append(getNoAuthNameSequence(authFailNames)); + } + return stringBuffer.toString(); + } + private String getNoAuthNameSequence(Set names) { StringBuffer stringBuffer = new StringBuffer(); int showMaxCount = 3; @@ -143,5 +146,39 @@ public class JTemplateAuthorityChecker { stringBuffer.append("\n"); return stringBuffer.toString(); } + + static class ClassFilter implements Filter { + + private static final Set FILTER_SET = new HashSet<>(); + private static final Set START_WITH_SET = new HashSet<>(); + private static final Filter INSTANCE = new ModClassFilter(); + + public static Filter getInstance() { + return INSTANCE; + } + + static { + FILTER_SET.add("java.awt.image.BufferedImage"); + FILTER_SET.add("sun.awt.AppContext"); + FILTER_SET.add("com.fr.poly.creator.ECBlockCreator"); + FILTER_SET.add("io.netty.channel.nio.SelectedSelectionKeySet"); + FILTER_SET.add("com.fr.form.ui.ElementCaseImage"); + FILTER_SET.add("this$0"); + START_WITH_SET.add("com.fr.design"); + } + + @Override + public boolean accept(String s) { + if (FILTER_SET.contains(s)) { + return true; + } + for (String start : START_WITH_SET) { + if (s.startsWith(start)) { + return true; + } + } + return false; + } + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java index fcb975730..4a7183f53 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java @@ -2,14 +2,17 @@ package com.fr.design.mainframe.authority; import com.fr.data.impl.NameDatabaseConnection; +import java.util.Arrays; +import java.util.HashSet; import java.util.Set; +import java.util.stream.Collectors; public class NameDatabaseConnectionAuthorityChecker extends ElementAuthorityChecker { @Override - String checkConnectionName(NameDatabaseConnection nameDatabaseConnection, Set authConnectionNames) { + Set getNoAuthConnectionNames(NameDatabaseConnection nameDatabaseConnection, Set authConnectionNames) { String name = nameDatabaseConnection.getName(); if (!authConnectionNames.contains(name)) { - return name; + return new HashSet<>(Arrays.asList(name)); } return null; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java index d11cbc958..498c04af4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java @@ -2,15 +2,16 @@ package com.fr.design.mainframe.authority; import com.fr.data.impl.NameTableData; +import java.util.Arrays; +import java.util.HashSet; import java.util.Set; public class NameTableDataAuthorityChecker extends ElementAuthorityChecker { @Override - String checkDatasetName(NameTableData nameTableData, Set authDatasetNames) { + Set getNoAuthDatasetNames(NameTableData nameTableData, Set authDatasetNames) { if (!authDatasetNames.contains(nameTableData.getName())) { - return nameTableData.getName(); + return new HashSet<>(Arrays.asList(nameTableData.getName())); } return null; - } } From 19a83f8cb54d76215edc6a4c15509c36de091f41 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Thu, 16 Sep 2021 20:37:59 +0800 Subject: [PATCH 3/4] =?UTF-8?q?REPORT-56220=20=E6=95=B0=E6=8D=AE=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E8=B6=8A=E6=9D=83=E6=BC=8F=E6=B4=9E=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/authority/ElementAuthorityChecker.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java index 558643c04..3851406e7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java @@ -18,8 +18,7 @@ public abstract class ElementAuthorityChecker { Set getNoAuthConnectionNames(T t, Set authConnectionNames) { return null; } - - //检查是否有越权的服务器数据集,如果有返回名称,没有返回null + /** * @Description 获取越权的服务器数据集 From 83aa0647da69837fb1bf688599d99a0a840b2ef2 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Fri, 17 Sep 2021 09:43:18 +0800 Subject: [PATCH 4/4] =?UTF-8?q?REPORT-56220=20=E6=95=B0=E6=8D=AE=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E8=B6=8A=E6=9D=83=E6=BC=8F=E6=B4=9E=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/authority/DSColumnAuthorityChecker.java | 2 ++ .../mainframe/authority/ElementAuthorityChecker.java | 5 ++++- .../mainframe/authority/FormulaAuthorityChecker.java | 7 +++++-- .../authority/NameDatabaseConnectionAuthorityChecker.java | 2 ++ .../mainframe/authority/NameTableDataAuthorityChecker.java | 2 ++ 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java index 7a4ae7ce7..fdab6ea2a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/DSColumnAuthorityChecker.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.authority; import com.fr.report.cell.cellattr.core.group.DSColumn; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.HashSet; @@ -9,6 +10,7 @@ import java.util.Set; public class DSColumnAuthorityChecker extends ElementAuthorityChecker { @Override + @Nullable Set getNoAuthDatasetNames(DSColumn dsColumn, Set authDatasetNames) { if (!authDatasetNames.contains(dsColumn.getDSName())) { return new HashSet<>(Arrays.asList(dsColumn.getDSName())); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java index 3851406e7..67d0f1da3 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/ElementAuthorityChecker.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.authority; +import org.jetbrains.annotations.Nullable; import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl; import java.lang.reflect.Type; @@ -15,10 +16,11 @@ public abstract class ElementAuthorityChecker { * @param: authConnectionNames 有权限的数据连接名 * @return 如果有返回名称,没有返回null */ + @Nullable Set getNoAuthConnectionNames(T t, Set authConnectionNames) { return null; } - + /** * @Description 获取越权的服务器数据集 @@ -26,6 +28,7 @@ public abstract class ElementAuthorityChecker { * @param: authDatasetNames 有权限的服务器数据集名 * @return 如果有返回名称,没有返回null */ + @Nullable Set getNoAuthDatasetNames(T t, Set authDatasetNames) { return null; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java index 73a3965a7..d108c18d4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/FormulaAuthorityChecker.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.authority; import com.fr.base.Formula; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.HashSet; @@ -9,11 +10,13 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class FormulaAuthorityChecker extends ElementAuthorityChecker { + private static final Pattern FORMULA_PATTERN = Pattern.compile("^=SQL\\(\"(.+?)\","); + @Override + @Nullable public Set getNoAuthConnectionNames(Formula formula, Set authConnectionNames) { String content = formula.getContent(); - Pattern pattern = Pattern.compile("^=SQL\\(\"(.+?)\","); - Matcher matcher = pattern.matcher(content); + Matcher matcher = FORMULA_PATTERN.matcher(content); if (matcher.find()) { if (!authConnectionNames.contains(matcher.group(1))) { return new HashSet<>(Arrays.asList(matcher.group(1))); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java index 4a7183f53..96bc0b8c5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameDatabaseConnectionAuthorityChecker.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.authority; import com.fr.data.impl.NameDatabaseConnection; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.HashSet; @@ -9,6 +10,7 @@ import java.util.stream.Collectors; public class NameDatabaseConnectionAuthorityChecker extends ElementAuthorityChecker { @Override + @Nullable Set getNoAuthConnectionNames(NameDatabaseConnection nameDatabaseConnection, Set authConnectionNames) { String name = nameDatabaseConnection.getName(); if (!authConnectionNames.contains(name)) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java index 498c04af4..13e730085 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/authority/NameTableDataAuthorityChecker.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.authority; import com.fr.data.impl.NameTableData; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.HashSet; @@ -8,6 +9,7 @@ import java.util.Set; public class NameTableDataAuthorityChecker extends ElementAuthorityChecker { @Override + @Nullable Set getNoAuthDatasetNames(NameTableData nameTableData, Set authDatasetNames) { if (!authDatasetNames.contains(nameTableData.getName())) { return new HashSet<>(Arrays.asList(nameTableData.getName()));