diff --git a/.gitignore b/.gitignore index a94c0f3..fd7ac31 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .gradle .idea +.intellijPlatform build .DS_Store bin \ No newline at end of file diff --git a/.intellijPlatform/self-update.lock b/.intellijPlatform/self-update.lock new file mode 100644 index 0000000..1972e83 --- /dev/null +++ b/.intellijPlatform/self-update.lock @@ -0,0 +1 @@ +2024-09-10 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index e276d3a..9900c6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,22 @@ # checkov-jetbrains-idea Changelog +## [1.0.22] - 2024-09-10 + +### Added + +- Added a new 'show logs' button in the plugin panel that opens the plugin log file + +### Misc + +- Upgraded gradle version to 8.10.1 +- Migrated the IntelliJ platform plugin to version 2.0.1 + ## [1.0.21] - 2024-08-29 ### Added -- Added the following data to Prisma Cloid analytics +- Added the following data to Prisma Cloud analytics - Extension version - VS Code version diff --git a/build.gradle.kts b/build.gradle.kts index 2e4a587..ebb733b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,33 +1,35 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent +import org.jetbrains.changelog.Changelog import org.jetbrains.changelog.markdownToHTML +import org.jetbrains.intellij.platform.gradle.TestFrameworkType import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.jlleitschuh.gradle.ktlint.tasks.BaseKtLintCheckTask -fun properties(key: String) = project.findProperty(key).toString() +fun properties(key: String): String = project.findProperty(key).toString() plugins { - // Java support - id("java") - // Kotlin support - id("org.jetbrains.kotlin.jvm") version "1.9.25" - // gradle-intellij-plugin - read more: https://github.com/JetBrains/gradle-intellij-plugin - id("org.jetbrains.intellij") version "1.17.4" - // gradle-changelog-plugin - read more: https://github.com/JetBrains/gradle-changelog-plugin - id("org.jetbrains.changelog") version "1.3.1" - // Gradle Qodana Plugin - id("org.jetbrains.qodana") version "0.1.13" - // ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle - id("org.jlleitschuh.gradle.ktlint") version "10.2.0" + id("java") // Java support + alias(libs.plugins.kotlin) // Kotlin support + alias(libs.plugins.intelliJPlatform) // IntelliJ Platform Gradle Plugin + alias(libs.plugins.changelog) // Gradle Changelog Plugin + alias(libs.plugins.qodana) // Gradle Qodana Plugin + alias(libs.plugins.kover) // Gradle Kover Plugin kotlin("plugin.serialization") version "1.9.25" } group = properties("pluginGroup") version = properties("pluginVersion") +kotlin { + jvmToolchain(17) +} + // Configure project's dependencies repositories { mavenCentral() + intellijPlatform { + defaultRepositories() + } } dependencies { @@ -37,20 +39,51 @@ dependencies { implementation("commons-io:commons-io:2.11.0") implementation("io.github.java-diff-utils:java-diff-utils:4.12") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") - testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1") + implementation("org.slf4j:slf4j-api:2.0.16") + implementation("ch.qos.logback:logback-classic:1.5.6") + testImplementation(libs.junit) + testImplementation(libs.jupiterApi) testRuntimeOnly("org.junit.jupiter:junit-jupiter:5.8.1") testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.9.0") -} -// Configure gradle-intellij-plugin plugin. -// Read more: https://github.com/JetBrains/gradle-intellij-plugin -intellij { - pluginName.set(properties("pluginName")) - version.set(properties("platformVersion")) - type.set(properties("platformType")) + // IntelliJ Platform Gradle Plugin Dependencies Extension - read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-dependencies-extension.html + intellijPlatform { + create(providers.gradleProperty("platformType"), providers.gradleProperty("platformVersion")) + + // Plugin Dependencies. Uses `platformBundledPlugins` property from the gradle.properties file for bundled IntelliJ Platform plugins. + bundledPlugins(providers.gradleProperty("platformBundledPlugins").map { it.split(',') }) + + // Plugin Dependencies. Uses `platformPlugins` property from the gradle.properties file for plugin from JetBrains Marketplace. + plugins(providers.gradleProperty("platformPlugins").map { it.split(',') }) + + instrumentationTools() + pluginVerifier() + zipSigner() + testFramework(TestFrameworkType.Platform) + } +} - // Plugin Dependencies. Uses `platformPlugins` property from the gradle.properties file. - plugins.set(properties("platformPlugins").split(',').map(String::trim).filter(String::isNotEmpty)) +intellijPlatform { + pluginConfiguration { + name = properties("pluginName") + version = properties("pluginVersion") + ideaVersion { + sinceBuild = properties("pluginSinceBuild") + untilBuild = properties("pluginUntilBuild") + } + val changelog = project.changelog // local variable for configuration cache compatibility + // Get the latest available change notes from the changelog file + changeNotes = providers.gradleProperty("pluginVersion").map { pluginVersion -> + with(changelog) { + renderItem( + (getOrNull(pluginVersion) ?: getUnreleased()) + .withHeader(false) + .withEmptySections(false), + Changelog.OutputType.HTML, + ) + } + } + } } // Configure Gradle Changelog Plugin - read more: https://github.com/JetBrains/gradle-changelog-plugin @@ -67,6 +100,16 @@ qodana { showReport.set(System.getenv("QODANA_SHOW_REPORT")?.toBoolean() ?: false) } +kover { + reports { + total { + xml { + onCheck = true + } + } + } +} + tasks { // Set the JVM compatibility versions properties("javaVersion").let { @@ -79,18 +122,11 @@ tasks { } } - withType().configureEach { - enabled = false - } - wrapper { gradleVersion = properties("gradleVersion") } patchPluginXml { - version.set(properties("pluginVersion")) - sinceBuild.set(properties("pluginSinceBuild")) - untilBuild.set("") // Extract the section from README.md and provide for the plugin's manifest pluginDescription.set( projectDir.resolve("README.md").readText().lines().run { @@ -103,22 +139,6 @@ tasks { subList(indexOf(start) + 1, indexOf(end)) }.joinToString("\n").run { markdownToHTML(this) } ) - - // Get the latest available change notes from the changelog file - changeNotes.set(provider { - changelog.run { - getOrNull(properties("pluginVersion")) ?: getLatest() - }.toHTML() - }) - } - - // Configure UI tests plugin - // Read more: https://github.com/JetBrains/intellij-ui-test-robot - runIdeForUiTests { - systemProperty("robot-server.port", "8082") - systemProperty("ide.mac.message.dialogs.as.sheets", "false") - systemProperty("jb.privacy.policy.text", "") - systemProperty("jb.consents.confirmation.enabled", "false") } signPlugin { @@ -128,7 +148,7 @@ tasks { } publishPlugin { - dependsOn("patchChangelog") + dependsOn(patchChangelog) token.set(System.getenv("PUBLISH_TOKEN")) // pluginVersion is based on the SemVer (https://semver.org) and supports pre-release labels, like 2.1.7-alpha.3 // Specify pre-release label to publish the plugin in a custom Release Channel automatically. Read more: @@ -144,8 +164,25 @@ tasks { events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) } } +} - runPluginVerifier { - ideVersions.set(listOf("IC-2020.3.4", "IC-2021.1.3", "IC-2021.2.4", "IC-2024.1.6")) +intellijPlatformTesting { + runIde { + register("runIdeForUiTests") { + task { + jvmArgumentProviders += CommandLineArgumentProvider { + listOf( + "-Drobot-server.port=8082", + "-Dide.mac.message.dialogs.as.sheets=false", + "-Djb.privacy.policy.text=", + "-Djb.consents.confirmation.enabled=false", + ) + } + } + + plugins { + robotServerPlugin() + } + } } } diff --git a/gradle.properties b/gradle.properties index 2413e14..93c0f83 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,18 +3,22 @@ pluginGroup = com.github.bridgecrewio.prismajetbrainsidea pluginName = prismacloud-jetbrains-idea -pluginVersion=1.0.21 -pluginSinceBuild=241 +pluginVersion=1.0.22 # Plugin Verifier integration -> https://github.com/JetBrains/gradle-intellij-plugin#plugin-verifier-dsl # See https://jb.gg/intellij-platform-builds-list for available build versions pluginVerifierIdeVersions=2020.3.4, 2021.1.3, 2021.2.4, 2024.1.6 platformType = IC +# Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html +pluginSinceBuild=203 +pluginUntilBuild=242 platformVersion=2024.1.6 platformDownloadSources = true # Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html # Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22 platformPlugins = +# Example: platformBundledPlugins = com.intellij.java +platformBundledPlugins= # Opt-out flag for bundling Kotlin standard library. # See https://kotlinlang.org/docs/reference/using-gradle.html#dependency-on-the-standard-library for details. @@ -24,4 +28,4 @@ kotlin.stdlib.default.dependency = false javaVersion=17 # Gradle Releases -> https://github.com/gradle/gradle/releases -gradleVersion=7.6.4 +gradleVersion=8.10.1 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..77c1d6d --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,22 @@ +[versions] +# libraries +junit = "4.13.2" +jupiterApi = "5.8.1" + +# plugins +changelog = "2.2.1" +intelliJPlatform = "2.0.1" +kotlin = "1.9.25" +kover = "0.8.3" +qodana = "0.1.13" + +[libraries] +junit = { group = "junit", name = "junit", version.ref = "junit" } +jupiterApi = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.ref = "jupiterApi" } + +[plugins] +changelog = { id = "org.jetbrains.changelog", version.ref = "changelog" } +intelliJPlatform = { id = "org.jetbrains.intellij.platform", version.ref = "intelliJPlatform" } +kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } +qodana = { id = "org.jetbrains.qodana", version.ref = "qodana" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3994438..d642e7f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/bridgecrew/log/LoggerService.java b/src/main/java/com/bridgecrew/log/LoggerService.java new file mode 100644 index 0000000..98b80fc --- /dev/null +++ b/src/main/java/com/bridgecrew/log/LoggerService.java @@ -0,0 +1,21 @@ +package com.bridgecrew.log; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.FileAppender; +import com.intellij.openapi.components.Service; +import org.slf4j.LoggerFactory; + +@Service +public final class LoggerService { + + public String getLogFilePath() { + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); + Appender appender = rootLogger.getAppender("FILE"); + if (appender instanceof FileAppender fileAppender) { + return fileAppender.getFile(); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/bridgecrew/util/ApplicationServiceUtil.java b/src/main/java/com/bridgecrew/util/ApplicationServiceUtil.java new file mode 100644 index 0000000..245b658 --- /dev/null +++ b/src/main/java/com/bridgecrew/util/ApplicationServiceUtil.java @@ -0,0 +1,20 @@ +package com.bridgecrew.util; + +import com.intellij.openapi.application.ApplicationManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ApplicationServiceUtil { + + private final static Logger logger = LoggerFactory.getLogger(ApplicationServiceUtil.class); + + public static T getService(Class clazz) { + T service = ApplicationManager.getApplication().getService(clazz); + if (service == null) { + String message = String.format("Could not find service %s", clazz.getSimpleName()); + logger.error(message); + throw new IllegalArgumentException(message); + } + return service; + } +} diff --git a/src/main/kotlin/com/bridgecrew/activities/PostStartupActivity.kt b/src/main/kotlin/com/bridgecrew/activities/PostStartupActivity.kt index a40d2b9..09872c9 100644 --- a/src/main/kotlin/com/bridgecrew/activities/PostStartupActivity.kt +++ b/src/main/kotlin/com/bridgecrew/activities/PostStartupActivity.kt @@ -9,21 +9,23 @@ import com.bridgecrew.settings.PrismaSettingsState import com.bridgecrew.ui.CheckovToolWindowManagerPanel import com.intellij.ide.plugins.IdeaPluginDescriptor import com.intellij.ide.plugins.PluginInstaller +import com.intellij.ide.plugins.PluginManagerCore import com.intellij.ide.plugins.PluginStateListener import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger +import com.intellij.openapi.extensions.PluginId import com.intellij.openapi.project.Project -import com.intellij.openapi.startup.StartupActivity +import com.intellij.openapi.startup.ProjectActivity import com.intellij.openapi.vfs.LocalFileSystem +import org.slf4j.LoggerFactory import java.util.* +class PostStartupActivity : ProjectActivity { -private val LOG = logger() + private val logger = LoggerFactory.getLogger(javaClass) -class PostStartupActivity : StartupActivity { - - override fun runActivity(project: Project) { - LOG.info("Startup activity starting") + override suspend fun execute(project: Project) { + val version = PluginManagerCore.getPlugin(PluginId.getId("com.github.bridgecrewio.prismacloud"))?.version + logger.info("Starting Prisma Cloud JetBrains plugin version $version") project.messageBus.connect(project).subscribe(INITIALIZATION_TOPIC, object : InitializationListener { override fun initializationCompleted() { project.service().subscribeToInternalEvents(project) @@ -36,12 +38,12 @@ class PostStartupActivity : StartupActivity { PluginInstaller.addStateListener(object : PluginStateListener { override fun install(ideaPluginDescriptor: IdeaPluginDescriptor) { //todo this event wasn't trigger, need review - LOG.info("Plugin was installed") + logger.info("Plugin was installed") } override fun uninstall(ideaPluginDescriptor: IdeaPluginDescriptor) { //todo uncomment after backend added "onPluginUninstall" event support //sendAnalyticsPluginUninstalled(project) - LOG.info("Plugin was uninstalled") + logger.info("Plugin was uninstalled") } }) @@ -49,7 +51,7 @@ class PostStartupActivity : StartupActivity { initializeProject(project) sendAnalyticsPluginInstalled(project) - LOG.info("Startup activity finished") + logger.info("Startup activity finished") } private fun initializeProject(project: Project) { diff --git a/src/main/kotlin/com/bridgecrew/analytics/AnalyticsService.kt b/src/main/kotlin/com/bridgecrew/analytics/AnalyticsService.kt index 7a3d2ee..f3235a0 100644 --- a/src/main/kotlin/com/bridgecrew/analytics/AnalyticsService.kt +++ b/src/main/kotlin/com/bridgecrew/analytics/AnalyticsService.kt @@ -8,21 +8,18 @@ import com.bridgecrew.services.scan.ScanTaskResult import com.bridgecrew.settings.PrismaSettingsState import com.intellij.openapi.components.Service import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project -import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import org.slf4j.LoggerFactory import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.TimeUnit - @Service -@OptIn(ExperimentalSerializationApi::class) class AnalyticsService(val project: Project) { - private val LOG = logger() + private val logger = LoggerFactory.getLogger(javaClass) private var apiClient: ApiClient? = null private var fullScanData: FullScanAnalyticsData? = null @@ -38,41 +35,41 @@ class AnalyticsService(val project: Project) { fun fullScanButtonWasPressed() { val fullScanButtonWasPressedDate = Date() fullScanNumber += 1 - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan button was pressed") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan button was pressed") fullScanData = FullScanAnalyticsData(fullScanNumber) fullScanData!!.buttonPressedTime = fullScanButtonWasPressedDate } fun fullScanStarted() { - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan started") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan started") fullScanData!!.scanStartedTime = Date() } fun fullScanByFrameworkStarted(framework: String) { - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan started for framework $framework") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan started for framework $framework") fullScanData!!.frameworksScanTime[framework] = FullScanFrameworkScanTimeData(Date()) } fun fullScanByFrameworkFinished(framework: String) { fullScanData!!.frameworksScanTime[framework]!!.endTime = Date() fullScanData!!.frameworksScanTime[framework]!!.totalTimeSeconds = (fullScanData!!.frameworksScanTime[framework]!!.endTime.time - fullScanData!!.frameworksScanTime[framework]!!.startTime.time) / 1000 - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan finished for framework $framework and took ${fullScanData!!.frameworksScanTime[framework]!!.totalTimeSeconds} ms") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan finished for framework $framework and took ${fullScanData!!.frameworksScanTime[framework]!!.totalTimeSeconds} ms") } fun fullScanFinished() { fullScanData!!.scanFinishedTime = Date() - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan finished") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan finished") buildFullScanAnalyticsData() } fun fullScanFrameworkFinishedNoErrors(framework: String) { - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - framework $framework finished with no errors") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - framework $framework finished with no errors") } fun fullScanResultsWereFullyDisplayed() { if (fullScanData!!.isFullScanFinished()) { fullScanData!!.resultsWereFullyDisplayedTime = Date() - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan results are fully displayed") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan results are fully displayed") logFullScanAnalytics() wereFullScanResultsDisplayed = true } @@ -83,15 +80,15 @@ class AnalyticsService(val project: Project) { } fun fullScanFrameworkError(framework: String) { - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - error while scanning framework $framework") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - error while scanning framework $framework") } fun fullScanFrameworkDetectedVulnerabilities(framework: String, numberOfVulnerabilities: Int) { - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - $numberOfVulnerabilities security issues were detected while scanning framework $framework") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - $numberOfVulnerabilities security issues were detected while scanning framework $framework") } fun fullScanParsingError(framework: String, failedFilesSize: Int) { - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - parsing error while scanning framework $framework in $failedFilesSize files}") + logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - parsing error while scanning framework $framework in $failedFilesSize files}") } fun pluginInstalled(){ @@ -127,7 +124,8 @@ class AnalyticsService(val project: Project) { val frameworkScansFinishedWithErrors: MutableMap = project.service().frameworkScansFinishedWithErrors - LOG.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan analytics:\n" + + logger.info( + "Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan analytics:\n" + "full scan took ${formatTimeAsString(fullScanData!!.buttonPressedTime, fullScanData!!.resultsWereFullyDisplayedTime)} minutes from pressing on the scan button to fully display the results\n" + "full scan took ${formatTimeAsString(fullScanData!!.scanStartedTime, fullScanData!!.scanFinishedTime)} minutes from starting Prisma Cloud scans and finishing Prisma Cloud scans for all frameworks\n" + "full scan took ${formatTimeAsString(fullScanData!!.buttonPressedTime, fullScanData!!.scanStartedTime)} minutes from pressing on the scan button to starting Prisma Cloud scan\n" + diff --git a/src/main/kotlin/com/bridgecrew/api/ApiClient.kt b/src/main/kotlin/com/bridgecrew/api/ApiClient.kt index 327cc44..bf4b6fe 100644 --- a/src/main/kotlin/com/bridgecrew/api/ApiClient.kt +++ b/src/main/kotlin/com/bridgecrew/api/ApiClient.kt @@ -1,14 +1,13 @@ package com.bridgecrew.api - import com.bridgecrew.settings.DEFAULT_REPORTING_INTERVAL import com.bridgecrew.settings.PLUGIN_NAME -import com.intellij.openapi.diagnostic.logger import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlinx.serialization.SerializationException import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import org.slf4j.LoggerFactory import java.io.IOException import java.net.URI import java.net.http.HttpClient @@ -16,7 +15,6 @@ import java.net.http.HttpRequest import java.net.http.HttpRequest.BodyPublishers import java.net.http.HttpResponse - @Serializable data class LoginRequest(val username: String, val password: String) @@ -26,21 +24,21 @@ data class LoginResponse(val token: String) @Serializable data class ConfigResponse(val reportingInterval: Int = DEFAULT_REPORTING_INTERVAL) -private val LOG = logger() - @OptIn(ExperimentalSerializationApi::class) class ApiClient(private val username: String, private val password: String, private val prismaURL: String) { + + private val logger = LoggerFactory.getLogger(javaClass) private val client = HttpClient.newBuilder().build() private val prismaURI = URI.create(prismaURL) fun putDataAnalytics(data: String): Boolean { try { - LOG.debug("PutDataAnalytics method call") + logger.debug("PutDataAnalytics method call") val authToken = this.login().token //todo maybe add jwt parser to get know exp timestamp? if (authToken.isEmpty()) { //todo do we need show IDE popup here? - LOG.warn("Could not authorize for username: $username") + logger.warn("Could not authorize for username: $username") return false } @@ -53,28 +51,26 @@ class ApiClient(private val username: String, private val password: String, priv val response = client.send(request, HttpResponse.BodyHandlers.ofString()) - LOG.debug("PutDataAnalytics method called response body: ${response.body()}") + logger.debug("PutDataAnalytics method called response body: ${response.body()}") if(response.statusCode() == 403 || response.statusCode() == 401 || response.statusCode() == 404){ - LOG.warn("Could not authorize for token: $authToken") + logger.warn("Could not authorize for token: $authToken") return false } - return response.statusCode() == 200 } catch (e: IOException) { //todo do we need show IDE popup here? - LOG.warn("IOException: ${e.message}") + logger.warn("IOException: ${e.message}") return false } - } fun getConfig(): ConfigResponse { try { - LOG.debug("getConfig method call") + logger.debug("getConfig method call") val authToken = this.login().token if (authToken.isEmpty()) { - LOG.warn("Could not authorize for username: $username") + logger.warn("Could not authorize for username: $username") return ConfigResponse() } @@ -87,9 +83,9 @@ class ApiClient(private val username: String, private val password: String, priv val response = client.send(request, HttpResponse.BodyHandlers.ofString()) - LOG.debug("getConfig method called response body: ${response.body()}") + logger.debug("getConfig method called response body: ${response.body()}") if(response.statusCode() == 403 || response.statusCode() == 401){ - LOG.warn("Could not authorize for token: $authToken") + logger.warn("Could not authorize for token: $authToken") return ConfigResponse() } @@ -98,10 +94,9 @@ class ApiClient(private val username: String, private val password: String, priv } catch (e: IOException) { //todo do we need show IDE popup here? - LOG.warn("IOException: ${e.message}") + logger.warn("IOException: ${e.message}") return ConfigResponse() } - } fun getToken(){ @@ -110,7 +105,7 @@ class ApiClient(private val username: String, private val password: String, priv private fun login(): LoginResponse { try { - LOG.debug("Login to $prismaURL with username: $username") + logger.debug("Login to $prismaURL with username: $username") val loginRequest = LoginRequest(username, password) val jsonBody = Json.encodeToString(loginRequest) @@ -123,7 +118,7 @@ class ApiClient(private val username: String, private val password: String, priv val response = client.send(request, HttpResponse.BodyHandlers.ofString()) if (response.statusCode() == 401) { //todo do we need show IDE popup here? - LOG.warn("Incorrect username or password") + logger.warn("Incorrect username or password") return LoginResponse("") } @@ -131,10 +126,10 @@ class ApiClient(private val username: String, private val password: String, priv return json.decodeFromString(response.body()) } catch (e: IOException) { //todo do we need show IDE popup here? - LOG.warn("Method login called with IOException: ${e.message}") + logger.warn("Method login called with IOException: ${e.message}") return LoginResponse("") } catch (e: SerializationException) { - LOG.warn("Method login called with SerializationException: ${e.message}") + logger.warn("Method login called with SerializationException: ${e.message}") return LoginResponse("") } } diff --git a/src/main/kotlin/com/bridgecrew/errors/CheckovErrorHandler.kt b/src/main/kotlin/com/bridgecrew/errors/CheckovErrorHandler.kt index 6eb2971..d738d15 100644 --- a/src/main/kotlin/com/bridgecrew/errors/CheckovErrorHandler.kt +++ b/src/main/kotlin/com/bridgecrew/errors/CheckovErrorHandler.kt @@ -8,13 +8,14 @@ import com.bridgecrew.utils.extractFileNameFromPath import com.intellij.notification.NotificationType import com.intellij.openapi.components.Service import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project +import org.slf4j.LoggerFactory import java.io.File @Service class CheckovErrorHandlerService(val project: Project) { - private val LOG = logger() + + private val logger = LoggerFactory.getLogger(javaClass) private fun notifyAboutScanError(scanTaskResult: ScanTaskResult, dataSourceValue: String, error: Exception, scanSourceType: CheckovScanService.ScanSourceType) { try { @@ -35,20 +36,20 @@ class CheckovErrorHandlerService(val project: Project) { "Prisma Cloud result can be found in ${errorCheckovResultFile.path}.\n" + "To report: open a issue at https://github.com/bridgecrewio/prisma-cloud-jetbrains-ide/issues\n" - LOG.error(errorMessage, error) + logger.error(errorMessage, error) CheckovNotificationBalloon.showNotification(project, errorMessage, NotificationType.ERROR) } catch (e: Exception) { - LOG.error("Error while notifying about original exception - $error", e) + logger.error("Error while notifying about original exception - $error", e) } } fun notifyAboutParsingError(scanningSource: String, scanSourceType: CheckovScanService.ScanSourceType) { val errorMessage = "Error while scanning ${scanSourceType.toString().lowercase()} ${scanningSource.replace(project.basePath!!, "")} - file was found as invalid" - LOG.warn(errorMessage) + logger.warn(errorMessage) CheckovNotificationBalloon.showNotification(project, errorMessage, diff --git a/src/main/kotlin/icons/CheckovIcons.kt b/src/main/kotlin/com/bridgecrew/icons/CheckovIcons.kt similarity index 91% rename from src/main/kotlin/icons/CheckovIcons.kt rename to src/main/kotlin/com/bridgecrew/icons/CheckovIcons.kt index 6b5fcf3..1057dcf 100644 --- a/src/main/kotlin/icons/CheckovIcons.kt +++ b/src/main/kotlin/com/bridgecrew/icons/CheckovIcons.kt @@ -1,4 +1,4 @@ -package icons +package com.bridgecrew.icons import com.intellij.openapi.util.IconLoader @@ -17,4 +17,5 @@ object CheckovIcons { val SeverityCritical = IconLoader.getIcon("/icons/severity_critical.svg", javaClass) val prismaIcon = IconLoader.getIcon("/icons/prisma.svg", javaClass) val pluginLargeIcon = IconLoader.getIcon("/icons/plugin_large_icon.svg", javaClass) + val showLogsIcon = IconLoader.getIcon("/icons/showLogs.svg", javaClass) } \ No newline at end of file diff --git a/src/main/kotlin/com/bridgecrew/initialization/InitializationService.kt b/src/main/kotlin/com/bridgecrew/initialization/InitializationService.kt index bc1b862..237d7f6 100644 --- a/src/main/kotlin/com/bridgecrew/initialization/InitializationService.kt +++ b/src/main/kotlin/com/bridgecrew/initialization/InitializationService.kt @@ -1,30 +1,25 @@ package com.bridgecrew.initialization -import CheckovInstallerService -import CliService import com.bridgecrew.cache.InMemCache import com.bridgecrew.listeners.CheckovInstallerListener import com.bridgecrew.listeners.InitializationListener +import com.bridgecrew.services.CliService import com.bridgecrew.services.checkovScanCommandsService.CheckovScanCommandsService import com.bridgecrew.services.checkovScanCommandsService.DockerCheckovScanCommandsService import com.bridgecrew.services.checkovScanCommandsService.InstalledCheckovScanCommandsService -import com.bridgecrew.services.installation.DockerInstallerCommandService -import com.bridgecrew.services.installation.InstallerCommandService -import com.bridgecrew.services.installation.PipInstallerCommandService -import com.bridgecrew.services.installation.PipenvInstallerCommandService +import com.bridgecrew.services.installation.* import com.bridgecrew.services.scan.CheckovScanService import com.bridgecrew.utils.initializeRepoName import com.intellij.openapi.components.Service import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project +import org.slf4j.LoggerFactory import java.nio.file.Paths -private val LOG = logger() - @Service class InitializationService(private val project: Project) { + private val logger = LoggerFactory.getLogger(javaClass) private var isCheckovInstalledGlobally: Boolean = false private var minimalCheckovVersion: String = "3.2.20" @@ -40,14 +35,14 @@ class InitializationService(private val project: Project) { private fun checkIfDockerIsRunningCheckovImage(output: String, exitCode: Int, project: Project) { if (exitCode != 0 || output.lowercase().trim().contains("cannot connect to the Docker")) { - LOG.info("Docker can't be used as scan service, trying to check if installed globally") + logger.info("Docker can't be used as scan service, trying to check if installed globally") installCheckovIfNeededAndSetCheckovPath() return } if (output.lowercase().trim().contains("pulling from bridgecrew/checkov") || !checkIfCheckovUpdateNeeded(output)) { - LOG.info("Docker picked for Checkov installation") + logger.info("Docker picked for Checkov installation") setSelectedCheckovService(DockerCheckovScanCommandsService(project)) return } @@ -68,30 +63,30 @@ class InitializationService(private val project: Project) { } ) - LOG.info("Checking global checkov installation with `checkov`") + logger.info("Checking global checkov installation with `checkov`") val isGloballyInstalledCommand = arrayListOf("checkov", "-v") project.service().run(isGloballyInstalledCommand, project, this::checkIfCheckovIsGloballyInstalled, this::checkIfCheckovIsGloballyInstalled) } private fun checkIfCheckovIsGloballyInstalled(output: String, exitCode: Int, project: Project) { if (exitCode != 0 || output.contains("[ERROR]")) { - LOG.info("Checking global checkov installation with `checkov.cmd`") + logger.info("Checking global checkov installation with `checkov.cmd`") val cmds = arrayListOf("checkov.cmd", "-v") project.service().run(cmds, project, this::checkIfCheckovCmdIsGloballyInstalled, this::checkIfCheckovCmdIsGloballyInstalled) return } - LOG.info("Checkov installed globally, will use it") + logger.info("Checkov installed globally, will use it") isCheckovInstalledGlobally = true updatePythonBasePath(project, output) } private fun checkIfCheckovCmdIsGloballyInstalled(output: String, exitCode: Int, project: Project) { isCheckovInstalledGlobally = if (exitCode != 0 || output.contains("[ERROR]")) { - LOG.info("Checkov is not installed globally, running local command") + logger.info("Checkov is not installed globally, running local command") false } else { - LOG.info("Checkov installed globally, will use it") + logger.info("Checkov installed globally, will use it") true } updatePythonBasePath(project, output) @@ -114,7 +109,7 @@ class InitializationService(private val project: Project) { private fun updatePathUnix(output: String, exitCode: Int, project: Project) { if (exitCode != 0 || output.contains("[ERROR]")) { - LOG.warn("Failed to get checkovPath") + logger.warn("Failed to get checkovPath") project.service().install(project) return } @@ -130,7 +125,7 @@ class InitializationService(private val project: Project) { private fun updatePathWin(output: String, exitCode: Int, project: Project) { if (exitCode != 0 || output.contains("[ERROR]")) { - LOG.warn("Failed to get checkovPath") + logger.warn("Failed to get checkovPath") project.service().install(project) return } @@ -144,7 +139,7 @@ class InitializationService(private val project: Project) { val outputLine = output.split('\n') for (line in outputLine) { if (line.trim().contains("Location: ")) { - LOG.info("Python location is $line") + logger.info("Python location is $line") val sitePackagePath = line.split(' ')[1] project.service().checkovPath = Paths.get(Paths.get(sitePackagePath).parent.toString(), "Scripts", "checkov.cmd").toString() } @@ -183,7 +178,7 @@ class InitializationService(private val project: Project) { private fun updateCheckovPathUnixAfterInstallation(output: String, exitCode: Int, project: Project) { if (exitCode != 0 || output.contains("[ERROR]")) { - LOG.warn("Failed to get checkovPath") + logger.warn("Failed to get checkovPath") return } val result = output.trim() @@ -191,20 +186,20 @@ class InitializationService(private val project: Project) { checkovPathArray.removeLast() checkovPathArray.add("checkov") project.service().checkovPath = checkovPathArray.joinToString(separator = "/") - LOG.info("Setting checkovPath: ${project.service().checkovPath}") + logger.info("Setting checkovPath: ${project.service().checkovPath}") setSelectedCheckovService(InstalledCheckovScanCommandsService(project)) } private fun updateCheckovPathWinAfterInstallation(output: String, exitCode: Int, project: Project) { if (exitCode != 0 || output.contains("[ERROR]")) { - LOG.warn("Failed to get checkovPath") + logger.warn("Failed to get checkovPath") return } val result = output.trim() val checkovPathArray = result.split('\n') - LOG.info("Checkov path in Win is $result") + logger.info("Checkov path in Win is $result") project.service().checkovPath = checkovPathArray[0] - LOG.info("Setting checkovPath: ${project.service().checkovPath}") + logger.info("Setting checkovPath: ${project.service().checkovPath}") setSelectedCheckovService(InstalledCheckovScanCommandsService(project)) } @@ -225,7 +220,7 @@ class InitializationService(private val project: Project) { private fun checkIfCheckovUpdateNeeded(rawVersion: String): Boolean { val version = rawVersion.split('\n')[0] - LOG.info("Checkov version $version") + logger.info("Checkov version $version") InMemCache.set("checkovVersion", version) return !versionIsNewer(version, minimalCheckovVersion) } @@ -242,12 +237,12 @@ class InitializationService(private val project: Project) { @Suppress("UNUSED_PARAMETER") private fun onCheckovUpdate(output: String, exitCode: Int, project: Project) { if (exitCode != 0) { - LOG.warn("Failed to pull Checkov image") + logger.warn("Failed to pull Checkov image") installCheckovIfNeededAndSetCheckovPath() return } setSelectedCheckovService(DockerCheckovScanCommandsService(project)) - LOG.info("Checkov Docker updated") + logger.info("Checkov Docker updated") } } diff --git a/src/main/kotlin/com/bridgecrew/listeners/CheckovInstallerListener.kt b/src/main/kotlin/com/bridgecrew/listeners/CheckovInstallerListener.kt index ba414dd..126b347 100644 --- a/src/main/kotlin/com/bridgecrew/listeners/CheckovInstallerListener.kt +++ b/src/main/kotlin/com/bridgecrew/listeners/CheckovInstallerListener.kt @@ -1,4 +1,5 @@ package com.bridgecrew.listeners + import com.bridgecrew.services.installation.InstallerCommandService import com.intellij.util.messages.Topic diff --git a/src/main/kotlin/com/bridgecrew/listeners/CheckovScanListener.kt b/src/main/kotlin/com/bridgecrew/listeners/CheckovScanListener.kt index a494ede..ecb05eb 100644 --- a/src/main/kotlin/com/bridgecrew/listeners/CheckovScanListener.kt +++ b/src/main/kotlin/com/bridgecrew/listeners/CheckovScanListener.kt @@ -1,4 +1,5 @@ package com.bridgecrew.listeners + import com.bridgecrew.services.scan.CheckovScanService import com.intellij.util.messages.Topic diff --git a/src/main/kotlin/com/bridgecrew/listeners/CheckovSettingsListener.kt b/src/main/kotlin/com/bridgecrew/listeners/CheckovSettingsListener.kt index e478378..0f16962 100644 --- a/src/main/kotlin/com/bridgecrew/listeners/CheckovSettingsListener.kt +++ b/src/main/kotlin/com/bridgecrew/listeners/CheckovSettingsListener.kt @@ -1,4 +1,5 @@ package com.bridgecrew.listeners + import com.intellij.util.messages.Topic interface CheckovSettingsListener { diff --git a/src/main/kotlin/com/bridgecrew/results/BaseCheckovResult.kt b/src/main/kotlin/com/bridgecrew/results/BaseCheckovResult.kt index 08f3f01..498d722 100644 --- a/src/main/kotlin/com/bridgecrew/results/BaseCheckovResult.kt +++ b/src/main/kotlin/com/bridgecrew/results/BaseCheckovResult.kt @@ -1,6 +1,6 @@ package com.bridgecrew.results -enum class Category(category: String) { +enum class Category(val category: String) { SECRETS("Secrets"), IAC("IAC"), VULNERABILITIES("Vulnerabilities"), @@ -8,7 +8,7 @@ enum class Category(category: String) { WEAKNESSES("Weaknesses") } -enum class CheckType(checkType: String) { +enum class CheckType(val checkType: String) { ANSIBLE("ansible"), ARM("arm"), BICEP("bicep"), diff --git a/src/main/kotlin/com/bridgecrew/scheduler/IntervalRunner.kt b/src/main/kotlin/com/bridgecrew/scheduler/IntervalRunner.kt index 1a2db7d..08599bb 100644 --- a/src/main/kotlin/com/bridgecrew/scheduler/IntervalRunner.kt +++ b/src/main/kotlin/com/bridgecrew/scheduler/IntervalRunner.kt @@ -1,16 +1,16 @@ package com.bridgecrew.scheduler import com.intellij.openapi.components.Service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project -import java.util.Timer import org.apache.commons.lang3.time.StopWatch +import org.slf4j.LoggerFactory import java.util.* import java.util.concurrent.TimeUnit @Service class IntervalRunner(val project: Project) { - private val LOG = logger() + + private val logger = LoggerFactory.getLogger(javaClass) private val timer = Timer() fun scheduleWithTimer(intervalFunction: () -> Unit, period: Int) { val stopWatch = StopWatch.createStarted() @@ -20,9 +20,13 @@ class IntervalRunner(val project: Project) { try { stopWatch.time intervalFunction() - LOG.info("Function in scheduleWithTimer for ${project.name} executed with delay " + TimeUnit.MILLISECONDS.toSeconds(stopWatch.time)) + logger.info( + "Function in scheduleWithTimer for ${project.name} executed with delay " + TimeUnit.MILLISECONDS.toSeconds( + stopWatch.time + ) + ) } catch (e: Throwable) { - LOG.info("Catch the exception: $e") + logger.info("Catch the exception: $e") stopWatch.stop() timer.cancel() } @@ -32,6 +36,6 @@ class IntervalRunner(val project: Project) { fun stop(){ timer.cancel() - LOG.info("Timer stopped for ${project.name}") + logger.info("Timer stopped for ${project.name}") } } diff --git a/src/main/kotlin/com/bridgecrew/services/CheckovResultsComparatorGenerator.kt b/src/main/kotlin/com/bridgecrew/services/CheckovResultsComparatorGenerator.kt index 48117a9..d747776 100644 --- a/src/main/kotlin/com/bridgecrew/services/CheckovResultsComparatorGenerator.kt +++ b/src/main/kotlin/com/bridgecrew/services/CheckovResultsComparatorGenerator.kt @@ -2,7 +2,7 @@ package com.bridgecrew.services import com.bridgecrew.results.BaseCheckovResult import com.bridgecrew.results.Category -import com.intellij.openapi.diagnostic.logger +import org.slf4j.LoggerFactory class CheckovResultsComparatorGenerator { @@ -13,7 +13,7 @@ class CheckovResultsComparatorGenerator { } companion object { - private val LOG = logger() + private val logger = LoggerFactory.getLogger(this::class.java) fun generateCheckovResultComparator(): Comparator { return generateNameComparator(CheckovResultProperty.FILE_PATH) .thenComparing(generateResourceComparator()) @@ -39,7 +39,7 @@ class CheckovResultsComparatorGenerator { return@Comparator try { getAlphanumericComparator().compare(name1, name2) } catch (e: Exception) { - LOG.warn("Error while comparing ${property.name.lowercase()}", e) + logger.warn("Error while comparing ${property.name.lowercase()}", e) name1.compareTo(name2, true) } } diff --git a/src/main/kotlin/com/bridgecrew/services/CheckovResultsListUtils.kt b/src/main/kotlin/com/bridgecrew/services/CheckovResultsListUtils.kt index 4fa0c84..c899ad1 100644 --- a/src/main/kotlin/com/bridgecrew/services/CheckovResultsListUtils.kt +++ b/src/main/kotlin/com/bridgecrew/services/CheckovResultsListUtils.kt @@ -6,11 +6,15 @@ import com.bridgecrew.ui.CheckovToolWindowFactory import com.bridgecrew.ui.actions.SeverityFilterActions import com.intellij.openapi.components.service import com.intellij.openapi.project.Project -import org.jetbrains.rpc.LOG +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.io.File class CheckovResultsListUtils { + companion object { + + val logger: Logger = LoggerFactory.getLogger(this::class.java) private val checkovResultsComparator: Comparator = CheckovResultsComparatorGenerator.generateCheckovResultComparator() private fun filterResultsByCategories(sourceList: List, categories: List?): List { @@ -45,7 +49,7 @@ class CheckovResultsListUtils { try { sourceList.sortWith(checkovResultsComparator) } catch (e: Exception) { - LOG.warn("error while sorting list", e) + logger.warn("error while sorting list", e) } } diff --git a/src/main/kotlin/com/bridgecrew/services/CliService.kt b/src/main/kotlin/com/bridgecrew/services/CliService.kt index d0db12b..4601f60 100644 --- a/src/main/kotlin/com/bridgecrew/services/CliService.kt +++ b/src/main/kotlin/com/bridgecrew/services/CliService.kt @@ -1,4 +1,4 @@ - +package com.bridgecrew.services import com.bridgecrew.ui.CheckovNotificationBalloon import com.intellij.execution.configurations.GeneralCommandLine @@ -8,19 +8,19 @@ import com.intellij.execution.process.ScriptRunnerUtil import com.intellij.notification.NotificationType import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.Service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.Task import com.intellij.openapi.project.Project +import org.slf4j.LoggerFactory import java.nio.charset.Charset import javax.swing.SwingUtilities import kotlin.reflect.KFunction3 -private val LOG = logger() - @Service class CliService { + + private val logger = LoggerFactory.getLogger(javaClass) var checkovPath: String = "" var checkovVersion: String = "" @@ -31,7 +31,7 @@ class CliService { onFailureFunction: ((output: String, exitCode: Int, project: Project) -> Unit)? = null ) { val commandToPrint = commands.joinToString(" ") - LOG.info("Running command: $commandToPrint") + logger.info("Running command: $commandToPrint") try { val generalCommandLine = GeneralCommandLine(commands) @@ -49,7 +49,7 @@ class CliService { } } } catch (e: Exception){ - LOG.warn("Cli command $commandToPrint could not run due to exception: $e") + logger.warn("Cli command $commandToPrint could not run due to exception: $e") if (onFailureFunction != null) { onFailureFunction("", 1, project) } diff --git a/src/main/kotlin/com/bridgecrew/services/ResultsCacheService.kt b/src/main/kotlin/com/bridgecrew/services/ResultsCacheService.kt index b641885..331c2e9 100644 --- a/src/main/kotlin/com/bridgecrew/services/ResultsCacheService.kt +++ b/src/main/kotlin/com/bridgecrew/services/ResultsCacheService.kt @@ -8,13 +8,15 @@ import com.bridgecrew.utils.fromDockerFilePath import com.bridgecrew.utils.isWindows import com.intellij.openapi.components.Service import com.intellij.openapi.project.Project -import org.apache.commons.io.FilenameUtils -import org.jetbrains.rpc.LOG +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.io.File import java.nio.file.Paths @Service class ResultsCacheService(val project: Project) { + + private val logger: Logger = LoggerFactory.getLogger(javaClass) var checkovResults: MutableList = mutableListOf() var modifiedResults: MutableList = mutableListOf() private val baseDir: String = project.basePath!! @@ -177,7 +179,7 @@ class ResultsCacheService(val project: Project) { } } } catch (e: Exception) { - LOG.info("Error while adding checkov result $result", e) + logger.info("Error while adding checkov result $result", e) } } diff --git a/src/main/kotlin/com/bridgecrew/services/checkovScanCommandsService/InstalledCheckovScanCommandsService.kt b/src/main/kotlin/com/bridgecrew/services/checkovScanCommandsService/InstalledCheckovScanCommandsService.kt index 441ce81..7381a22 100644 --- a/src/main/kotlin/com/bridgecrew/services/checkovScanCommandsService/InstalledCheckovScanCommandsService.kt +++ b/src/main/kotlin/com/bridgecrew/services/checkovScanCommandsService/InstalledCheckovScanCommandsService.kt @@ -1,6 +1,6 @@ package com.bridgecrew.services.checkovScanCommandsService -import CliService +import com.bridgecrew.services.CliService import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import org.apache.commons.io.FilenameUtils diff --git a/src/main/kotlin/com/bridgecrew/services/installation/InstallService.kt b/src/main/kotlin/com/bridgecrew/services/installation/InstallService.kt index ff204ee..76206ec 100644 --- a/src/main/kotlin/com/bridgecrew/services/installation/InstallService.kt +++ b/src/main/kotlin/com/bridgecrew/services/installation/InstallService.kt @@ -1,28 +1,26 @@ +package com.bridgecrew.services.installation + import com.bridgecrew.listeners.CheckovInstallerListener -import com.bridgecrew.services.installation.DockerInstallerCommandService -import com.bridgecrew.services.installation.InstallerCommandService -import com.bridgecrew.services.installation.PipInstallerCommandService -import com.bridgecrew.services.installation.PipenvInstallerCommandService +import com.bridgecrew.services.CliService import com.intellij.execution.process.OSProcessHandler import com.intellij.execution.process.ProcessHandler import com.intellij.execution.process.ScriptRunnerUtil import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.Service import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.Task import com.intellij.openapi.project.Project +import org.slf4j.LoggerFactory import java.nio.charset.Charset import javax.swing.SwingUtilities - -private val LOG = logger() - @Service class CheckovInstallerService { + private val logger = LoggerFactory.getLogger(javaClass) + fun install( project: Project, ) { @@ -35,12 +33,12 @@ class CheckovInstallerService { val processHandler: ProcessHandler = OSProcessHandler(generalCommandLine) commands.add(Pair(service, processHandler)) } catch (e: Exception) { - LOG.info("Process is not installed in the machine, will not try to install $e") + logger.info("Process is not installed in the machine, will not try to install $e") continue } } if (commands.isEmpty()) { - LOG.error("Checkov could not be installed, your machine is missing all 3 installation options.\n Please install docker | pip | pipenv") + logger.error("Checkov could not be installed, your machine is missing all 3 installation options.\n Please install docker | pip | pipenv") } val installerTask = InstallerTask(project, "Installing checkov", commands) if (SwingUtilities.isEventDispatchThread()) { @@ -58,6 +56,8 @@ class CheckovInstallerService { val services: ArrayList> ) : Task.Backgroundable(project, title, true) { + private val logger = LoggerFactory.getLogger(javaClass) + override fun run(indicator: ProgressIndicator) { indicator.isIndeterminate = false for (service in services) { @@ -67,10 +67,10 @@ class CheckovInstallerService { ScriptRunnerUtil.STDOUT_OR_STDERR_OUTPUT_KEY_FILTER, 720000000) if (handler.exitCode != 0 || output.contains("[ERROR]")) { - LOG.info("Failed to install using: ${serviceObject.javaClass.kotlin}") + logger.info("Failed to install using: ${serviceObject.javaClass.kotlin}") continue } - LOG.info("Checkov installed successfully using ${serviceObject.javaClass.kotlin}") + logger.info("Checkov installed successfully using ${serviceObject.javaClass.kotlin}") project.messageBus.syncPublisher(CheckovInstallerListener.INSTALLER_TOPIC).installerFinished(serviceObject) project.service().run(serviceObject.getVersion(project), project, ::printCheckovVersion) break @@ -79,11 +79,11 @@ class CheckovInstallerService { fun printCheckovVersion(output: String, exitCode: Int, project: Project) { if (exitCode != 0 || output.contains("[ERROR]")) { - LOG.warn("Failed to get checkov version") + logger.warn("Failed to get checkov version") return } project.service().checkovVersion = output.trim().replace("\n", "") - LOG.info("Checkov was installed version: $output") + logger.info("Checkov was installed version: $output") } } } diff --git a/src/main/kotlin/com/bridgecrew/services/installation/PipInstallerCommandService.kt b/src/main/kotlin/com/bridgecrew/services/installation/PipInstallerCommandService.kt index 16fa5b8..6f671e5 100644 --- a/src/main/kotlin/com/bridgecrew/services/installation/PipInstallerCommandService.kt +++ b/src/main/kotlin/com/bridgecrew/services/installation/PipInstallerCommandService.kt @@ -1,6 +1,6 @@ package com.bridgecrew.services.installation -import CliService +import com.bridgecrew.services.CliService import com.intellij.execution.configurations.GeneralCommandLine import com.intellij.openapi.components.service import com.intellij.openapi.project.Project diff --git a/src/main/kotlin/com/bridgecrew/services/installation/PipenvInstallerCommandService.kt b/src/main/kotlin/com/bridgecrew/services/installation/PipenvInstallerCommandService.kt index b73a7bf..67473a9 100644 --- a/src/main/kotlin/com/bridgecrew/services/installation/PipenvInstallerCommandService.kt +++ b/src/main/kotlin/com/bridgecrew/services/installation/PipenvInstallerCommandService.kt @@ -1,6 +1,6 @@ package com.bridgecrew.services.installation -import CliService +import com.bridgecrew.services.CliService import com.intellij.execution.configurations.GeneralCommandLine import com.intellij.openapi.components.service import com.intellij.openapi.project.Project diff --git a/src/main/kotlin/com/bridgecrew/services/scan/CheckovScanService.kt b/src/main/kotlin/com/bridgecrew/services/scan/CheckovScanService.kt index aa07bb5..385eb58 100644 --- a/src/main/kotlin/com/bridgecrew/services/scan/CheckovScanService.kt +++ b/src/main/kotlin/com/bridgecrew/services/scan/CheckovScanService.kt @@ -20,19 +20,20 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.Service import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.extensions.PluginId import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.Project +import org.slf4j.LoggerFactory import java.io.File import java.nio.charset.Charset import javax.swing.SwingUtilities -private val LOG = logger() - @Service class CheckovScanService: Disposable { + + private val logger = LoggerFactory.getLogger(javaClass) + var selectedCheckovScanner: CheckovScanCommandsService? = null private val settings = PrismaSettingsState().getInstance() private val fullScanTasks = mutableSetOf() @@ -45,15 +46,15 @@ class CheckovScanService: Disposable { } if (singleFileCurrentScans.size == DESIRED_NUMBER_OF_SINGLE_FILE_SCANS) { - LOG.warn("${singleFileCurrentScans.size} scans for files are currently running. Please try scanning again in a couple of minutes") + logger.warn("${singleFileCurrentScans.size} scans for files are currently running. Please try scanning again in a couple of minutes") return } if (selectedCheckovScanner == null) { - LOG.warn("Checkov is not installed") + logger.warn("Checkov is not installed") } - LOG.info("Trying to scan a file using $selectedCheckovScanner") + logger.info("Trying to scan a file using $selectedCheckovScanner") project.messageBus.syncPublisher(CheckovScanListener.SCAN_TOPIC).fileScanningStarted() val checkovResultFile = createCheckovTempFile("${extractFileNameFromPath(filePath)}-checkov-result", ".json") @@ -79,18 +80,17 @@ class CheckovScanService: Disposable { } clearGlobalState(project) } catch (e: Exception) { - LOG.error(e) - return + logger.error("Failed to scan file $filePath", e) } } fun scanProject(project: Project) { try { if (selectedCheckovScanner == null) { - LOG.warn("Checkov is not installed") + logger.warn("Checkov is not installed") } - LOG.info("Trying to scan the project $selectedCheckovScanner") + logger.info("Trying to scan the project $selectedCheckovScanner") project.service().saveCurrentState() project.service().deleteAllCheckovResults() @@ -125,7 +125,7 @@ class CheckovScanService: Disposable { } } } catch (e: ProcessCanceledException) { - LOG.warn("Process for running framework $framework was canceled") + logger.warn("Process for running framework $framework was canceled") project.service().frameworkWasCancelled() } } @@ -136,7 +136,7 @@ class CheckovScanService: Disposable { } } catch (e: Exception) { CheckovScanAction.resetActionDynamically(true) - LOG.error(e) + logger.error("Failed to scan project $project", e) return } } @@ -150,7 +150,7 @@ class CheckovScanService: Disposable { } fun cancelFullScan(project: Project) { - LOG.info("Going to cancel full scan") + logger.info("Going to cancel full scan") project.service().onCancel = true for (frameworkScanTask in fullScanTasks) { @@ -187,7 +187,7 @@ class CheckovScanService: Disposable { selectedCheckovScanner!!.getExecCommandsForRepositoryByFramework(scanningSource.first(), checkovResultFilePath) val maskedCommand = replaceApiToken(execCommand.joinToString(" ")) - LOG.info("Running command with service ${selectedCheckovScanner!!.javaClass}: $maskedCommand") + logger.info("Running command with service ${selectedCheckovScanner!!.javaClass}: $maskedCommand") return execCommand } @@ -229,7 +229,7 @@ class CheckovScanService: Disposable { scanTaskResult.deleteResultsFile() } catch (error: Exception) { - LOG.warn("Error while analyzing scan results for framework $framework", error) + logger.warn("Error while analyzing scan results for framework $framework", error) project.service().scanningError(scanTaskResult, framework, error, ScanSourceType.FRAMEWORK) } } @@ -249,7 +249,14 @@ class CheckovScanService: Disposable { } if (extractionResult.failedChecks.isEmpty()) { - LOG.info("Checkov scanning finished, no errors have been detected for file: ${filePath.replace(project.basePath!!, "")}") + logger.info( + "Checkov scanning finished, no errors have been detected for file: ${ + filePath.replace( + project.basePath!!, + "" + ) + }" + ) scanTaskResult.deleteResultsFile() return } @@ -259,7 +266,7 @@ class CheckovScanService: Disposable { scanTaskResult.deleteResultsFile() } catch (error: Exception) { - LOG.warn("Error while analyzing scan results for file $filePath", error) + logger.warn("Error while analyzing scan results for file $filePath", error) project.service().scanningError(scanTaskResult, filePath, error, ScanSourceType.FILE) } } @@ -268,13 +275,13 @@ class CheckovScanService: Disposable { if (scanTaskResult.errorReason.contains("Please check your API token")) { project.service().scanningError(scanTaskResult, scanningSource, Exception("Please check your API token"), scanSourceType) - LOG.error("Please check you API token\n\n") + logger.error("Please check you API token\n\n") return false } if (scanTaskResult.errorReason.contains("missing dependencies (e.g., helm or kustomize, which require those tools to be on your system")) { val errorMessage = "Framework $scanningSource was not scanned since it's probably not installed: ${scanTaskResult.errorReason}" - LOG.warn(errorMessage) + logger.warn(errorMessage) scanTaskResult.deleteResultsFile() project.service().frameworkWasNotScanned(scanningSource) return false diff --git a/src/main/kotlin/com/bridgecrew/services/scan/FullScanState.kt b/src/main/kotlin/com/bridgecrew/services/scan/FullScanState.kt index afc86b6..28b27e4 100644 --- a/src/main/kotlin/com/bridgecrew/services/scan/FullScanState.kt +++ b/src/main/kotlin/com/bridgecrew/services/scan/FullScanState.kt @@ -15,9 +15,9 @@ import com.google.gson.reflect.TypeToken import com.intellij.notification.NotificationType import com.intellij.openapi.components.Service import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project import org.json.JSONArray +import org.slf4j.LoggerFactory import java.io.File @Service @@ -42,7 +42,7 @@ class FullScanStateService(val project: Project) { var previousState = State.FIRST_TIME_SCAN private val gson = Gson() - private val LOG = logger() + private val logger = LoggerFactory.getLogger(javaClass) var isFullScanRunning = false var isFrameworkResultsWereDisplayed = false @@ -97,7 +97,7 @@ class FullScanStateService(val project: Project) { project.service().checkovResults = checkovResultsList SeverityFilterActions.restartState() } catch (e: Exception) { - LOG.warn("Could not restore previous state from file, clearing the list", e) + logger.warn("Could not restore previous state from file, clearing the list", e) } } @@ -105,7 +105,7 @@ class FullScanStateService(val project: Project) { try { stateFile!!.delete() } catch (e: Exception) { - LOG.warn("Could not delete previous state file in $stateFile") + logger.warn("Could not delete previous state file in $stateFile") } } diff --git a/src/main/kotlin/com/bridgecrew/services/scan/ScanTask.kt b/src/main/kotlin/com/bridgecrew/services/scan/ScanTask.kt index e6fec7d..3dea08d 100644 --- a/src/main/kotlin/com/bridgecrew/services/scan/ScanTask.kt +++ b/src/main/kotlin/com/bridgecrew/services/scan/ScanTask.kt @@ -2,14 +2,16 @@ package com.bridgecrew.services.scan import com.bridgecrew.analytics.AnalyticsService import com.bridgecrew.listeners.CheckovScanListener -import com.bridgecrew.utils.* +import com.bridgecrew.utils.DEFAULT_FILE_TIMEOUT +import com.bridgecrew.utils.DEFAULT_FRAMEWORK_TIMEOUT +import com.bridgecrew.utils.createCheckovTempFile +import com.bridgecrew.utils.extractFileNameFromPath import com.intellij.execution.ExecutionException import com.intellij.execution.process.ProcessAdapter import com.intellij.execution.process.ProcessEvent import com.intellij.execution.process.ProcessHandler import com.intellij.execution.process.ProcessOutputTypes import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.ProgressManager @@ -17,6 +19,7 @@ import com.intellij.openapi.progress.Task import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManagerListener import com.intellij.openapi.util.Key +import org.slf4j.LoggerFactory import java.io.File data class ScanTaskResult( @@ -35,7 +38,7 @@ data class ScanTaskResult( abstract class ScanTask(project: Project, title: String, private val sourceName: String, private val processHandler: ProcessHandler, val checkovResultFile: File) : Task.Backgroundable(project, title, true) { - protected val LOG = logger() + protected val logger = LoggerFactory.getLogger(javaClass) val debugOutputFile: File = createCheckovTempFile("${sourceName}-debug-output", ".txt") var errorReason = "" @@ -43,14 +46,16 @@ abstract class ScanTask(project: Project, title: String, private val sourceName: protected var indicator: ProgressIndicator? = null protected fun getScanOutputs(timeout: Long): ScanTaskResult { - LOG.assertTrue(!processHandler.isStartNotified) + if (!processHandler.isStartNotified) { + logger.error("Assertion failed: processHandler.isStartNotified = ${processHandler.isStartNotified}") + } processHandler.addProcessListener(object : ProcessAdapter() { override fun onTextAvailable(event: ProcessEvent, outputType: Key<*>) { try { if (processHandler.isProcessTerminated || processHandler.isProcessTerminating) { - LOG.info("Process is terminating for $sourceName") + logger.info("Process is terminating for $sourceName") return } @@ -67,9 +72,12 @@ abstract class ScanTask(project: Project, title: String, private val sourceName: errorReason = updateErrorReason(text) } - LOG.debug(text) + logger.debug(text) } catch (e: ProcessCanceledException) { - LOG.info("Process was canceled for $sourceName during onTextAvailable, destroying process for processHandler", e) + logger.info( + "Process was canceled for $sourceName during onTextAvailable, destroying process for processHandler", + e + ) processHandler.destroyProcess() } @@ -98,12 +106,12 @@ abstract class ScanTask(project: Project, title: String, private val sourceName: fun cancelTask() { if (this.indicator != null) { - LOG.info("Going to cancel task for $sourceName") + logger.info("Going to cancel task for $sourceName") this.indicator!!.cancel() ProgressManager.canceled(indicator!!) processHandler.destroyProcess() deleteResultsFile() - LOG.info("Task was canceled for $sourceName") + logger.info("Task was canceled for $sourceName") } } @@ -121,26 +129,26 @@ abstract class ScanTask(project: Project, title: String, private val sourceName: try { this.indicator = indicator checkOnCancel() - LOG.info("Going to scan for framework $framework") + logger.info("Going to scan for framework $framework") indicator.isIndeterminate = false val scanTaskResult: ScanTaskResult = getScanOutputs(DEFAULT_FRAMEWORK_TIMEOUT) indicator.checkCanceled() - LOG.info("Checkov scan task finished successfully for framework $framework") + logger.info("Checkov scan task finished successfully for framework $framework") project.service().fullScanByFrameworkFinished(framework) project.service().analyzeFrameworkScan(scanTaskResult, processHandler.exitCode!!, project, framework) } catch (e: ProcessCanceledException) { - LOG.info("Task for framework $framework was canceled ", e) + logger.info("Task for framework $framework was canceled ", e) processHandler.destroyProcess() deleteResultsFile() project.service().frameworkWasCancelled() project.messageBus.syncPublisher(CheckovScanListener.SCAN_TOPIC).scanningFinished(CheckovScanService.ScanSourceType.FRAMEWORK) } catch (error: Exception) { - LOG.error("error while scanning framework $framework", error) + logger.error("error while scanning framework $framework", error) project.service().fullScanByFrameworkFinished(framework) project.service().frameworkFinishedWithErrors(framework, ScanTaskResult(checkovResultFile, debugOutputFile, errorReason)) throw error @@ -162,23 +170,23 @@ abstract class ScanTask(project: Project, title: String, private val sourceName: this.indicator = indicator indicator.checkCanceled() - LOG.info("Going to scan for file $filePath") + logger.info("Going to scan for file $filePath") indicator.isIndeterminate = false val scanTaskResult: ScanTaskResult = getScanOutputs(DEFAULT_FILE_TIMEOUT) indicator.checkCanceled() - LOG.info("Checkov scan task finished successfully for file $filePath") + logger.info("Checkov scan task finished successfully for file $filePath") project.service().analyzeFileScan(scanTaskResult, processHandler.exitCode!!, project, filePath) } catch (e: ProcessCanceledException) { - LOG.info("Task for file $filePath was canceled", e) + logger.info("Task for file $filePath was canceled", e) processHandler.destroyProcess() deleteResultsFile() } catch (error: Exception) { - LOG.error("error while scanning file $filePath", error) + logger.error("error while scanning file $filePath", error) throw error } } diff --git a/src/main/kotlin/com/bridgecrew/testing/CheckovRunnerTesting.kt b/src/main/kotlin/com/bridgecrew/testing/CheckovRunnerTesting.kt index 436a1dc..b25cee2 100644 --- a/src/main/kotlin/com/bridgecrew/testing/CheckovRunnerTesting.kt +++ b/src/main/kotlin/com/bridgecrew/testing/CheckovRunnerTesting.kt @@ -1,13 +1,9 @@ package com.bridgecrew.testing -import com.bridgecrew.CheckovResult -import com.google.gson.Gson import com.intellij.openapi.ui.SimpleToolWindowPanel import java.io.File import java.io.InputStream - - class CheckovRunnerTesting : SimpleToolWindowPanel(false, true) { val results: List = mutableListOf("""{ "check_id": "CKV2_AWS_12", diff --git a/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowDescriptionPanel.kt b/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowDescriptionPanel.kt index c153661..a9a41e0 100644 --- a/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowDescriptionPanel.kt +++ b/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowDescriptionPanel.kt @@ -1,20 +1,21 @@ package com.bridgecrew.ui +import com.bridgecrew.icons.CheckovIcons import com.bridgecrew.utils.createGridRowCol import com.intellij.icons.AllIcons import com.intellij.ide.DataManager +import com.intellij.openapi.actionSystem.ActionManager import com.intellij.openapi.actionSystem.ActionPlaces import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.project.Project import com.intellij.openapi.ui.SimpleToolWindowPanel import com.intellij.uiDesigner.core.GridConstraints import com.intellij.uiDesigner.core.GridLayoutManager -import com.intellij.util.ui.UIUtil import com.intellij.util.ui.JBUI -import icons.CheckovIcons -import com.intellij.openapi.actionSystem.ActionManager -import icons.CheckovIcons.pluginLargeIcon -import java.awt.* +import com.intellij.util.ui.UIUtil +import java.awt.Color +import java.awt.Dimension +import java.awt.Font import javax.swing.* class CheckovToolWindowDescriptionPanel(val project: Project) : SimpleToolWindowPanel(true, true) { @@ -98,7 +99,7 @@ class CheckovToolWindowDescriptionPanel(val project: Project) : SimpleToolWindow val imagePanel = JPanel() imagePanel.layout = GridLayoutManager(2, 2, JBUI.emptyInsets(), -1, -1) imagePanel.background = UIUtil.getEditorPaneBackground() - imagePanel.add(JLabel(pluginLargeIcon), createGridRowCol(0,0, GridConstraints.ANCHOR_CENTER)) + imagePanel.add(JLabel(CheckovIcons.pluginLargeIcon), createGridRowCol(0, 0, GridConstraints.ANCHOR_CENTER)) imagePanel.add(JLabel("Prisma Cloud"), createGridRowCol(1,0, GridConstraints.ANCHOR_NORTHEAST)) imagePanel.add(JLabel(" "), createGridRowCol(0,1, GridConstraints.ANCHOR_NORTHEAST)) return imagePanel diff --git a/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowFactory.kt b/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowFactory.kt index 863c839..a90671c 100644 --- a/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowFactory.kt +++ b/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowFactory.kt @@ -9,7 +9,6 @@ import com.bridgecrew.ui.topPanel.CheckovActionToolbar import com.bridgecrew.utils.PANELTYPE import com.bridgecrew.utils.formatNumberWithCommas import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.openapi.wm.ToolWindow @@ -17,6 +16,7 @@ import com.intellij.openapi.wm.ToolWindowFactory import com.intellij.openapi.wm.ToolWindowManager import com.intellij.openapi.wm.ex.ToolWindowManagerListener import com.intellij.util.messages.MessageBusConnection +import org.slf4j.LoggerFactory const val PRISMA_CLOUD_TOOL_WINDOW_ID = "Prisma Cloud" const val OVERVIEW_TAB_NAME = "Overview" @@ -37,7 +37,7 @@ private val tabNameToCategory: Map = mapOf( class CheckovToolWindowFactory : ToolWindowFactory { - private val LOG = logger() + private val logger = LoggerFactory.getLogger(javaClass) companion object { var internalExecution = false @@ -79,7 +79,7 @@ class CheckovToolWindowFactory : ToolWindowFactory { reloadContents(project, checkovTabContent.id) } } catch (e: Exception) { - LOG.error("Error while creating tool window: $e.message") + logger.error("Error while creating tool window: $e.message") } finally { currentlyRunning = false } diff --git a/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowManagerPanel.kt b/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowManagerPanel.kt index c4d0cbc..32bc432 100644 --- a/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowManagerPanel.kt +++ b/src/main/kotlin/com/bridgecrew/ui/CheckovToolWindowManagerPanel.kt @@ -11,8 +11,8 @@ import com.bridgecrew.services.scan.FullScanStateService import com.bridgecrew.settings.CheckovGlobalState import com.bridgecrew.settings.PrismaSettingsState import com.bridgecrew.ui.actions.CheckovScanAction -import com.bridgecrew.ui.errorBubble.CheckovGutterErrorIcon import com.bridgecrew.ui.actions.SeverityFilterActions +import com.bridgecrew.ui.errorBubble.CheckovGutterErrorIcon import com.bridgecrew.ui.topPanel.CheckovTopPanel import com.bridgecrew.ui.vulnerabilitiesTree.CheckovToolWindowTree import com.bridgecrew.utils.* @@ -21,14 +21,16 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.Service import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.editor.Document import com.intellij.openapi.editor.colors.EditorColorsListener import com.intellij.openapi.editor.colors.EditorColorsScheme import com.intellij.openapi.editor.markup.HighlighterLayer import com.intellij.openapi.editor.markup.MarkupModel import com.intellij.openapi.editor.markup.RangeHighlighter -import com.intellij.openapi.fileEditor.* +import com.intellij.openapi.fileEditor.FileEditorManager +import com.intellij.openapi.fileEditor.FileEditorManagerEvent +import com.intellij.openapi.fileEditor.FileEditorManagerListener +import com.intellij.openapi.fileEditor.TextEditor import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.ui.SimpleToolWindowPanel @@ -40,6 +42,7 @@ import com.intellij.openapi.vfs.newvfs.events.VFileEvent import com.intellij.openapi.wm.ToolWindowManager import com.intellij.openapi.wm.ex.ToolWindowManagerListener import com.intellij.ui.OnePixelSplitter +import org.slf4j.LoggerFactory import java.awt.BorderLayout import java.io.File import javax.swing.SwingUtilities @@ -49,7 +52,7 @@ class CheckovToolWindowManagerPanel(val project: Project) : SimpleToolWindowPane private val checkovDescription = CheckovToolWindowDescriptionPanel(project) private val mainPanelSplitter = OnePixelSplitter(PANEL_SPLITTER_KEY, 0.5f) - private val LOG = logger() + private val logger = LoggerFactory.getLogger(javaClass) private val key = Key("prismaCloudPlugin") /** @@ -237,7 +240,7 @@ class CheckovToolWindowManagerPanel(val project: Project) : SimpleToolWindowPane return } - LOG.debug("file event for file: ${events[0].file!!.path}. isValid: ${events[0].isValid}, isFromRefresh: ${events[0].isFromRefresh}, isFromSave: ${events[0].isFromSave}, requestor: ${events[0].requestor}") + logger.debug("file event for file: ${events[0].file!!.path}. isValid: ${events[0].isValid}, isFromRefresh: ${events[0].isFromRefresh}, isFromSave: ${events[0].isFromSave}, requestor: ${events[0].requestor}") if (events.isEmpty() || !events[0].isFromSave || events[0].file == null) { return @@ -283,42 +286,46 @@ class CheckovToolWindowManagerPanel(val project: Project) : SimpleToolWindowPane } fun subscribeToInternalEvents(project: Project) { + // Subscribe to Scanning Topic - project.messageBus.connect(this) - .subscribe(CheckovScanListener.SCAN_TOPIC, object : CheckovScanListener { + project.messageBus.connect(this).subscribe(CheckovScanListener.SCAN_TOPIC, object : CheckovScanListener { - override fun fileScanningStarted(){} + override fun fileScanningStarted() {} - override fun projectScanningStarted() { - SeverityFilterActions.restartState() - project.service().loadMainPanel(PANELTYPE.CHECKOV_REPOSITORY_SCAN_STARTED) - } + override fun projectScanningStarted() { + SeverityFilterActions.restartState() + project.service() + .loadMainPanel(PANELTYPE.CHECKOV_REPOSITORY_SCAN_STARTED) + } - override fun scanningFinished(scanSourceType: CheckovScanService.ScanSourceType) { - ApplicationManager.getApplication().invokeLater { - SeverityFilterActions.onScanFinishedForDisplayingResults(project) - if (scanSourceType == CheckovScanService.ScanSourceType.FILE) { - project.service().loadMainPanel(PANELTYPE.CHECKOV_FILE_SCAN_FINISHED) - } else { - project.service().loadMainPanel(PANELTYPE.CHECKOV_FRAMEWORK_SCAN_FINISHED) - } - } + override fun scanningFinished(scanSourceType: CheckovScanService.ScanSourceType) { + ApplicationManager.getApplication().invokeLater { + SeverityFilterActions.onScanFinishedForDisplayingResults(project) + if (scanSourceType == CheckovScanService.ScanSourceType.FILE) { + project.service() + .loadMainPanel(PANELTYPE.CHECKOV_FILE_SCAN_FINISHED) + } else { + project.service() + .loadMainPanel(PANELTYPE.CHECKOV_FRAMEWORK_SCAN_FINISHED) } + } + } - override fun fullScanFailed() { - ApplicationManager.getApplication().invokeLater { - project.service().loadMainPanel(PANELTYPE.CHECKOV_REPOSITORY_SCAN_FAILED) - } - } - }) + override fun fullScanFailed() { + ApplicationManager.getApplication().invokeLater { + project.service() + .loadMainPanel(PANELTYPE.CHECKOV_REPOSITORY_SCAN_FAILED) + } + } + }) // Subscribe to Settings Topic project.messageBus.connect(this) - .subscribe(CheckovSettingsListener.SETTINGS_TOPIC, object: CheckovSettingsListener { - override fun settingsUpdated() { - project.service().loadMainPanel() - } - }) + .subscribe(CheckovSettingsListener.SETTINGS_TOPIC, object : CheckovSettingsListener { + override fun settingsUpdated() { + project.service().loadMainPanel() + } + }) } private fun updateErrorsInFile(){ diff --git a/src/main/kotlin/com/bridgecrew/ui/CodeDiffPanel.kt b/src/main/kotlin/com/bridgecrew/ui/CodeDiffPanel.kt index 1c5da4d..31b87f7 100644 --- a/src/main/kotlin/com/bridgecrew/ui/CodeDiffPanel.kt +++ b/src/main/kotlin/com/bridgecrew/ui/CodeDiffPanel.kt @@ -2,11 +2,10 @@ package com.bridgecrew.ui import com.bridgecrew.results.BaseCheckovResult import com.bridgecrew.utils.* -import com.bridgecrew.utils.FIX_COLOR_LIGHT import com.github.difflib.text.DiffRow import com.github.difflib.text.DiffRowGenerator -import com.intellij.openapi.diagnostic.logger import com.intellij.util.ui.JBUI +import org.slf4j.LoggerFactory import java.awt.Dimension import java.awt.Font import javax.swing.* @@ -15,7 +14,7 @@ import javax.swing.text.StyleConstants class CodeDiffPanel(val result: BaseCheckovResult, isErrorBubble: Boolean): JPanel() { - private val LOG = logger() + private val logger = LoggerFactory.getLogger(javaClass) var hasDiff = false private val codeFont = Font("JetBrains Mono", Font.BOLD, 12) @@ -65,7 +64,7 @@ class CodeDiffPanel(val result: BaseCheckovResult, isErrorBubble: Boolean): JPan try { result.codeDiffFirstLine = diffRow.newLine.split(" ")[0].toInt() } catch (e: Exception) { - LOG.debug("Could not update first diff line from new line \"${diffRow.newLine}\"", e) + logger.debug("Could not update first diff line from new line \"${diffRow.newLine}\"", e) } } diff --git a/src/main/kotlin/com/bridgecrew/ui/actions/FixAction.kt b/src/main/kotlin/com/bridgecrew/ui/actions/FixAction.kt index 08767ac..c963d14 100644 --- a/src/main/kotlin/com/bridgecrew/ui/actions/FixAction.kt +++ b/src/main/kotlin/com/bridgecrew/ui/actions/FixAction.kt @@ -12,7 +12,6 @@ import com.bridgecrew.utils.navigateToFile import com.intellij.ide.DataManager import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.command.WriteCommandAction -import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.editor.Document import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.project.Project @@ -20,6 +19,7 @@ import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.ui.Messages import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VirtualFile +import org.slf4j.LoggerFactory import java.awt.event.ActionEvent import java.awt.event.ActionListener import javax.swing.JButton @@ -60,7 +60,7 @@ class FixAction(private val buttonInstance: JButton, val result: BaseCheckovResu } } - private val LOG = logger() + private val logger = LoggerFactory.getLogger(javaClass) override fun actionPerformed(e: ActionEvent?) { ApplicationManager.getApplication().invokeLater { @@ -99,7 +99,7 @@ class FixAction(private val buttonInstance: JButton, val result: BaseCheckovResu } } catch (e: Exception) { - LOG.warn("error while trying to apply fix", e) + logger.warn("error while trying to apply fix", e) buttonInstance.isEnabled = true return false } @@ -124,7 +124,7 @@ class FixAction(private val buttonInstance: JButton, val result: BaseCheckovResu } } } catch (e: Exception) { - LOG.warn("error while trying to apply SCA fix", e) + logger.warn("error while trying to apply SCA fix", e) buttonInstance.isEnabled = true } } diff --git a/src/main/kotlin/com/bridgecrew/ui/actions/ShowLogFileAction.kt b/src/main/kotlin/com/bridgecrew/ui/actions/ShowLogFileAction.kt new file mode 100644 index 0000000..5f579cf --- /dev/null +++ b/src/main/kotlin/com/bridgecrew/ui/actions/ShowLogFileAction.kt @@ -0,0 +1,55 @@ +package com.bridgecrew.ui.actions + +import com.bridgecrew.icons.CheckovIcons +import com.bridgecrew.log.LoggerService +import com.bridgecrew.util.ApplicationServiceUtil +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.Presentation +import com.intellij.openapi.project.DumbAware +import org.slf4j.LoggerFactory +import java.awt.Desktop +import java.io.File +import java.io.IOException + +class ShowLogFileAction : AnAction(), DumbAware { + + private val logger = LoggerFactory.getLogger(this::class.java) + + override fun update(event: AnActionEvent) { + val presentation: Presentation = event.presentation + presentation.icon = CheckovIcons.showLogsIcon + } + + override fun getActionUpdateThread(): ActionUpdateThread { + return ActionUpdateThread.EDT + } + + override fun actionPerformed(event: AnActionEvent) { + val logFilePath = ApplicationServiceUtil.getService(LoggerService::class.java).getLogFilePath() + val file = File(logFilePath) + + if (!file.exists()) { + logger.error("File does not exist: $logFilePath") + return + } + + if (!Desktop.isDesktopSupported()) { + logger.error("Desktop is not supported on this platform.") + return + } + + val desktop = Desktop.getDesktop() + if (!desktop.isSupported(Desktop.Action.OPEN)) { + logger.error("Open action is not supported on this platform.") + return + } + + try { + desktop.open(file) + } catch (e: IOException) { + logger.error("An error occurred while trying to open the file: ${e.message}", e) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/bridgecrew/ui/errorBubble/CheckovGutterErrorIcon.kt b/src/main/kotlin/com/bridgecrew/ui/errorBubble/CheckovGutterErrorIcon.kt index ab5d7f8..a075177 100644 --- a/src/main/kotlin/com/bridgecrew/ui/errorBubble/CheckovGutterErrorIcon.kt +++ b/src/main/kotlin/com/bridgecrew/ui/errorBubble/CheckovGutterErrorIcon.kt @@ -1,5 +1,6 @@ package com.bridgecrew.ui.errorBubble +import com.bridgecrew.icons.CheckovIcons import com.bridgecrew.listeners.ErrorBubbleFixListener import com.bridgecrew.results.BaseCheckovResult import com.bridgecrew.utils.FIX_COLOR_DARK @@ -13,7 +14,6 @@ import com.intellij.openapi.editor.markup.* import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManager import com.intellij.util.ui.EmptyIcon -import icons.CheckovIcons import java.awt.Point import javax.swing.Icon diff --git a/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleActionsPanel.kt b/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleActionsPanel.kt index 672f6b5..3c937d9 100644 --- a/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleActionsPanel.kt +++ b/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleActionsPanel.kt @@ -1,5 +1,6 @@ package com.bridgecrew.ui.errorBubble +import com.bridgecrew.icons.CheckovIcons import com.bridgecrew.results.BaseCheckovResult import com.bridgecrew.ui.actions.FixAction import com.bridgecrew.ui.actions.FocusOnFileInTree @@ -8,7 +9,6 @@ import com.bridgecrew.ui.buttons.DocumentationLinkButton import com.bridgecrew.ui.buttons.SuppressionLinkButton import com.bridgecrew.utils.* import com.intellij.openapi.project.Project -import icons.CheckovIcons import java.awt.Color import java.awt.Dimension import java.awt.Font diff --git a/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleCenterPanel.kt b/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleCenterPanel.kt index 88bfc9f..ca33706 100644 --- a/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleCenterPanel.kt +++ b/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleCenterPanel.kt @@ -1,10 +1,12 @@ package com.bridgecrew.ui.errorBubble -import com.bridgecrew.results.BaseCheckovResult import com.intellij.ui.ScrollPaneFactory import java.awt.BorderLayout import java.awt.Dimension -import javax.swing.* +import javax.swing.BorderFactory +import javax.swing.JPanel +import javax.swing.JTextArea +import javax.swing.ScrollPaneConstants class ErrorBubbleCenterPanel(text: String) : JPanel() { diff --git a/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleInnerPanel.kt b/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleInnerPanel.kt index 4bc7fd6..342f2ed 100644 --- a/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleInnerPanel.kt +++ b/src/main/kotlin/com/bridgecrew/ui/errorBubble/ErrorBubbleInnerPanel.kt @@ -10,10 +10,12 @@ import com.bridgecrew.utils.UNKNOWN_LICENSES_DESCRIPTION import com.bridgecrew.utils.VIOLATED_LICENSES_DESCRIPTION import com.intellij.openapi.project.Project import com.intellij.ui.components.JBScrollPane -import java.awt.* +import java.awt.BorderLayout +import java.awt.Component +import java.awt.Dimension +import java.awt.Point import javax.swing.* - class ErrorBubbleInnerPanel(val project: Project, val result: BaseCheckovResult, private val vulnerabilityCount: Int, index: Int, total: Int, callback: navigationCallback) : JPanel() { companion object { diff --git a/src/main/kotlin/com/bridgecrew/ui/rightPanel/dictionaryDetails/LicenseDictionaryPanel.kt b/src/main/kotlin/com/bridgecrew/ui/rightPanel/dictionaryDetails/LicenseDictionaryPanel.kt index 73c55c7..1e41b04 100644 --- a/src/main/kotlin/com/bridgecrew/ui/rightPanel/dictionaryDetails/LicenseDictionaryPanel.kt +++ b/src/main/kotlin/com/bridgecrew/ui/rightPanel/dictionaryDetails/LicenseDictionaryPanel.kt @@ -2,7 +2,6 @@ package com.bridgecrew.ui.rightPanel.dictionaryDetails import com.bridgecrew.results.LicenseCheckovResult - class LicenseDictionaryPanel(result: LicenseCheckovResult) : DictionaryExtraInfoPanel() { override var fieldsMap: MutableMap = mutableMapOf( diff --git a/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovFileTreeNode.kt b/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovFileTreeNode.kt index 8c6e671..33e9482 100644 --- a/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovFileTreeNode.kt +++ b/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovFileTreeNode.kt @@ -1,9 +1,9 @@ package com.bridgecrew.ui.vulnerabilitiesTree +import com.bridgecrew.icons.CheckovIcons import com.bridgecrew.utils.FileType import com.bridgecrew.utils.getFileType import com.intellij.icons.AllIcons -import icons.CheckovIcons import javax.swing.Icon class CheckovFileTreeNode(val fileName: String, override val relativePathNode: String): CheckovTreeNode { diff --git a/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovToolWindowTree.kt b/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovToolWindowTree.kt index 202eb20..0bbfa31 100644 --- a/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovToolWindowTree.kt +++ b/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovToolWindowTree.kt @@ -1,10 +1,10 @@ package com.bridgecrew.ui.vulnerabilitiesTree -import com.bridgecrew.settings.CheckovGlobalState import com.bridgecrew.results.BaseCheckovResult import com.bridgecrew.results.Category -import com.bridgecrew.services.ResultsCacheService import com.bridgecrew.services.CheckovResultsListUtils +import com.bridgecrew.services.ResultsCacheService +import com.bridgecrew.settings.CheckovGlobalState import com.bridgecrew.ui.CheckovToolWindowDescriptionPanel import com.bridgecrew.ui.rightPanel.CheckovErrorRightPanel import com.bridgecrew.utils.navigateToFile @@ -29,7 +29,6 @@ import javax.swing.tree.DefaultMutableTreeNode import javax.swing.tree.TreeNode import javax.swing.tree.TreePath - class CheckovToolWindowTree( val project: Project, private val split: JBSplitter, private val descriptionPanel: CheckovToolWindowDescriptionPanel, private val selectedPath: String ) : SimpleToolWindowPanel(true, true), Disposable { diff --git a/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovTreeRenderer.kt b/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovTreeRenderer.kt index ba110cd..673ad63 100644 --- a/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovTreeRenderer.kt +++ b/src/main/kotlin/com/bridgecrew/ui/vulnerabilitiesTree/CheckovTreeRenderer.kt @@ -6,7 +6,6 @@ import javax.swing.JTree import javax.swing.tree.DefaultMutableTreeNode import javax.swing.tree.DefaultTreeCellRenderer - class CheckovTreeRenderer : DefaultTreeCellRenderer() { override fun getTreeCellRendererComponent(tree: JTree?, value: Any?, diff --git a/src/main/kotlin/com/bridgecrew/utils/CheckovUtils.kt b/src/main/kotlin/com/bridgecrew/utils/CheckovUtils.kt index e38c970..149c202 100644 --- a/src/main/kotlin/com/bridgecrew/utils/CheckovUtils.kt +++ b/src/main/kotlin/com/bridgecrew/utils/CheckovUtils.kt @@ -1,14 +1,15 @@ package com.bridgecrew.utils -import com.bridgecrew.* +import com.bridgecrew.CheckovResult +import com.bridgecrew.VulnerabilityDetails +import com.bridgecrew.gson import com.bridgecrew.results.BaseCheckovResult import com.bridgecrew.results.Category import com.bridgecrew.results.CheckType import com.google.gson.reflect.TypeToken -import com.intellij.openapi.diagnostic.logger import org.json.JSONArray import org.json.JSONObject - +import org.slf4j.LoggerFactory data class CheckovResultExtractionData( val failedChecks: List = arrayListOf(), @@ -17,8 +18,11 @@ data class CheckovResultExtractionData( ) class CheckovUtils { + companion object { - private val LOG = logger() + + private val logger = LoggerFactory.getLogger(this::class.java) + fun isCustomPolicy(result: BaseCheckovResult): Boolean { return (result.category == Category.IAC || result.category == Category.SECRETS) && !result.id.startsWith("CKV") } @@ -63,7 +67,7 @@ class CheckovUtils { val image = result.resource.split(" ").find { token -> token.startsWith("(") } image!!.replace("(", "") } catch (error: Error) { - LOG.warn("Could not find image name from result resource ${result.resource}", error) + logger.warn("Could not find image name from result resource ${result.resource}", error) generateVulnerabilityResourceByPackage(vulnerabilityDetails.package_name, vulnerabilityDetails.package_version, result.resource) } } @@ -85,7 +89,7 @@ class CheckovUtils { return CheckovResultExtractionData(arrayListOf(), 0, 0) } - LOG.info("found checkov result for source $scanningSource") + logger.info("found checkov result for source $scanningSource") val checkovResult = rawResult.replace("\u001B[0m", "") return when (checkovResult[0]) { @@ -148,7 +152,7 @@ class CheckovUtils { try { return summary.getInt("parsing_errors") } catch (e: Exception) { - LOG.error("Error while extracting parsing errors", e) + logger.error("Error while extracting parsing errors", e) } return 0 diff --git a/src/main/kotlin/com/bridgecrew/utils/GitUtils.kt b/src/main/kotlin/com/bridgecrew/utils/GitUtils.kt index 80d2753..f036c77 100644 --- a/src/main/kotlin/com/bridgecrew/utils/GitUtils.kt +++ b/src/main/kotlin/com/bridgecrew/utils/GitUtils.kt @@ -1,6 +1,6 @@ package com.bridgecrew.utils -import CliService +import com.bridgecrew.services.CliService import com.intellij.openapi.components.service import com.intellij.openapi.project.Project diff --git a/src/main/kotlin/com/bridgecrew/utils/UIUtils.kt b/src/main/kotlin/com/bridgecrew/utils/UIUtils.kt index f5ce7d7..837c971 100644 --- a/src/main/kotlin/com/bridgecrew/utils/UIUtils.kt +++ b/src/main/kotlin/com/bridgecrew/utils/UIUtils.kt @@ -1,11 +1,11 @@ package com.bridgecrew.utils +import com.bridgecrew.icons.CheckovIcons import com.bridgecrew.results.BaseCheckovResult import com.bridgecrew.results.Category import com.bridgecrew.results.Severity import com.intellij.openapi.editor.colors.EditorColorsManager import com.intellij.uiDesigner.core.GridConstraints -import icons.CheckovIcons import java.awt.Color import java.awt.Font import java.awt.Insets diff --git a/src/main/kotlin/com/bridgecrew/utils/fileUtils.kt b/src/main/kotlin/com/bridgecrew/utils/fileUtils.kt index 1589c66..b1afef2 100644 --- a/src/main/kotlin/com/bridgecrew/utils/fileUtils.kt +++ b/src/main/kotlin/com/bridgecrew/utils/fileUtils.kt @@ -1,4 +1,5 @@ package com.bridgecrew.utils + import com.intellij.openapi.editor.Document import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.fileEditor.OpenFileDescriptor @@ -6,13 +7,16 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VirtualFile import org.apache.commons.io.FilenameUtils -import org.jetbrains.rpc.LOG +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.io.File import java.net.URL import java.nio.file.Files import java.nio.file.Path +var logger: Logger = LoggerFactory.getLogger("FileUtils") var checkovTempDirPath: Path = Files.createTempDirectory("checkov") + fun navigateToFile(project: Project, virtualFile: VirtualFile, startLine: Int = 0, startColumn: Int = 0) { val line = calculateLineOffset(startLine - 1, virtualFile) val column = calculateColumnOffset(startColumn, virtualFile, line) @@ -93,11 +97,12 @@ fun getFileType(filePath: String): FileType { } fun getGitIgnoreValues(project: Project): List { + try { val path = project.basePath + "/.gitignore" val gitignoreVirtualFile = LocalFileSystem.getInstance().findFileByPath(path) if (gitignoreVirtualFile == null) { - LOG.info("no .gitignore file in this project") + logger.info("no .gitignore file in this project") return arrayListOf() } @@ -105,7 +110,7 @@ fun getGitIgnoreValues(project: Project): List { .split(System.lineSeparator()).filter { raw -> !(raw.trim().startsWith("#") || raw.trim().isEmpty() )} } catch (e: Exception) { - LOG.error(Exception("error while reading .gitignore file", e)) + logger.error("error while reading .gitignore file", e) } return arrayListOf() } @@ -136,12 +141,16 @@ fun deleteCheckovTempDir() { } val listOfFiles = checkovTempDirPath.toFile().list()!! - LOG.info("Checking if Checkov temp dir should be deleted, current files - ${checkovTempDirPath.toFile().list()?.map { path -> path.toString() }}") + logger.info( + "Checking if Checkov temp dir should be deleted, current files - ${ + checkovTempDirPath.toFile().list()?.map { path -> path.toString() } + }" + ) if (listOfFiles.isEmpty() || listOfFiles.none { filePath -> filePath.startsWith("error") }) { checkovTempDirPath.toFile().deleteRecursively() } } catch (e: Exception) { - LOG.warn("could not delete temp directory in $checkovTempDirPath", e) + logger.warn("could not delete temp directory in $checkovTempDirPath", e) } } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 85ae57c..f39087f 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -9,21 +9,15 @@ ]]> - com.intellij.modules.lang com.intellij.modules.platform - - - - - - - + - - diff --git a/src/main/resources/icons/showLogs.svg b/src/main/resources/icons/showLogs.svg new file mode 100644 index 0000000..131fbf4 --- /dev/null +++ b/src/main/resources/icons/showLogs.svg @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/icons/showLogs_dark.svg b/src/main/resources/icons/showLogs_dark.svg new file mode 100644 index 0000000..e5b0d41 --- /dev/null +++ b/src/main/resources/icons/showLogs_dark.svg @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..4e5b754 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + %d{yyyy-MM-dd HH:mm:ss} [%level] %logger{36} - %msg%n + + + + ./prisma-cloud-jetbrains.log + false + + %d{yyyy-MM-dd HH:mm:ss} [%level] %logger{36} - %msg%n + + + + + + + \ No newline at end of file