Skip to content

Commit

Permalink
BCE-36632 - Added additional telemetry data to the plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
ChananM committed Aug 25, 2024
1 parent e931086 commit 6001569
Show file tree
Hide file tree
Showing 22 changed files with 167 additions and 118 deletions.
24 changes: 14 additions & 10 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,24 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.jetbrains.changelog.markdownToHTML
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jlleitschuh.gradle.ktlint.tasks.BaseKtLintCheckTask

fun properties(key: String) = project.findProperty(key).toString()

plugins {
// Java support
id("java")
// Kotlin support
id("org.jetbrains.kotlin.jvm") version "1.8.0"
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.10.1"
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"
kotlin("plugin.serialization") version "1.8.0"
kotlin("plugin.serialization") version "1.9.25"
}

group = properties("pluginGroup")
Expand All @@ -27,21 +28,20 @@ version = properties("pluginVersion")
// Configure project's dependencies
repositories {
mavenCentral()
jcenter()
}

dependencies {
implementation("com.beust:klaxon:5.6")
implementation("com.google.code.gson:gson:2.10.1")
implementation("org.json:json:20230227")
implementation("org.json:json:20231013")
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:5.8.1")
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1")
testImplementation("org.junit.platform:junit-platform-engine:1.9.0")
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 {
Expand Down Expand Up @@ -79,6 +79,10 @@ tasks {
}
}

withType<BaseKtLintCheckTask>().configureEach {
enabled = false
}

wrapper {
gradleVersion = properties("gradleVersion")
}
Expand Down Expand Up @@ -142,6 +146,6 @@ tasks {
}

runPluginVerifier {
ideVersions.set(listOf("IC-2020.3.4", "IC-2021.1.3", "IC-2021.2.4"))
ideVersions.set(listOf("IC-2020.3.4", "IC-2021.1.3", "IC-2021.2.4", "IC-2024.1.6"))
}
}
}
12 changes: 6 additions & 6 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@

pluginGroup = com.github.bridgecrewio.prismajetbrainsidea
pluginName = prismacloud-jetbrains-idea
pluginVersion = 1.0.18
pluginSinceBuild = 203
pluginVersion=1.0.21
pluginSinceBuild=241
# 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
pluginVerifierIdeVersions=2020.3.4, 2021.1.3, 2021.2.4, 2024.1.6

platformType = IC
platformVersion = 2021.2.4
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
Expand All @@ -21,7 +21,7 @@ platformPlugins =
kotlin.stdlib.default.dependency = false

# Java language level used to compile sources and to generate the files for - Java 11 is required since 2020.3
javaVersion = 11
javaVersion=17

# Gradle Releases -> https://github.com/gradle/gradle/releases
gradleVersion = 7.3
gradleVersion=7.6.4
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ class PostStartupActivity : StartupActivity {
project.service<AnalyticsService>().startSchedulerReleasingAnalytics()
// project.service<ResultsCacheService>().setMockCheckovResultsFromExampleFile() // MOCK
}

})

PluginInstaller.addStateListener(object : PluginStateListener {
Expand Down Expand Up @@ -69,4 +68,4 @@ class PostStartupActivity : StartupActivity {
private fun sendAnalyticsPluginUninstalled(project: Project){
project.service<AnalyticsService>().pluginUninstalled()
}
}
}
33 changes: 27 additions & 6 deletions src/main/kotlin/com/bridgecrew/analytics/AnalyticsDataEvents.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,41 @@
package com.bridgecrew.analytics

import com.bridgecrew.cache.InMemCache
import com.bridgecrew.settings.PLUGIN_NAME
import com.bridgecrew.settings.PrismaSettingsState
import com.google.gson.annotations.Expose
import kotlinx.serialization.*
import java.util.*
import com.intellij.ide.plugins.PluginManagerCore
import com.intellij.openapi.application.ApplicationInfo
import com.intellij.openapi.extensions.PluginId
import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.json.JsonObject
import java.util.*


@OptIn(ExperimentalSerializationApi::class)
@Serializable
sealed class AnalyticsData(@EncodeDefault val pluginName: String = PLUGIN_NAME){
sealed class AnalyticsData(@EncodeDefault val pluginName: String = PLUGIN_NAME) {

@EncodeDefault
val installationId: String = PrismaSettingsState().getInstance()!!.installationId

@EncodeDefault
var pluginVersion: String? =
PluginManagerCore.getPlugin(PluginId.getId("com.github.bridgecrewio.prismacloud"))?.version

@EncodeDefault
var ideVersion: String? =
ApplicationInfo.getInstance().fullApplicationName + " / " + ApplicationInfo.getInstance().build

@EncodeDefault
var operatingSystem: String? = System.getProperty("os.name") + " " + System.getProperty("os.version")

@EncodeDefault
var checkovVersion: String? = InMemCache.get("checkovVersion")

@Serializable
lateinit var eventType: String

Expand Down Expand Up @@ -51,8 +73,7 @@ data class FullScanAnalyticsData(@Transient val scanNumber: Int = 0): AnalyticsD
@OptIn(ExperimentalSerializationApi::class)
@Serializable
data class PluginInstallAnalyticsData(
@EncodeDefault
override val eventData: JsonObject = JsonObject(mapOf())
@EncodeDefault override val eventData: JsonObject = JsonObject(mapOf())
) : AnalyticsData()

@Serializable
Expand All @@ -63,4 +84,4 @@ data class FullScanFrameworkScanTimeData(
@Serializable(with = DateSerializer::class)
var endTime: Date = Date()
var totalTimeSeconds = 0L
}
}
7 changes: 4 additions & 3 deletions src/main/kotlin/com/bridgecrew/analytics/AnalyticsService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ 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.*
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import java.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.TimeUnit
import kotlinx.serialization.json.Json


@Service
Expand Down Expand Up @@ -211,4 +212,4 @@ class AnalyticsService(val project: Project) {
analyticsData.eventType = EventTypeEnum.ON_PLUGIN_UNINSTALL
analyticsEventData.add(Json.encodeToString(analyticsData))
}
}
}
9 changes: 6 additions & 3 deletions src/main/kotlin/com/bridgecrew/api/ApiClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ 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.*
import kotlinx.serialization.json.*
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import java.io.IOException
import java.net.URI
import java.net.http.HttpClient
Expand Down Expand Up @@ -135,4 +138,4 @@ class ApiClient(private val username: String, private val password: String, priv
return LoginResponse("")
}
}
}
}
9 changes: 5 additions & 4 deletions src/main/kotlin/com/bridgecrew/cache/CacheDataAnalytics.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ package com.bridgecrew.cache

import com.intellij.openapi.project.Project

class CacheDataAnalytics (private val project: Project){
fun load(analyticsEventData: MutableList<String>){
class CacheDataAnalytics(private val project: Project) {

fun load(analyticsEventData: MutableList<String>) {
val data = CacheDataAnalyticsStorage(project).readDataFromFile()
if(data.isNullOrEmpty()){
return
Expand All @@ -15,8 +16,8 @@ class CacheDataAnalytics (private val project: Project){
CacheDataAnalyticsStorage(project).clear()
}

fun stash(analyticsEventData: MutableList<String>){
fun stash(analyticsEventData: MutableList<String>) {
val data = analyticsEventData.joinToString("\n")
CacheDataAnalyticsStorage(project).writeDataToFile(data)
}
}
}
14 changes: 14 additions & 0 deletions src/main/kotlin/com/bridgecrew/cache/InMemCache.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.bridgecrew.cache

object InMemCache {

private val cache: MutableMap<String, String> = mutableMapOf()

fun get(key: String): String? {
return cache[key]
}

fun set(key: String, value: String) {
cache[key] = value
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ 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.scan.CheckovScanService
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.scan.CheckovScanService
import com.bridgecrew.utils.initializeRepoName
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
Expand All @@ -25,7 +26,7 @@ private val LOG = logger<InitializationService>()
class InitializationService(private val project: Project) {

private var isCheckovInstalledGlobally: Boolean = false
private var checkovVersion: String = "3.2.20"
private var minimalCheckovVersion: String = "3.2.20"

fun initializeProject() {
initializeCheckovScanService()
Expand Down Expand Up @@ -54,16 +55,17 @@ class InitializationService(private val project: Project) {
}

private fun installCheckovIfNeededAndSetCheckovPath() {
project.messageBus.connect()
.subscribe(CheckovInstallerListener.INSTALLER_TOPIC, object : CheckovInstallerListener {
override fun installerFinished(serviceClass: InstallerCommandService) {
if (serviceClass is PipenvInstallerCommandService) {
updateCheckovPathAfterInstallation()
} else {
setSelectedCheckovServiceFromInstaller(serviceClass)
}
project.messageBus.connect().subscribe(CheckovInstallerListener.INSTALLER_TOPIC,
object : CheckovInstallerListener {
override fun installerFinished(serviceClass: InstallerCommandService) {
if (serviceClass is PipenvInstallerCommandService) {
updateCheckovPathAfterInstallation()
} else {
setSelectedCheckovServiceFromInstaller(serviceClass)
}
})
}
}
)

LOG.info("Checking global checkov installation with `checkov`")
val isGloballyInstalledCommand = arrayListOf("checkov", "-v")
Expand Down Expand Up @@ -107,8 +109,6 @@ class InitializationService(private val project: Project) {
val command = PipInstallerCommandService.getUnixCommandsForFindingCheckovPath()
project.service<CliService>().run(command, project, this::updatePathUnix)
}


}

private fun updatePathUnix(output: String, exitCode: Int, project: Project) {
Expand Down Expand Up @@ -225,8 +225,8 @@ class InitializationService(private val project: Project) {
private fun checkIfCheckovUpdateNeeded(rawVersion: String): Boolean {
val version = rawVersion.split('\n')[0]
LOG.info("Checkov version $version")

return !versionIsNewer(version, checkovVersion)
InMemCache.set("checkovVersion", version)
return !versionIsNewer(version, minimalCheckovVersion)
}

private fun updateCheckovPip(project: Project) {
Expand All @@ -238,6 +238,7 @@ class InitializationService(private val project: Project) {
project.service<CliService>().run(cmds, project, this::onCheckovUpdate, this::onCheckovUpdate)
}

@Suppress("UNUSED_PARAMETER")
private fun onCheckovUpdate(output: String, exitCode: Int, project: Project) {
if (exitCode != 0) {
LOG.warn("Failed to pull Checkov image")
Expand All @@ -248,4 +249,4 @@ class InitializationService(private val project: Project) {
setSelectedCheckovService(DockerCheckovScanCommandsService(project))
LOG.info("Checkov Docker updated")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ import com.intellij.util.messages.Topic
interface CheckovInstallerListener {

companion object {
val INSTALLER_TOPIC =
Topic.create("Checkov installer", CheckovInstallerListener::class.java)
val INSTALLER_TOPIC = Topic.create("Checkov installer", CheckovInstallerListener::class.java)
}

fun installerFinished(serviceClass: InstallerCommandService)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ package com.bridgecrew.services.checkovScanCommandsService

import com.bridgecrew.listeners.CheckovSettingsListener
import com.bridgecrew.settings.PrismaSettingsState
import com.bridgecrew.utils.*
import com.bridgecrew.utils.FULL_SCAN_EXCLUDED_PATHS
import com.bridgecrew.utils.getGitIgnoreValues
import com.bridgecrew.utils.getRepoName
import com.bridgecrew.utils.isWindows
import com.intellij.openapi.project.Project
import org.apache.commons.lang.StringUtils
import org.apache.commons.lang3.StringUtils

abstract class CheckovScanCommandsService(val project: Project) {
protected val settings = PrismaSettingsState().getInstance()
Expand Down Expand Up @@ -110,5 +113,4 @@ abstract class CheckovScanCommandsService(val project: Project) {
abstract fun getFilePath(originalFilePath: String): String
abstract fun getCertPath(): String
abstract fun getOutputFilePath(outputFilePath: String): String

}
}
Loading

0 comments on commit 6001569

Please sign in to comment.