diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 95b24b9..0f24ae0 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -4,8 +4,6 @@
-
-
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index c6c9827..fd5a3f9 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -41,5 +41,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 3eadea6..12f5777 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -5,7 +5,18 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 344cdca..1c777bf 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -5,9 +5,6 @@
-
-
-
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 115a42d..7f62674 100644
--- a/build.gradle
+++ b/build.gradle
@@ -4,11 +4,13 @@ plugins {
id 'java'
id 'org.jetbrains.intellij' version '0.4.10'
id 'maven'
+ id 'org.jetbrains.kotlin.jvm' version '1.3.72'
}
apply plugin: 'idea'
apply plugin: 'org.jetbrains.intellij'
apply plugin: 'java'
+apply plugin: "kotlin"
group 'de.fraunhofer'
version '0.2.5.1'
@@ -21,6 +23,7 @@ repositories {
}
dependencies {
+ implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72")
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'ca.mcgill.sable', name: 'soot', version: '4.0.0'
compile group: 'de.fraunhofer.iem', name: 'CryptoAnalysis-Android', version: '2.7.2-SNAPSHOT'
@@ -29,11 +32,13 @@ dependencies {
compile group: 'de.tud.sse', name: 'soot-infoflow-android', version: '2.7.1'
compile group: 'de.tud.sse', name: 'soot-infoflow-cmd', version: '2.7.1'
compile group: 'org.swinglabs.swingx', name: 'swingx-all', version: '1.6.4'
+
+
}
// See https://github.com/JetBrains/gradle-intellij-plugin/gradle
intellij {
- plugins 'android', 'java', 'maven', 'gradle'
+ plugins 'android', 'java', 'maven', 'gradle', 'Kotlin'
//version '2019.2.2'
updateSinceUntilBuild false
@@ -58,7 +63,7 @@ runIde {
patchPluginXml {
sinceBuild '191'
- untilBuild '201.*'
+ untilBuild '202.*'
changeNotes """
Add change notes here.
most HTML tags may be used"""
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/actions/RunCogniCryptAction.java b/src/main/java/de/fraunhofer/iem/icognicrypt/actions/RunCogniCryptAction.java
index a11d81d..ea12906 100644
--- a/src/main/java/de/fraunhofer/iem/icognicrypt/actions/RunCogniCryptAction.java
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/actions/RunCogniCryptAction.java
@@ -27,6 +27,7 @@ public class RunCogniCryptAction extends CogniCryptAction implements DumbAware
private static final Logger logger = Logger.getInstance(RunCogniCryptAction.class);
private final IPersistableCogniCryptSettings _settings;
private final IdeType _ideType;
+ public static boolean EnabledFlag= true;
public RunCogniCryptAction()
{
@@ -49,6 +50,12 @@ public void actionPerformed(@NotNull AnActionEvent e)
Iterable files = GetFilesToAnalyze(project);
// TODO: Re-Enable
+ if(e.getPresentation().isEnabled()){
+ e.getPresentation().setEnabled(false);
+ EnabledFlag=false;
+ update(e);
+ }
+
/*
if (files == null || !Linq.any(files))
{
@@ -87,6 +94,14 @@ private Iterable GetFilesToAnalyze(Project project)
}
return Collections.EMPTY_LIST;
}
+ public static void SetFlag(boolean b){
+ EnabledFlag=b;
+ }
+ @Override
+ public void update(AnActionEvent e) {
+ e.getPresentation().setEnabled(EnabledFlag);
+ }
+
}
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/AnalysisListenerService.java b/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/AnalysisListenerService.java
index bbd55cc..dfc8598 100644
--- a/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/AnalysisListenerService.java
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/AnalysisListenerService.java
@@ -21,6 +21,7 @@
import crypto.interfaces.ISLConstraint;
import crypto.rules.CrySLPredicate;
import de.fraunhofer.iem.icognicrypt.Constants;
+import de.fraunhofer.iem.icognicrypt.actions.RunCogniCryptAction;
import de.fraunhofer.iem.icognicrypt.core.Language.JvmClassNameUtils;
import de.fraunhofer.iem.icognicrypt.results.CogniCryptError;
import de.fraunhofer.iem.icognicrypt.results.IResultProvider;
@@ -29,7 +30,6 @@
import soot.SootClass;
import sync.pds.solver.nodes.Node;
import typestate.TransitionFunction;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -43,6 +43,7 @@ class AnalysisListenerService extends CrySLAnalysisListener implements Disposabl
private static final Logger logger = LoggerFactory.getLogger(AnalysisListenerService.class);
private final Project _project;
private IResultProvider _resultProvider;
+ public static boolean EnabledFlag;
private final List _sourceCodeFiles;
@@ -54,6 +55,7 @@ private AnalysisListenerService(Project project, IResultProvider resultProvider)
@Override
public void beforeAnalysis() {
+ EnabledFlag= false;
_resultProvider.RemoveAllResults();
_sourceCodeFiles.clear();
@@ -66,6 +68,7 @@ public void afterAnalysis() {
//After analysis completes, restart code analyzer so that error markers can be updated
//for (Project project : ProjectManager.getInstance().getOpenProjects())
DaemonCodeAnalyzer.getInstance(_project).restart();
+ RunCogniCryptAction.SetFlag(true);
}
@Override
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/CogniCryptAndroidStudioAnalysisTask.java b/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/CogniCryptAndroidStudioAnalysisTask.java
index 57dd954..4095515 100644
--- a/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/CogniCryptAndroidStudioAnalysisTask.java
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/CogniCryptAndroidStudioAnalysisTask.java
@@ -15,6 +15,7 @@
import crypto.analysis.errors.IncompleteOperationError;
import de.fraunhofer.iem.crypto.CogniCryptAndroidAnalysis;
import de.fraunhofer.iem.icognicrypt.Constants;
+import de.fraunhofer.iem.icognicrypt.actions.RunCogniCryptAction;
import de.fraunhofer.iem.icognicrypt.core.Language.JvmClassNameUtils;
import de.fraunhofer.iem.icognicrypt.results.CogniCryptError;
import de.fraunhofer.iem.icognicrypt.results.IResultProvider;
@@ -111,6 +112,7 @@ public void onFinished()
_analysisQueue = null;
_stopWatch = null;
_resultProvider = null;
+ RunCogniCryptAction.SetFlag(true);
}
@Override
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/IntelliJAnalysis.java b/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/IntelliJAnalysis.java
index 8ccafad..1017509 100644
--- a/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/IntelliJAnalysis.java
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/analysis/IntelliJAnalysis.java
@@ -86,8 +86,8 @@ public static void RunIntelliJAnalysis(Project project, Iterable filesToAn
Task analysis = new JavaProjectAnalysisTask(modulePath, Joiner.on(File.pathSeparator).join(classpath),
settings.getRulesDirectory());
ProgressManager.getInstance().run(analysis);
-
*/
+
}
ProgressManager.getInstance().run(new JavaProjectAnalysisTask(project, modulePaths
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/results/CogniCryptErrorLineMarker.java b/src/main/java/de/fraunhofer/iem/icognicrypt/results/CogniCryptErrorLineMarker.java
index 3d99e69..78ec716 100644
--- a/src/main/java/de/fraunhofer/iem/icognicrypt/results/CogniCryptErrorLineMarker.java
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/results/CogniCryptErrorLineMarker.java
@@ -47,12 +47,12 @@ public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement psiElement)
}
return null;
}
-
+/*
@Override
public void collectSlowLineMarkers(@NotNull List list, @NotNull Collection collection) {
int i = 0;
}
-
+*/
private LineMarkerInfo CreateNewMarker(PsiElement psiElement, Iterable errors){
return new LineMarkerInfo<>(psiElement, psiElement.getTextRange(), PluginIcons.ERROR, Pass.LINE_MARKERS,
new TooltipProvider(getErrorsMessage(errors)), null, GutterIconRenderer.Alignment.LEFT);
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/results/KotlinErrorLineMarker.java b/src/main/java/de/fraunhofer/iem/icognicrypt/results/KotlinErrorLineMarker.java
new file mode 100644
index 0000000..094f28b
--- /dev/null
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/results/KotlinErrorLineMarker.java
@@ -0,0 +1,81 @@
+package de.fraunhofer.iem.icognicrypt.results;
+
+import com.intellij.codeHighlighting.Pass;
+import com.intellij.codeInsight.daemon.LineMarkerInfo;
+import com.intellij.codeInsight.daemon.LineMarkerProvider;
+import com.intellij.openapi.components.ServiceManager;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.markup.GutterIconRenderer;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.*;
+import com.intellij.psi.impl.source.tree.java.ClassElement;
+import org.jetbrains.kotlin.psi.*;
+import icons.PluginIcons;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.uast.UElement;
+import org.jetbrains.uast.UElementKt;
+import java.util.Set;
+
+public class KotlinErrorLineMarker implements LineMarkerProvider
+{
+ // TODO: Somehow this code is not executed with Kotlin files.
+ @Nullable
+ public LineMarkerInfo getLineMarkerInfo(@NotNull KtElement psiElement)
+ {
+ IResultProvider resultProvider = ServiceManager.getService(psiElement.getProject(), IResultProvider.class);
+ int lineNumber = getLineNumber(psiElement) + 1;
+
+ UElement uElement= (UElement) psiElement.getNode();
+ // PsiElement element= UElementKt.getAsJavaPsiElement((UElement) psiElement.getNode(),psiElement.getClass());
+ PsiElement element= uElement.getSourcePsi();
+ String path = psiElement.getContainingFile().getVirtualFile().getPath();
+ Set errors = resultProvider.FindErrors(path, lineNumber);
+ if (!errors.isEmpty())
+ return CreateNewMarker(element, errors);
+
+ return null;
+ }
+ /*
+ @Override
+ public void collectSlowLineMarkers(@NotNull List list, @NotNull Collection collection) {
+ int i = 0;
+ }
+ */
+ private LineMarkerInfo CreateNewMarker(PsiElement element, Iterable errors){
+ return new LineMarkerInfo<>(element, element.getTextRange(), PluginIcons.ERROR, Pass.LINE_MARKERS,
+ new TooltipProvider(getErrorsMessage(errors)), null, GutterIconRenderer.Alignment.LEFT);
+ }
+
+ private String getErrorsMessage(Iterable errors) {
+ String s = "";
+ for(CogniCryptError e : errors){
+ s += e.getErrorMessage() +"\n";
+ }
+ return s;
+ }
+
+ //Returns line number for PSI element
+ private int getLineNumber(KtElement psiElement) {
+ KtFile containingFile = (KtFile) psiElement.getContainingFile();
+ Project project = containingFile.getProject();
+ PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(project);
+ Document document = psiDocumentManager.getDocument(containingFile);
+ int textOffset = psiElement.getTextOffset();
+
+ return document.getLineNumber(textOffset);
+ }
+
+ private PsiClass FindClass(KtElement element){
+ if (element instanceof KtClass)
+ return (PsiClass) element;
+ if (element == null)
+ return null;
+ return FindClass((KtElement) element.getParent());
+ }
+
+ @Override
+ public LineMarkerInfo> getLineMarkerInfo(@NotNull PsiElement element) {
+ return null;
+ }
+}
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/results/ui/CogniCryptResultWindow.java b/src/main/java/de/fraunhofer/iem/icognicrypt/results/ui/CogniCryptResultWindow.java
index b0a377d..0901027 100644
--- a/src/main/java/de/fraunhofer/iem/icognicrypt/results/ui/CogniCryptResultWindow.java
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/results/ui/CogniCryptResultWindow.java
@@ -39,14 +39,14 @@ public CogniCryptResultWindow(ToolWindow toolWindow, Project project)
IResultProvider service = ServiceManager.getService(project, IResultProvider.class);
service.Subscribe(_tableModel);
-
- for (Set errorSet : service.GetErrors().values())
- {
- for (CogniCryptError error : errorSet)
- {
- _tableModel.AddError(error);
- }
- }
+// ToolWindow clearing when starting IDE
+// for (Set errorSet : service.GetErrors().values())
+// {
+// for (CogniCryptError error : errorSet)
+// {
+// _tableModel.AddError(error);
+// }
+// }
}
@Override
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/settings/CogniCryptSettingsPersistentComponent.java b/src/main/java/de/fraunhofer/iem/icognicrypt/settings/CogniCryptSettingsPersistentComponent.java
index d30eb90..f0d742e 100644
--- a/src/main/java/de/fraunhofer/iem/icognicrypt/settings/CogniCryptSettingsPersistentComponent.java
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/settings/CogniCryptSettingsPersistentComponent.java
@@ -27,7 +27,7 @@ public void loadState(@NotNull CogniCryptSettingsPersistentComponent icognicrypt
}
@Override
- public void setOptimizedLanguage(SupportedLanguage optimizedLanguage)
+ public void setOptimizedLanguage(@NotNull SupportedLanguage optimizedLanguage)
{
super.setOptimizedLanguage(optimizedLanguage);
ServiceManager.getService(SupportedLanguagesUtils.class).SupportedLanguages.Promote(optimizedLanguage);
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/ui/NotificationProvider.java b/src/main/java/de/fraunhofer/iem/icognicrypt/ui/NotificationProvider.java
index 32e9604..ca12a47 100644
--- a/src/main/java/de/fraunhofer/iem/icognicrypt/ui/NotificationProvider.java
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/ui/NotificationProvider.java
@@ -1,11 +1,18 @@
package de.fraunhofer.iem.icognicrypt.ui;
+import com.intellij.ide.DataManager;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
+import com.intellij.openapi.actionSystem.DataContext;
+import com.intellij.openapi.actionSystem.PlatformDataKeys;
+import com.intellij.openapi.project.Project;
+import static de.fraunhofer.iem.icognicrypt.IdeSupport.projects.ProjectHelper.GetActiveProject;
+
public class NotificationProvider
{
+
public static void Warn(String message)
{
ShowNotification(message, NotificationType.WARNING);
@@ -24,6 +31,13 @@ public static void ShowError(String message)
private static void ShowNotification(String message, NotificationType type)
{
Notification notification = new Notification("CogniCrypt", "CogniCrypt Message", message, type);
- Notifications.Bus.notify(notification);
+ Project project= GetActiveProject();
+ DataContext d = DataManager.getInstance().getDataContext();
+ Project project1= d.getData(PlatformDataKeys.PROJECT);
+ if(project==project1) {
+ Notifications.Bus.notify(notification, project);
+ }
+
}
+
}
diff --git a/src/main/java/de/fraunhofer/iem/icognicrypt/ui/multipleOutputFilesDialog/MultipleOutputFilesDialog.form b/src/main/java/de/fraunhofer/iem/icognicrypt/ui/multipleOutputFilesDialog/MultipleOutputFilesDialog.form
index 21877a7..1988181 100644
--- a/src/main/java/de/fraunhofer/iem/icognicrypt/ui/multipleOutputFilesDialog/MultipleOutputFilesDialog.form
+++ b/src/main/java/de/fraunhofer/iem/icognicrypt/ui/multipleOutputFilesDialog/MultipleOutputFilesDialog.form
@@ -91,7 +91,9 @@
-
+
+
+
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 2687662..0da5cf4 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -10,8 +10,11 @@
+ com.intellij.modules.platform
com.intellij.modules.java
org.jetbrains.android
+ org.jetbrains.kotlin
+ org.jetbrains.kotlin
@@ -46,8 +49,9 @@
+
+ implementationClass="de.fraunhofer.iem.icognicrypt.results.CogniCryptErrorLineMarker"/>
diff --git a/src/main/resources/META-INF/withKotlin.xml b/src/main/resources/META-INF/withKotlin.xml
new file mode 100644
index 0000000..0381990
--- /dev/null
+++ b/src/main/resources/META-INF/withKotlin.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file