diff --git a/plugins/de.cognicrypt.codegenerator/.classpath b/plugins/de.cognicrypt.codegenerator/.classpath index e70863972..620e33854 100644 --- a/plugins/de.cognicrypt.codegenerator/.classpath +++ b/plugins/de.cognicrypt.codegenerator/.classpath @@ -38,5 +38,6 @@ + diff --git a/plugins/de.cognicrypt.codegenerator/META-INF/MANIFEST.MF b/plugins/de.cognicrypt.codegenerator/META-INF/MANIFEST.MF index 1fd59cc1e..deee6c5fd 100644 --- a/plugins/de.cognicrypt.codegenerator/META-INF/MANIFEST.MF +++ b/plugins/de.cognicrypt.codegenerator/META-INF/MANIFEST.MF @@ -29,7 +29,8 @@ Bundle-ClassPath: lib/claferchocoig.jar, src/main/resources/, src/main/java/, lib/dom4j-2.0.0.jar, - lib/saxon9he.jar + lib/saxon9he.jar, + lib/json-simple.jar Automatic-Module-Name: de.cognicrypt.codegenerator Bundle-Vendor: TU Darmstadt, Paderborn University Export-Package: de.cognicrypt.codegenerator, diff --git a/plugins/de.cognicrypt.codegenerator/build.properties b/plugins/de.cognicrypt.codegenerator/build.properties index 330d861c4..518f24263 100644 --- a/plugins/de.cognicrypt.codegenerator/build.properties +++ b/plugins/de.cognicrypt.codegenerator/build.properties @@ -9,4 +9,6 @@ bin.includes = plugin.xml,\ src/main/java/,\ target/classes/Tasks/tasks.json,\ lib/dom4j-2.0.0.jar,\ - lib/saxon9he.jar \ No newline at end of file + lib/saxon9he.jar,\ + lib/json-simple.jar + diff --git a/plugins/de.cognicrypt.codegenerator/lib/json-simple.jar b/plugins/de.cognicrypt.codegenerator/lib/json-simple.jar new file mode 100644 index 000000000..dfd5856d0 Binary files /dev/null and b/plugins/de.cognicrypt.codegenerator/lib/json-simple.jar differ diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/AltConfigWizard.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/AltConfigWizard.java index 1b598d752..efb0fe643 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/AltConfigWizard.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/AltConfigWizard.java @@ -263,7 +263,7 @@ public boolean performFinish() { codeGenerator.getDeveloperProject().refresh(); resetAnswers(); - chosenConfig = new CrySLConfiguration(resFileOSPath, ((CrySLBasedCodeGenerator) codeGenerator).setUpTemplateClass(pathToTemplateFile)); + chosenConfig = new CrySLConfiguration(resFileOSPath, ((CrySLBasedCodeGenerator) codeGenerator).setUpTemplateClass(pathToTemplateFile), selectedTask.getName()); break; case XSL: this.constraints = (this.constraints != null) ? this.constraints : new HashMap<>(); @@ -274,7 +274,7 @@ public boolean performFinish() { // Initialize Code Generation codeGenerator = new XSLBasedGenerator(targetFile, selectedTask.getCodeTemplate()); chosenConfig = new XSLConfiguration(instanceGenerator.getInstances().values().iterator() - .next(), this.constraints, codeGenerator.getDeveloperProject().getProjectPath() + Constants.innerFileSeparator + Constants.pathToClaferInstanceFile); + .next(), this.constraints, codeGenerator.getDeveloperProject().getProjectPath() + Constants.innerFileSeparator + Constants.pathToClaferInstanceFile, selectedTask.getName()); break; default: return false; diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/Configuration.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/Configuration.java index 1a45b3d46..5547017ae 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/Configuration.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/Configuration.java @@ -13,6 +13,7 @@ package de.cognicrypt.codegenerator.wizard; import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.util.List; import java.util.Map; @@ -20,9 +21,12 @@ import org.dom4j.io.XMLWriter; import de.cognicrypt.codegenerator.question.Answer; -import de.cognicrypt.codegenerator.question.Question; -import de.cognicrypt.utils.FileUtils; +import de.cognicrypt.codegenerator.question.Question; +import de.cognicrypt.core.Constants; +import de.cognicrypt.utils.Utils; +import de.cognicrypt.utils.FileUtils; +import org.json.simple.JSONObject; /** * This class is a storage for the configuration chosen by the user. * @@ -32,11 +36,27 @@ public abstract class Configuration { final protected Map options; final protected String pathOnDisk; + protected Answer answr; + final protected String taskName; - @SuppressWarnings("unchecked") - public Configuration(Map constraints, String pathOnDisk) { + @SuppressWarnings("unchecked") + public Configuration(Map constraints, String pathOnDisk, String taskName) throws IOException { + + this.answr = new Answer(); this.pathOnDisk = pathOnDisk; this.options = (Map) constraints; + this.taskName = taskName; + + JSONObject obj = new JSONObject(); + this.options.forEach((question,answer) ->obj.put(question.getQuestionText(), answer.getValue())); + String jsonPath = Utils.getCurrentProject().getLocation().toOSString() + Constants.innerFileSeparator + taskName + Constants.JSON_EXTENSION; + + File file = new File(jsonPath); + file.createNewFile(); + FileWriter fileWriter = new FileWriter(file); + fileWriter.write(obj.toJSONString()); + fileWriter.flush(); + fileWriter.close(); } /** diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/CrySLConfiguration.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/CrySLConfiguration.java index 8499d6fd9..5762ab927 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/CrySLConfiguration.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/CrySLConfiguration.java @@ -21,8 +21,8 @@ public class CrySLConfiguration extends Configuration { private final GeneratorClass template; - public CrySLConfiguration(String pathOnDisk, GeneratorClass templateClass) { - super(new HashMap<>(), pathOnDisk); + public CrySLConfiguration(String pathOnDisk, GeneratorClass templateClass, String selectedTask) throws IOException { + super(new HashMap<>(), pathOnDisk, selectedTask); this.template = templateClass; } diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/XSLConfiguration.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/XSLConfiguration.java index de000599d..2bfd9aaed 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/XSLConfiguration.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/XSLConfiguration.java @@ -33,8 +33,8 @@ public class XSLConfiguration extends Configuration { final private InstanceClafer instance; - public XSLConfiguration(InstanceClafer instance, Map constraints, String pathOnDisk) { - super(constraints, pathOnDisk); + public XSLConfiguration(InstanceClafer instance, Map constraints, String pathOnDisk, String taskName) throws IOException { + super(constraints, pathOnDisk, taskName); this.instance = instance; } diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/beginner/BeginnerTaskQuestionPage.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/beginner/BeginnerTaskQuestionPage.java index 42d599fb7..99503a88b 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/beginner/BeginnerTaskQuestionPage.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/wizard/beginner/BeginnerTaskQuestionPage.java @@ -24,6 +24,7 @@ import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.IStructuredSelection; @@ -706,6 +707,7 @@ public void widgetSelected(final SelectionEvent e) { } private Group createNote(final Composite parent, final Question question, boolean visible) { + IPreferenceStore prefStore = Activator.getDefault().getPreferenceStore(); final Group notePanel = new Group(parent, SWT.NONE); notePanel.setText("Note:"); final GridLayout gridLayout = new GridLayout(); @@ -722,7 +724,12 @@ private Group createNote(final Composite parent, final Question question, boolea note.setLayoutData(new GridData(GridData.FILL_BOTH)); String noteText = question.getNote(); if (noteText.contains("$$$")) { - noteText = noteText.split("\\$\\$\\$")[1]; + + String[] noteText1 = noteText.split("\\$\\$\\$"); + noteText = noteText1[1]; + if (!prefStore.getBoolean(Constants.SUPPRESS_LEGACYCLIENT_ERRORS)) { + noteText = noteText + noteText1[2]; + } } note.setText(noteText); note.pack(); diff --git a/plugins/de.cognicrypt.codegenerator/src/main/resources/TaskDesc/SecureCommunication.json b/plugins/de.cognicrypt.codegenerator/src/main/resources/TaskDesc/SecureCommunication.json index 37733e5cd..314aa548e 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/resources/TaskDesc/SecureCommunication.json +++ b/plugins/de.cognicrypt.codegenerator/src/main/resources/TaskDesc/SecureCommunication.json @@ -164,7 +164,7 @@ { "id": "0", "element": "radio", - "note": "1$$$It is highly discouraged to enable support for legacy clients. This may have grave security implications.", + "note": "1$$$It is highly discouraged to enable support for legacy clients. This may have grave security implications.$$$\nCogniCrypt's analysis raises warnings when this option is selected. You can however disable such warnings for legacy configurations in the CogniCrypt preferences.", "questionText": "Which clients should the server at least support?", "answers": [ { diff --git a/plugins/de.cognicrypt.core/META-INF/MANIFEST.MF b/plugins/de.cognicrypt.core/META-INF/MANIFEST.MF index 627b52f22..4f42f7f48 100644 --- a/plugins/de.cognicrypt.core/META-INF/MANIFEST.MF +++ b/plugins/de.cognicrypt.core/META-INF/MANIFEST.MF @@ -241,6 +241,7 @@ Export-Package: boomerang; org.eclipse.egit.github.core.service, org.ini4j;uses:="org.ini4j.spi,new org.ini4j", org.ini4j.spi, + org.json.simple, soot; uses:="soot.jimple.toolkits.scalar, soot.toolkits.graph, diff --git a/plugins/de.cognicrypt.core/src/de/cognicrypt/core/Constants.java b/plugins/de.cognicrypt.core/src/de/cognicrypt/core/Constants.java index 3aa9e6210..3c432b95b 100644 --- a/plugins/de.cognicrypt.core/src/de/cognicrypt/core/Constants.java +++ b/plugins/de.cognicrypt.core/src/de/cognicrypt/core/Constants.java @@ -538,6 +538,7 @@ public String toString() { public static final String SHOW_SECURE_OBJECTS = "de.cognicrypt.staticanalyzer.secureObjects"; public static final String CALL_GRAPH_SELECTION = "de.cognicrypt.staticanalyzer.callgraphSelection"; public static final String SELECT_CUSTOM_RULES = "de.cognicrypt.staticanalyzer.selectCustomRules"; + public static final String SUPPRESS_LEGACYCLIENT_ERRORS = "de.cognicrypt.staticanalyzer.suppressConstraintErrors"; public static final String ANALYSE_DEPENDENCIES = "de.cognicrypt.staticanalyzer.dependencyAnalysis"; @@ -617,4 +618,7 @@ public String toString() { public static final String codeTemplateFolder = "src" + Constants.innerFileSeparator + "main" + Constants.innerFileSeparator + "java" + Constants.innerFileSeparator + "de" + Constants.innerFileSeparator + "cognicrypt" + Constants.innerFileSeparator + "codegenerator" + Constants.innerFileSeparator + "crysl" + Constants.innerFileSeparator + "templates" + Constants.innerFileSeparator; + + //name of tasks + public final static String SECURE_COMMUNICATION = "SecureCommunication"; } diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/ArithConstraintTestRule.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/ArithConstraintTestRule.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/ArithConstraintTestRule.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/ArithConstraintTestRule.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/CompConstraintTestRule.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/CompConstraintTestRule.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/CompConstraintTestRule.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/CompConstraintTestRule.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/ComplexConstraintTestRule.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/ComplexConstraintTestRule.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/ComplexConstraintTestRule.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/ComplexConstraintTestRule.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/InConstraintTestRule.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/InConstraintTestRule.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/InConstraintTestRule.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/InConstraintTestRule.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule1.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule1.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule1.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule1.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule10.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule10.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule10.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule10.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule11.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule11.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule11.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule11.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule12.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule12.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule12.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule12.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule13.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule13.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule13.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule13.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule14.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule14.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule14.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule14.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule15.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule15.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule15.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule15.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule16.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule16.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule16.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule16.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule17.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule17.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule17.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule17.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule2.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule2.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule2.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule2.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule3.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule3.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule3.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule3.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule4.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule4.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule4.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule4.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule5.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule5.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule5.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule5.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule6.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule6.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule6.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule6.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule7.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule7.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule7.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule7.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule8.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule8.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule8.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule8.cryptsl diff --git a/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule9.crysl b/plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule9.cryptsl similarity index 100% rename from plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule9.crysl rename to plugins/de.cognicrypt.crysl.handler/src/test/resources/Testrule9.cryptsl diff --git a/plugins/de.cognicrypt.staticanalyzer/.classpath b/plugins/de.cognicrypt.staticanalyzer/.classpath index 66438e56a..aa2de0cb7 100644 --- a/plugins/de.cognicrypt.staticanalyzer/.classpath +++ b/plugins/de.cognicrypt.staticanalyzer/.classpath @@ -1,8 +1,12 @@ - + + + + + - + diff --git a/plugins/de.cognicrypt.staticanalyzer/META-INF/MANIFEST.MF b/plugins/de.cognicrypt.staticanalyzer/META-INF/MANIFEST.MF index b547db499..fc666c0c4 100644 --- a/plugins/de.cognicrypt.staticanalyzer/META-INF/MANIFEST.MF +++ b/plugins/de.cognicrypt.staticanalyzer/META-INF/MANIFEST.MF @@ -21,6 +21,7 @@ Require-Bundle: org.eclipse.ui, Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: ., - resources/ + resources/json-simple.jar Automatic-Module-Name: de.cognicrypt.staticanalyzer -Import-Package: org.eclipse.ui.texteditor +Import-Package: org.eclipse.ui.texteditor, + org.json.simple diff --git a/plugins/de.cognicrypt.staticanalyzer/build.properties b/plugins/de.cognicrypt.staticanalyzer/build.properties index 9902751f9..346b4b957 100644 --- a/plugins/de.cognicrypt.staticanalyzer/build.properties +++ b/plugins/de.cognicrypt.staticanalyzer/build.properties @@ -2,5 +2,6 @@ source.. = src/ bin.includes = plugin.xml,\ META-INF/,\ .,\ - src/,\ - experimental/ + experimental/,\ + resources/json-simple.jar +src.includes = resources/json-simple.jar diff --git a/plugins/de.cognicrypt.staticanalyzer/resources/json-simple.jar b/plugins/de.cognicrypt.staticanalyzer/resources/json-simple.jar new file mode 100644 index 000000000..dfd5856d0 Binary files /dev/null and b/plugins/de.cognicrypt.staticanalyzer/resources/json-simple.jar differ diff --git a/plugins/de.cognicrypt.staticanalyzer/src/de/cognicrypt/staticanalyzer/StaticAnalyzerPreferences.java b/plugins/de.cognicrypt.staticanalyzer/src/de/cognicrypt/staticanalyzer/StaticAnalyzerPreferences.java index 7d207ea42..bbf7bf5fc 100644 --- a/plugins/de.cognicrypt.staticanalyzer/src/de/cognicrypt/staticanalyzer/StaticAnalyzerPreferences.java +++ b/plugins/de.cognicrypt.staticanalyzer/src/de/cognicrypt/staticanalyzer/StaticAnalyzerPreferences.java @@ -1,6 +1,11 @@ /******************************************************************************** - * Copyright (c) 2015-2019 TU Darmstadt, Paderborn University This program and the accompanying materials are made available under the terms of the Eclipse Public License v. 2.0 - * which is available at http://www.eclipse.org/legal/epl-2.0. SPDX-License-Identifier: EPL-2.0 + * Copyright (c) 2015-2019 TU Darmstadt, Paderborn University + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ package de.cognicrypt.staticanalyzer; @@ -51,7 +56,8 @@ public class StaticAnalyzerPreferences extends PreferenceListener { private Button secureObjectsCheckBox; private Button analyseDependenciesCheckBox; private Button addNewRulesetButton, selectCustomRulesCheckBox; - private CheckboxTableViewer table; + private Button suppressLegacyClientErrorsCheckBox; + private CheckboxTableViewer table; private Combo CGSelection; private Combo forbidden; @@ -60,7 +66,7 @@ public class StaticAnalyzerPreferences extends PreferenceListener { private Combo neverType; private Combo incompleteOp; private Combo typestate; - + private List listOfRulesets = new ArrayList(); @Override @@ -83,6 +89,7 @@ private void initializeBasicValues() { secureObjectsCheckBox.setSelection(preferences.getBoolean(Constants.SHOW_SECURE_OBJECTS)); analyseDependenciesCheckBox.setSelection(preferences.getBoolean(Constants.ANALYSE_DEPENDENCIES)); selectCustomRulesCheckBox.setSelection(preferences.getBoolean(Constants.SELECT_CUSTOM_RULES)); + suppressLegacyClientErrorsCheckBox.setSelection(preferences.getBoolean(Constants.SUPPRESS_LEGACYCLIENT_ERRORS)); } private void performBasicDefaults() { @@ -92,201 +99,206 @@ private void performBasicDefaults() { preferences.setDefault(Constants.SHOW_SECURE_OBJECTS, false); preferences.setDefault(Constants.ANALYSE_DEPENDENCIES, true); preferences.setDefault(Constants.CALL_GRAPH_SELECTION, 0); + preferences.setDefault(Constants.SUPPRESS_LEGACYCLIENT_ERRORS, true); } - - /*** - * This method creates a row for each of the rule set with a drop-down list of versions passed. - * - * @param ruleset rule set to be added - */ - private void createRulesTableRow(Ruleset ruleset) { - - TableEditor editor = new TableEditor(table.getTable()); - TableItem rulesRow = new TableItem(table.getTable(), SWT.NONE); - rulesRow.setText(0, ruleset.getFolderName()); - editor.grabHorizontal = true; - editor.setEditor(ruleset.getVersions(), rulesRow, 1); - rulesRow.setText(2, ruleset.getUrl()); - rulesRow.setChecked(ruleset.isChecked()); - ruleset.setRulesRow(rulesRow); - } - - /** - * This method fetches the list of rule sets which are stored in preference file - * - * @return list of rule sets - */ - private List getRulesetsFromPrefs() { - List ruleSets = new ArrayList(); - - try { - String[] listOfNodes = rulePreferences.childrenNames(); - - for (String currentNode : listOfNodes) { - Ruleset loadedRuleset = new Ruleset(currentNode); - Preferences subPref = rulePreferences.node(currentNode); - String[] keys = subPref.keys(); - for (String key : keys) { - switch (key) { - case "FolderName": - loadedRuleset.setFolderName(subPref.get(key, "")); - break; - case "CheckboxState": - loadedRuleset.setChecked(subPref.getBoolean(key, false)); - break; - case "SelectedVersion": - loadedRuleset.setSelectedVersion(subPref.get(key, "")); - break; - case "Url": - loadedRuleset.setUrl(subPref.get(key, "")); - break; - default: - break; - } - } - ruleSets.add(loadedRuleset); - } - } - catch (BackingStoreException e) { - Activator.getDefault().logError(e); - } - return ruleSets; - } - + /*** - * This method creates a table with check boxes for the CrySL rule sets. - */ - private void createRulesTable() { - TableViewerColumn rulesColumn = new TableViewerColumn(table, SWT.FILL); - TableViewerColumn versionsColumn = new TableViewerColumn(table, SWT.FILL); - TableViewerColumn rulesURL = new TableViewerColumn(table, SWT.FILL); - rulesColumn.getColumn().setText(Constants.TABLE_HEADER_RULES); - versionsColumn.getColumn().setText(Constants.TABLE_HEADER_VERSION); - rulesURL.getColumn().setText(Constants.TABLE_HEADER_URL); - rulesColumn.getColumn().setWidth(200); - versionsColumn.getColumn().setWidth(100); - rulesURL.getColumn().setWidth(200); + * This method creates a row for each of the rule set with a drop-down list of + * versions passed. + * + * @param ruleset rule set to be added + */ + private void createRulesTableRow(Ruleset ruleset) { + + TableEditor editor = new TableEditor(table.getTable()); + TableItem rulesRow = new TableItem(table.getTable(), SWT.NONE); + rulesRow.setText(0, ruleset.getFolderName()); + editor.grabHorizontal = true; + editor.setEditor(ruleset.getVersions(), rulesRow, 1); + rulesRow.setText(2, ruleset.getUrl()); + rulesRow.setChecked(ruleset.isChecked()); + ruleset.setRulesRow(rulesRow); + } + + /** + * This method fetches the list of rule sets which are stored in preference file + * + * @return list of rule sets + */ + private List getRulesetsFromPrefs() { + List ruleSets = new ArrayList(); + + try { + String[] listOfNodes = rulePreferences.childrenNames(); + + for (String currentNode : listOfNodes) { + Ruleset loadedRuleset = new Ruleset(currentNode); + Preferences subPref = rulePreferences.node(currentNode); + String[] keys = subPref.keys(); + for (String key : keys) { + switch (key) { + case "FolderName": + loadedRuleset.setFolderName(subPref.get(key, "")); + break; + case "CheckboxState": + loadedRuleset.setChecked(subPref.getBoolean(key, false)); + break; + case "SelectedVersion": + loadedRuleset.setSelectedVersion(subPref.get(key, "")); + break; + case "Url": + loadedRuleset.setUrl(subPref.get(key, "")); + break; + default: + break; + } + } + ruleSets.add(loadedRuleset); + } + } catch (BackingStoreException e) { + Activator.getDefault().logError(e); + } + return ruleSets; + } + + /*** + * This method creates a table with check boxes for the CrySL rule sets. + */ + private void createRulesTable() { + TableViewerColumn rulesColumn = new TableViewerColumn(table, SWT.FILL); + TableViewerColumn versionsColumn = new TableViewerColumn(table, SWT.FILL); + TableViewerColumn rulesURL = new TableViewerColumn(table, SWT.FILL); + rulesColumn.getColumn().setText(Constants.TABLE_HEADER_RULES); + versionsColumn.getColumn().setText(Constants.TABLE_HEADER_VERSION); + rulesURL.getColumn().setText(Constants.TABLE_HEADER_URL); + rulesColumn.getColumn().setWidth(200); + versionsColumn.getColumn().setWidth(100); + rulesURL.getColumn().setWidth(200); listOfRulesets = getRulesetsFromPrefs(); - for (Iterator itr = listOfRulesets.iterator(); itr.hasNext();) { - Ruleset ruleset = (Ruleset) itr.next(); - ruleset.setVersions(new CCombo(table.getTable(), SWT.NONE)); - String[] items = CrySLUtils.getRuleVersions(ruleset.getFolderName()); - if (items != null) { + for (Iterator itr = listOfRulesets.iterator(); itr.hasNext();) { + Ruleset ruleset = (Ruleset) itr.next(); + ruleset.setVersions(new CCombo(table.getTable(), SWT.NONE)); + String[] items = CrySLUtils.getRuleVersions(ruleset.getFolderName()); + if (items != null) { ruleset.getVersions().setItems(items); - ruleset.getVersions().setItems(CrySLUtils.getRuleVersions(ruleset.getFolderName())); - ruleset.setSelectedVersion( - (ruleset.getSelectedVersion().length() > 0) ? ruleset.getSelectedVersion() : ruleset.getVersions().getItem(ruleset.getVersions().getItemCount() - 1)); - ruleset.getVersions().select(ruleset.getVersions().indexOf(ruleset.getSelectedVersion())); + ruleset.getVersions() + .setItems(CrySLUtils.getRuleVersions(ruleset.getFolderName())); + ruleset.setSelectedVersion((ruleset.getSelectedVersion().length() > 0) ? ruleset.getSelectedVersion() + : ruleset.getVersions().getItem(ruleset.getVersions().getItemCount() - 1)); + ruleset.getVersions().select(ruleset.getVersions().indexOf(ruleset.getSelectedVersion())); } createRulesTableRow(ruleset); - ruleset.getVersions().addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - super.widgetSelected(e); - - ruleset.setSelectedVersion(ruleset.getVersions().getItem(ruleset.getVersions().getSelectionIndex())); - } - }); - } - } - - /*** - * This method modifies the rule set table by adding a new rule set entry - * - * @param newRuleset The new rule set which is added to the table - */ - private void modifyRulesTable(Ruleset newRuleset) { - newRuleset.setVersions(new CCombo(table.getTable(), SWT.NONE)); - newRuleset.getVersions().setItems(CrySLUtils.getRuleVersions(newRuleset.getFolderName())); - newRuleset.setSelectedVersion(newRuleset.getVersions().getItem(newRuleset.getVersions().getItemCount() - 1)); - newRuleset.getVersions().select(newRuleset.getVersions().getItemCount() - 1); - createRulesTableRow(newRuleset); - newRuleset.getVersions().addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - super.widgetSelected(e); - newRuleset.setSelectedVersion(newRuleset.getVersions().getItem(newRuleset.getVersions().getSelectionIndex())); - } - }); - } - - /*** - * This method creates the UI for the preference page. - * - * @param parent Instance of the eclipse preference window on which UI widgets for CogniCrypt are added. - */ + ruleset.getVersions().addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + super.widgetSelected(e); + + ruleset.setSelectedVersion( + ruleset.getVersions().getItem(ruleset.getVersions().getSelectionIndex())); + } + }); + } + } + + /*** + * This method modifies the rule set table by adding a new rule set entry + * @param newRuleset The new rule set which is added to the table + */ + private void modifyRulesTable(Ruleset newRuleset) { + newRuleset.setVersions(new CCombo(table.getTable(), SWT.NONE)); + newRuleset.getVersions() + .setItems(CrySLUtils.getRuleVersions(newRuleset.getFolderName())); + newRuleset.setSelectedVersion(newRuleset.getVersions().getItem(newRuleset.getVersions().getItemCount() - 1)); + newRuleset.getVersions().select(newRuleset.getVersions().getItemCount() - 1); + createRulesTableRow(newRuleset); + newRuleset.getVersions().addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + super.widgetSelected(e); + newRuleset.setSelectedVersion( + newRuleset.getVersions().getItem(newRuleset.getVersions().getSelectionIndex())); + } + }); + } + + /*** + * This method creates the UI for the preference page. + * + * @param parent Instance of the eclipse preference window on which UI widgets + * for CogniCrypt are added. + */ private void createBasicContents(Composite parent) { final Group staticAnalysisGroup = UIUtils.addHeaderGroup(parent, "Analysis"); final Composite source = new Composite(staticAnalysisGroup, SWT.FILL); source.setLayout(new GridLayout(3, true)); final Label ruleSource = new Label(source, SWT.NONE); - ruleSource.setText("Source of CrySL Rules: "); - + ruleSource.setText("Source of CrySL rules: "); + table = CheckboxTableViewer.newCheckList(staticAnalysisGroup, SWT.CHECK); - table.getTable().setHeaderVisible(true); - table.getTable().setLinesVisible(true); - createRulesTable(); - table.getTable().addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - super.widgetSelected(e); - if (e.detail == SWT.CHECK) { - TableItem item = (TableItem) e.item; - - for (Iterator itr = listOfRulesets.iterator(); itr.hasNext();) { - Ruleset ruleset = (Ruleset) itr.next(); - if (item.getText(0) == ruleset.getFolderName()) - ruleset.setChecked(item.getChecked()); - } - } - } - }); - addNewRulesetButton = new Button(staticAnalysisGroup, SWT.PUSH); - addNewRulesetButton.setText("Add Ruleset"); - addNewRulesetButton.addListener(SWT.Selection, new Listener() { - - @Override - public void handleEvent(Event e) { - addNewRuleset(); - } - }); - selectCustomRulesCheckBox = new Button(staticAnalysisGroup, SWT.CHECK); - selectCustomRulesCheckBox.setText("Select Custom Rules"); - selectCustomRulesCheckBox.addListener(SWT.Selection, new Listener() { - @Override - public void handleEvent(Event e) { - preferences.setValue(Constants.SELECT_CUSTOM_RULES,selectCustomRulesCheckBox.getSelection()); - } - }); - + table.getTable().setHeaderVisible(true); + table.getTable().setLinesVisible(true); + createRulesTable(); + table.getTable().addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + super.widgetSelected(e); + if (e.detail == SWT.CHECK) { + TableItem item = (TableItem) e.item; + + for (Iterator itr = listOfRulesets.iterator(); itr.hasNext();) { + Ruleset ruleset = (Ruleset) itr.next(); + if (item.getText(0) == ruleset.getFolderName()) + ruleset.setChecked(item.getChecked()); + } + } + } + }); + + selectCustomRulesCheckBox = new Button(staticAnalysisGroup, SWT.CHECK); + selectCustomRulesCheckBox.setText("Select custom rules"); + automatedAnalysisCheckBox = new Button(staticAnalysisGroup, SWT.CHECK); - automatedAnalysisCheckBox.setText("Enable Automated Analysis when Saving"); - + automatedAnalysisCheckBox.setText("Enable automated analysis when saving"); + providerDetectionCheckBox = new Button(staticAnalysisGroup, SWT.CHECK); - providerDetectionCheckBox.setText("Enable Provider-Detection Analysis"); + providerDetectionCheckBox.setText("Enable provider detection analysis"); secureObjectsCheckBox = new Button(staticAnalysisGroup, SWT.CHECK); - secureObjectsCheckBox.setText("Show Secure Objects"); + secureObjectsCheckBox.setText("Show secure objects"); analyseDependenciesCheckBox = new Button(staticAnalysisGroup, SWT.CHECK); - analyseDependenciesCheckBox.setText("Include Dependencies into Project Analysis"); + analyseDependenciesCheckBox.setText("Include dependencies to projects analysis"); analyseDependenciesCheckBox.setSelection(preferences.getBoolean(Constants.ANALYSE_DEPENDENCIES)); - + + suppressLegacyClientErrorsCheckBox = new Button(staticAnalysisGroup, SWT.CHECK); + suppressLegacyClientErrorsCheckBox.setText("Suppress warnings related to legacy code generated by CogniCrypt"); + suppressLegacyClientErrorsCheckBox.setSelection(preferences.getBoolean(Constants.SUPPRESS_LEGACYCLIENT_ERRORS)); + + addNewRulesetButton = new Button(staticAnalysisGroup, SWT.PUSH); + addNewRulesetButton.setText("Add ruleset"); + addNewRulesetButton.addListener(SWT.Selection, new Listener() { + + @Override + public void handleEvent(Event e) { + addNewRuleset(); + } + }); } - + protected void addNewRuleset() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); AddNewRulesetDialog dialog = new AddNewRulesetDialog(window.getShell()); dialog.create(); if (dialog.open() == Window.OK) { - if (ifExists(dialog.getRulesetUrl())) { + if(ifExists(dialog.getRulesetUrl())) { MessageDialog.openError(window.getShell(), "Duplicate Ruleset", "You are trying to add an existing ruleset!"); return; - } else { - if (ArtifactUtils.downloadRulesets(dialog.getRulesetUrl())) { + } + else { + if(ArtifactUtils.downloadRulesets(dialog.getRulesetUrl())) { Activator.getDefault().logInfo("Rulesets updated."); } Ruleset newRuleset = new Ruleset(dialog.getRulesetUrl()); @@ -295,11 +307,11 @@ protected void addNewRuleset() { } } } - + boolean ifExists(String url) { List existingRulesets = getRulesetsFromPrefs(); for (Ruleset ruleset : existingRulesets) { - if (ruleset.getUrl().equals(url)) { + if(ruleset.getUrl().equals(url)) { return true; } } @@ -360,7 +372,7 @@ private void createAdvancedContents(Composite parent) { final Composite constraintContainer = new Composite(errorTypeGroup, SWT.None); constraintContainer.setLayout(new GridLayout(2, true)); final Label constraintLabel = new Label(constraintContainer, SWT.None); - constraintLabel.setText("Incorrect-Parameter Problem:"); + constraintLabel.setText("Incorrect Parameter Problem:"); constraint = new Combo(constraintContainer, SWT.DROP_DOWN | SWT.READ_ONLY); constraint.setItems(Arrays.stream(Constants.Severities.values()).map(Enum::name).toArray(String[]::new)); @@ -368,7 +380,7 @@ private void createAdvancedContents(Composite parent) { final Composite typestateContainer = new Composite(errorTypeGroup, SWT.None); typestateContainer.setLayout(new GridLayout(2, true)); final Label typestateLabel = new Label(typestateContainer, SWT.None); - typestateLabel.setText("Incorrect-Method-Call Problem:"); + typestateLabel.setText("Incorrect Method Call Problem:"); typestate = new Combo(typestateContainer, SWT.DROP_DOWN | SWT.READ_ONLY); typestate.setItems(Arrays.stream(Constants.Severities.values()).map(Enum::name).toArray(String[]::new)); @@ -376,14 +388,14 @@ private void createAdvancedContents(Composite parent) { final Composite incompleteContainer = new Composite(errorTypeGroup, SWT.None); incompleteContainer.setLayout(new GridLayout(2, true)); final Label incompleteLabel = new Label(incompleteContainer, SWT.None); - incompleteLabel.setText("Missing-Method-Call Problem:"); + incompleteLabel.setText("Missing Method Call Problem:"); incompleteOp = new Combo(incompleteContainer, SWT.DROP_DOWN | SWT.READ_ONLY); incompleteOp.setItems(Arrays.stream(Constants.Severities.values()).map(Enum::name).toArray(String[]::new)); final Composite forbiddenContainer = new Composite(errorTypeGroup, SWT.None); forbiddenContainer.setLayout(new GridLayout(2, true)); final Label forbiddenLabel = new Label(forbiddenContainer, SWT.None); - forbiddenLabel.setText("Forbidden-Method Problem:"); + forbiddenLabel.setText("Forbidden Method Problem:"); forbidden = new Combo(forbiddenContainer, SWT.DROP_DOWN | SWT.READ_ONLY); forbidden.setItems(Arrays.stream(Constants.Severities.values()).map(Enum::name).toArray(String[]::new)); @@ -391,7 +403,7 @@ private void createAdvancedContents(Composite parent) { final Composite reqPredContainer = new Composite(errorTypeGroup, SWT.None); reqPredContainer.setLayout(new GridLayout(2, true)); final Label reqPredLabel = new Label(reqPredContainer, SWT.None); - reqPredLabel.setText("Insecure-Class-Composition Problem:"); + reqPredLabel.setText("Insecure Class Composition Problem:"); reqPred = new Combo(reqPredContainer, SWT.DROP_DOWN | SWT.READ_ONLY); reqPred.setItems(Arrays.stream(Constants.Severities.values()).map(Enum::name).toArray(String[]::new)); @@ -399,33 +411,35 @@ private void createAdvancedContents(Composite parent) { final Composite neverTypeContainer = new Composite(errorTypeGroup, SWT.None); neverTypeContainer.setLayout(new GridLayout(2, true)); final Label neverTypeLabel = new Label(neverTypeContainer, SWT.None); - neverTypeLabel.setText("Wrong-Type Problem:"); + neverTypeLabel.setText("Wrong Type Problem:"); neverType = new Combo(neverTypeContainer, SWT.DROP_DOWN | SWT.READ_ONLY); neverType.setItems(Arrays.stream(Constants.Severities.values()).map(Enum::name).toArray(String[]::new)); } /*** - * This method assigns default values for each of the preference options and is invoked when Restore defaults is clicked. - */ + * This method assigns default values for each of the preference options and is + * invoked when Restore defaults is clicked. + */ @Override public void setDefaultValues() { - selectCustomRulesCheckBox.setSelection(preferences.getDefaultBoolean(Constants.SELECT_CUSTOM_RULES)); + selectCustomRulesCheckBox.setSelection(true); automatedAnalysisCheckBox.setSelection(preferences.getDefaultBoolean(Constants.AUTOMATED_ANALYSIS)); providerDetectionCheckBox.setSelection(preferences.getDefaultBoolean(Constants.PROVIDER_DETECTION_ANALYSIS)); secureObjectsCheckBox.setSelection(preferences.getDefaultBoolean(Constants.SHOW_SECURE_OBJECTS)); analyseDependenciesCheckBox.setSelection(preferences.getDefaultBoolean(Constants.ANALYSE_DEPENDENCIES)); - + suppressLegacyClientErrorsCheckBox.setSelection(preferences.getDefaultBoolean(Constants.SUPPRESS_LEGACYCLIENT_ERRORS)); + for (Iterator itr = listOfRulesets.iterator(); itr.hasNext();) { - Ruleset ruleset = (Ruleset) itr.next(); - ruleset.getVersions().select(ruleset.getVersions().getItemCount() - 1); - if (ruleset.getFolderName().equals("JavaCryptographicArchitecture")) - ruleset.getRulesRow().setChecked(true); - else - ruleset.getRulesRow().setChecked(false); - ruleset.setSelectedVersion(ruleset.getVersions().getItem(ruleset.getVersions().getItemCount() - 1)); - ruleset.setChecked(ruleset.getRulesRow().getChecked()); - } - + Ruleset ruleset = (Ruleset) itr.next(); + ruleset.getVersions().select(ruleset.getVersions().getItemCount() - 1); + if (ruleset.getFolderName().equals("JavaCryptographicArchitecture")) + ruleset.getRulesRow().setChecked(true); + else + ruleset.getRulesRow().setChecked(false); + ruleset.setSelectedVersion(ruleset.getVersions().getItem(ruleset.getVersions().getItemCount() - 1)); + ruleset.setChecked(ruleset.getRulesRow().getChecked()); + } + CGSelection.select(preferences.getDefaultInt(Constants.CALL_GRAPH_SELECTION)); forbidden.select(preferences.getDefaultInt(Constants.FORBIDDEN_METHOD_MARKER_TYPE)); @@ -449,16 +463,17 @@ protected void storeValues() { preferences.setValue(Constants.NEVER_TYPEOF_MARKER_TYPE, neverType.getSelectionIndex()); preferences.setValue(Constants.REQUIRED_PREDICATE_MARKER_TYPE, reqPred.getSelectionIndex()); preferences.setValue(Constants.TYPESTATE_ERROR_MARKER_TYPE, typestate.getSelectionIndex()); - + preferences.setValue(Constants.SUPPRESS_LEGACYCLIENT_ERRORS, suppressLegacyClientErrorsCheckBox.getSelection()); + for (Iterator itr = listOfRulesets.iterator(); itr.hasNext();) { - Ruleset ruleset = (Ruleset) itr.next(); - - Preferences subPref = rulePreferences.node(ruleset.getFolderName()); - subPref.putBoolean("CheckboxState", ruleset.isChecked()); - subPref.put("FolderName", ruleset.getFolderName()); - subPref.put("SelectedVersion", ruleset.getSelectedVersion()); - subPref.put("Url", ruleset.getUrl()); - } + Ruleset ruleset = (Ruleset) itr.next(); + + Preferences subPref = rulePreferences.node(ruleset.getFolderName()); + subPref.putBoolean("CheckboxState", ruleset.isChecked()); + subPref.put("FolderName", ruleset.getFolderName()); + subPref.put("SelectedVersion", ruleset.getSelectedVersion()); + subPref.put("Url", ruleset.getUrl()); + } } } diff --git a/plugins/de.cognicrypt.staticanalyzer/src/de/cognicrypt/staticanalyzer/results/ResultsCCUIListener.java b/plugins/de.cognicrypt.staticanalyzer/src/de/cognicrypt/staticanalyzer/results/ResultsCCUIListener.java index 397ea2316..3ccfc2c8d 100644 --- a/plugins/de.cognicrypt.staticanalyzer/src/de/cognicrypt/staticanalyzer/results/ResultsCCUIListener.java +++ b/plugins/de.cognicrypt.staticanalyzer/src/de/cognicrypt/staticanalyzer/results/ResultsCCUIListener.java @@ -6,6 +6,11 @@ package de.cognicrypt.staticanalyzer.results; import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -68,6 +73,9 @@ import soot.tagkit.AbstractHost; import typestate.TransitionFunction; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; /** * This listener is notified of any misuses the analysis finds. It also reports the results of the analysis to the Statistics View * @@ -118,9 +126,16 @@ public void analyzeDependenciesOnly(final Boolean depOnly) { @Override public void reportError(final AbstractError error) { IResource sourceFile = null; + IPreferenceStore prefStore = Activator.getDefault().getPreferenceStore(); if (this.depOnly) { return; } + if (error instanceof ConstraintError) { + ConstraintError conError = (ConstraintError) error; + if (prefStore.getBoolean(Constants.SUPPRESS_LEGACYCLIENT_ERRORS) && conError.getBrokenConstraint().toString().equals("VC:protocol - TLSv1.2,") && isLegacyClient()) { + return; + } + } final String errorMessage = error.toErrorMarkerString(); final Statement errorLocation = error.getErrorLocation(); final String errorJimpleBody = errorLocation.getMethod().getActiveBody().toString(); @@ -230,6 +245,27 @@ public void reportError(final AbstractError error) { } } + + @SuppressWarnings("unchecked") + public Boolean isLegacyClient() { + final String path = this.currentProject.getLocation().toOSString() + Constants.innerFileSeparator + Constants.SECURE_COMMUNICATION + Constants.JSON_EXTENSION; + JSONParser parser = new JSONParser(); + try { + if (Files.exists(Paths.get(path))) { + + Object obj = parser.parse(new InputStreamReader(new FileInputStream(path))); + JSONObject jsonObject = (JSONObject) obj; + String clientsQuestion = "Which clients should the server at least support?"; + + if (jsonObject.containsKey(clientsQuestion) && jsonObject.get(clientsQuestion).equals("Legacy Clients (since 2001)")) { + return true; + } + } + } catch (ParseException | IOException e2) { + Activator.getDefault().logError(e2); + } + return false; + } // It only works when the secure object checkbox in preference page is checked @Override