From fccb643fe5d182baa78dad1e37d9f7074eb96a3a Mon Sep 17 00:00:00 2001 From: Aniket Shinde Date: Fri, 7 Aug 2026 23:57:11 +0530 Subject: [PATCH 01/19] module setup --- checkmarx-ast-eclipse-plugin-tests/.classpath | 6 +- checkmarx-ast-eclipse-plugin-tests/pom.xml | 27 +- .../plugin/tests/ui/TestFilterState.java | 2 +- .../eclipse/plugin/tests/ui/TestTriage.java | 2 +- .../ast/eclipse/plugin/tests/ui/TestUI.java | 2 +- .../unit/enums/SeverityExtendedTest.java | 2 +- .../plugin/tests/unit/enums/SeverityTest.java | 2 +- .../tests/unit/runner/AuthenticatorTest.java | 2 +- .../plugin/tests/unit/utils/CxLoggerTest.java | 2 +- .../tests/unit/utils/PluginUtilsTest.java | 2 +- .../views/actions/ToolBarActionsTest.java | 2 +- .../unit/views/filters/ActionFiltersTest.java | 2 +- .../filters/FilterStateExtendedTest.java | 2 +- .../unit/views/filters/FilterStateTest.java | 2 +- checkmarx-ast-eclipse-plugin/.classpath | 20 +- .../META-INF/MANIFEST.MF | 15 +- checkmarx-ast-eclipse-plugin/build.properties | 12 +- .../icons/cx-one-assist-cube.png | Bin 0 -> 146450 bytes .../icons/severity/critical.svg | 11 + .../icons/severity/critical_16.svg | 4 + .../icons/severity/critical_16_dark.svg | 4 + .../icons/severity/critical_20.svg | 4 + .../icons/severity/critical_20_dark.svg | 4 + .../icons/severity/critical_dark.svg | 4 + .../icons/severity/high.svg | 5 + .../icons/severity/high_16.svg | 4 + .../icons/severity/high_16_dark.svg | 4 + .../icons/severity/high_20.svg | 4 + .../icons/severity/high_20_dark.svg | 4 + .../icons/severity/high_dark.svg | 4 + .../icons/severity/ignored.svg | 4 + .../icons/severity/ignored_16.svg | 4 + .../icons/severity/ignored_16_dark.svg | 4 + .../icons/severity/ignored_20.svg | 4 + .../icons/severity/ignored_20_dark.svg | 4 + .../icons/severity/ignored_24.svg | 4 + .../icons/severity/ignored_24_dark.svg | 4 + .../icons/severity/ignored_dark.svg | 4 + .../icons/severity/low.svg | 4 + .../icons/severity/low_16.svg | 4 + .../icons/severity/low_16_dark.svg | 4 + .../icons/severity/low_20.svg | 4 + .../icons/severity/low_20_dark.svg | 4 + .../icons/severity/low_dark.svg | 4 + .../icons/severity/malicious.svg | 4 + .../icons/severity/malicious_16.svg | 4 + .../icons/severity/malicious_16_dark.svg | 4 + .../icons/severity/malicious_20.svg | 4 + .../icons/severity/malicious_20_dark.svg | 4 + .../icons/severity/medium.svg | 5 + .../icons/severity/medium_16.svg | 4 + .../icons/severity/medium_16_dark.svg | 4 + .../icons/severity/medium_20.svg | 4 + .../icons/severity/medium_20_dark.svg | 4 + .../icons/severity/medium_dark.svg | 4 + .../icons/severity/ok.svg | 4 + .../icons/severity/ok_16.svg | 4 + .../icons/severity/ok_16_dark.svg | 4 + .../icons/severity/ok_20.svg | 4 + .../icons/severity/ok_20_dark.svg | 4 + .../icons/severity/ok_24.svg | 4 + .../icons/severity/ok_24_dark.svg | 4 + .../icons/severity/ok_dark.svg | 4 + .../icons/severity/unknown.svg | 5 + .../icons/severity/unknown_16.svg | 5 + .../icons/severity/unknown_16_dark.svg | 5 + .../icons/severity/unknown_20.svg | 5 + .../icons/severity/unknown_20_dark.svg | 5 + .../icons/severity/unknown_dark.svg | 5 + checkmarx-ast-eclipse-plugin/pom.xml | 5 +- .../properties/AuthButtonFieldEditor.java | 2 +- .../eclipse/properties/PreferencesPage.java | 6 +- .../eclipse/runner/Authenticator.java | 2 +- .../eclipse/startup/PluginStartup.java | 47 +- .../eclipse/utils/PluginConstants.java | 4 +- .../checkmarx/eclipse/utils/PluginUtils.java | 5 +- .../eclipse/views/CheckmarxView.java | 7 +- .../checkmarx/eclipse/views/DataProvider.java | 2 +- .../views/actions/ActionStartScan.java | 2 +- .../eclipse/views/actions/ToolBarActions.java | 4 +- .../eclipse/views/filters/ActionFilters.java | 2 +- .../eclipse/views/filters/FilterState.java | 2 +- com.checkmarx.eclipse.feature/feature.xml | 16 +- common-lib/.classpath | 7 + common-lib/.gitignore | 2 + common-lib/.project | 28 + common-lib/META-INF/MANIFEST.MF | 12 + common-lib/build.properties | 3 + common-lib/pom.xml | 12 + .../eclipse/common/enums/Severity.java | 17 + .../eclipse/common/events/SettingsTopics.java | 13 + .../common/properties/SharedPreferences.java | 31 + .../eclipse/common/utils/CxLogger.java | 58 + devassist-lib/.classpath | 15 + devassist-lib/.gitignore | 2 + devassist-lib/.project | 28 + devassist-lib/META-INF/MANIFEST.MF | 33 + devassist-lib/build.properties | 14 + devassist-lib/icons/CxFlatLogo16x16.png | Bin 0 -> 4474 bytes devassist-lib/icons/critical_16.svg | 4 + devassist-lib/icons/critical_16_dark.svg | 4 + devassist-lib/icons/high_16.svg | 4 + devassist-lib/icons/high_16_dark.svg | 4 + devassist-lib/icons/ignored_16.svg | 4 + devassist-lib/icons/ignored_16_dark.svg | 4 + devassist-lib/icons/low_16.svg | 4 + devassist-lib/icons/low_16_dark.svg | 4 + devassist-lib/icons/malicious_16.svg | 4 + devassist-lib/icons/malicious_16_dark.svg | 4 + devassist-lib/icons/medium_16.svg | 4 + devassist-lib/icons/medium_16_dark.svg | 4 + devassist-lib/icons/ok_16.svg | 4 + devassist-lib/icons/ok_16_dark.svg | 4 + devassist-lib/icons/unknown_16.svg | 5 + devassist-lib/icons/unknown_16_dark.svg | 5 + devassist-lib/plugin.xml | 143 ++ devassist-lib/pom.xml | 12 + .../eclipse/devassist/backend/Constants.java | 31 + .../backend/DevAssistScanStateHolder.java | 244 +++ .../backend/GlobalScannerController.java | 209 +++ .../devassist/backend/ScannerRegistry.java | 335 ++++ .../devassist/backend/SeverityLevel.java | 51 + .../listener/ProjectLifecycleListener.java | 344 ++++ .../backend/result/ResultPublisher.java | 294 +++ .../basescanner/BaseScannerCommand.java | 114 ++ .../basescanner/BaseScannerService.java | 144 ++ .../devassist/basescanner/ScannerCommand.java | 34 + .../devassist/basescanner/ScannerService.java | 43 + .../eclipse/devassist/common/ScanManager.java | 185 ++ .../eclipse/devassist/common/ScanResult.java | 32 + .../devassist/common/ScannerConfig.java | 95 + .../devassist/common/ScannerFactory.java | 188 ++ .../devassist/factory/CxWrapperFactory.java | 49 + .../inspection/DevAssistInspection.java | 45 + .../inspection/DevAssistInspectionMgr.java | 334 ++++ .../inspection/DevAssistScanScheduler.java | 188 ++ .../eclipse/devassist/model/Location.java | 61 + .../eclipse/devassist/model/ScanEngine.java | 36 + .../eclipse/devassist/model/ScanIssue.java | 194 ++ .../devassist/model/Vulnerability.java | 82 + .../devassist/problems/ProblemBuilder.java | 103 ++ .../devassist/problems/ProblemDecorator.java | 643 +++++++ .../devassist/problems/ProblemDescriptor.java | 117 ++ .../devassist/problems/ProblemHelper.java | 174 ++ .../problems/ProblemHolderService.java | 276 +++ .../problems/ScanIssueProcessor.java | 223 +++ .../scanners/asca/AscaScanResultAdaptor.java | 272 +++ .../scanners/asca/AscaScannerCommand.java | 54 + .../scanners/asca/AscaScannerService.java | 351 ++++ .../ContainerScanResultAdaptor.java | 175 ++ .../containers/ContainerScannerCommand.java | 109 ++ .../containers/ContainerScannerService.java | 296 +++ .../scanners/iac/IacScanResultAdaptor.java | 254 +++ .../scanners/iac/IacScannerCommand.java | 77 + .../scanners/iac/IacScannerService.java | 322 ++++ .../scanners/oss/OssScanResultAdaptor.java | 196 ++ .../scanners/oss/OssScannerCommand.java | 178 ++ .../scanners/oss/OssScannerService.java | 310 ++++ .../secrets/SecretsScanResultAdaptor.java | 161 ++ .../secrets/SecretsScannerCommand.java | 53 + .../secrets/SecretsScannerService.java | 300 ++++ .../devassist/ui/findings/CxFindingsView.java | 1595 +++++++++++++++++ .../actions/VulnerabilityFilterAction.java | 80 + .../actions/VulnerabilityFilterState.java | 67 + .../findings/dialogs/ProblemDescription.java | 181 ++ .../findings/editor/FindingsAnnotation.java | 71 + .../editor/FindingsEditorOverlay.java | 140 ++ .../ui/findings/icons/IconRegistry.java | 121 ++ .../findings/icons/SeverityImageComposer.java | 243 +++ .../ignored/IgnoredProblemsStore.java | 212 +++ .../integration/CopilotIntegration.java | 381 ++++ .../integration/RemediationPromptBuilder.java | 274 +++ .../ui/findings/marker/MarkerIssueMapper.java | 196 ++ .../ui/findings/model/FileNodeLabel.java | 86 + .../ui/findings/model/ScanDetailWithPath.java | 31 + .../provider/FindingsContentProvider.java | 112 ++ .../provider/FindingsLabelProvider.java | 164 ++ .../realtime/CheckmarxDocumentListener.java | 108 ++ .../realtime/CheckmarxEditorListener.java | 408 +++++ .../ui/findings/realtime/RealTimeScanJob.java | 240 +++ .../CheckmarxMarkerResolutionGenerator.java | 26 + .../ViewFindingDetailsResolution.java | 258 +++ .../ui/findings/utils/FindingsUtils.java | 94 + .../devassist/utils/DevAssistConstants.java | 159 ++ .../devassist/utils/DevAssistUtils.java | 258 +++ .../eclipse/devassist/utils/ScanEngine.java | 21 + pom.xml | 6 +- 187 files changed, 14345 insertions(+), 88 deletions(-) create mode 100644 checkmarx-ast-eclipse-plugin/icons/cx-one-assist-cube.png create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/critical.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/critical_16.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/critical_16_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/critical_20.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/critical_20_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/critical_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/high.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/high_16.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/high_16_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/high_20.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/high_20_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/high_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ignored.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ignored_16.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ignored_16_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ignored_20.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ignored_20_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ignored_24.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ignored_24_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ignored_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/low.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/low_16.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/low_16_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/low_20.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/low_20_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/low_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/malicious.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/malicious_16.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/malicious_16_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/malicious_20.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/malicious_20_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/medium.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/medium_16.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/medium_16_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/medium_20.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/medium_20_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/medium_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ok.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ok_16.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ok_16_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ok_20.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ok_20_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ok_24.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ok_24_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/ok_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/unknown.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/unknown_16.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/unknown_16_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/unknown_20.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/unknown_20_dark.svg create mode 100644 checkmarx-ast-eclipse-plugin/icons/severity/unknown_dark.svg create mode 100644 common-lib/.classpath create mode 100644 common-lib/.gitignore create mode 100644 common-lib/.project create mode 100644 common-lib/META-INF/MANIFEST.MF create mode 100644 common-lib/build.properties create mode 100644 common-lib/pom.xml create mode 100644 common-lib/src/com/checkmarx/eclipse/common/enums/Severity.java create mode 100644 common-lib/src/com/checkmarx/eclipse/common/events/SettingsTopics.java create mode 100644 common-lib/src/com/checkmarx/eclipse/common/properties/SharedPreferences.java create mode 100644 common-lib/src/com/checkmarx/eclipse/common/utils/CxLogger.java create mode 100644 devassist-lib/.classpath create mode 100644 devassist-lib/.gitignore create mode 100644 devassist-lib/.project create mode 100644 devassist-lib/META-INF/MANIFEST.MF create mode 100644 devassist-lib/build.properties create mode 100644 devassist-lib/icons/CxFlatLogo16x16.png create mode 100644 devassist-lib/icons/critical_16.svg create mode 100644 devassist-lib/icons/critical_16_dark.svg create mode 100644 devassist-lib/icons/high_16.svg create mode 100644 devassist-lib/icons/high_16_dark.svg create mode 100644 devassist-lib/icons/ignored_16.svg create mode 100644 devassist-lib/icons/ignored_16_dark.svg create mode 100644 devassist-lib/icons/low_16.svg create mode 100644 devassist-lib/icons/low_16_dark.svg create mode 100644 devassist-lib/icons/malicious_16.svg create mode 100644 devassist-lib/icons/malicious_16_dark.svg create mode 100644 devassist-lib/icons/medium_16.svg create mode 100644 devassist-lib/icons/medium_16_dark.svg create mode 100644 devassist-lib/icons/ok_16.svg create mode 100644 devassist-lib/icons/ok_16_dark.svg create mode 100644 devassist-lib/icons/unknown_16.svg create mode 100644 devassist-lib/icons/unknown_16_dark.svg create mode 100644 devassist-lib/plugin.xml create mode 100644 devassist-lib/pom.xml create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/backend/Constants.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/backend/DevAssistScanStateHolder.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/backend/GlobalScannerController.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/backend/ScannerRegistry.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/backend/SeverityLevel.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/backend/result/ResultPublisher.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/BaseScannerCommand.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/BaseScannerService.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/ScannerCommand.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/ScannerService.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScanManager.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScanResult.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScannerConfig.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScannerFactory.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/factory/CxWrapperFactory.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistInspection.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistInspectionMgr.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistScanScheduler.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/model/Location.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/model/ScanEngine.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/model/ScanIssue.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/model/Vulnerability.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemBuilder.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemDecorator.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemDescriptor.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemHelper.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemHolderService.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ScanIssueProcessor.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScanResultAdaptor.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScannerCommand.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScannerService.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScanResultAdaptor.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScannerCommand.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScannerService.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScanResultAdaptor.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScannerCommand.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScannerService.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScanResultAdaptor.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScannerCommand.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScannerService.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScanResultAdaptor.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScannerCommand.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScannerService.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/CxFindingsView.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/actions/VulnerabilityFilterAction.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/actions/VulnerabilityFilterState.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/dialogs/ProblemDescription.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/editor/FindingsAnnotation.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/editor/FindingsEditorOverlay.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/icons/IconRegistry.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/icons/SeverityImageComposer.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/ignored/IgnoredProblemsStore.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/integration/CopilotIntegration.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/integration/RemediationPromptBuilder.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/marker/MarkerIssueMapper.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/model/FileNodeLabel.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/model/ScanDetailWithPath.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/provider/FindingsContentProvider.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/provider/FindingsLabelProvider.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/CheckmarxDocumentListener.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/CheckmarxEditorListener.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/RealTimeScanJob.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/resolution/CheckmarxMarkerResolutionGenerator.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/resolution/ViewFindingDetailsResolution.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/utils/FindingsUtils.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistConstants.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistUtils.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/utils/ScanEngine.java diff --git a/checkmarx-ast-eclipse-plugin-tests/.classpath b/checkmarx-ast-eclipse-plugin-tests/.classpath index 98ee5fe7..13b02eb1 100644 --- a/checkmarx-ast-eclipse-plugin-tests/.classpath +++ b/checkmarx-ast-eclipse-plugin-tests/.classpath @@ -1,8 +1,7 @@ - + - @@ -14,7 +13,8 @@ - + + diff --git a/checkmarx-ast-eclipse-plugin-tests/pom.xml b/checkmarx-ast-eclipse-plugin-tests/pom.xml index 94b4d65c..70e9bd00 100644 --- a/checkmarx-ast-eclipse-plugin-tests/pom.xml +++ b/checkmarx-ast-eclipse-plugin-tests/pom.xml @@ -43,35 +43,10 @@ XML CSV - HTML - - check - verify - check - - ${project.build.directory}/jacoco.exec - ${project.basedir}/../checkmarx-ast-eclipse-plugin/target/classes - - org/eclipse/wb/swt/SWTResourceManager.class - - - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - 0.30 - - - - - - - + org.eclipse.tycho diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestFilterState.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestFilterState.java index ed66593e..4936ee24 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestFilterState.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestFilterState.java @@ -17,7 +17,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.enums.State; import com.checkmarx.eclipse.views.actions.ToolBarActions; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestTriage.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestTriage.java index f2edc136..89b48777 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestTriage.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestTriage.java @@ -16,7 +16,7 @@ import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem; import org.junit.jupiter.api.Test; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.utils.PluginConstants; public class TestTriage extends BaseUITest { diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestUI.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestUI.java index 7c42f499..441e25af 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestUI.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestUI.java @@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test; import com.checkmarx.eclipse.enums.ActionName; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.views.actions.ToolBarActions; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/enums/SeverityExtendedTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/enums/SeverityExtendedTest.java index 6b6c4769..d6cb2551 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/enums/SeverityExtendedTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/enums/SeverityExtendedTest.java @@ -6,7 +6,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; class SeverityExtendedTest { diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/enums/SeverityTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/enums/SeverityTest.java index cbe95be9..c27fdb4a 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/enums/SeverityTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/enums/SeverityTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; class SeverityTest { diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java index 3df473f4..becefbdc 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java @@ -14,7 +14,7 @@ import com.checkmarx.ast.wrapper.CxException; import com.checkmarx.ast.wrapper.CxWrapper; import com.checkmarx.eclipse.runner.Authenticator; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.utils.PluginConstants; class AuthenticatorTest { diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/CxLoggerTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/CxLoggerTest.java index c2374a49..aa024ad6 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/CxLoggerTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/CxLoggerTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; class CxLoggerTest { diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java index e38bda0d..63a5233a 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java @@ -32,7 +32,7 @@ import com.checkmarx.ast.results.result.Data; import com.checkmarx.ast.results.result.Node; import com.checkmarx.ast.results.result.Result; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.properties.Preferences; import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.utils.PluginUtils; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/actions/ToolBarActionsTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/actions/ToolBarActionsTest.java index c8cdeecf..66d26119 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/actions/ToolBarActionsTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/actions/ToolBarActionsTest.java @@ -26,7 +26,7 @@ import com.checkmarx.eclipse.views.DataProvider; import com.checkmarx.eclipse.enums.PluginListenerType; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.views.DisplayModel; import com.checkmarx.eclipse.views.PluginListenerDefinition; import com.checkmarx.eclipse.views.actions.ToolBarActions; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/ActionFiltersTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/ActionFiltersTest.java index 2f1ed8e5..46ce453d 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/ActionFiltersTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/ActionFiltersTest.java @@ -3,7 +3,7 @@ import com.checkmarx.eclipse.views.filters.ActionFilters; import com.checkmarx.eclipse.enums.ActionName; import com.checkmarx.eclipse.enums.PluginListenerType; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.views.DataProvider; import com.checkmarx.eclipse.views.PluginListenerDefinition; import com.google.common.eventbus.EventBus; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/FilterStateExtendedTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/FilterStateExtendedTest.java index ee9f7f79..ad4a2b8b 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/FilterStateExtendedTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/FilterStateExtendedTest.java @@ -8,7 +8,7 @@ import org.mockito.MockedStatic; import org.mockito.MockitoAnnotations; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.enums.State; import com.checkmarx.eclipse.views.GlobalSettings; import com.checkmarx.eclipse.views.filters.FilterState; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/FilterStateTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/FilterStateTest.java index ca5f312a..f1f860cf 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/FilterStateTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/filters/FilterStateTest.java @@ -12,7 +12,7 @@ import org.mockito.MockedStatic; import org.mockito.Mockito; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.enums.State; import com.checkmarx.eclipse.views.GlobalSettings; import com.checkmarx.eclipse.views.filters.FilterState; diff --git a/checkmarx-ast-eclipse-plugin/.classpath b/checkmarx-ast-eclipse-plugin/.classpath index 32e2245e..19a4d9ec 100644 --- a/checkmarx-ast-eclipse-plugin/.classpath +++ b/checkmarx-ast-eclipse-plugin/.classpath @@ -2,30 +2,26 @@ - + + + + + + - + + - - - - - - - - - - diff --git a/checkmarx-ast-eclipse-plugin/META-INF/MANIFEST.MF b/checkmarx-ast-eclipse-plugin/META-INF/MANIFEST.MF index f9af0477..02e5d705 100644 --- a/checkmarx-ast-eclipse-plugin/META-INF/MANIFEST.MF +++ b/checkmarx-ast-eclipse-plugin/META-INF/MANIFEST.MF @@ -5,9 +5,14 @@ Bundle-SymbolicName: com.checkmarx.eclipse.plugin;singleton:=true Bundle-Version: 1.0.0.qualifier Bundle-Vendor: Checkmarx Require-Bundle: org.eclipse.ui, + org.eclipse.ui.workbench.texteditor, + org.eclipse.ui.editors, org.eclipse.core.runtime, org.eclipse.jdt.core, org.eclipse.ui.ide, + org.eclipse.jface.text, + org.eclipse.text, + org.eclipse.jdt.ui, org.eclipse.jgit, org.eclipse.e4.core.services, com.google.guava, @@ -15,13 +20,20 @@ Require-Bundle: org.eclipse.ui, org.apache.commons.lang3, org.eclipse.mylyn.commons.ui, org.eclipse.mylyn.commons.core, - jakarta.inject.jakarta.inject-api;bundle-version="2.0.1" + jakarta.inject.jakarta.inject-api;bundle-version="2.0.1", + com.checkmarx.eclipse.common, + com.checkmarx.eclipse.devassist Automatic-Module-Name: com.checkmarx.eclipse Bundle-RequiredExecutionEnvironment: JavaSE-17 Import-Package: org.eclipse.core.resources, org.osgi.service.event;version="1.4.1" Bundle-ActivationPolicy: lazy Bundle-Activator: com.checkmarx.eclipse.Activator +Export-Package: com.checkmarx.ast.asca, + com.checkmarx.ast.wrapper, + com.checkmarx.eclipse.enums, + com.checkmarx.eclipse.properties, + com.checkmarx.eclipse.utils Bundle-ClassPath: ., lib/slf4j-simple-2.0.17.jar, lib/slf4j-reload4j-2.0.17.jar, @@ -33,3 +45,4 @@ Bundle-ClassPath: ., lib/ast-cli-java-wrapper-2.4.24.jar, lib/org.eclipse.mylyn.commons.ui_4.9.0.v20251121-0615.jar, lib/org-eclipse-mylyn-commons-core.jar + \ No newline at end of file diff --git a/checkmarx-ast-eclipse-plugin/build.properties b/checkmarx-ast-eclipse-plugin/build.properties index 680259c9..525ac1d0 100644 --- a/checkmarx-ast-eclipse-plugin/build.properties +++ b/checkmarx-ast-eclipse-plugin/build.properties @@ -2,15 +2,7 @@ output.. = bin/ bin.includes = plugin.xml,\ META-INF/,\ icons/,\ - lib/slf4j-simple-2.0.17.jar,\ - lib/slf4j-reload4j-2.0.17.jar,\ - lib/slf4j-api-2.0.17.jar,\ - lib/jackson-annotations-2.21.jar,\ - lib/jackson-core-2.21.1.jar,\ - lib/commons-lang3-3.18.0.jar,\ - lib/ast-cli-java-wrapper-2.4.24.jar,\ lib/org.eclipse.mylyn.commons.ui_4.9.0.v20251121-0615.jar,\ - lib/jackson-databind-2.21.1.jar,\ - .,\ - lib/org-eclipse-mylyn-commons-core.jar + lib/org-eclipse-mylyn-commons-core.jar,\ + . source.. = src/ diff --git a/checkmarx-ast-eclipse-plugin/icons/cx-one-assist-cube.png b/checkmarx-ast-eclipse-plugin/icons/cx-one-assist-cube.png new file mode 100644 index 0000000000000000000000000000000000000000..e48df9b81ab73017718fc2d2a5d36fc9068f73fe GIT binary patch literal 146450 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⪻e7GI(wZ>O2P~$^i^%A1VSqx)d7!Ibe^-ctZZs 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�wW#ux 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 literal 0 HcmV?d00001 diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/critical.svg b/checkmarx-ast-eclipse-plugin/icons/severity/critical.svg new file mode 100644 index 00000000..f3ab95d7 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/critical.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/critical_16.svg b/checkmarx-ast-eclipse-plugin/icons/severity/critical_16.svg new file mode 100644 index 00000000..6e1929e8 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/critical_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/critical_16_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/critical_16_dark.svg new file mode 100644 index 00000000..9c89888d --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/critical_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/critical_20.svg b/checkmarx-ast-eclipse-plugin/icons/severity/critical_20.svg new file mode 100644 index 00000000..5a297484 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/critical_20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/critical_20_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/critical_20_dark.svg new file mode 100644 index 00000000..74a7154a --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/critical_20_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/critical_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/critical_dark.svg new file mode 100644 index 00000000..9f6ad62b --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/critical_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/high.svg b/checkmarx-ast-eclipse-plugin/icons/severity/high.svg new file mode 100644 index 00000000..3b3399b7 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/high.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/high_16.svg b/checkmarx-ast-eclipse-plugin/icons/severity/high_16.svg new file mode 100644 index 00000000..4c815e84 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/high_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/high_16_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/high_16_dark.svg new file mode 100644 index 00000000..d9b8a81f --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/high_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/high_20.svg b/checkmarx-ast-eclipse-plugin/icons/severity/high_20.svg new file mode 100644 index 00000000..167be4d1 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/high_20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/high_20_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/high_20_dark.svg new file mode 100644 index 00000000..292e26a0 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/high_20_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/high_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/high_dark.svg new file mode 100644 index 00000000..50b139fa --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/high_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ignored.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ignored.svg new file mode 100644 index 00000000..95180214 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ignored.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ignored_16.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_16.svg new file mode 100644 index 00000000..4ec04da0 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ignored_16_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_16_dark.svg new file mode 100644 index 00000000..20246d56 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ignored_20.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_20.svg new file mode 100644 index 00000000..f8b60d31 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ignored_20_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_20_dark.svg new file mode 100644 index 00000000..06138d2a --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_20_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ignored_24.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_24.svg new file mode 100644 index 00000000..95180214 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_24.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ignored_24_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_24_dark.svg new file mode 100644 index 00000000..a8df1cee --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_24_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ignored_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_dark.svg new file mode 100644 index 00000000..a8df1cee --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ignored_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/low.svg b/checkmarx-ast-eclipse-plugin/icons/severity/low.svg new file mode 100644 index 00000000..a429fd46 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/low.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/low_16.svg b/checkmarx-ast-eclipse-plugin/icons/severity/low_16.svg new file mode 100644 index 00000000..40b203e4 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/low_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/low_16_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/low_16_dark.svg new file mode 100644 index 00000000..69f9b3a6 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/low_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/low_20.svg b/checkmarx-ast-eclipse-plugin/icons/severity/low_20.svg new file mode 100644 index 00000000..0ad469eb --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/low_20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/low_20_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/low_20_dark.svg new file mode 100644 index 00000000..b4310c02 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/low_20_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/low_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/low_dark.svg new file mode 100644 index 00000000..5cb507fb --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/low_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/malicious.svg b/checkmarx-ast-eclipse-plugin/icons/severity/malicious.svg new file mode 100644 index 00000000..db43abd1 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/malicious.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/malicious_16.svg b/checkmarx-ast-eclipse-plugin/icons/severity/malicious_16.svg new file mode 100644 index 00000000..32a94bd0 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/malicious_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/malicious_16_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/malicious_16_dark.svg new file mode 100644 index 00000000..32a94bd0 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/malicious_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/malicious_20.svg b/checkmarx-ast-eclipse-plugin/icons/severity/malicious_20.svg new file mode 100644 index 00000000..946f3889 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/malicious_20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/malicious_20_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/malicious_20_dark.svg new file mode 100644 index 00000000..032df876 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/malicious_20_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/medium.svg b/checkmarx-ast-eclipse-plugin/icons/severity/medium.svg new file mode 100644 index 00000000..a004f117 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/medium.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/medium_16.svg b/checkmarx-ast-eclipse-plugin/icons/severity/medium_16.svg new file mode 100644 index 00000000..3a6cda49 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/medium_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/medium_16_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/medium_16_dark.svg new file mode 100644 index 00000000..5be2c823 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/medium_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/medium_20.svg b/checkmarx-ast-eclipse-plugin/icons/severity/medium_20.svg new file mode 100644 index 00000000..4117ba0e --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/medium_20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/medium_20_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/medium_20_dark.svg new file mode 100644 index 00000000..8cd8ec41 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/medium_20_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/medium_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/medium_dark.svg new file mode 100644 index 00000000..6cc09bf7 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/medium_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ok.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ok.svg new file mode 100644 index 00000000..df362347 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ok.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ok_16.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ok_16.svg new file mode 100644 index 00000000..21fa16ef --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ok_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ok_16_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ok_16_dark.svg new file mode 100644 index 00000000..21fa16ef --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ok_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ok_20.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ok_20.svg new file mode 100644 index 00000000..dc746080 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ok_20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ok_20_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ok_20_dark.svg new file mode 100644 index 00000000..c139bab4 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ok_20_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ok_24.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ok_24.svg new file mode 100644 index 00000000..df362347 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ok_24.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ok_24_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ok_24_dark.svg new file mode 100644 index 00000000..df362347 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ok_24_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/ok_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/ok_dark.svg new file mode 100644 index 00000000..df362347 --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/ok_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/unknown.svg b/checkmarx-ast-eclipse-plugin/icons/severity/unknown.svg new file mode 100644 index 00000000..d63f29bf --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/unknown.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/unknown_16.svg b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_16.svg new file mode 100644 index 00000000..d63f29bf --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_16.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/unknown_16_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_16_dark.svg new file mode 100644 index 00000000..a5270a2a --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_16_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/unknown_20.svg b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_20.svg new file mode 100644 index 00000000..d63f29bf --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_20.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/unknown_20_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_20_dark.svg new file mode 100644 index 00000000..a5270a2a --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_20_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/checkmarx-ast-eclipse-plugin/icons/severity/unknown_dark.svg b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_dark.svg new file mode 100644 index 00000000..a5270a2a --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/icons/severity/unknown_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/checkmarx-ast-eclipse-plugin/pom.xml b/checkmarx-ast-eclipse-plugin/pom.xml index cdaf8a6d..9fd07411 100644 --- a/checkmarx-ast-eclipse-plugin/pom.xml +++ b/checkmarx-ast-eclipse-plugin/pom.xml @@ -9,4 +9,7 @@ com.checkmarx.eclipse.plugin eclipse-plugin - + + src + + \ No newline at end of file diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/AuthButtonFieldEditor.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/AuthButtonFieldEditor.java index bd13259d..9c680065 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/AuthButtonFieldEditor.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/AuthButtonFieldEditor.java @@ -10,7 +10,7 @@ import org.eclipse.swt.widgets.Display; import com.checkmarx.eclipse.runner.Authenticator; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.utils.PluginConstants; public class AuthButtonFieldEditor extends StringButtonFieldEditor { diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/PreferencesPage.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/PreferencesPage.java index 3c5af098..e722b342 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/PreferencesPage.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/PreferencesPage.java @@ -2,6 +2,8 @@ import java.util.concurrent.CompletableFuture; +import com.checkmarx.eclipse.common.events.SettingsTopics; + import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.StringFieldEditor; @@ -21,7 +23,7 @@ import com.checkmarx.eclipse.Activator; import com.checkmarx.eclipse.runner.Authenticator; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.utils.PluginUtils; import org.eclipse.swt.widgets.Link; @@ -163,7 +165,7 @@ public boolean performOk() { boolean ok = super.performOk(); if (ok) { - PluginUtils.getEventBroker().post(PluginConstants.TOPIC_APPLY_SETTINGS, PluginConstants.EMPTY_STRING); + PluginUtils.getEventBroker().post(SettingsTopics.TOPIC_APPLY_SETTINGS, PluginConstants.EMPTY_STRING); } return ok; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/runner/Authenticator.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/runner/Authenticator.java index 202baa99..4311f7ad 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/runner/Authenticator.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/runner/Authenticator.java @@ -7,7 +7,7 @@ import com.checkmarx.ast.wrapper.CxConfig; import com.checkmarx.ast.wrapper.CxException; import com.checkmarx.ast.wrapper.CxWrapper; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.utils.PluginConstants; public class Authenticator { diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java index e520f992..f5ea672a 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java @@ -6,11 +6,17 @@ import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; +import com.checkmarx.eclipse.devassist.ui.findings.realtime.CheckmarxEditorListener; +import com.checkmarx.eclipse.devassist.backend.GlobalScannerController; +import com.checkmarx.eclipse.devassist.backend.listener.ProjectLifecycleListener; public class PluginStartup implements IStartup { private static final String VIEW_ID = "com.checkmarx.eclipse.views.CheckmarxView"; + private static final String FINDINGS_VIEW_ID = "com.checkmarx.eclipse.devassist.ui.findings.CxFindingsView"; + private static CheckmarxEditorListener realtimeScanListener; // Keep strong reference to prevent GC + private static ProjectLifecycleListener projectListener; // Keep strong reference to prevent GC @Override public void earlyStartup() { @@ -19,13 +25,50 @@ public void earlyStartup() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window != null) { IWorkbenchPage page = window.getActivePage(); + + // Show Checkmarx One view if not already visible if (page != null && page.findView(VIEW_ID) == null) { page.showView(VIEW_ID); } + + // Show Checkmarx Findings view if not already visible + if (page != null && page.findView(FINDINGS_VIEW_ID) == null) { + page.showView(FINDINGS_VIEW_ID); + } + + // Register listener for real-time scanning with debounce + realtimeScanListener = new CheckmarxEditorListener(); + window.getPartService().addPartListener(realtimeScanListener); + + // Initialize backend scanner infrastructure + initializeBackendScanners(); } } catch (PartInitException e) { - CxLogger.error("Failed to open Checkmarx One view on startup: " + e.getMessage(), e); + CxLogger.error("Failed to open Checkmarx views on startup: " + e.getMessage(), e); + } catch (Exception e) { + CxLogger.error("Error during plugin startup: " + e.getMessage(), e); } }); } + + /** + * Initialize backend scanner infrastructure. + * + * Creates and registers: + * - GlobalScannerController (application-level singleton) + * - ProjectLifecycleListener (project open/close listener) + * + * This enables real-time scanning on file modifications. + */ + private void initializeBackendScanners() { + try { + GlobalScannerController controller = GlobalScannerController.getInstance(); + CxLogger.info(controller.getStateReport()); + + projectListener = new ProjectLifecycleListener(); + projectListener.register(); + } catch (Exception e) { + CxLogger.error("Error initializing backend scanners: " + e.getMessage(), e); + } + } } diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginConstants.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginConstants.java index 524b1136..f39bc5bc 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginConstants.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginConstants.java @@ -21,6 +21,7 @@ public class PluginConstants { public static final String BFL_NOT_FOUND = "Best fix Location not available for given results"; public static final String TOOLBAR_ACTION_PREFERENCES = "Preferences"; public static final String TOOLBAR_ACTION_CLEAR_RESULTS = "Clear results section"; + public static final String FINDINGS_PROMO_DESCRIPTION = "Checkmarx AI (Cx Assist) provides real-time threat detection and helps you avoid vulnerabilities before they happen."; /******************************** LOG VIEW: ERRORS ********************************/ @@ -63,9 +64,6 @@ public class PluginConstants { public static final String PREFERENCES_TEST_CONNECTION = "Test Connection"; public static final String PREFERENCES_VALIDATING_STATE = "Validating..."; - /******************************** TOPICS ********************************/ - public static final String TOPIC_APPLY_SETTINGS = "ApplySettings"; - /******************************** PROBLEMS VIEW ********************************/ public static final String PROBLEM_SOURCE_ID = "CheckmarxEclipsePlugin"; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginUtils.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginUtils.java index 50f6ff23..94ade55a 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginUtils.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginUtils.java @@ -24,7 +24,8 @@ import com.checkmarx.ast.results.result.Node; import com.checkmarx.ast.results.result.Result; import com.checkmarx.eclipse.enums.ActionName; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.properties.Preferences; import com.checkmarx.eclipse.views.DataProvider; import com.checkmarx.eclipse.views.DisplayModel; @@ -52,7 +53,7 @@ public static String convertStringTimeStamp(String timestamp) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(PARAM_TIMESTAMP_PATTERN).withZone(ZoneId.systemDefault()); parsedDate = dateTimeFormatter.format(instant); } catch (Exception e) { - System.out.println(e); + return timestamp; } diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/CheckmarxView.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/CheckmarxView.java index 6ccb14d1..b4366c05 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/CheckmarxView.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/CheckmarxView.java @@ -89,11 +89,12 @@ import com.checkmarx.ast.results.result.Result; import com.checkmarx.ast.scan.Scan; import com.checkmarx.ast.wrapper.CxException; +import com.checkmarx.eclipse.common.events.SettingsTopics; import com.checkmarx.eclipse.Activator; import com.checkmarx.eclipse.enums.ActionName; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.properties.Preferences; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.utils.NotificationPopUpUI; import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.utils.PluginUtils; @@ -223,7 +224,7 @@ public CheckmarxView() { currentProjectId = globalSettings.getProjectId(); currentBranch = globalSettings.getBranch(); currentScanId = globalSettings.getScanId(); - PluginUtils.getEventBroker().subscribe(PluginConstants.TOPIC_APPLY_SETTINGS, this); + PluginUtils.getEventBroker().subscribe(SettingsTopics.TOPIC_APPLY_SETTINGS, this); } @Override diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/DataProvider.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/DataProvider.java index 9133a43e..72884426 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/DataProvider.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/DataProvider.java @@ -32,7 +32,7 @@ import com.checkmarx.ast.wrapper.CxWrapper; import com.checkmarx.eclipse.properties.Preferences; import com.checkmarx.eclipse.runner.Authenticator; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.utils.PluginUtils; import com.checkmarx.eclipse.views.filters.FilterState; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionStartScan.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionStartScan.java index 972a5d68..bccdb3d7 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionStartScan.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionStartScan.java @@ -40,7 +40,7 @@ import com.checkmarx.eclipse.views.GlobalSettings; import com.checkmarx.eclipse.views.PluginListenerDefinition; import com.google.common.eventbus.EventBus; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.utils.NotificationPopUpUI; import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.utils.PluginUtils; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ToolBarActions.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ToolBarActions.java index f2840d71..7ba5f4e7 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ToolBarActions.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ToolBarActions.java @@ -22,8 +22,8 @@ import com.checkmarx.eclipse.enums.ActionName; import com.checkmarx.eclipse.enums.PluginListenerType; -import com.checkmarx.eclipse.enums.Severity; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.enums.Severity; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.views.DataProvider; import com.checkmarx.eclipse.views.DisplayModel; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/filters/ActionFilters.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/filters/ActionFilters.java index 49a6ee09..bfc2fa08 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/filters/ActionFilters.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/filters/ActionFilters.java @@ -7,7 +7,7 @@ import com.checkmarx.eclipse.Activator; import com.checkmarx.eclipse.enums.ActionName; import com.checkmarx.eclipse.enums.PluginListenerType; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.views.DataProvider; import com.checkmarx.eclipse.views.PluginListenerDefinition; import com.google.common.eventbus.EventBus; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/filters/FilterState.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/filters/FilterState.java index e5957112..7d435027 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/filters/FilterState.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/filters/FilterState.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.Set; -import com.checkmarx.eclipse.enums.Severity; +import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.enums.State; import com.checkmarx.eclipse.views.GlobalSettings; diff --git a/com.checkmarx.eclipse.feature/feature.xml b/com.checkmarx.eclipse.feature/feature.xml index f03adb4a..faf0ab05 100644 --- a/com.checkmarx.eclipse.feature/feature.xml +++ b/com.checkmarx.eclipse.feature/feature.xml @@ -234,6 +234,20 @@ Vulnerable code is highlighted in the editor + + + + - + \ No newline at end of file diff --git a/common-lib/.classpath b/common-lib/.classpath new file mode 100644 index 00000000..bebfa806 --- /dev/null +++ b/common-lib/.classpath @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/common-lib/.gitignore b/common-lib/.gitignore new file mode 100644 index 00000000..92145bce --- /dev/null +++ b/common-lib/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ \ No newline at end of file diff --git a/common-lib/.project b/common-lib/.project new file mode 100644 index 00000000..f1006388 --- /dev/null +++ b/common-lib/.project @@ -0,0 +1,28 @@ + + + common-lib + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + \ No newline at end of file diff --git a/common-lib/META-INF/MANIFEST.MF b/common-lib/META-INF/MANIFEST.MF new file mode 100644 index 00000000..cd398271 --- /dev/null +++ b/common-lib/META-INF/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Checkmarx Common Library +Bundle-SymbolicName: com.checkmarx.eclipse.common +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: Checkmarx +Require-Bundle: org.eclipse.core.runtime +Bundle-RequiredExecutionEnvironment: JavaSE-17 +Export-Package: com.checkmarx.eclipse.common.enums, + com.checkmarx.eclipse.common.events, + com.checkmarx.eclipse.common.properties, + com.checkmarx.eclipse.common.utils \ No newline at end of file diff --git a/common-lib/build.properties b/common-lib/build.properties new file mode 100644 index 00000000..5acaa1ff --- /dev/null +++ b/common-lib/build.properties @@ -0,0 +1,3 @@ +output.. = bin/ +bin.includes = META-INF/,. +source.. = src/ \ No newline at end of file diff --git a/common-lib/pom.xml b/common-lib/pom.xml new file mode 100644 index 00000000..c683aceb --- /dev/null +++ b/common-lib/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.checkmarx.ast.eclipse + checkmarx-eclipse-plugin + 1.0.0-SNAPSHOT + + com.checkmarx.eclipse.common + eclipse-plugin + diff --git a/common-lib/src/com/checkmarx/eclipse/common/enums/Severity.java b/common-lib/src/com/checkmarx/eclipse/common/enums/Severity.java new file mode 100644 index 00000000..091c187b --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/enums/Severity.java @@ -0,0 +1,17 @@ +package com.checkmarx.eclipse.common.enums; + +public enum Severity { + + CRITICAL, + HIGH, + MEDIUM, + LOW, + INFO, + GROUP_BY_SEVERITY, + GROUP_BY_QUERY_NAME, + GROUP_BY_STATE_NAME; + + public static Severity getSeverity(String severity) { + return Severity.valueOf(severity); + } +} diff --git a/common-lib/src/com/checkmarx/eclipse/common/events/SettingsTopics.java b/common-lib/src/com/checkmarx/eclipse/common/events/SettingsTopics.java new file mode 100644 index 00000000..cac1c5d9 --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/events/SettingsTopics.java @@ -0,0 +1,13 @@ +package com.checkmarx.eclipse.common.events; + +/** + * Event broker topic names shared across bundles (main plugin publishes, + * devassist and the main view subscribe). + */ +public class SettingsTopics { + + public static final String TOPIC_APPLY_SETTINGS = "ApplySettings"; + + private SettingsTopics() { + } +} diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/SharedPreferences.java b/common-lib/src/com/checkmarx/eclipse/common/properties/SharedPreferences.java new file mode 100644 index 00000000..d928e87e --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/SharedPreferences.java @@ -0,0 +1,31 @@ +package com.checkmarx.eclipse.common.properties; + +import org.eclipse.core.runtime.Platform; + +/** + * Read-only access to the Checkmarx preference store, for bundles that only + * need to read values (never store them). The store itself is owned by the + * main plugin's Activator; reads go through the platform preferences + * service, which is not bundle-specific. + */ +public class SharedPreferences { + + public static final String QUALIFIER = "com.checkmarx.eclipse"; + public static final String API_KEY = "apiKey"; + public static final String ADDITIONAL_OPTIONS = "additionalOptions"; + + private SharedPreferences() { + } + + public static String getPref(String key) { + return Platform.getPreferencesService().getString(QUALIFIER, key, null, null); + } + + public static String getApiKey() { + return getPref(API_KEY); + } + + public static String getAdditionalOptions() { + return getPref(ADDITIONAL_OPTIONS); + } +} diff --git a/common-lib/src/com/checkmarx/eclipse/common/utils/CxLogger.java b/common-lib/src/com/checkmarx/eclipse/common/utils/CxLogger.java new file mode 100644 index 00000000..099f8e14 --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/utils/CxLogger.java @@ -0,0 +1,58 @@ +package com.checkmarx.eclipse.common.utils; + +import org.eclipse.core.runtime.ILog; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkUtil; + +/** + * Class responsible to add entries to Eclipse Error Log perspective + * + * @author HugoMa + * + */ +public class CxLogger { + + private static final Bundle BUNDLE = FrameworkUtil.getBundle(CxLogger.class); + private static final ILog LOGGER = Platform.getLog(BUNDLE); + + /** + * Add entry as error + * + * @param msg + * @param e + */ + public static void error(String msg, Exception e) { + log(Status.ERROR, msg, e); + } + + /** + * Add entry as warning + * + * @param msg + */ + public static void warning(String msg) { + log(Status.WARNING, msg, null); + } + + /** + * Add entry as info + * + * @param msg + */ + public static void info(String msg) { + log(Status.INFO, msg, null); + } + + /** + * Add entry to Error Log + * + * @param status + * @param msg + * @param e + */ + private static void log(int status, String msg, Exception e) { + LOGGER.log(new Status(status, BUNDLE.getSymbolicName(), msg, e)); + } +} diff --git a/devassist-lib/.classpath b/devassist-lib/.classpath new file mode 100644 index 00000000..055501eb --- /dev/null +++ b/devassist-lib/.classpath @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/devassist-lib/.gitignore b/devassist-lib/.gitignore new file mode 100644 index 00000000..92145bce --- /dev/null +++ b/devassist-lib/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ \ No newline at end of file diff --git a/devassist-lib/.project b/devassist-lib/.project new file mode 100644 index 00000000..3b6ad123 --- /dev/null +++ b/devassist-lib/.project @@ -0,0 +1,28 @@ + + + devassist-lib + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + \ No newline at end of file diff --git a/devassist-lib/META-INF/MANIFEST.MF b/devassist-lib/META-INF/MANIFEST.MF new file mode 100644 index 00000000..09d88bdb --- /dev/null +++ b/devassist-lib/META-INF/MANIFEST.MF @@ -0,0 +1,33 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: DevAssist Library +Bundle-SymbolicName: com.checkmarx.eclipse.devassist;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-17 +Bundle-ClassPath: ., + lib/ast-cli-java-wrapper-2.4.24.jar, + lib/jackson-core-2.21.4.jar, + lib/jackson-databind-2.21.5.jar, + lib/jackson-annotations-2.21.jar, + lib/slf4j-api-2.0.17.jar, + lib/slf4j-simple-2.0.17.jar, + lib/slf4j-reload4j-2.0.17.jar, + lib/commons-lang3-3.18.0.jar +Require-Bundle: com.checkmarx.eclipse.common, + org.eclipse.ui, + org.eclipse.ui.workbench, + org.eclipse.ui.workbench.texteditor, + org.eclipse.ui.editors, + org.eclipse.ui.ide, + org.eclipse.core.runtime, + org.eclipse.core.resources, + org.eclipse.core.commands, + org.eclipse.jface, + org.eclipse.jface.text, + org.eclipse.swt, + org.eclipse.jgit, + org.eclipse.e4.core.services +Import-Package: org.osgi.service.event;version="1.4.1" +Export-Package: com.checkmarx.eclipse.devassist.backend, + com.checkmarx.eclipse.devassist.backend.listener, + com.checkmarx.eclipse.devassist.ui.findings.realtime \ No newline at end of file diff --git a/devassist-lib/build.properties b/devassist-lib/build.properties new file mode 100644 index 00000000..ab1fe1a3 --- /dev/null +++ b/devassist-lib/build.properties @@ -0,0 +1,14 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + plugin.xml,\ + icons/,\ + lib/ast-cli-java-wrapper-2.4.24.jar,\ + lib/jackson-core-2.21.4.jar,\ + lib/jackson-databind-2.21.5.jar,\ + lib/jackson-annotations-2.21.jar,\ + lib/slf4j-api-2.0.17.jar,\ + lib/slf4j-simple-2.0.17.jar,\ + lib/slf4j-reload4j-2.0.17.jar,\ + lib/commons-lang3-3.18.0.jar,\ + . \ No newline at end of file diff --git a/devassist-lib/icons/CxFlatLogo16x16.png b/devassist-lib/icons/CxFlatLogo16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4176de239bd851769ee14cf2593c859494bcf883 GIT binary patch literal 4474 zcmZ`+2UHW=)*hM^DM3Iw#L!y;DAEF=fHWz_(0fTB5dtBB&_SdlMG&MYRRperQUz&N zigb{sAXSlGlqT(g`rqq+*LyST%=u>T?>l?%IeX1oC)&tBi-C@d4gdfK9c>N7(R_^Q zXigkG<7B%V0D#^NqpohGqpl7%@^nXITu}g^9i3uIZFa5gbe3gOVqy7IFme806N%0zQ=C?7WF{0HeXtFYiScjEZDmIk$`?nGAG802eci(Mw zZFM#Tcir1DtUX)11?249khndQYXQu}o_s(%`SO+wW{$q^S_nX2MB!}L_PI^)aZQa2 zfLc8u`I0Cs)NAJ-PyCqO3ufbORBNUHIH~c%w$1I4HJm^Ig&{-=2r25ZG!RP^UFC`L zDv(x-GL`VCKDC0FxFV#gWS4yBMZ~r&fJH)0GZ;deRf?Qh*UQf&G&@IGzYVy}0qBcF zQTSYf@;hiQ8tm*Ov)1r9D7(OJa5Ph-rH|v$hjAAOQQ7UCe6QZspU{xf5KNxI7w%^l z?2IR6i|~K9r=T_#jng)oVY==kK|pZieX4VU8(jyv>zL-RyKBx@k3f(n%#_i?D&4t*8KcQY9bxMsnj5B(1bvoPUuuK^b(R zgQ`vvRFOpOOIa?{d$V?x>P+st(Xv@`yk}m_?9B&Yg^RVP3$@p$kefB(V3<|zvyfqR zle8j>*h1D9oy9XP6@pZFop%arc|16$d$N21icu$ALF622j9S8Jl%63)C3U6T2Z*jP zGH7C`D>y_1S@Zv7pkUF4!i%>z;3oI-;CGJPTx#r zFoyTqMDEyzlO2h{Pmd!?gnd2gU^3y+dU4T%j;aq;?Hd)IrE1buYWUURWWoLid9Lt)M$xmo?5bzE)wa;tGa(sqF4;w! z59l9}A?q=rp0J`Ygi0ajJ>G@`heGEjbgd~s^{Wx!|%`zpmnFsnwWSt4cM3raK8 znbBEvE8m2$S?ON?NKR@xbO zU;OB0K8STI_Y6x+E)vNuchRkfS(F8pd)4KX5?|+Kk$lasG*xuGqT`iYac>>w%uWlxMcWIRahgOA*u||X+P+nKidz&gcr&L!L5fgT zAUACG-F6B%-AHMhu=48q+O=)ty)&O~1`GAjG*fDY!fvQ@sJ9AVIm62Gjz*a#lD2Tt zd|t3#;8gSv4a+=vcr4}(&lGX$)YRoERfn@>_qWrA^&q$Db>ans5t7k*;$XJq!P}dO z8QP}W_a87}=doxk4r`B{!#Y&?Vo}(-f%r$(SN$IjY7IgxlLOnzoK$_ed^vrUYi|cc zkLoPvyIgY>JGdjL%ZP#&+(W1<>ep)dJ}NE6m2F=uuWosaO$NR8eXSS4&lA+bA?Gb^Af1J) z@2nZ98G7?xa8$#gyldux&a>i1Od=+J4%Bsw0M6bX!Bz-Yu+yuYh`rq+>U_`P zdm4A9R$6=Kvy5lyTjs+Sf|eZ>!_N5eB!{-jj&duv5r+{+6k6^BHo~}SfcJX2T)%}& z!{Cp{8~)sunaIrW^Iqq>-56XIt2L_!s<#$hyl;3XFNrUej<77HZ`N*dFTs>^7_%5J zMbbs;#TVt@&2Po$JJzwhY-`b3M9vZW)8{)pp~O<}ps#r=r

93%WiJ&^%(E6EL}@ zpgi^HQQ`Hh1@ECc0k6xKSUVs(pgi);E*<27J7HEq$GR+*cdh-lLjj?n-y>fC54T(YrhwJ6{(*TTb}*Y#Cl~ zZnA0`3+mPyi9dDggX(-)Q}~6U;77q)fB;y)PESoM#}_RBRCe`hA_{cDMXTp*s)|Hp zRpf^Fu$&oJfWo%Q$Ga-YV?3eZVUc&jD#Pc)gdy%qY7*4R2vfsFV5Rz4v}?R)j;pHPgd2 z?~BIr8+FdGTkmg;ac0++jq2jug+&PJXr_ct%Xa@Zrl}`iNVI!Y5>(ygdle>VmF~@M zo0Ksjde&6hI!)JJzutv=QTI9(R|t*-(wEKIf-g($rtRIW?x2Mz!rMaObb}0~V(TeU zu~g!f&HMFe&xCWj&($MZo7?A45+}6+AB`FuB=6bVtJ!N#Mv94DW7HqW63_ae)M@`= z3ez3)DkdmB-f&jmJ>6c_arsu{S@W~cx-OwnUD$LtMgNzJU5b+g@6Ljb&ilI`;X}R> zv-@%vyn?35lc@-&;Rj-Sh4T(^4w$vh@Sv0OuvhHSr>msAZR>GsL#Kk;!VyD#<$c|H zK6=nS`1J@l$+(3D%XC`DbKZaZV7VJMT_Ewa+lB3#`&fLrRc{{^ZlWW=<8i~ zeeby0=$T8{e!R+OZPV0+9b5Ox9y&Q>`-G-+_}NRJ*Ha8D^6T<8BdnFh=!&*4eVy6W zQPra#xEiaf`yQ6Na^o#0s|!C~tIpmJ-_aXj%;zmoZd_ztSsYGzx`0d}84uv5$J+nu z#rk>;W#RpyD-0u+w$oM>UfBnYefxGz0f(^^oYXj;TS~*8QNBfAOc!kBc^>jZi#4%@ z1Do$@7nJ7v=Ra~oxGlK$xtRFzisj#mc6wtR{aR9a3wdlk>YIv-il3SHjRrz?-%O`Q zOOXuY6@8bGd&SlLR|~uE(<&3zB^O-#6%Pqo-Md-tH81LoNWBXVZjYQ7Cdc8y%A;Qf zO#It+5&Nj@_PC||4+*xk^`2AM)`7D_3PVtvgxXI*0z1tmnbSD$(W!C2Amx?K1?6zk zkL9jftr}BL+l8PJifQVUrjLh>PhLNo9)6t|S(0#ye=M-We{Vf{v2C`C$`E7No|Ufh z$ZvUb&&AYi=rg;cEwS-V{o(@jKz%oX;mM-S{txG#>=G46KP6i|+pQ+^^}*Gpt|s^a zb}nuqa20xJJ-(a76v6Ku=oAFs72D{qXcWuV$!>2N4#w%!s0Ce7bIOs8b)N z52Nvqkh%v;-$|bsk1D^g4{hOJQDeSAy}fn-tDZ@0buIGaJvx8*pv-j8`uc$Q5vBpC z$W8$iM~Lj`2FSPos-GADbji5?#t1Ue-yCuPh{OPtzd061^YN8+82XYw5KzZrBn z6#w93YF4t{(cuT6_0Tpa0KjRX<3Xl_5L^WS@_QJh8PQDtijt$d8`R#(-2nylaq~D< z0dOCsBj|=A+Jk-ETyX>?9~H5m?>b69qmGm4-?~RO!HA zFx=A#t%T6H{9AtXrUG#x5LyD90&UQ`jsaUgZ?KHj_|vzqXJ>a9+(VN z8us60C?CxKkR5w|$$r-LD;)fIF(q>Zis0_*b)1%}%(-*$pCSIA^`8WPDgF@{<1j>3 z+24|Xng6Xa`^W!BoIkDqRv3C>P)DEgS7yJ1{Av4xe_WrE5yl7QYNmm4L*WQNt2xT- zzdHV_(ENW1|8V>k!ePhz_s4$zYL=hYqi#{9gTwyrJXJc`_cOgmogS&9aS_SEsh^;t z{aTGfZDqaxe3`zb#RFpy9)u^7-oG4iVq?{0mb&_vf#*aYqJ&dJvgqbS5`C#A<=s56 z(pQHva8#a2B_eY;yOQ+f&C5)_mR;3G>KEezG%|;2`S)x;d>exaCY;1hMb{Y=e6Wet z1enW-=IG)Hk8hIqPuH|;jU`(0h|B$D-n<)Hu@8QpZen~<=2og?`+KU%!e$eVRdN2f z`CL$VK7I2rzjti105~a!9C>H(enyYdXye-KimtG`zc6I2=B*4)VSC&9(+X?B&MUZ| z$HgorI>cfDTFAdDg-t0S21G3evUWaM`!SAdA+{G1ofd2T0h{qPOpczaCs`qshJtMv zF$B{kqj#&re9Nwn6`?siXfI!;?hBzg;GEC~ rU2?4$DE9ok^p`<~%EKYy%4zD`?j`5f3naIWe-JvF1{$T8>_YzoodMk! literal 0 HcmV?d00001 diff --git a/devassist-lib/icons/critical_16.svg b/devassist-lib/icons/critical_16.svg new file mode 100644 index 00000000..6e1929e8 --- /dev/null +++ b/devassist-lib/icons/critical_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/critical_16_dark.svg b/devassist-lib/icons/critical_16_dark.svg new file mode 100644 index 00000000..9c89888d --- /dev/null +++ b/devassist-lib/icons/critical_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/high_16.svg b/devassist-lib/icons/high_16.svg new file mode 100644 index 00000000..4c815e84 --- /dev/null +++ b/devassist-lib/icons/high_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/high_16_dark.svg b/devassist-lib/icons/high_16_dark.svg new file mode 100644 index 00000000..d9b8a81f --- /dev/null +++ b/devassist-lib/icons/high_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/ignored_16.svg b/devassist-lib/icons/ignored_16.svg new file mode 100644 index 00000000..4ec04da0 --- /dev/null +++ b/devassist-lib/icons/ignored_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/ignored_16_dark.svg b/devassist-lib/icons/ignored_16_dark.svg new file mode 100644 index 00000000..20246d56 --- /dev/null +++ b/devassist-lib/icons/ignored_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/low_16.svg b/devassist-lib/icons/low_16.svg new file mode 100644 index 00000000..40b203e4 --- /dev/null +++ b/devassist-lib/icons/low_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/low_16_dark.svg b/devassist-lib/icons/low_16_dark.svg new file mode 100644 index 00000000..69f9b3a6 --- /dev/null +++ b/devassist-lib/icons/low_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/malicious_16.svg b/devassist-lib/icons/malicious_16.svg new file mode 100644 index 00000000..32a94bd0 --- /dev/null +++ b/devassist-lib/icons/malicious_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/malicious_16_dark.svg b/devassist-lib/icons/malicious_16_dark.svg new file mode 100644 index 00000000..32a94bd0 --- /dev/null +++ b/devassist-lib/icons/malicious_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/medium_16.svg b/devassist-lib/icons/medium_16.svg new file mode 100644 index 00000000..3a6cda49 --- /dev/null +++ b/devassist-lib/icons/medium_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/medium_16_dark.svg b/devassist-lib/icons/medium_16_dark.svg new file mode 100644 index 00000000..5be2c823 --- /dev/null +++ b/devassist-lib/icons/medium_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/ok_16.svg b/devassist-lib/icons/ok_16.svg new file mode 100644 index 00000000..21fa16ef --- /dev/null +++ b/devassist-lib/icons/ok_16.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/ok_16_dark.svg b/devassist-lib/icons/ok_16_dark.svg new file mode 100644 index 00000000..21fa16ef --- /dev/null +++ b/devassist-lib/icons/ok_16_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/devassist-lib/icons/unknown_16.svg b/devassist-lib/icons/unknown_16.svg new file mode 100644 index 00000000..d63f29bf --- /dev/null +++ b/devassist-lib/icons/unknown_16.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/devassist-lib/icons/unknown_16_dark.svg b/devassist-lib/icons/unknown_16_dark.svg new file mode 100644 index 00000000..a5270a2a --- /dev/null +++ b/devassist-lib/icons/unknown_16_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/devassist-lib/plugin.xml b/devassist-lib/plugin.xml new file mode 100644 index 00000000..0dd5b49e --- /dev/null +++ b/devassist-lib/plugin.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/devassist-lib/pom.xml b/devassist-lib/pom.xml new file mode 100644 index 00000000..42f73309 --- /dev/null +++ b/devassist-lib/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.checkmarx.ast.eclipse + checkmarx-eclipse-plugin + 1.0.0-SNAPSHOT + + com.checkmarx.eclipse.devassist + eclipse-plugin + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/Constants.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/Constants.java new file mode 100644 index 00000000..9c7551d8 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/Constants.java @@ -0,0 +1,31 @@ +package com.checkmarx.eclipse.devassist.backend; + +/** + * Constants for DevAssist backend operations. + * Mirrors JetBrains Constants pattern. + */ +public class Constants { + // Main plugin bundle id, used to load icons/resources that live in the main plugin bundle + public static final String MAIN_PLUGIN_ID = "com.checkmarx.eclipse.plugin"; + + // UI strings + public static final String BTN_OPEN_SETTINGS = "Open Settings"; + public static final String FINDINGS_PROMO_DESCRIPTION = "Checkmarx AI (Cx Assist) provides real-time threat detection and helps you avoid vulnerabilities before they happen."; + + // Log messages + public static final String ERROR_BUILDING_CX_WRAPPER = "An error occurred while instantiating a CxWrapper: %s"; + + // Severity level string constants + public static final String MALICIOUS_SEVERITY = "Malicious"; + public static final String CRITICAL_SEVERITY = "Critical"; + public static final String HIGH_SEVERITY = "High"; + public static final String MEDIUM_SEVERITY = "Medium"; + public static final String LOW_SEVERITY = "Low"; + public static final String OK = "OK"; + public static final String UNKNOWN = "Unknown"; + public static final String IGNORE_LABEL = "Ignored"; + + private Constants() { + // Private constructor to prevent instantiation + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/DevAssistScanStateHolder.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/DevAssistScanStateHolder.java new file mode 100644 index 00000000..503d066f --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/DevAssistScanStateHolder.java @@ -0,0 +1,244 @@ +package com.checkmarx.eclipse.devassist.backend; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicReference; +import java.security.MessageDigest; + +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Tracks file modification state to prevent redundant scans. + * + * Stores a composite "state hash" for each file: + * - Document modification timestamp + * - File system last-modified time + * - Editor content hash + * + * When a file is requested for scanning, we compare the current state + * with the cached state. If unchanged, we skip the scan and return cached results. + * + * This mirrors the JetBrains DevAssistScanStateHolder pattern. + */ +public class DevAssistScanStateHolder { + + private static final String LOG_TAG = "[SCAN-STATE]"; + + private final ConcurrentHashMap fileStateHash = new ConcurrentHashMap<>(); + // Atomic in-flight marker to prevent concurrent scans of the same file + // putIfAbsent() detects if another thread is already scanning this file + private final ConcurrentHashMap inFlightScans = new ConcurrentHashMap<>(); + + /** + * Get the cached state hash for a file. + * + * @param filePath Absolute file path + * @return Last recorded state hash, or null if never scanned + */ + public Long getStateHash(String filePath) { + if (filePath == null) { + return null; + } + return fileStateHash.get(filePath); + } + + /** + * Update the state hash for a file (after successful scan). + * + * @param filePath Absolute file path + * @param stateHash New state hash + */ + public void updateStateHash(String filePath, long stateHash) { + if (filePath == null) { + return; + } + + Long previous = fileStateHash.put(filePath, stateHash); + CxLogger.info(LOG_TAG + " Updated state hash for: " + filePath + + " (previous: " + previous + ", new: " + stateHash + ")"); + } + + /** + * Check if a file has changed since last scan AND mark it as in-flight. + * CRITICAL: Uses atomic putIfAbsent() to prevent concurrent scans of the same file. + * If another thread is already scanning this file, returns false to skip duplicate work. + * + * @param filePath Absolute file path + * @param currentStateHash Current state of the file + * @return true if file changed AND no other scan is in-flight, false otherwise + */ + public boolean hasChanged(String filePath, long currentStateHash) { + if (filePath == null) { + return true; + } + + Long cachedHash = fileStateHash.get(filePath); + + // Never scanned before + if (cachedHash == null) { + CxLogger.info(LOG_TAG + " File never scanned: " + filePath); + // Atomic check: if another thread beat us here, skip to avoid duplicate work + if (inFlightScans.putIfAbsent(filePath, true) != null) { + CxLogger.info(LOG_TAG + " BLOCKED: Another scan already in-flight for: " + filePath); + return false; + } + return true; + } + + // Compare hashes + boolean changed = !cachedHash.equals(currentStateHash); + if (!changed) { + CxLogger.info(LOG_TAG + " File unchanged (cached): " + filePath); + return false; + } + + // File changed - atomically mark as in-flight to prevent duplicate concurrent scans + if (inFlightScans.putIfAbsent(filePath, true) != null) { + CxLogger.info(LOG_TAG + " BLOCKED: Another scan already in-flight for: " + filePath); + return false; + } + + return true; + } + + /** + * Mark a file scan as complete (remove in-flight marker). + * MUST be called after scan completes to unblock other threads. + * + * @param filePath Absolute file path + */ + public void markScanComplete(String filePath) { + if (filePath == null) { + return; + } + inFlightScans.remove(filePath); + } + + /** + * Clear state for a specific file (e.g., when file is deleted). + * Also clears any in-flight scan marker. + * + * @param filePath Absolute file path + */ + public void clearFileState(String filePath) { + if (filePath == null) { + return; + } + + fileStateHash.remove(filePath); + inFlightScans.remove(filePath); + CxLogger.info(LOG_TAG + " Cleared state for: " + filePath); + } + + /** + * Clear all state (on project close). + * Also clears all in-flight scan markers. + */ + public void clearAll() { + fileStateHash.clear(); + inFlightScans.clear(); + CxLogger.info(LOG_TAG + " All state cleared"); + } + + /** + * Compute a state hash for a file based on: + * - File system last modified time + * - Document content hash (if open in editor with unsaved changes) + * + * CRITICAL FIX: When file is dirty (unsaved), hash actual document content instead of + * using System.nanoTime(). Previous implementation returned different hash on every call, + * causing unnecessary rescans even when content didn't change. + * + * @param filePath File to hash + * @return Composite state hash + */ + public static long computeFileStateHash(String filePath) { + try { + java.nio.file.Path path = java.nio.file.Paths.get(filePath); + long fileModified = java.nio.file.Files.getLastModifiedTime(path).toMillis(); + + // Check if file is open in editor with unsaved changes + // If dirty (unsaved), hash actual document content to detect real changes + String dirtyDocumentContent = null; + try { + org.eclipse.ui.IWorkbench workbench = org.eclipse.ui.PlatformUI.getWorkbench(); + if (workbench != null && !workbench.isClosing()) { + for (org.eclipse.ui.IWorkbenchWindow window : workbench.getWorkbenchWindows()) { + for (org.eclipse.ui.IWorkbenchPage page : window.getPages()) { + for (org.eclipse.ui.IEditorReference ref : page.getEditorReferences()) { + org.eclipse.ui.IEditorPart editor = ref.getEditor(false); + if (editor != null && editor.isDirty()) { + try { + String editorPath = editor.getEditorInput().getAdapter(org.eclipse.core.resources.IFile.class) + .getLocation().toOSString(); + if (editorPath.equals(filePath)) { + // Get document content from editor + if (editor instanceof org.eclipse.ui.texteditor.ITextEditor) { + org.eclipse.ui.texteditor.ITextEditor textEditor = (org.eclipse.ui.texteditor.ITextEditor) editor; + org.eclipse.jface.text.IDocument doc = textEditor.getDocumentProvider().getDocument(editor.getEditorInput()); + if (doc != null) { + dirtyDocumentContent = doc.get(); + break; + } + } + } + } catch (Exception e2) { + // Skip if we can't get editor or document + } + } + } + if (dirtyDocumentContent != null) break; + } + if (dirtyDocumentContent != null) break; + } + } + } catch (Exception e) { + // If workbench check fails, just use file timestamp + dirtyDocumentContent = null; + } + + // If file has unsaved changes, hash actual document content + // This ensures same content hashes to same value (no unnecessary rescans) + if (dirtyDocumentContent != null) { + return hashDocumentContent(dirtyDocumentContent); + } + + return fileModified; + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error computing state hash: " + e.getMessage()); + return System.currentTimeMillis(); + } + } + + /** + * Compute SHA-256 hash of document content. + * CRITICAL: Enables stable hashing of dirty files - same content always produces same hash. + * + * @param content Document text content + * @return Long hash value (first 8 bytes of SHA-256) + */ + private static long hashDocumentContent(String content) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] hash = md.digest(content.getBytes("UTF-8")); + // Convert first 8 bytes to long + long result = 0; + for (int i = 0; i < 8; i++) { + result = (result << 8) | (hash[i] & 0xFF); + } + return result; + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error hashing document content: " + e.getMessage()); + // Fallback to content length + hash code + return ((long) content.length() << 32) | (content.hashCode() & 0xFFFFFFFFL); + } + } + + /** + * Get statistics about tracked files. + * + * @return Summary string + */ + public String getStatistics() { + return "Tracked files: " + fileStateHash.size(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/GlobalScannerController.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/GlobalScannerController.java new file mode 100644 index 00000000..2d4e0a15 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/GlobalScannerController.java @@ -0,0 +1,209 @@ +package com.checkmarx.eclipse.devassist.backend; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import com.checkmarx.eclipse.devassist.backend.ScannerRegistry.ScannerType; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Application-level singleton managing global scanner state. + * + * Responsibilities: + * - Track which scanners are enabled/disabled globally + * - Sync with user preferences/settings + * - Notify all open projects when scanner state changes + * - Provide query methods for scanner availability + * + * This is an application-scoped service (one instance for entire Eclipse). + * Each project's ScannerRegistry checks this controller before executing scans. + * + * Mirrors the JetBrains GlobalScannerController pattern. + */ +public class GlobalScannerController { + + private static final String LOG_TAG = "[GLOBAL-SCANNER]"; + private static GlobalScannerController instance; + + // Global enable/disable state for each scanner + private final ConcurrentHashMap scannerState = + new ConcurrentHashMap<>(); + + // Listeners notified when scanner state changes + private final List stateListeners = new ArrayList<>(); + + /** + * Get the global singleton instance. + * Lazily creates on first access. + * + * @return Global scanner controller + */ + public synchronized static GlobalScannerController getInstance() { + if (instance == null) { + instance = new GlobalScannerController(); + } + return instance; + } + + /** + * Enable a scanner globally. + * + * @param type Scanner type to enable + */ + public void enableScanner(ScannerType type) { + if (type == null) { + return; + } + + boolean wasDisabled = Boolean.FALSE.equals(scannerState.put(type, true)); + + if (wasDisabled) { + CxLogger.info(LOG_TAG + " Enabled scanner: " + type.getDisplayName()); + notifyScannerStateChanged(type, true); + } + } + + /** + * Disable a scanner globally. + * + * @param type Scanner type to disable + */ + public void disableScanner(ScannerType type) { + if (type == null) { + return; + } + + boolean wasEnabled = Boolean.TRUE.equals(scannerState.put(type, false)); + + if (wasEnabled) { + CxLogger.info(LOG_TAG + " Disabled scanner: " + type.getDisplayName()); + notifyScannerStateChanged(type, false); + } + } + + /** + * Check if a scanner is enabled globally. + * + * @param type Scanner type to check + * @return true if enabled, false if disabled + */ + public boolean isScannerEnabled(ScannerType type) { + if (type == null) { + return false; + } + + // Default to enabled if not explicitly set + return scannerState.getOrDefault(type, true); + } + + /** + * Enable all scanners. + */ + public void enableAllScanners() { + CxLogger.info(LOG_TAG + " Enabling all scanners"); + + for (ScannerType type : ScannerType.values()) { + enableScanner(type); + } + } + + /** + * Disable all scanners. + */ + public void disableAllScanners() { + CxLogger.info(LOG_TAG + " Disabling all scanners"); + + for (ScannerType type : ScannerType.values()) { + disableScanner(type); + } + } + + /** + * Get count of enabled scanners. + * + * @return Number of enabled scanners + */ + public int getEnabledScannerCount() { + int count = 0; + for (ScannerType type : ScannerType.values()) { + if (isScannerEnabled(type)) { + count++; + } + } + return count; + } + + /** + * Register a listener to be notified of state changes. + * + * @param listener Listener callback + */ + public void addScannerStateListener(ScannerStateListener listener) { + if (listener != null) { + stateListeners.add(listener); + } + } + + /** + * Unregister a state listener. + * + * @param listener Listener to remove + */ + public void removeScannerStateListener(ScannerStateListener listener) { + if (listener != null) { + stateListeners.remove(listener); + } + } + + /** + * Notify all listeners of a scanner state change. + * + * @param type Changed scanner type + * @param enabled New enabled state + */ + private void notifyScannerStateChanged(ScannerType type, boolean enabled) { + for (ScannerStateListener listener : stateListeners) { + try { + listener.onScannerStateChanged(type, enabled); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error notifying listener: " + e.getMessage()); + } + } + } + + /** + * Get a detailed state report. + * + * @return Multi-line status string + */ + public String getStateReport() { + StringBuilder sb = new StringBuilder(); + sb.append(LOG_TAG).append(" Scanner State Report:\n"); + + for (ScannerType type : ScannerType.values()) { + boolean enabled = isScannerEnabled(type); + sb.append(" ").append(type.getDisplayName()).append(": ") + .append(enabled ? "ENABLED" : "DISABLED").append("\n"); + } + + sb.append(" Total Enabled: ").append(getEnabledScannerCount()).append("/") + .append(ScannerType.values().length); + + return sb.toString(); + } + + /** + * Listener interface for scanner state changes. + * Implemented by project registries to react to global changes. + */ + public interface ScannerStateListener { + /** + * Called when a scanner's enabled state changes globally. + * + * @param type Changed scanner type + * @param enabled New enabled state + */ + void onScannerStateChanged(ScannerType type, boolean enabled); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/ScannerRegistry.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/ScannerRegistry.java new file mode 100644 index 00000000..2a56daf1 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/ScannerRegistry.java @@ -0,0 +1,335 @@ +package com.checkmarx.eclipse.devassist.backend; + +import java.util.concurrent.ConcurrentHashMap; + +import org.eclipse.core.resources.IProject; + +import com.checkmarx.eclipse.common.utils.CxLogger; +import com.checkmarx.eclipse.devassist.basescanner.ScannerService; + +/** + * Manages the lifecycle of scanner services for a project. + * + * Responsibilities: + * - Create scanner instances when project opens + * - Store scanner instances for reuse + * - Dispose scanners when project closes + * + * This is a project-level service. Each open project gets its own registry. + * Scanners are lazily initialized on first access. + * + * Mirrors the JetBrains ScannerRegistry pattern. + */ +public class ScannerRegistry { + + private static final String LOG_TAG = "[SCANNER-REGISTRY]"; + + // Session property key for storing registry on project + public static final String REGISTRY_KEY = ScannerRegistry.class.getName() + ".INSTANCE"; + + private final IProject project; + private final ConcurrentHashMap scanners = new ConcurrentHashMap<>(); + private boolean disposed = false; + + /** + * Create a registry for a project. + * + * @param project Eclipse project + */ + public ScannerRegistry(IProject project) { + this.project = project; + CxLogger.info(LOG_TAG + " Created for project: " + project.getName()); + } + + + /** + * Deregister and dispose all scanners (on project close). + */ + public void deregisterAllScanners() { + CxLogger.info(LOG_TAG + " Deregistering all scanners for: " + project.getName()); + + // Dispose each scanner + scanners.forEach((type, scanner) -> { + try { + if (scanner instanceof AutoCloseable) { + ((AutoCloseable) scanner).close(); + } + CxLogger.info(LOG_TAG + "Disposed scanner: " + type); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error disposing scanner " + type + ": " + + e.getMessage()); + } + }); + + scanners.clear(); + disposed = true; + CxLogger.info(LOG_TAG + " All scanners disposed"); + } + + /** + * Get a scanner service by type. + * Lazily creates the scanner on first access. + * + * @param type Scanner type (OSS, SECRETS, etc.) + * @return Scanner instance, or null if scanner type not supported + */ + public Object getScannerService(ScannerType type) { + if (disposed) { + CxLogger.warning(LOG_TAG + " Registry is disposed"); + return null; + } + + return scanners.computeIfAbsent(type.name(), key -> { + CxLogger.info(LOG_TAG + " Creating scanner: " + type); + // Scanner creation will be implemented in Phase 2 + return createScannerInstance(type); + }); + } + + /** + * Create a scanner instance by type. + * Creates implementations of ScannerService that delegate to the new scanner commands. + * + * @param type Scanner type + * @return Scanner instance + */ + private Object createScannerInstance(ScannerType type) { + try { + CxLogger.info(LOG_TAG + " Creating scanner instance for: " + type.getDisplayName()); + Object scanner = null; + + switch (type) { + case OSS: + scanner = new OssScannerServiceImpl(project); + break; + case SECRETS: + scanner = new SecretsScannerServiceImpl(project); + break; + case CONTAINERS: + scanner = new ContainerScannerServiceImpl(project); + break; + case IAC: + scanner = new IacScannerServiceImpl(project); + break; + case ASCA: + scanner = new AscaScannerServiceImpl(project); + break; + default: + return null; + } + + if (scanner != null) { + CxLogger.info(LOG_TAG + "Successfully created scanner: " + type.getDisplayName()); + } else { + CxLogger.warning(LOG_TAG + "Scanner returned null: " + type.getDisplayName()); + } + return scanner; + } catch (Exception e) { + CxLogger.error(LOG_TAG + "Error creating scanner " + type.getDisplayName() + ": " + e.getMessage(), e); + e.printStackTrace(); + return null; + } + } + + /** + * Inner class implementations of ScannerService that bridge to new scanner commands. + * These are minimal adapters that delegate to the proper scanner packages. + */ + + private static class OssScannerServiceImpl implements ScannerService { + private final com.checkmarx.eclipse.devassist.scanners.oss.OssScannerCommand command; + private final com.checkmarx.eclipse.devassist.common.ScannerConfig config; + OssScannerServiceImpl(IProject project) { + this.command = new com.checkmarx.eclipse.devassist.scanners.oss.OssScannerCommand(project); + this.config = com.checkmarx.eclipse.devassist.common.ScannerConfig.builder() + .engineName("OSS") + .build(); + } + @Override + public boolean shouldScanFile(String filePath) { return filePath != null && !filePath.isEmpty(); } + @Override + public com.checkmarx.eclipse.devassist.common.ScanResult scan(String filePath) { + try { + var result = command.scan(filePath, new org.eclipse.jface.text.Document()); + return (com.checkmarx.eclipse.devassist.common.ScanResult) (Object) result; + } catch (Exception e) { + CxLogger.error("[OSS-SERVICE] Scan error: " + e.getMessage(), e); + return null; + } + } + @Override + public com.checkmarx.eclipse.devassist.common.ScannerConfig getConfig() { return config; } + @Override + public void close() throws Exception { command.dispose(); } + } + + private static class SecretsScannerServiceImpl implements ScannerService { + private final com.checkmarx.eclipse.devassist.scanners.secrets.SecretsScannerCommand command; + private final com.checkmarx.eclipse.devassist.common.ScannerConfig config; + SecretsScannerServiceImpl(IProject project) { + this.command = new com.checkmarx.eclipse.devassist.scanners.secrets.SecretsScannerCommand(project); + this.config = com.checkmarx.eclipse.devassist.common.ScannerConfig.builder() + .engineName("SECRETS") + .build(); + } + @Override + public boolean shouldScanFile(String filePath) { return filePath != null && !filePath.isEmpty(); } + @Override + public com.checkmarx.eclipse.devassist.common.ScanResult scan(String filePath) { + try { + var result = command.scan(filePath, new org.eclipse.jface.text.Document()); + return (com.checkmarx.eclipse.devassist.common.ScanResult) (Object) result; + } catch (Exception e) { + CxLogger.error("[SECRETS-SERVICE] Scan error: " + e.getMessage(), e); + return null; + } + } + @Override + public com.checkmarx.eclipse.devassist.common.ScannerConfig getConfig() { return config; } + @Override + public void close() throws Exception { command.dispose(); } + } + + private static class IacScannerServiceImpl implements ScannerService { + private final com.checkmarx.eclipse.devassist.scanners.iac.IacScannerCommand command; + private final com.checkmarx.eclipse.devassist.common.ScannerConfig config; + IacScannerServiceImpl(IProject project) { + this.command = new com.checkmarx.eclipse.devassist.scanners.iac.IacScannerCommand(project); + this.config = com.checkmarx.eclipse.devassist.common.ScannerConfig.builder() + .engineName("IAC") + .build(); + } + @Override + public boolean shouldScanFile(String filePath) { return filePath != null && !filePath.isEmpty(); } + @Override + public com.checkmarx.eclipse.devassist.common.ScanResult scan(String filePath) { + try { + var result = command.scan(filePath, new org.eclipse.jface.text.Document()); + return (com.checkmarx.eclipse.devassist.common.ScanResult) (Object) result; + } catch (Exception e) { + CxLogger.error("[IAC-SERVICE] Scan error: " + e.getMessage(), e); + return null; + } + } + @Override + public com.checkmarx.eclipse.devassist.common.ScannerConfig getConfig() { return config; } + @Override + public void close() throws Exception { command.dispose(); } + } + + private static class AscaScannerServiceImpl implements ScannerService { + private final com.checkmarx.eclipse.devassist.scanners.asca.AscaScannerCommand command; + private final com.checkmarx.eclipse.devassist.common.ScannerConfig config; + AscaScannerServiceImpl(IProject project) { + this.command = new com.checkmarx.eclipse.devassist.scanners.asca.AscaScannerCommand(project); + this.config = com.checkmarx.eclipse.devassist.common.ScannerConfig.builder() + .engineName("ASCA") + .build(); + } + @Override + public boolean shouldScanFile(String filePath) { return filePath != null && !filePath.isEmpty(); } + @Override + public com.checkmarx.eclipse.devassist.common.ScanResult scan(String filePath) { + try { + var result = command.scan(filePath, new org.eclipse.jface.text.Document()); + return (com.checkmarx.eclipse.devassist.common.ScanResult) (Object) result; + } catch (Exception e) { + CxLogger.error("[ASCA-SERVICE] Scan error: " + e.getMessage(), e); + return null; + } + } + @Override + public com.checkmarx.eclipse.devassist.common.ScannerConfig getConfig() { return config; } + @Override + public void close() throws Exception { command.dispose(); } + } + + private static class ContainerScannerServiceImpl implements ScannerService { + private final com.checkmarx.eclipse.devassist.scanners.containers.ContainerScannerCommand command; + private final com.checkmarx.eclipse.devassist.common.ScannerConfig config; + ContainerScannerServiceImpl(IProject project) { + this.command = new com.checkmarx.eclipse.devassist.scanners.containers.ContainerScannerCommand(project); + this.config = com.checkmarx.eclipse.devassist.common.ScannerConfig.builder() + .engineName("CONTAINERS") + .build(); + } + @Override + public boolean shouldScanFile(String filePath) { return filePath != null && !filePath.isEmpty(); } + @Override + public com.checkmarx.eclipse.devassist.common.ScanResult scan(String filePath) { + try { + var result = command.scan(filePath, new org.eclipse.jface.text.Document()); + return (com.checkmarx.eclipse.devassist.common.ScanResult) (Object) result; + } catch (Exception e) { + CxLogger.error("[CONTAINER-SERVICE] Scan error: " + e.getMessage(), e); + return null; + } + } + @Override + public com.checkmarx.eclipse.devassist.common.ScannerConfig getConfig() { return config; } + @Override + public void close() throws Exception { command.dispose(); } + } + + /** + * Check if a scanner is registered. + * + * @param type Scanner type + * @return true if scanner exists + */ + public boolean hasScannerService(ScannerType type) { + return scanners.containsKey(type.name()); + } + + /** + * Get the project this registry belongs to. + * + * @return Eclipse project + */ + public IProject getProject() { + return project; + } + + /** + * Check if registry is disposed. + * + * @return true if disposed + */ + public boolean isDisposed() { + return disposed; + } + + /** + * Get statistics for debugging. + * + * @return Summary string + */ + public String getStatistics() { + return "Project: " + project.getName() + + ", Scanners: " + scanners.size() + + ", Disposed: " + disposed; + } + + /** + * Enum of available scanner types. + * Maps to the 5 scanner engines in Checkmarx. + */ + public enum ScannerType { + OSS("Open Source Supply Chain"), + SECRETS("Secrets Scanning"), + CONTAINERS("Container Scanning"), + IAC("Infrastructure as Code"), + ASCA("Application Security Code Analysis"); + + private final String displayName; + + ScannerType(String displayName) { + this.displayName = displayName; + } + + public String getDisplayName() { + return displayName; + } + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/SeverityLevel.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/SeverityLevel.java new file mode 100644 index 00000000..459da6f8 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/SeverityLevel.java @@ -0,0 +1,51 @@ +package com.checkmarx.eclipse.devassist.backend; + +/** + * Severity level enumeration matching JetBrains implementation. + * Provides 8 severity levels with precedence values (lower = more severe). + */ +public enum SeverityLevel { + MALICIOUS("Malicious", 1), + CRITICAL("Critical", 2), + HIGH("High", 3), + MEDIUM("Medium", 4), + LOW("Low", 5), + UNKNOWN("Unknown", 6), + OK("OK", 7), + IGNORED("Ignored", 8); + + private final String severity; + private final int precedence; + + SeverityLevel(String severity, int precedence) { + this.severity = severity; + this.precedence = precedence; + } + + public String getSeverity() { + return severity; + } + + public int getPrecedence() { + return precedence; + } + + /** + * Convert string severity value to enum. + * Returns UNKNOWN if no match found. + * + * @param value Severity string (case-insensitive) + * @return Matching SeverityLevel or UNKNOWN + */ + public static SeverityLevel fromValue(String value) { + if (value == null) { + return UNKNOWN; + } + for (SeverityLevel level : values()) { + if (level.getSeverity().equalsIgnoreCase(value)) { + return level; + } + } + return UNKNOWN; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java new file mode 100644 index 00000000..3dec907e --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java @@ -0,0 +1,344 @@ +package com.checkmarx.eclipse.devassist.backend.listener; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.QualifiedName; +import com.checkmarx.eclipse.devassist.backend.DevAssistScanStateHolder; +import com.checkmarx.eclipse.devassist.problems.ProblemHolderService; +import com.checkmarx.eclipse.devassist.backend.ScannerRegistry; +import com.checkmarx.eclipse.devassist.backend.result.ResultPublisher; +import com.checkmarx.eclipse.devassist.common.ScanManager; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; + +public class ProjectLifecycleListener implements IResourceChangeListener { + + private static final String LOG_TAG = "[PROJECT-LISTENER]"; + private static final String PLUGIN_ID = "com.checkmarx.eclipse.plugin"; + + private static final QualifiedName REGISTRY_KEY = new QualifiedName(PLUGIN_ID, "scanner-registry"); + private static final QualifiedName PROBLEM_HOLDER_KEY = new QualifiedName(PLUGIN_ID, "problem-holder"); + private static final QualifiedName STATE_HOLDER_KEY = new QualifiedName(PLUGIN_ID, "state-holder"); + private static final QualifiedName WORKSPACE_SCAN_JOB_KEY = new QualifiedName(PLUGIN_ID, "workspace-scan-job"); + + private final List initializedProjects = new ArrayList<>(); + + /** + * Register this listener with Eclipse workspace and process existing open projects. + */ + public void register() { + CxLogger.info(LOG_TAG + " Registering project lifecycle listener"); + ResourcesPlugin.getWorkspace().addResourceChangeListener( + this, + IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.POST_CHANGE + ); + CxLogger.info(LOG_TAG + " ✓ Registered"); + + // FIX 1: Run immediate initialization for projects ALREADY open on IDE startup + initExistingProjects(); + } + + /** + * Re-runs initialization (registry setup + initial OSS/IaC/container scan) for + * any already-open projects that were skipped earlier because the user wasn't + * authenticated yet - the exact same path {@link #register()} runs for + * already-open projects at plugin launch. onProjectOpen() only proceeds when + * isUserAuthenticated() is true and nothing else ever re-triggers it for a + * project that was already open (only a real open/close event does), so a + * login that happens after Eclipse already started needs to call this to get + * the same initial scan that a fresh launch would have performed. + */ + public void scanAlreadyOpenProjects() { + initExistingProjects(); + } + + /** + * Scans the workspace and initializes any projects that are already open. + */ + private void initExistingProjects() { + try { + IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); + for (IProject project : projects) { + if (project.isOpen() && !isInitialized(project)) { + + onProjectOpen(project); + } + } + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error initializing existing projects on startup: " + e.getMessage(), e); + } + } + + public void unregister() { + CxLogger.info(LOG_TAG + " Unregistering project lifecycle listener"); + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); + } + + /** + * Handle resource change events for project state changes (open/close). + */ + @Override + public void resourceChanged(IResourceChangeEvent event) { + try { + // Handle project close (PRE_CLOSE) + if (event.getType() == IResourceChangeEvent.PRE_CLOSE) { + IResource resource = event.getResource(); + if (resource instanceof IProject) { + onProjectClose((IProject) resource); + } + return; + } + + // FIX 2: Inspect IResourceDelta to catch when a closed project is opened manually + if (event.getType() == IResourceChangeEvent.POST_CHANGE && event.getDelta() != null) { + event.getDelta().accept(delta -> { + IResource resource = delta.getResource(); + if (resource instanceof IProject) { + IProject project = (IProject) resource; + // Check if project OPEN state changed + if ((delta.getFlags() & IResourceDelta.OPEN) != 0) { + if (project.isOpen() && !isInitialized(project)) { + onProjectOpen(project); + } else if (!project.isOpen() && isInitialized(project)) { + onProjectClose(project); + } + } + } + // Only visit top-level delta children (projects are at root level) + return true; + }); + } + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error handling resource change: " + e.getMessage(), e); + } + } + + private void onProjectOpen(IProject project) { + String projName = project.getName(); + if (projName.length() > 26) projName = projName.substring(0, 26); + try { + if (!isUserAuthenticated()) { + return; + } + + ScannerRegistry registry = new ScannerRegistry(project); + project.setSessionProperty(REGISTRY_KEY, registry); + + ProblemHolderService problemHolder = new ProblemHolderService(); + project.setSessionProperty(PROBLEM_HOLDER_KEY, problemHolder); + DevAssistScanStateHolder stateHolder = new DevAssistScanStateHolder(); + project.setSessionProperty(STATE_HOLDER_KEY, stateHolder); + initializedProjects.add(project.getName()); + + startWorkspaceFileScanning(project); + + } catch (Exception e) { + e.printStackTrace(); + CxLogger.error(LOG_TAG + " Error initializing project " + + project.getName() + ": " + e.getMessage(), e); + } + } + + private boolean isUserAuthenticated() { + String apiKey = com.checkmarx.eclipse.common.properties.SharedPreferences.getApiKey(); + return apiKey != null && !apiKey.trim().isEmpty(); + } + + private void onProjectClose(IProject project) { + CxLogger.info(LOG_TAG + " ✓ Project closing: " + project.getName()); + + try { + // Cancel any in-flight workspace scan job + try { + Job scanJob = (Job) project.getSessionProperty(WORKSPACE_SCAN_JOB_KEY); + if (scanJob != null && scanJob.getState() != Job.NONE) { + scanJob.cancel(); + CxLogger.info(LOG_TAG + " ✓ Cancelled workspace scan job for " + project.getName()); + } + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error cancelling scan job: " + e.getMessage()); + } + + try { + ScannerRegistry registry = (ScannerRegistry) project.getSessionProperty(REGISTRY_KEY); + if (registry != null) { + registry.deregisterAllScanners(); + CxLogger.info(LOG_TAG + " ✓ ScannerRegistry disposed"); + } + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error disposing ScannerRegistry: " + e.getMessage()); + } + + try { + ProblemHolderService problemHolder = (ProblemHolderService) project.getSessionProperty(PROBLEM_HOLDER_KEY); + if (problemHolder != null) { + problemHolder.clearAll(); + CxLogger.info(LOG_TAG + " ✓ Result cache cleared"); + } + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error clearing cache: " + e.getMessage()); + } + + try { + DevAssistScanStateHolder stateHolder = (DevAssistScanStateHolder) project.getSessionProperty(STATE_HOLDER_KEY); + if (stateHolder != null) { + stateHolder.clearAll(); + CxLogger.info(LOG_TAG + " ✓ State holder cleared"); + } + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error clearing state: " + e.getMessage()); + } + + initializedProjects.remove(project.getName()); + CxLogger.info(LOG_TAG + " ✓ Project cleanup completed: " + project.getName()); + + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error cleaning up project " + project.getName() + ": " + e.getMessage(), e); + } + } + + private boolean isInitialized(IProject project) { + return initializedProjects.contains(project.getName()); + } + + public String getStatistics() { + return "Initialized projects: " + initializedProjects.size(); + } + + private void startWorkspaceFileScanning(IProject project) { + Job scanJob = new Job("Checkmarx Workspace Scanner (" + project.getName() + ")") { + @Override + protected IStatus run(IProgressMonitor monitor) { + try { + monitor.beginTask("Scanning manifest, IaC, and container files...", 3); + + // Check if job was cancelled or project closed before starting + if (monitor.isCanceled() || !project.isOpen()) { + return Status.CANCEL_STATUS; + } + + scanManifestFiles(project); + monitor.worked(1); + + if (monitor.isCanceled() || !project.isOpen()) { + return Status.CANCEL_STATUS; + } + + scanIacFiles(project); + monitor.worked(1); + + if (monitor.isCanceled() || !project.isOpen()) { + return Status.CANCEL_STATUS; + } + + scanContainerFiles(project); + monitor.worked(1); + + return Status.OK_STATUS; + + } catch (Exception e) { + e.printStackTrace(); + return new Status(IStatus.ERROR, PLUGIN_ID, "Error scanning workspace files", e); + } finally { + monitor.done(); + } + } + }; + + try { + // Store job reference in session property so onProjectClose() can cancel it + project.setSessionProperty(WORKSPACE_SCAN_JOB_KEY, scanJob); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error storing workspace scan job: " + e.getMessage()); + } + + // Run as a background job so it doesn't block the IDE + scanJob.setPriority(Job.BUILD); + scanJob.schedule(); + } + + private void scanManifestFiles(IProject project) { + String[] manifestPatterns = { + "pom.xml", "package.json", "package-lock.json", "npm-shrinkwrap.json", + "go.mod", "go.sum", "requirements.txt", "Pipfile", "Pipfile.lock", "setup.py", + "Gemfile", "Gemfile.lock", "Cargo.toml", "Cargo.lock", "composer.json", "composer.lock", + "packages.config", ".csproj", "yarn.lock" + }; + findAndScanFiles(project, manifestPatterns, "OSS Manifest Files"); + } + + private void scanIacFiles(IProject project) { + String[] iacPatterns = { ".tf", ".tfvars", ".yaml", ".yml", ".hcl" }; + findAndScanFiles(project, iacPatterns, "IaC Configuration Files"); + } + + private void scanContainerFiles(IProject project) { + String[] containerPatterns = { + "Dockerfile", "dockerfile", "docker-compose.yaml", "docker-compose.yml", ".dockerignore" + }; + findAndScanFiles(project, containerPatterns, "Container Files"); + } + + private void findAndScanFiles(IProject project, String[] patterns, String fileType) { + try { + + + ScannerRegistry registry = (ScannerRegistry) project.getSessionProperty( + new QualifiedName(PLUGIN_ID, "scanner-registry")); + DevAssistScanStateHolder stateHolder = (DevAssistScanStateHolder) project.getSessionProperty( + new QualifiedName(PLUGIN_ID, "state-holder")); + ProblemHolderService problemHolder = (ProblemHolderService) project.getSessionProperty( + new QualifiedName(PLUGIN_ID, "problem-holder")); + + if (registry == null || stateHolder == null || problemHolder == null) { + return; + } + + IResource[] members = project.members(true); + for (IResource resource : members) { + if (!(resource instanceof org.eclipse.core.resources.IFile)) { + continue; + } + + IFile file = (org.eclipse.core.resources.IFile) resource; + String fileName = file.getName().toLowerCase(); + String filePath = file.getLocation().toOSString(); + + boolean matches = false; + for (String pattern : patterns) { + if (fileName.equals(pattern.toLowerCase()) || filePath.toLowerCase().endsWith(pattern.toLowerCase())) { + matches = true; + break; + } + } + if (matches) { + try { + ScanManager scanManager = new ScanManager(registry, stateHolder); + List issues = scanManager.scanFile(filePath); + if (!issues.isEmpty()) { + problemHolder.addScanIssues(filePath, issues); + ResultPublisher.publishResults(file, issues); + } + } catch (Exception e) { + System.err.println(LOG_TAG + " Error scanning " + fileName + ": " + e.getMessage()); + } + } + } + } catch (Exception e) { + System.err.println(LOG_TAG + " Error finding files for " + fileType + ": " + e.getMessage()); + } + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/result/ResultPublisher.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/result/ResultPublisher.java new file mode 100644 index 00000000..8d671d8b --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/result/ResultPublisher.java @@ -0,0 +1,294 @@ +package com.checkmarx.eclipse.devassist.backend.result; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.QualifiedName; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PlatformUI; + +import com.checkmarx.eclipse.devassist.backend.DevAssistScanStateHolder; +import com.checkmarx.eclipse.devassist.backend.ScannerRegistry; +import com.checkmarx.eclipse.devassist.inspection.DevAssistInspectionMgr; +import com.checkmarx.eclipse.devassist.problems.ProblemDecorator; +import com.checkmarx.eclipse.devassist.problems.ProblemHelper; +import com.checkmarx.eclipse.devassist.problems.ProblemHolderService; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.common.utils.CxLogger; +import java.util.List; + +/** + * Publishes scan results to Checkmarx Findings Window and editor decorations. + * + * Responsibilities: + * - Update custom Findings View with scan results + * - Render editor decorations (gutter icons, underlines) for Findings Window issues + * - NO integration with Eclipse native Problems View + * + * This connects scan results directly to the custom Findings Window. + */ +public class ResultPublisher { + + private static final String LOG_TAG = "[RESULT-PUBLISHER]"; + + /** + * Publish scan results to Findings View and editor decorations. + * + * Orchestrates the complete problem descriptor creation and publication flow: + * 1. Update Findings View cache with scan results + * 2. Create problem descriptors via DevAssistInspectionMgr + * 3. Render editor decorations (gutter icons, underlines) + * + * Mirrors JetBrains pattern where scan results are stored in cache, + * which then publishes a message to notify all interested views. + * + * @param file File that was scanned + * @param scanIssues Issues found by scanners + */ + public static void publishResults(IFile file, List scanIssues) { + if (file == null || scanIssues == null) { + return; + } + try { + // Step 1: Update Findings View (try to display immediately if view is open) + + updateFindingsView(file, scanIssues); + + + // Step 2: Create problem descriptors via DevAssistInspectionMgr + + createAndRenderDecorations(file, scanIssues); + + + } catch (Exception e) { + System.err.println(LOG_TAG + " [ERROR] " + e.getMessage()); + e.printStackTrace(); + CxLogger.error(LOG_TAG + " Error publishing results: " + e.getMessage(), e); + } + } + + /** + * Update Findings View with scan results. + * + * @param file File that was scanned + * @param scanIssues Issues to display + */ + private static void updateFindingsView(IFile file, List scanIssues) { + try { + if (scanIssues.isEmpty()) { + return; + } + + // Must run on UI thread + org.eclipse.swt.widgets.Display display = PlatformUI.getWorkbench().getDisplay(); + if (display == null || display.isDisposed()) { + return; + } + + // JetBrains Pattern: Remove old engine results, then merge new results + // This triggers the message bus pattern: + // 1. removeScanIssuesByFileAndScanner() removes old results for THIS engine + // 2. mergeScanIssues() stores new results in cache + // 3. notifyListenersOfUpdate() publishes to all listeners + // 4. CxFindingsView listener receives callback with getAllIssues() + // 5. Listener calls refreshTree(allCachedResults) + // 6. Tree shows merged results (no duplicates, no stale issues) + // FIX: Use getLocation() (absolute path) to match cache key format used in RealTimeScanJob + // ProblemHolderService cache is keyed with absolute paths from RealTimeScanJob.scanFile() + // Must use same path format for cache lookups or removal will fail - causing duplicates + String filePath = file.getLocation().toOSString(); + + org.eclipse.core.resources.IProject project = file.getProject(); + if (project != null) { + ProblemHolderService problemHolder = + (ProblemHolderService) project.getSessionProperty( + new org.eclipse.core.runtime.QualifiedName("com.checkmarx.eclipse.plugin", "problem-holder")); + + if (problemHolder != null) { + // Get engine type from scan issues (all issues from same scan have same engine) + String engineType = scanIssues.isEmpty() ? null : + scanIssues.get(0).getScanEngine() != null ? + scanIssues.get(0).getScanEngine().name() : null; + + // Step 1: Remove old results from THIS scanner engine + if (engineType != null) { + problemHolder.removeScanIssuesByFileAndScanner(engineType, filePath); + + } + + // Step 2: Add new results from THIS scanner engine + problemHolder.mergeScanIssues(filePath, scanIssues); + + } else { + + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Create problem descriptors and render editor decorations. + * + * Orchestrates: + * 1. Get registry and state holder from project session + * 2. Build ProblemHelper.Builder with file context and scan issues + * 3. Call DevAssistInspectionMgr to create problem descriptors + * 4. Render gutter icons and underlines using descriptors + * + * @param file File that was scanned + * @param scanIssues Issues to process + */ + private static void createAndRenderDecorations(IFile file, List scanIssues) { + try { + if (scanIssues.isEmpty()) { + return; + } + + org.eclipse.swt.widgets.Display display = PlatformUI.getWorkbench().getDisplay(); + if (display == null || display.isDisposed()) { + return; + } + + org.eclipse.core.resources.IProject project = file.getProject(); + if (project == null) { + CxLogger.warning(LOG_TAG + " Project not available for file: " + file.getName()); + return; + } + + display.asyncExec(() -> { + try { + // Get registry and state holder from session properties + ScannerRegistry registry = (ScannerRegistry) project.getSessionProperty( + new QualifiedName("com.checkmarx.eclipse.plugin", "scanner-registry")); + DevAssistScanStateHolder stateHolder = (DevAssistScanStateHolder) project.getSessionProperty( + new QualifiedName("com.checkmarx.eclipse.plugin", "state-holder")); + ProblemHolderService problemHolder = (ProblemHolderService) project.getSessionProperty( + new QualifiedName("com.checkmarx.eclipse.plugin", "problem-holder")); + + if (registry == null || stateHolder == null || problemHolder == null) { + CxLogger.warning(LOG_TAG + " Required services not initialized (registry=" + (registry != null) + + ", stateHolder=" + (stateHolder != null) + ", problemHolder=" + (problemHolder != null) + ")"); + // Fallback to direct decoration if services not available + ProblemDecorator.decorateEditor(file, scanIssues); + return; + } + + // Build ProblemHelper.Builder with file context and scan issues + String filePath = file.getLocation().toOSString(); + org.eclipse.jface.text.IDocument document = getDocumentForFile(file); + ProblemHelper.Builder builder = ProblemHelper.builder(file, project) + .filePath(filePath) + .document(document) + .scanIssueList(scanIssues) + .problemHolderService(problemHolder) + .problemDecorator(new ProblemDecorator()); + + // Create problem descriptors via DevAssistInspectionMgr + DevAssistInspectionMgr mgr = new DevAssistInspectionMgr(registry, stateHolder); + mgr.startScanAndCreateProblemDescriptors(builder); + + CxLogger.info(LOG_TAG + " Problem descriptors created via DevAssistInspectionMgr for " + scanIssues.size() + " issues"); + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error creating problem descriptors: " + e.getMessage()); + // Fallback to direct decoration + try { + ProblemDecorator.decorateEditor(file, scanIssues); + } catch (Exception fallbackError) { + CxLogger.error(LOG_TAG + " Fallback decoration also failed: " + fallbackError.getMessage(), fallbackError); + } + } + }); + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error: " + e.getMessage()); + } + } + + /** + * Get the IDocument for a file, preferring the live editor's document (so unsaved + * edits are reflected) and falling back to reading the file's on-disk content. + * + * ScanIssueProcessor requires a non-null document to validate that an issue's line + * number is within range (getNumberOfLines()); without it every issue is rejected. + * + * @param file File to get the document for + * @return IDocument, or null if it could not be obtained + */ + private static org.eclipse.jface.text.IDocument getDocumentForFile(IFile file) { + try { + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + if (page != null) { + org.eclipse.ui.IEditorPart editor = page.findEditor(new org.eclipse.ui.part.FileEditorInput(file)); + if (editor instanceof org.eclipse.ui.texteditor.ITextEditor) { + org.eclipse.ui.texteditor.ITextEditor textEditor = (org.eclipse.ui.texteditor.ITextEditor) editor; + org.eclipse.jface.text.IDocument doc = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); + if (doc != null) { + return doc; + } + } + } + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Could not get document from editor: " + e.getMessage()); + } + + try { + org.eclipse.jface.text.Document doc = new org.eclipse.jface.text.Document(); + doc.set(new String(file.getContents().readAllBytes())); + return doc; + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Could not create document from file: " + e.getMessage()); + return null; + } + } + + /** + * Find the open Findings View. + * + * @return CxFindingsView instance if open, null otherwise + */ + private static com.checkmarx.eclipse.devassist.ui.findings.CxFindingsView findOpenFindingsView() { + try { + IWorkbench workbench = PlatformUI.getWorkbench(); + if (workbench == null) { + return null; + } + + IWorkbenchPage page = null; + try { + page = workbench.getActiveWorkbenchWindow().getActivePage(); + } catch (NullPointerException e) { + for (var window : workbench.getWorkbenchWindows()) { + page = window.getActivePage(); + if (page != null) break; + } + } + + if (page == null) { + return null; + } + + return (com.checkmarx.eclipse.devassist.ui.findings.CxFindingsView) page + .findView(com.checkmarx.eclipse.devassist.ui.findings.CxFindingsView.ID); + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error finding Findings View: " + e.getMessage()); + return null; + } + } + + /** + * Clear results for a file. + * + * @param file File to clear + */ + public static void clearResults(IFile file) { + try { + CxLogger.info(LOG_TAG + " Clearing results for: " + file.getName()); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error clearing results: " + e.getMessage()); + } + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/BaseScannerCommand.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/BaseScannerCommand.java new file mode 100644 index 00000000..9a7c5ace --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/BaseScannerCommand.java @@ -0,0 +1,114 @@ +package com.checkmarx.eclipse.devassist.basescanner; + +import com.checkmarx.eclipse.devassist.common.ScannerConfig; +import com.checkmarx.eclipse.devassist.utils.ScanEngine; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IProject; + +/** + * BaseScannerCommand is an abstract implementation of the ScannerCommand interface + * that provides foundational functionality for registering, deregistering, and + * managing a scanner's lifecycle for a given project. This class serves as a + * base implementation for custom scanner commands. + */ +public abstract class BaseScannerCommand implements ScannerCommand { + + private static final String LOG_TAG = "[SCANNER-COMMAND]"; + public ScannerConfig config; + protected IProject project; + private boolean isRegistered = false; + + /** + * Create a scanner command with configuration. + * + * @param project Eclipse project + * @param config Scanner configuration + */ + protected BaseScannerCommand(IProject project, ScannerConfig config) { + this.project = project; + this.config = config; + } + + /** + * Registers the project for the scanner which is invoked + * + * @param project - the project for the registration + */ + @Override + public void register(IProject project) { + boolean isActive = getScannerActivationStatus(); + if (!isActive) { + return; + } + if (isScannerRegisteredAlready(project)) { + return; + } + CxLogger.info(config.getEnabledMessage() + ":" + project.getName()); + initializeScanner(); + isRegistered = true; + } + + /** + * De-registers the project for the scanner. + * This method is called in two cases: either project is closed by the user, or scanner is disabled + * + * @param project - the project that is registered + */ + @Override + public void deregister(IProject project) { + if (!isScannerRegisteredAlready(project)) { + return; + } + CxLogger.info(config.getDisabledMessage() + ":" + project.getName()); + isRegistered = false; + } + + /** + * Returns the scanner activation status of the scanner engine + */ + private boolean getScannerActivationStatus() { + return config != null && config.getEngineName() != null; + } + + /** + * Checks if the scanner is registered already for the project + * + * @param project is required + */ + private boolean isScannerRegisteredAlready(IProject project) { + return isRegistered; + } + + /** + * This method returns the ScanEngine Type + * + * @return ScanEngine + */ + protected ScanEngine getScannerType() { + return ScanEngine.valueOf(config.getEngineName().toUpperCase()); + } + + /** + * Get the configuration. + * + * @return Scanner config + */ + public ScannerConfig getConfig() { + return config; + } + + /** + * Abstract method to initialize the scanner + * This method is invoked when the scanner is registered for the project + */ + @Override + public abstract void initializeScanner(); + + /** + * Dispose the scanner. + */ + @Override + public void dispose() { + CxLogger.info(LOG_TAG + " Disposed"); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/BaseScannerService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/BaseScannerService.java new file mode 100644 index 00000000..e7f7dbd3 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/BaseScannerService.java @@ -0,0 +1,144 @@ +package com.checkmarx.eclipse.devassist.basescanner; + +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.common.ScannerConfig; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IProject; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Comparator; +import java.util.stream.Stream; + +/** + * Base implementation of {@link ScannerService} that wires respective ScannerConfig called + * from different scannerServices. + * Provides helpers for deciding when to scan files and scanners managing temporary folders. + * + * @param is type of ScanResult produced by concrete scanner Scan method implementations + */ +public abstract class BaseScannerService implements ScannerService { + + protected final IProject project; + public ScannerConfig config; + private static final String LOG_TAG = "[SCANNER-SERVICE]"; + + /** + * Creates a new scanner service with the supplied configuration. + * + * @param project Eclipse project + * @param config configuration values to be used by the scanner + */ + public BaseScannerService(IProject project, ScannerConfig config) { + this.project = project; + this.config = config; + } + + /** + * Determines whether the file at the given path should be scanned. + * Files inside /node_modules/ are skipped by default. + * + * @param filePath absolute or project-relative file path + * @return true if the file should be scanned; false otherwise + */ + @Override + public boolean shouldScanFile(String filePath) { + if (filePath == null || filePath.isEmpty()) { + return false; + } + + // Common exclusions + if (filePath.contains("/node_modules/") || filePath.contains("\\node_modules\\")) { + return false; + } + + return isFileTypeSupported(filePath); + } + + /** + * Subclasses implement scanner-specific file type checking. + * + * @param filePath File path + * @return true if scanner supports this file + */ + protected abstract boolean isFileTypeSupported(String filePath); + + /** + * Perform scan - subclasses must implement this. + * + * @param filePath File to scan + * @return ScanResult of type T or null + */ + @Override + public abstract ScanResult scan(String filePath); + + /** + * Get the configuration. + * + * @return Scanner config + */ + @Override + public ScannerConfig getConfig() { + return config; + } + + /** + * Builds the path to a temporary sub-folder within the system temp directory. + * + * @param baseDir name of the sub-folder to create under java.io.tmpdir + * @return absolute path string for the temporary sub-folder + */ + protected String getTempSubFolderPath(String baseDir) { + String tempOS = System.getProperty("java.io.tmpdir"); + Path tempDir = Paths.get(tempOS, baseDir); + return tempDir.toString(); + } + + /** + * Ensures that the specified temporary folder exists, creating any missing directories. + * + * @param folderPath target temporary folder path + */ + protected void createTempFolder(Path folderPath) { + try { + Files.createDirectories(folderPath); + } catch (IOException e) { + CxLogger.warning("Failed to create temporary folder:" + folderPath); + } + } + + /** + * Recursively deletes the provided temporary folder and files in it, if it has been created. + * + * @param tempFolder root path of the temporary folder to remove + */ + protected void deleteTempFolder(Path tempFolder) { + if (Files.notExists(tempFolder)) { + return; + } + try (Stream walk = Files.walk(tempFolder)) { + walk.sorted(Comparator.reverseOrder()) + .forEach(path -> { + try { + Files.deleteIfExists(path); + } catch (Exception e) { + CxLogger.warning("Failed to delete file in temp folder:" + path); + } + }); + } catch (IOException e) { + CxLogger.warning("Failed to delete temporary folder:" + tempFolder); + } + } + + /** + * Close the scanner and release resources. + * + * @throws Exception if close fails + */ + @Override + public void close() throws Exception { + CxLogger.info(LOG_TAG + " Closed for project: " + project.getName()); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/ScannerCommand.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/ScannerCommand.java new file mode 100644 index 00000000..27057f33 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/ScannerCommand.java @@ -0,0 +1,34 @@ +package com.checkmarx.eclipse.devassist.basescanner; + +import org.eclipse.core.resources.IProject; + +/** + * Interface for scanner command implementations. + * Manages scanner lifecycle including registration and deregistration. + */ +public interface ScannerCommand { + + /** + * Register the scanner for a project. + * + * @param project Eclipse project + */ + void register(IProject project); + + /** + * Deregister the scanner for a project. + * + * @param project Eclipse project + */ + void deregister(IProject project); + + /** + * Initialize the scanner. + */ + void initializeScanner(); + + /** + * Dispose the scanner. + */ + void dispose(); +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/ScannerService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/ScannerService.java new file mode 100644 index 00000000..c1121b7f --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/basescanner/ScannerService.java @@ -0,0 +1,43 @@ +package com.checkmarx.eclipse.devassist.basescanner; + +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.common.ScannerConfig; + +/** + * Generic interface for scanner services. + * Each scanner produces a specific result type T. + * + * @param The result type produced by this scanner + */ +public interface ScannerService { + + /** + * Check if this scanner should scan the file. + * + * @param filePath File path + * @return true if file should be scanned + */ + boolean shouldScanFile(String filePath); + + /** + * Perform a scan on the file and return result. + * + * @param filePath File path + * @return ScanResult of type T or null + */ + ScanResult scan(String filePath); + + /** + * Get the scanner configuration. + * + * @return Scanner config + */ + ScannerConfig getConfig(); + + /** + * Close scanner and release resources. + * + * @throws Exception if close fails + */ + void close() throws Exception; +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScanManager.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScanManager.java new file mode 100644 index 00000000..ff9fe3f6 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScanManager.java @@ -0,0 +1,185 @@ +package com.checkmarx.eclipse.devassist.common; + +import java.util.ArrayList; +import java.util.List; + +import com.checkmarx.eclipse.devassist.backend.DevAssistScanStateHolder; +import com.checkmarx.eclipse.devassist.backend.ScannerRegistry; +import com.checkmarx.eclipse.devassist.backend.ScannerRegistry.ScannerType; +import com.checkmarx.eclipse.devassist.basescanner.ScannerService; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Orchestrates the scanning process for a file. + * + * Responsibilities: - Use ScannerFactory to select appropriate scanners for a + * file - Check if file has changed since last scan (skip redundant scans) - + * Execute all applicable scanners in sequence - Merge results from multiple + * scanners - Update file state timestamp to prevent re-scanning + * + * This is the main entry point for initiating scans. Called from + * FileEditorListener when a file is modified. + * + * NOTE: Uses backend.DevAssistScanStateHolder (not inspection.version) to maintain compatibility + * with existing code that passes backend version to super(). + */ +public class ScanManager { + + private static final String LOG_TAG = "[SCAN-MANAGER]"; + + private final ScannerFactory factory; + private final com.checkmarx.eclipse.devassist.backend.DevAssistScanStateHolder stateHolder; + + /** + * Create a scan manager for a project. + * + * @param registry Project's scanner registry + * @param stateHolder State holder for tracking file modification + */ + public ScanManager(ScannerRegistry registry, DevAssistScanStateHolder stateHolder) { + this.factory = new ScannerFactory(registry); + this.stateHolder = stateHolder; + } + + /** + * Scan a file using all applicable scanners. + * + * High-level flow: 1. Compute current file state hash 2. Check if file changed + * since last scan 3. If unchanged, return cached results 4. Get all scanners + * that support this file 5. Execute each scanner sequentially 6. Merge results + * from all scanners 7. Update state hash to mark as scanned 8. Return merged + * results + * + * @param filePath Absolute file path to scan + * @return List of issues found by all scanners + * @throws Exception if scan fails + */ + public List scanFile(String filePath) throws Exception { + if (filePath == null || filePath.isEmpty()) { + + return List.of(); + } + + + + + + + // 1. Compute current file state hash + + long currentStateHash = DevAssistScanStateHolder.computeFileStateHash(filePath); + + + // 2. Check if file changed since last scan + // NOTE: hasChanged() atomically marks the file as "in-flight" when it returns true. + // We MUST call stateHolder.markScanComplete(filePath) once we're done (success or + // failure) or every subsequent edit will be permanently BLOCKED as "already in-flight". + if (!stateHolder.hasChanged(filePath, currentStateHash)) { + + return List.of(); + } + + try { + // 3. Get all scanners that support this file + + List> applicableScanners = factory.getAllSupportedScanners(filePath); + + + for (ScannerService scanner : applicableScanners) { + String displayName = scanner.getConfig() != null ? scanner.getConfig().getEngineName() : "Unknown"; + + } + + if (applicableScanners.isEmpty()) { + + // Still update state to avoid re-checking unsupported files + stateHolder.updateStateHash(filePath, currentStateHash); + return List.of(); + } + + // 4. Execute all scanners and merge results + + List allIssues = new ArrayList<>(); + int scannerIndex = 1; + int successfulScanners = 0; + + for (ScannerService scanner : applicableScanners) { + String displayName = scanner.getConfig() != null ? scanner.getConfig().getEngineName() : "Unknown"; + try { + var scanResult = scanner.scan(filePath); + List scannerResults = scanResult != null ? scanResult.getIssues() : null; + + if (scannerResults != null) { + for (ScanIssue issue : scannerResults) { + } + allIssues.addAll(scannerResults); + } + successfulScanners++; + + } catch (Exception e) { + e.printStackTrace(); + } + scannerIndex++; + } + + // 5. Update state hash only if at least one scanner succeeded + // If all scanners failed, don't update hash so file will be re-scanned on next change + if (successfulScanners > 0) { + stateHolder.updateStateHash(filePath, currentStateHash); + } + + return allIssues; + } finally { + // Always release the in-flight marker so the next edit can trigger a scan. + stateHolder.markScanComplete(filePath); + } + } + + /** + * Scan a file using a specific scanner type. + * + * Used when you want to force a scan with a particular scanner, regardless of + * file type. + * + * @param filePath File to scan + * @param scannerType Specific scanner to use + * @return Issues from that scanner, or empty list if scanner doesn't support + * file + * @throws Exception if scan fails + */ + public List scanFileWithScanner(String filePath, ScannerType scannerType) throws Exception { + + if (filePath == null || scannerType == null) { + return List.of(); + } + + CxLogger.info(LOG_TAG + " Starting " + scannerType.getDisplayName() + " scan: " + filePath); + + ScannerService scanner = factory.getScannerForFile(filePath, scannerType); + if (scanner == null) { + CxLogger.warning(LOG_TAG + " Scanner does not support file: " + filePath); + return List.of(); + } + + try { + var scanResult = scanner.scan(filePath); + List results = scanResult != null ? scanResult.getIssues() : List.of(); + CxLogger.info(LOG_TAG + " Found " + results.size() + " issues"); + return results; + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Scan failed: " + e.getMessage(), e); + throw e; + } + } + + /** + * Get factory statistics. + * + * @return Summary string + */ + public String getStatistics() { + return factory.getStatistics(); + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScanResult.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScanResult.java new file mode 100644 index 00000000..1b7f240f --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScanResult.java @@ -0,0 +1,32 @@ +package com.checkmarx.eclipse.devassist.common; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import java.util.List; + +/** + * Interface for a scan result wrapper. + * + * Adaptor classes implement this interface to wrap raw scanner results + * and provide conversion to standardized ScanIssue objects. + * + * @param Type of raw scanner result (e.g., OssRealtimeResults, SecretsRealtimeResults) + */ +public interface ScanResult { + + /** + * Get the raw scan results from the scanner. + * + * @return Raw scanner results of type T + */ + T getResults(); + + /** + * Get the standardized list of scan issues from the raw results. + * + * This converts the scanner-specific result format into a uniform + * list of ScanIssue objects that can be displayed in the UI. + * + * @return List of ScanIssue objects + */ + List getIssues(); +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScannerConfig.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScannerConfig.java new file mode 100644 index 00000000..11a88458 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScannerConfig.java @@ -0,0 +1,95 @@ +package com.checkmarx.eclipse.devassist.common; + +/** + * Configuration object for scanner engines. + * Defines settings and messages for each scanner type. + */ +public class ScannerConfig { + + private final String engineName; + private final String configSection; + private final String activateKey; + private final String enabledMessage; + private final String disabledMessage; + private final String errorMessage; + + private ScannerConfig(Builder builder) { + this.engineName = builder.engineName; + this.configSection = builder.configSection; + this.activateKey = builder.activateKey; + this.enabledMessage = builder.enabledMessage; + this.disabledMessage = builder.disabledMessage; + this.errorMessage = builder.errorMessage; + } + + public static Builder builder() { + return new Builder(); + } + + public String getEngineName() { + return engineName; + } + + public String getConfigSection() { + return configSection; + } + + public String getActivateKey() { + return activateKey; + } + + public String getEnabledMessage() { + return enabledMessage; + } + + public String getDisabledMessage() { + return disabledMessage; + } + + public String getErrorMessage() { + return errorMessage; + } + + public static class Builder { + private String engineName; + private String configSection; + private String activateKey; + private String enabledMessage; + private String disabledMessage; + private String errorMessage; + + public Builder engineName(String engineName) { + this.engineName = engineName; + return this; + } + + public Builder configSection(String configSection) { + this.configSection = configSection; + return this; + } + + public Builder activateKey(String activateKey) { + this.activateKey = activateKey; + return this; + } + + public Builder enabledMessage(String enabledMessage) { + this.enabledMessage = enabledMessage; + return this; + } + + public Builder disabledMessage(String disabledMessage) { + this.disabledMessage = disabledMessage; + return this; + } + + public Builder errorMessage(String errorMessage) { + this.errorMessage = errorMessage; + return this; + } + + public ScannerConfig build() { + return new ScannerConfig(this); + } + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScannerFactory.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScannerFactory.java new file mode 100644 index 00000000..a7a293d4 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/common/ScannerFactory.java @@ -0,0 +1,188 @@ +package com.checkmarx.eclipse.devassist.common; + +import java.util.ArrayList; +import java.util.List; + +import com.checkmarx.eclipse.devassist.backend.GlobalScannerController; +import com.checkmarx.eclipse.devassist.backend.ScannerRegistry; +import com.checkmarx.eclipse.devassist.backend.ScannerRegistry.ScannerType; +import com.checkmarx.eclipse.devassist.basescanner.ScannerService; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Factory for selecting appropriate scanners by file type. + * + * Responsibilities: + * - Query all available scanners + * - Filter by file type compatibility + * - Filter by global enabled state + * - Return ordered list of applicable scanners + * + * Mirrors the JetBrains ScannerFactory pattern. + */ +public class ScannerFactory { + + private static final String LOG_TAG = "[SCANNER-FACTORY]"; + + private final ScannerRegistry registry; + private final GlobalScannerController controller; + + /** + * Create a scanner factory for a project. + * + * @param registry Project's scanner registry + */ + public ScannerFactory(ScannerRegistry registry) { + this.registry = registry; + this.controller = GlobalScannerController.getInstance(); + } + + /** + * Get all enabled scanners that support a file. + * + * Queries all scanner types, filters by: + * 1. Global enabled state (GlobalScannerController) + * 2. File type support (ScannerService.shouldScanFile()) + * + * @param filePath File to scan + * @return List of applicable scanners (empty if none match) + */ + public List> getAllSupportedScanners(String filePath) { + List> supported = new ArrayList<>(); + + CxLogger.info(LOG_TAG + " Finding scanners for: " + filePath); + + // Check each scanner type + for (ScannerType type : ScannerType.values()) { + // Check if globally enabled + if (!controller.isScannerEnabled(type)) { + CxLogger.info(LOG_TAG + " ⊘ " + type.getDisplayName() + " disabled globally"); + continue; + } + + // Get scanner from registry + ScannerService scanner = getScannerService(type); + if (scanner == null) { + CxLogger.warning(LOG_TAG + " Scanner not initialized: " + type); + continue; + } + + // Check if supports this file type + if (scanner.shouldScanFile(filePath)) { + supported.add(scanner); + CxLogger.info(LOG_TAG + " ✓ " + type.getDisplayName() + " supports file"); + } else { + CxLogger.info(LOG_TAG + " ⊘ " + type.getDisplayName() + " does not support file"); + } + } + + if (supported.isEmpty()) { + CxLogger.info(LOG_TAG + " No scanners support this file"); + } else { + CxLogger.info(LOG_TAG + " ✓ Found " + supported.size() + " supporting scanner(s)"); + } + + return supported; + } + + /** + * Get a specific scanner by type if it supports the file. + * + * @param filePath File to scan + * @param type Scanner type to retrieve + * @return Scanner if enabled and supports file, null otherwise + */ + public ScannerService getScannerForFile(String filePath, ScannerType type) { + if (filePath == null || type == null) { + return null; + } + + // Check if globally enabled + if (!controller.isScannerEnabled(type)) { + CxLogger.info(LOG_TAG + " " + type.getDisplayName() + " is disabled globally"); + return null; + } + + // Get scanner from registry + ScannerService scanner = getScannerService(type); + if (scanner == null) { + CxLogger.warning(LOG_TAG + " Scanner not initialized: " + type); + return null; + } + + // Check if supports file type + if (!scanner.shouldScanFile(filePath)) { + CxLogger.info(LOG_TAG + " " + type.getDisplayName() + " does not support file: " + + filePath); + return null; + } + + return scanner; + } + + /** + * Get a scanner service by type. + * Retrieves from the registry which manages scanner lifecycle. + * + * @param type Scanner type + * @return Scanner instance, or null if not available + */ + private ScannerService getScannerService(ScannerType type) { + try { + Object scanner = registry.getScannerService(type); + return scanner instanceof ScannerService ? (ScannerService) scanner : null; + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error getting scanner for type " + type + ": " + e.getMessage()); + return null; + } + } + + /** + * Get scanner by file name pattern (useful for quick lookups). + * Returns the primary scanner for a file type. + * + * @param filePath File path + * @return Primary scanner type for this file, or null + */ + public ScannerType getPrimaryScannerType(String filePath) { + if (filePath == null) { + return null; + } + + String lowerPath = filePath.toLowerCase(); + + // Manifest files → OSS + if (lowerPath.matches(".*\\.(package\\.json|pom\\.xml|go\\.mod|requirements\\.txt|" + + "Gemfile|Cargo\\.toml|Pipfile)$")) { + return ScannerType.OSS; + } + + // Source code files → ASCA + if (lowerPath.matches(".*\\.(java|py|js|ts|cpp|cs|go|php|rb|swift)$")) { + return ScannerType.ASCA; + } + + // Infrastructure files → IAC + if (lowerPath.matches(".*\\.(tf|yaml|yml|json|hcl)$")) { + return ScannerType.IAC; + } + + // Container files → CONTAINERS + if (lowerPath.matches(".*(Dockerfile|docker-compose\\.ya?ml)")) { + return ScannerType.CONTAINERS; + } + + // Everything else can be scanned for secrets + return ScannerType.SECRETS; + } + + /** + * Get factory statistics. + * + * @return Summary string + */ + public String getStatistics() { + int enabledCount = controller.getEnabledScannerCount(); + return "Scanners enabled: " + enabledCount + "/" + ScannerType.values().length; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/factory/CxWrapperFactory.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/factory/CxWrapperFactory.java new file mode 100644 index 00000000..9ea8c324 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/factory/CxWrapperFactory.java @@ -0,0 +1,49 @@ +package com.checkmarx.eclipse.devassist.factory; + +import com.checkmarx.ast.wrapper.CxConfig; +import com.checkmarx.ast.wrapper.CxException; +import com.checkmarx.ast.wrapper.CxWrapper; +import com.checkmarx.eclipse.common.properties.SharedPreferences; +import com.checkmarx.eclipse.common.utils.CxLogger; +import com.checkmarx.eclipse.devassist.backend.Constants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +/** + * Builds wrapper objects according to the current configuration. + */ +public class CxWrapperFactory { + + public static CxWrapper build() throws CxException, Exception { + return getWrapper(); + } + + /** + * Create a CxWrapper with current credentials and configuration + * + * @return initialized CxWrapper instance + * @throws Exception if wrapper instantiation fails + */ + private static CxWrapper getWrapper() throws Exception { + CxWrapper cxWrapper = null; + + Logger log = LoggerFactory.getLogger(CxWrapperFactory.class.getName()); + + CxConfig.CxConfigBuilder builder = CxConfig.builder() + .apiKey(SharedPreferences.getApiKey()) + .additionalParameters(SharedPreferences.getAdditionalOptions()); + + CxConfig config = builder.build(); + + try { + cxWrapper = new CxWrapper(config, log); + } catch (IOException e) { + CxLogger.error(String.format(Constants.ERROR_BUILDING_CX_WRAPPER, e.getMessage()), e); + throw new Exception(e); + } + + return cxWrapper; + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistInspection.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistInspection.java new file mode 100644 index 00000000..8dbd41d1 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistInspection.java @@ -0,0 +1,45 @@ +package com.checkmarx.eclipse.devassist.inspection; + +/** + * Inspection metadata and registry class. + * + * In JetBrains: extends LocalInspectionTool with checkFile() implementation. + * In Eclipse: serves as metadata holder for inspection framework integration. + * + * Provides inspection ID, name, and grouping constants for registration. + * Can be extended with inspection framework hooks in future. + */ +public class DevAssistInspection { + + // Inspection identity constants + private static final String INSPECTION_ID = "com.checkmarx.eclipse.devassist.inspection"; + private static final String INSPECTION_NAME = "Checkmarx Developer Assist"; + private static final String INSPECTION_GROUP = "Checkmarx"; + + /** + * Get the unique identifier for this inspection. + * + * @return Inspection ID for registration and lookup + */ + public String getInspectionId() { + return INSPECTION_ID; + } + + /** + * Get the human-readable name for this inspection. + * + * @return Inspection name for display in UI + */ + public String getInspectionName() { + return INSPECTION_NAME; + } + + /** + * Get the inspection group/category. + * + * @return Inspection group for organization in preferences + */ + public String getInspectionGroup() { + return INSPECTION_GROUP; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistInspectionMgr.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistInspectionMgr.java new file mode 100644 index 00000000..2d9feb94 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistInspectionMgr.java @@ -0,0 +1,334 @@ +package com.checkmarx.eclipse.devassist.inspection; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.IDocument; + +import com.checkmarx.eclipse.devassist.basescanner.ScannerService; +import com.checkmarx.eclipse.devassist.common.ScanManager; +import com.checkmarx.eclipse.devassist.backend.ScannerRegistry; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.problems.ProblemBuilder; +import com.checkmarx.eclipse.devassist.problems.ProblemDecorator; +import com.checkmarx.eclipse.devassist.problems.ProblemDescriptor; +import com.checkmarx.eclipse.devassist.problems.ProblemHelper; +import com.checkmarx.eclipse.devassist.problems.ProblemHolderService; +import com.checkmarx.eclipse.devassist.problems.ScanIssueProcessor; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Main orchestrator for inspection workflow. + * + * Coordinates the complete flow: + * 1. Scan files using ScanManager (inherited) + * 2. Create problem descriptors from scan issues + * 3. Validate issues (ScanIssueProcessor) + * 4. Cache problems (ProblemHolderService) + * 5. Decorate editor (ProblemDecorator) + * 6. Manage cleanup and state reset + * + * Extends ScanManager to inherit scanning capabilities. + * Mirrors JetBrains DevAssistInspectionMgr. + */ +public class DevAssistInspectionMgr extends ScanManager { + + private static final String LOG_TAG = "[INSPECTION-MGR]"; + + private final ProblemDecorator problemDecorator = new ProblemDecorator(); + + /** + * Constructor accepting scanner registry and state holder. + * + * @param registry Scanner registry for the project + * @param stateHolder State holder for tracking file modifications + */ + public DevAssistInspectionMgr( + ScannerRegistry registry, + com.checkmarx.eclipse.devassist.backend.DevAssistScanStateHolder stateHolder) { + super(registry, stateHolder); + } + + /** + * Scan a file and create problem descriptors. + * + * Complete orchestration: + * 1. Build problem helper + * 2. Scan file → get ScanIssue list (if not already provided) + * 3. Cache scan issues + * 4. Create ScanIssueProcessor for validation + * 5. For each issue: validate and create ProblemDescriptor + * 6. Cache problem descriptors + * 7. Return array of problem descriptors + * + * @param problemHelperBuilder Builder with pre-configured context + * @return Array of problem descriptors (empty if none) + */ + public ProblemDescriptor[] startScanAndCreateProblemDescriptors( + ProblemHelper.Builder problemHelperBuilder) { + + ProblemHelper problemHelper = problemHelperBuilder.build(); + + CxLogger.info(LOG_TAG + " Starting scan for file: " + problemHelper.getFile().getName()); + + try { + // Use pre-scanned issues if available, otherwise scan file + List allScanIssues = problemHelper.getScanIssueList(); + if (allScanIssues == null || allScanIssues.isEmpty()) { + allScanIssues = scanFile(problemHelper.getFilePath()); + CxLogger.info(LOG_TAG + " Performed fresh scan for file: " + problemHelper.getFile().getName()); + } else { + CxLogger.info(LOG_TAG + " Using pre-scanned issues for file: " + problemHelper.getFile().getName()); + } + + if (allScanIssues.isEmpty()) { + CxLogger.info(LOG_TAG + " No scan issues found for: " + + problemHelper.getFile().getName()); + decorateUIForIgnoreVulnerability(problemHelper.getFile(), allScanIssues); + return new ProblemDescriptor[0]; + } + + // Ensure helper has the issues (in case they were pre-populated) + problemHelperBuilder.scanIssueList(allScanIssues); + ProblemHelper helperWithIssues = problemHelperBuilder.build(); + + // Cache issues + helperWithIssues.getProblemHolderService().addScanIssues( + problemHelper.getFilePath(), allScanIssues); + + // Create problems with decoration + List allProblems = createProblemDescriptorsWithDecoration(helperWithIssues); + + if (allProblems.isEmpty()) { + CxLogger.info(LOG_TAG + " No problem descriptors created for: " + + problemHelper.getFile().getName()); + return new ProblemDescriptor[0]; + } + + // Cache problem descriptors + helperWithIssues.getProblemHolderService().addProblemDescriptors( + problemHelper.getFilePath(), allProblems); + + CxLogger.info(LOG_TAG + " Created " + allProblems.size() + + " problem descriptors for: " + problemHelper.getFile().getName()); + + return allProblems.toArray(new ProblemDescriptor[0]); + + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error during scan: " + e.getMessage(), e); + return new ProblemDescriptor[0]; + } + } + + /** + * Create problem descriptors with UI decoration. + * + * Removes existing annotations, validates issues, creates descriptors, + * and decorates the editor with visual feedback. + * + * @param problemHelper Helper with scan issues + * @return List of created problem descriptors + */ + private List createProblemDescriptorsWithDecoration( + ProblemHelper problemHelper) { + + if (isScanIssuePresent(problemHelper.getScanIssueList())) { + // Clear existing decorations + ProblemDecorator.removeAllHighlighters(problemHelper.getProject()); + + // Process issues with decoration enabled + List descriptors = createProblemDescriptors( + problemHelper, true); + + // Decorate UI + if (!descriptors.isEmpty()) { + decorateUI(problemHelper.getDocument(), problemHelper.getFile(), + problemHelper.getScanIssueList()); + } + + return descriptors; + } + return Collections.emptyList(); + } + + /** + * Create problem descriptors without UI decoration. + * + * @param problemHelper Helper with scan issues + * @return List of created problem descriptors + */ + public List createProblemDescriptorsWithoutDecoration( + ProblemHelper problemHelper) { + + if (isScanIssuePresent(problemHelper.getScanIssueList())) { + return createProblemDescriptors(problemHelper, false); + } + return Collections.emptyList(); + } + + /** + * Create problem descriptors from scan issues. + * + * For each scan issue: + * 1. Create ScanIssueProcessor + * 2. Validate and create ProblemDescriptor + * 3. Collect non-null descriptors + * + * @param problemHelper Helper with context and issues + * @param isDecoratorEnabled Whether to enable visual decoration + * @return List of valid problem descriptors + */ + private List createProblemDescriptors( + ProblemHelper problemHelper, + boolean isDecoratorEnabled) { + + List descriptors = new ArrayList<>(); + ScanIssueProcessor processor = new ScanIssueProcessor(problemHelper); + + for (ScanIssue scanIssue : problemHelper.getScanIssueList()) { + ProblemDescriptor descriptor = processor.processScanIssue( + scanIssue, isDecoratorEnabled); + if (descriptor != null) { + descriptors.add(descriptor); + } + } + + CxLogger.info(LOG_TAG + " Created " + descriptors.size() + + " problem descriptors from " + problemHelper.getScanIssueList().size() + + " scan issues"); + + return descriptors; + } + + /** + * Get existing problem descriptors for a file. + * + * Called when file hasn't changed since last scan. + * Returns cached problem descriptors. + * + * @param problemHolderService Cache service + * @param filePath File path + * @param document Document (for validation) + * @param file IFile + * @param supportedEnabledScanners Enabled scanners + * @return Array of cached problem descriptors + */ + public ProblemDescriptor[] getExistingProblems( + ProblemHolderService problemHolderService, + String filePath, + IDocument document, + IFile file, + List supportedEnabledScanners) { + + ProblemHelper problemHelper = ProblemHelper.builder(file, file.getProject()) + .filePath(filePath) + .document(document) + .supportedScanners(supportedEnabledScanners) + .problemHolderService(problemHolderService) + .problemDecorator(this.problemDecorator) + .build(); + + // Get cached issues + List scanIssueList = problemHolderService.getScanIssuesByFile(filePath); + if (scanIssueList.isEmpty()) { + CxLogger.warning(LOG_TAG + " No cached issues for: " + filePath); + resetEditorAndResults(file.getProject(), filePath); + decorateUIForIgnoreVulnerability(file, scanIssueList); + return new ProblemDescriptor[0]; + } + + // Get cached problem descriptors + List cachedDescriptors = problemHolderService.getProblemDescriptors(filePath); + if (cachedDescriptors.isEmpty()) { + CxLogger.warning(LOG_TAG + " No cached problem descriptors for: " + filePath); + decorateUIForIgnoreVulnerability(file, scanIssueList); + return new ProblemDescriptor[0]; + } + + // Decorate UI with cached issues + decorateUI(document, file, scanIssueList); + + CxLogger.info(LOG_TAG + " Returning " + cachedDescriptors.size() + + " cached problem descriptors for: " + file.getName()); + + return cachedDescriptors.toArray(new ProblemDescriptor[0]); + } + + /** + * Decorate UI with scan results (gutter icons, underlines). + * + * @param document Document to decorate + * @param file File being decorated + * @param scanIssueList Issues to show + */ + public void decorateUI(IDocument document, IFile file, List scanIssueList) { + try { + ProblemDecorator.decorateEditor(file, scanIssueList); + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error decorating UI: " + e.getMessage(), e); + } + } + + /** + * Decorate UI for ignored vulnerabilities (empty if none ignored). + * + * @param file File to decorate + * @param scanIssueList Issues (may be empty) + */ + public void decorateUIForIgnoreVulnerability(IFile file, List scanIssueList) { + try { + CxLogger.info(LOG_TAG + " decorateUIForIgnoreVulnerability called for: " + file.getName()); + // TODO: Integrate with IgnoredProblemsStore when available + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error in decorateUIForIgnoreVulnerability: " + e.getMessage(), e); + } + } + + /** + * Reset editor and clear all cached results for a file. + * + * Called when: + * - File is closed + * - Scan encounters error + * - User requests reset + * + * @param project Project containing file + * @param filePath File path to reset + */ + public void resetEditorAndResults(IProject project, String filePath) { + try { + if (project == null || !project.isOpen()) { + return; + } + + // Clear visual decorations + ProblemDecorator.removeAllHighlighters(project); + + // Clear cached data + ProblemHolderService problemHolderService = ProblemHolderService.getInstance(project); + if (problemHolderService != null && filePath != null && !filePath.isEmpty()) { + problemHolderService.removeProblemDescriptorsForFile(filePath); + problemHolderService.removeScanIssues(filePath); + } + + CxLogger.info(LOG_TAG + " Reset editor and results for: " + filePath); + + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error resetting: " + e.getMessage(), e); + } + } + + /** + * Check if scan issues are present. + * + * @param scanIssueList List to check + * @return true if not null and not empty + */ + private boolean isScanIssuePresent(List scanIssueList) { + return scanIssueList != null && !scanIssueList.isEmpty(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistScanScheduler.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistScanScheduler.java new file mode 100644 index 00000000..01584aed --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/inspection/DevAssistScanScheduler.java @@ -0,0 +1,188 @@ +package com.checkmarx.eclipse.devassist.inspection; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; + +import com.checkmarx.eclipse.devassist.problems.ProblemHelper; +import com.checkmarx.eclipse.devassist.ui.findings.realtime.RealTimeScanJob; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Scheduler that wraps and coordinates RealTimeScanJob for background file scanning. + * + * Responsibilities: + * - Manage scheduling of real-time scans with debounce + * - Track pending scans per file + * - Cancel pending scans when needed + * - Provide clean API for scan orchestration + * + * Wraps Eclipse RealTimeScanJob which extends Job for background execution. + */ +public class DevAssistScanScheduler { + + private static final String LOG_TAG = "[SCAN-SCHEDULER]"; + private static final long DEFAULT_DEBOUNCE_DELAY_MS = 1000L; + + // Track pending jobs per file path + private final Map pendingScans = new ConcurrentHashMap<>(); + + /** + * Schedule a scan for a file with default debounce delay (1 second). + * + * If a scan is already pending for this file, returns false. + * Use reschedule() to cancel and restart with new delay. + * + * @param file File to scan + * @param problemHelper Problem context (unused in current impl, for alignment) + * @return true if scheduled, false if already pending + */ + public boolean scheduleInspection(IFile file, ProblemHelper problemHelper) { + return scheduleInspection(file, DEFAULT_DEBOUNCE_DELAY_MS); + } + + /** + * Schedule a scan for a file with custom debounce delay. + * + * @param file File to scan + * @param delayMs Debounce delay in milliseconds + * @return true if scheduled, false if already pending + */ + public boolean scheduleInspection(IFile file, long delayMs) { + if (file == null) { + return false; + } + + String filePath = file.getLocation().toOSString(); + + // Check if already pending + if (pendingScans.containsKey(filePath)) { + CxLogger.info(LOG_TAG + " Scan already pending for: " + filePath); + return false; + } + + try { + // Create new job + RealTimeScanJob scanJob = new RealTimeScanJob(file, file.getName()); + + // Track it + pendingScans.put(filePath, scanJob); + + // Schedule with debounce delay + scanJob.schedule(delayMs); + + CxLogger.info(LOG_TAG + " Scheduled scan for: " + filePath + + " (delay=" + delayMs + "ms)"); + return true; + + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Failed to schedule scan: " + e.getMessage(), e); + pendingScans.remove(filePath); + return false; + } + } + + /** + * Reschedule a pending scan (cancel current, start new with delay). + * + * Used by CheckmarxDocumentListener when user types: + * - First keystroke: schedule with 1s delay + * - While typing: reschedule (cancel, start new 1s timer) + * - After user pauses: job runs + * + * @param file File to reschedule + * @param delayMs New debounce delay + * @return true if rescheduled, false if no pending job + */ + public boolean rescheduleInspection(IFile file, long delayMs) { + if (file == null) { + return false; + } + + String filePath = file.getLocation().toOSString(); + RealTimeScanJob existingJob = pendingScans.get(filePath); + + if (existingJob == null) { + // No pending job, schedule new one + return scheduleInspection(file, delayMs); + } + + try { + // Cancel current + existingJob.cancel(); + + // Reschedule with new delay + existingJob.reschedule(delayMs); + + CxLogger.info(LOG_TAG + " Rescheduled scan for: " + filePath + + " (delay=" + delayMs + "ms)"); + return true; + + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Failed to reschedule: " + e.getMessage(), e); + return false; + } + } + + /** + * Cancel a pending scan for a file. + * + * @param file File to cancel scan for + * @return true if cancelled, false if no pending scan + */ + public boolean cancelScheduledInspection(IFile file) { + if (file == null) { + return false; + } + + String filePath = file.getLocation().toOSString(); + RealTimeScanJob job = pendingScans.remove(filePath); + + if (job == null) { + return false; + } + + try { + job.cancel(); + CxLogger.info(LOG_TAG + " Cancelled scan for: " + filePath); + return true; + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error cancelling scan: " + e.getMessage(), e); + return false; + } + } + + /** + * Trigger inspection on the entire project (force re-inspection). + * + * @param project Project to inspect + */ + public void triggerInspection(IProject project) { + if (project == null) { + return; + } + CxLogger.info(LOG_TAG + " Triggering inspection for project: " + project.getName()); + // Future: force re-inspect all files in project + } + + /** + * Get number of pending scans. + * + * @return Count of scheduled but not yet running scans + */ + public int getPendingScansCount() { + return pendingScans.size(); + } + + /** + * Get statistics for debugging. + * + * @return Summary string + */ + public String getStatistics() { + return "Pending scans: " + pendingScans.size() + + ", Tracked files: " + pendingScans.keySet(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/model/Location.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/model/Location.java new file mode 100644 index 00000000..7e010a9d --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/model/Location.java @@ -0,0 +1,61 @@ +package com.checkmarx.eclipse.devassist.model; + +/** + * Represents a specific location within a file where a scan issue is detected. + * Contains line number and character range information. + */ +public class Location { + + private int line; + private int startIndex; + private int endIndex; + private boolean isAbsoluteOffset = false; + + public Location() { + } + + public Location(int line, int startIndex, int endIndex) { + this.line = line; + this.startIndex = startIndex; + this.endIndex = endIndex; + } + + public Location(int line, int startIndex, int endIndex, boolean isAbsoluteOffset) { + this.line = line; + this.startIndex = startIndex; + this.endIndex = endIndex; + this.isAbsoluteOffset = isAbsoluteOffset; + } + + public int getLine() { + return line; + } + + public void setLine(int line) { + this.line = line; + } + + public int getStartIndex() { + return startIndex; + } + + public void setStartIndex(int startIndex) { + this.startIndex = startIndex; + } + + public int getEndIndex() { + return endIndex; + } + + public void setEndIndex(int endIndex) { + this.endIndex = endIndex; + } + + public boolean isAbsoluteOffset() { + return isAbsoluteOffset; + } + + public void setAbsoluteOffset(boolean absoluteOffset) { + isAbsoluteOffset = absoluteOffset; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/model/ScanEngine.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/model/ScanEngine.java new file mode 100644 index 00000000..6b7d6fbb --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/model/ScanEngine.java @@ -0,0 +1,36 @@ +package com.checkmarx.eclipse.devassist.model; + +/** + * Enumeration of scan engines supported by Checkmarx. + */ +public enum ScanEngine { + ASCA("ASCA"), + OSS("OSS"), + SECRETS("SECRETS"), + CONTAINERS("CONTAINERS"), + IAC("IAC"); + + private final String displayName; + + ScanEngine(String displayName) { + this.displayName = displayName; + } + + public String getDisplayName() { + return displayName; + } + + @Override + public String toString() { + return displayName; + } + + public static ScanEngine fromString(String value) { + for (ScanEngine engine : ScanEngine.values()) { + if (engine.displayName.equalsIgnoreCase(value)) { + return engine; + } + } + throw new IllegalArgumentException("Unknown scan engine: " + value); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/model/ScanIssue.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/model/ScanIssue.java new file mode 100644 index 00000000..f72d961b --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/model/ScanIssue.java @@ -0,0 +1,194 @@ +package com.checkmarx.eclipse.devassist.model; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a scan issue detected during a real-time scan. + * Captures detailed information about security issues identified in a scanned project. + * Each scan issue can have multiple locations and vulnerabilities. + */ +public class ScanIssue { + + private String scanIssueId; + private String severity; + private String title; + private String description; + private String remediationAdvise; + private String packageVersion; + private String packageManager; + private String cve; + private ScanEngine scanEngine; + private String filePath; + private String imageTag; + private String fileType; + private String secretValue; + private String similarityId; + private Integer ruleId; + private Integer problematicLineNumber; + private List locations = new ArrayList<>(); + private List vulnerabilities = new ArrayList<>(); + + public ScanIssue() { + } + + public ScanIssue(String scanIssueId, String severity, String title, String description, + String remediationAdvise, String packageVersion, String packageManager, String cve, + ScanEngine scanEngine, String filePath, String imageTag) { + this.scanIssueId = scanIssueId; + this.severity = severity; + this.title = title; + this.description = description; + this.remediationAdvise = remediationAdvise; + this.packageVersion = packageVersion; + this.packageManager = packageManager; + this.cve = cve; + this.scanEngine = scanEngine; + this.filePath = filePath; + this.imageTag = imageTag; + } + + public String getScanIssueId() { + return scanIssueId; + } + + public void setScanIssueId(String scanIssueId) { + this.scanIssueId = scanIssueId; + } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getRemediationAdvise() { + return remediationAdvise; + } + + public void setRemediationAdvise(String remediationAdvise) { + this.remediationAdvise = remediationAdvise; + } + + public String getPackageVersion() { + return packageVersion; + } + + public void setPackageVersion(String packageVersion) { + this.packageVersion = packageVersion; + } + + public String getPackageManager() { + return packageManager; + } + + public void setPackageManager(String packageManager) { + this.packageManager = packageManager; + } + + public String getCve() { + return cve; + } + + public void setCve(String cve) { + this.cve = cve; + } + + public ScanEngine getScanEngine() { + return scanEngine; + } + + public void setScanEngine(ScanEngine scanEngine) { + this.scanEngine = scanEngine; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getImageTag() { + return imageTag; + } + + public void setImageTag(String imageTag) { + this.imageTag = imageTag; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getSecretValue() { + return secretValue; + } + + public void setSecretValue(String secretValue) { + this.secretValue = secretValue; + } + + public String getSimilarityId() { + return similarityId; + } + + public void setSimilarityId(String similarityId) { + this.similarityId = similarityId; + } + + public Integer getRuleId() { + return ruleId; + } + + public void setRuleId(Integer ruleId) { + this.ruleId = ruleId; + } + + public Integer getProblematicLineNumber() { + return problematicLineNumber; + } + + public void setProblematicLineNumber(Integer problematicLineNumber) { + this.problematicLineNumber = problematicLineNumber; + } + + public List getLocations() { + return locations; + } + + public void setLocations(List locations) { + this.locations = locations; + } + + public List getVulnerabilities() { + return vulnerabilities; + } + + public void setVulnerabilities(List vulnerabilities) { + this.vulnerabilities = vulnerabilities; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/model/Vulnerability.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/model/Vulnerability.java new file mode 100644 index 00000000..d7e828ec --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/model/Vulnerability.java @@ -0,0 +1,82 @@ +package com.checkmarx.eclipse.devassist.model; + +/** + * Represents a vulnerability associated with a scan issue. + * Provides additional insights into the security risk. + */ +public class Vulnerability { + + private String vulnerabilityId; + private String severity; + private String title; + private String description; + private String actualValue; + private String cve; + private String fixVersion; + + public Vulnerability() { + } + + public Vulnerability(String vulnerabilityId, String severity, String title, String description) { + this.vulnerabilityId = vulnerabilityId; + this.severity = severity; + this.title = title; + this.description = description; + } + + public String getVulnerabilityId() { + return vulnerabilityId; + } + + public void setVulnerabilityId(String vulnerabilityId) { + this.vulnerabilityId = vulnerabilityId; + } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getActualValue() { + return actualValue; + } + + public void setActualValue(String actualValue) { + this.actualValue = actualValue; + } + + public String getCve() { + return cve; + } + + public void setCve(String cve) { + this.cve = cve; + } + + public String getFixVersion() { + return fixVersion; + } + + public void setFixVersion(String fixVersion) { + this.fixVersion = fixVersion; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemBuilder.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemBuilder.java new file mode 100644 index 00000000..8b047444 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemBuilder.java @@ -0,0 +1,103 @@ +package com.checkmarx.eclipse.devassist.problems; + +import java.util.ArrayList; +import java.util.List; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; + +/** + * Static factory for creating ProblemDescriptor objects. + * + * Encapsulates logic for: + * - Formatting problem descriptions + * - Creating appropriate fixes for issues + * - Building ProblemDescriptor instances + * + * Mirrors JetBrains ProblemBuilder. + * Cannot be instantiated. + */ +public final class ProblemBuilder { + + private ProblemBuilder() { + } + + /** + * Build a ProblemDescriptor from a scan issue. + * + * Mirrors JetBrains ProblemBuilder.build(). + * + * @param problemHelper Context with file, document, etc. + * @param scanIssue The scan issue to describe + * @param problemLineNumber Line number where problem was found + * @return ProblemDescriptor with formatted description and fixes + */ + public static ProblemDescriptor build( + ProblemHelper problemHelper, + ScanIssue scanIssue, + int problemLineNumber) { + + String description = formatDescription(scanIssue); + List fixes = createFixes(scanIssue); + + return ProblemDescriptor.builder() + .file(problemHelper.getFile()) + .scanIssue(scanIssue) + .lineNumber(problemLineNumber) + .description(description) + .fixes(fixes) + .build(); + } + + /** + * Format the problem description from scan issue details. + * + * @param scanIssue The scan issue + * @return HTML-formatted description for display + */ + private static String formatDescription(ScanIssue scanIssue) { + StringBuilder sb = new StringBuilder(); + sb.append(""); + sb.append("").append(escapeHtml(scanIssue.getTitle())).append(""); + sb.append("
"); + sb.append("Severity: ").append(scanIssue.getSeverity()); + sb.append("
"); + if (scanIssue.getDescription() != null && !scanIssue.getDescription().isEmpty()) { + sb.append(escapeHtml(scanIssue.getDescription())); + } + sb.append(""); + return sb.toString(); + } + + /** + * Escape HTML special characters for safe display. + * + * @param text Text to escape + * @return HTML-escaped text + */ + private static String escapeHtml(String text) { + if (text == null) { + return ""; + } + return text + .replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\"", """) + .replace("'", "'"); + } + + /** + * Create fixes for a scan issue. + * + * Currently creates: ViewDetailsFix + * Can be extended with: IgnoreVulnerabilityFix, etc. + * + * @param scanIssue The scan issue + * @return List of fixes (currently all as Object, can be typed later) + */ + private static List createFixes(ScanIssue scanIssue) { + List fixes = new ArrayList<>(); + // Future: add ViewDetailsFix, IgnoreVulnerabilityFix, etc. + return fixes; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemDecorator.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemDecorator.java new file mode 100644 index 00000000..43406c39 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemDecorator.java @@ -0,0 +1,643 @@ +package com.checkmarx.eclipse.devassist.problems; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.resources.IFile; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.source.Annotation; +import org.eclipse.jface.text.source.IAnnotationModel; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.texteditor.ITextEditor; + +import com.checkmarx.eclipse.devassist.ui.findings.editor.FindingsAnnotation; +import com.checkmarx.eclipse.devassist.model.Location; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Renders scan results as editor decorations. + * + * Creates visual indicators for issues in the editor: + * - Gutter icons (severity indicators on line numbers) + * - Line highlighting (background color by severity) + * - Annotations (squiggly underlines and tooltips) + * + * Integrates with Eclipse's SourceViewerConfiguration to display + * issue markers alongside the editor content. + */ +public class ProblemDecorator { + + private static final String LOG_TAG = "[SCAN-DECORATOR]"; + + // Track annotations we've created so we can remove them later + private static final Map> fileAnnotations = + new HashMap<>(); + + /** + * Render scan results as annotations in the editor. + * + * Creates FindingsAnnotation objects for each issue and adds them + * to the editor's annotation model for visual display. + * + * @param file File that was scanned + * @param scanIssues Issues to visualize + */ + public static void decorateEditor(IFile file, List scanIssues) { + if (file == null) { + return; + } + if (scanIssues == null) { + scanIssues = List.of(); + } + + // **FIX: Use getLocation() (absolute path) for consistency with RealTimeScanJob and ResultPublisher** + // This ensures fileAnnotations map keys match the same path format used throughout the codebase + String filePath = file.getLocation().toOSString(); + + try { + // Find open editor for this file + ITextEditor editor = findOpenEditor(file); + if (editor == null) { + CxLogger.info(LOG_TAG + "No open editor for: " + filePath); + return; + } + + // Get annotation model from editor + IAnnotationModel annotationModel = editor.getDocumentProvider() + .getAnnotationModel(editor.getEditorInput()); + + if (annotationModel == null) { + CxLogger.warning(LOG_TAG + "No annotation model available"); + return; + } + + // Remove previous annotations for this file (BEFORE isEmpty check) + // This ensures stale annotations are cleared even if file is now clean + clearAnnotations(filePath, annotationModel); + + // Early return if no issues to add + if (scanIssues.isEmpty()) { + return; + } + + // Add new annotations for each issue + List annotations = new java.util.ArrayList<>(); + + for (ScanIssue issue : scanIssues) { + try { + FindingsAnnotation annotation = createAnnotation(editor, issue); + if (annotation != null) { + annotation.addButton(filePath, null); + annotations.add(annotation); + + CxLogger.info(LOG_TAG + " ─────────────────────────────────────────────────"); + CxLogger.info(LOG_TAG + " Issue: " + issue.getTitle()); + CxLogger.info(LOG_TAG + " Engine: " + issue.getScanEngine()); + CxLogger.info(LOG_TAG + " Severity: " + issue.getSeverity()); + + // **OSS-SPECIFIC LOGIC: Only decorate the first line (used for redirection)** + // For OSS issues, decorate only the first location's line to keep it simple + org.eclipse.jface.text.Position pos = null; + + if (issue.getScanEngine() != null && + issue.getScanEngine().name().equalsIgnoreCase("OSS")) { + // OSS: Decorate only the first line where package is declared + pos = decorateOssFirstLineOnly(editor, issue); + } else { + // Other engines: Use standard range calculation + pos = calculateRange(editor, issue); + } + + if (pos != null && pos.getLength() > 0) { + CxLogger.info(LOG_TAG + " Calculated Position for Editor:"); + CxLogger.info(LOG_TAG + " Offset: " + pos.getOffset()); + CxLogger.info(LOG_TAG + " Length: " + pos.getLength()); + CxLogger.info(LOG_TAG + " Range: [" + pos.getOffset() + "-" + (pos.getOffset() + pos.getLength()) + "]"); + + // Add annotation to model for display + annotationModel.addAnnotation(annotation, pos); + CxLogger.info(LOG_TAG + "Annotation added to model"); + } else { + CxLogger.warning(LOG_TAG + "FAILED: Invalid position (offset=" + + (pos != null ? pos.getOffset() : "null") + ", length=" + + (pos != null ? pos.getLength() : "null") + ")"); + } + } + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error creating annotation: " + + e.getMessage()); + e.printStackTrace(); + } + } + + // Store annotations for later cleanup + fileAnnotations.put(filePath, annotations); + + CxLogger.info(LOG_TAG + " ══════════════════════════════════════════════════"); + CxLogger.info(LOG_TAG + "COMPLETE: Added " + annotations.size() + + " annotations to editor"); + CxLogger.info(LOG_TAG + " ══════════════════════════════════════════════════"); + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error decorating editor: " + + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Create a FindingsAnnotation for a scan issue. + * + * FindingsAnnotation extends Eclipse's Annotation class and provides + * custom rendering (color, icon, tooltip) based on issue severity. + * + * @param editor Text editor + * @param issue Scan issue + * @return FindingsAnnotation, or null if creation fails + */ + private static FindingsAnnotation createAnnotation(ITextEditor editor, + ScanIssue issue) { + try { + // Get severity from issue + String severity = issue.getSeverity(); + + // DEBUG: Log the actual severity value + CxLogger.info(LOG_TAG + " [DEBUG] Issue: " + issue.getTitle() + + " | Severity from issue: " + (severity != null ? severity : "NULL")); + + // Map severity to annotation type + String annotationType = mapSeverityToAnnotationType(severity); + + CxLogger.info(LOG_TAG + " [DEBUG] Mapped to annotation type: " + annotationType); + + // Create annotation with issue details + FindingsAnnotation annotation = new FindingsAnnotation( + annotationType, + issue.getTitle(), + issue.getDescription() + ); + return annotation; + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error creating annotation: " + + e.getMessage()); + return null; + } + } + + + /** + * Map severity level to custom Findings annotation type. + * Handles all 8 severity levels including OK, UNKNOWN, and IGNORED. + * + * @param severity Severity string (MALICIOUS, CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN, OK, IGNORED) + * @return Annotation type constant (com.checkmarx.eclipse.findings.{severity}) + */ + private static String mapSeverityToAnnotationType(String severity) { + if (severity == null) { + return "com.checkmarx.eclipse.findings.unknown"; + } + String upper = severity.toUpperCase(); + if (upper.contains("MALICIOUS")) { + return "com.checkmarx.eclipse.findings.malicious"; + } + if (upper.contains("CRITICAL") || upper.contains("ERROR")) { + return "com.checkmarx.eclipse.findings.critical"; + } + if (upper.contains("HIGH")) { + return "com.checkmarx.eclipse.findings.high"; + } + if (upper.contains("MEDIUM")) { + return "com.checkmarx.eclipse.findings.medium"; + } + if (upper.contains("LOW") || upper.contains("INFO")) { + return "com.checkmarx.eclipse.findings.low"; + } + if (upper.contains("UNKNOWN")) { + return "com.checkmarx.eclipse.findings.unknown"; + } + if (upper.contains("OK")) { + return "com.checkmarx.eclipse.findings.ok"; + } + if (upper.contains("IGNORED")) { + return "com.checkmarx.eclipse.findings.ignored"; + } + + return "com.checkmarx.eclipse.findings.unknown"; + } + + /** + * Decorate only the first line for OSS issues (package declaration line). + * + * For OSS vulnerabilities, the Location has the exact character range, + * but it may span the entire dependency block. We simplify by decorating + * only the first line where the package is declared. + * + * @param editor Text editor + * @param issue OSS issue + * @return Position covering the entire first line, or null if unable to determine + */ + private static org.eclipse.jface.text.Position decorateOssFirstLineOnly( + ITextEditor editor, ScanIssue issue) { + + try { + org.eclipse.jface.text.IDocument document = + editor.getDocumentProvider().getDocument(editor.getEditorInput()); + + if (document == null) { + CxLogger.warning(LOG_TAG + " [OSS] Document is null!"); + return null; + } + + // Get the line number from first location + if (issue.getLocations() == null || issue.getLocations().isEmpty()) { + CxLogger.warning(LOG_TAG + " [OSS] No locations found!"); + return null; + } + + com.checkmarx.eclipse.devassist.model.Location location = + issue.getLocations().get(0); + int lineNumber = location.getLine() - 1; // Convert to 0-based + + int docLength = document.getLength(); + int lineCount = document.getNumberOfLines(); + + // Bounds check + if (lineNumber < 0 || lineNumber >= lineCount) { + CxLogger.warning(LOG_TAG + " [OSS] Line " + (lineNumber + 1) + + " out of bounds (doc has " + lineCount + " lines)"); + return null; + } + + // Get the entire line information + org.eclipse.jface.text.IRegion lineInfo = document.getLineInformation(lineNumber); + int lineOffset = lineInfo.getOffset(); + int lineLength = lineInfo.getLength(); + + // For OSS, decorate the entire line (excluding trailing newline) + // This ensures the gutter icon and underline appear on the whole line + int decorationLength = lineLength; + if (decorationLength == 0) { + decorationLength = 1; // Minimum 1 char + } + + CxLogger.info(LOG_TAG + " [OSS] Line " + (lineNumber + 1) + + " (offset=" + lineOffset + ", length=" + decorationLength + ")"); + + // Bounds check final position + if (lineOffset < 0 || lineOffset > docLength) { + CxLogger.warning(LOG_TAG + " [OSS] Line offset " + lineOffset + + " out of bounds (doc length=" + docLength + ")"); + return null; + } + + if (lineOffset + decorationLength > docLength) { + CxLogger.warning(LOG_TAG + " [OSS] Adjusted length from " + + decorationLength + " to " + (docLength - lineOffset)); + decorationLength = docLength - lineOffset; + } + + if (decorationLength <= 0) { + CxLogger.warning(LOG_TAG + " [OSS] Invalid decoration length: " + decorationLength); + return null; + } + + CxLogger.info(LOG_TAG + " [OSS] Decorating first line: [" + lineOffset + + "-" + (lineOffset + decorationLength) + "] = " + decorationLength + " chars"); + + return new org.eclipse.jface.text.Position(lineOffset, decorationLength); + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " [OSS] Error decorating first line: " + + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + /** + * Calculate the precise source range for an annotation. + * + * Handles BOTH absolute and line-relative offsets depending on scanner: + * - Secrets API: Returns RealtimeLocation with ABSOLUTE document offsets + * - ASCA API: Returns character positions that are LINE-RELATIVE offsets + * + * @param editor Text editor + * @param issue Scan issue with location info + * @return org.eclipse.jface.text.Position representing the precise range + */ + private static org.eclipse.jface.text.Position calculateRange(ITextEditor editor, ScanIssue issue) { + try { + IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput()); + if (document == null) return new org.eclipse.jface.text.Position(0, 1); + + int docLength = document.getLength(); + + // 1. Precise location-based offset calculation + if (issue.getLocations() != null && !issue.getLocations().isEmpty()) { + Location location = issue.getLocations().get(0); + int rawStart = location.getStartIndex(); + int rawEnd = location.getEndIndex(); + int line = Math.max(0, location.getLine() - 1); + + IRegion lineInfo = document.getLineInformation(line); + int lineOffset = lineInfo.getOffset(); + int lineLength = lineInfo.getLength(); + + int trimIndent = getLeadingWhitespaceOffset(document, lineOffset, lineLength); + // Use explicit flag from Location instead of inferring from magnitude + boolean isAbsoluteOffset = location.isAbsoluteOffset(); + + int charStart = isAbsoluteOffset ? rawStart : (lineOffset + rawStart); + int charEnd = isAbsoluteOffset ? rawEnd : (lineOffset + rawEnd); + + // If start points to the beginning of the line, shift past leading whitespace + if (charStart <= lineOffset) { + charStart = lineOffset + trimIndent; + } + + if (charEnd <= charStart) { + charEnd = lineOffset + lineLength; + } + + // Clamp offsets safely within document bounds + charStart = Math.max(0, Math.min(charStart, docLength)); + charEnd = Math.max(charStart, Math.min(charEnd, docLength)); + + if (charEnd > charStart) { + return new org.eclipse.jface.text.Position(charStart, charEnd - charStart); + } + } + + // 2. Fallback: Highlight line content (skipping leading indentation) + int targetLine = 0; + if (issue.getProblematicLineNumber() != null) { + targetLine = issue.getProblematicLineNumber() - 1; + } else if (issue.getLocations() != null && !issue.getLocations().isEmpty()) { + targetLine = issue.getLocations().get(0).getLine() - 1; + } + + int line = Math.max(0, Math.min(targetLine, document.getNumberOfLines() - 1)); + IRegion lineInfo = document.getLineInformation(line); + + int trimIndent = getLeadingWhitespaceOffset(document, lineInfo.getOffset(), lineInfo.getLength()); + int startOffset = lineInfo.getOffset() + trimIndent; + int length = Math.max(1, lineInfo.getLength() - trimIndent); + + return new org.eclipse.jface.text.Position(startOffset, length); + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error calculating range: " + e.getMessage()); + return new org.eclipse.jface.text.Position(0, 1); + } + } + /** + * Calculates the number of leading whitespace characters (spaces/tabs) on a given line. + * + * @param document Text document + * @param lineOffset Start character offset of the line + * @param lineLength Total length of the line + * @return Number of leading whitespace characters + */ + private static int getLeadingWhitespaceOffset(org.eclipse.jface.text.IDocument document, + int lineOffset, + int lineLength) { + try { + String lineText = document.get(lineOffset, lineLength); + int leadingSpaces = 0; + + while (leadingSpaces < lineText.length() && + Character.isWhitespace(lineText.charAt(leadingSpaces))) { + leadingSpaces++; + } + + return leadingSpaces; + } catch (Exception e) { + return 0; + } + } + + /** + * Clear previous annotations for a file. + * + * @param filePath File path + * @param annotationModel Annotation model + */ + private static void clearAnnotations(String filePath, + IAnnotationModel annotationModel) { + + try { + List previousAnnotations = fileAnnotations.get(filePath); + if (previousAnnotations != null) { + for (Annotation annotation : previousAnnotations) { + annotationModel.removeAnnotation(annotation); + } + fileAnnotations.remove(filePath); + + CxLogger.info(LOG_TAG + " Cleared " + previousAnnotations.size() + + " previous annotations"); + } + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error clearing annotations: " + + e.getMessage()); + } + } + + /** + * Find open text editor for a file. + * + * @param file File to find editor for + * @return ITextEditor or null + */ + private static ITextEditor findOpenEditor(IFile file) { + try { + IWorkbench workbench = PlatformUI.getWorkbench(); + if (workbench == null) { + return null; + } + + IWorkbenchPage page = null; + try { + page = workbench.getActiveWorkbenchWindow().getActivePage(); + } catch (NullPointerException e) { + // Workbench window not available, try all windows + for (var window : workbench.getWorkbenchWindows()) { + page = window.getActivePage(); + if (page != null) break; + } + } + + if (page == null) { + return null; + } + + var editors = page.getEditors(); + for (var editor : editors) { + Object input = editor.getEditorInput(); + if (input instanceof org.eclipse.ui.IFileEditorInput) { + IFile editorFile = ((org.eclipse.ui.IFileEditorInput) input) + .getFile(); + if (editorFile.equals(file)) { + // Try method 1: Direct ITextEditor instance + if (editor instanceof ITextEditor) { + return (ITextEditor) editor; + } + + // Try method 2: ITextEditor adapter (for MavenPomEditor, etc.) + ITextEditor textEditor = editor.getAdapter(ITextEditor.class); + if (textEditor != null) { + return textEditor; + } + } + } + } + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error finding open editor: " + + e.getMessage()); + } + + return null; + } + + /** + * Remove all decorations for a file. + * + * Called when: + * - Results are cleared + * - File is closed + * - Editor is disposed + * + * @param file File to remove decorations from + */ + public static void clearDecorations(IFile file) { + try { + // **FIX: Use getLocation() (absolute path) for consistency with decorateEditor()** + // Ensures fileAnnotations map lookups use the same path format + String filePath = file.getLocation().toOSString(); + CxLogger.info(LOG_TAG + " Clearing decorations for: " + filePath); + + ITextEditor editor = findOpenEditor(file); + if (editor == null) { + fileAnnotations.remove(filePath); + return; + } + + IAnnotationModel annotationModel = editor.getDocumentProvider() + .getAnnotationModel(editor.getEditorInput()); + + if (annotationModel != null) { + clearAnnotations(filePath, annotationModel); + } + + CxLogger.info(LOG_TAG + " Decorations cleared"); + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error clearing decorations: " + + e.getMessage()); + } + } + + /** + * Get decorator statistics. + * + * @return Summary string + */ + public static String getStatistics() { + int totalAnnotations = fileAnnotations.values().stream() + .mapToInt(List::size) + .sum(); + return "Decorated files: " + fileAnnotations.size() + + ", Total annotations: " + totalAnnotations; + } + + /** + * Highlight a line and add gutter icon for a problem. + * + * Delegates to the decorateEditor() path which handles annotation creation + * and display in the editor's gutter and line highlighting. + * + * @param problemHelper Problem helper with context (used to locate the file being edited) + * @param scanIssue Scan issue to highlight + * @param isProblem Whether this is a problem (not just note) + * @param problemLineNumber Line number to highlight + */ + public void highlightLineAddGutterIconForProblem( + ProblemHelper problemHelper, + ScanIssue scanIssue, + boolean isProblem, + int problemLineNumber) { + + if (!isProblem || scanIssue == null) { + return; + } + + try { + // Get the file from problem helper and decorate it + // Wrap single issue in a list and delegate to decorateEditor() + IFile file = problemHelper.getFile(); + if (file != null && file.exists()) { + decorateEditor(file, List.of(scanIssue)); + } else { + CxLogger.warning(LOG_TAG + " Cannot decorate: file not found or null"); + } + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error in highlightLineAddGutterIconForProblem: " + e.getMessage(), e); + } + } + + /** + * Remove all highlighters/decorations from a project. + * + * Called by DevAssistInspectionMgr when resetting editor state. + * Clears all tracked annotations across all files. + * + * @param project Project to clear (used for context, actual clearing is project-wide) + */ + public static void removeAllHighlighters(org.eclipse.core.resources.IProject project) { + try { + IWorkbench workbench = PlatformUI.getWorkbench(); + if (workbench == null) { + CxLogger.info(LOG_TAG + " removeAllHighlighters: Workbench not available"); + return; + } + + for (org.eclipse.ui.IWorkbenchWindow window : workbench.getWorkbenchWindows()) { + for (IWorkbenchPage page : window.getPages()) { + for (org.eclipse.ui.IEditorReference ref : page.getEditorReferences()) { + try { + ITextEditor editor = (ITextEditor) ref.getEditor(false); + if (editor != null) { + IAnnotationModel annotationModel = + editor.getDocumentProvider().getAnnotationModel(editor.getEditorInput()); + if (annotationModel != null) { + for (List annotations : fileAnnotations.values()) { + for (Annotation ann : annotations) { + try { + annotationModel.removeAnnotation(ann); + } catch (Exception e) { + // Continue removing others + } + } + } + } + } + } catch (Exception e) { + // Continue with other editors + } + } + } + } + + fileAnnotations.clear(); + CxLogger.info(LOG_TAG + " Removed all highlighters for project: " + project.getName()); + + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error removing all highlighters: " + e.getMessage(), e); + } + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemDescriptor.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemDescriptor.java new file mode 100644 index 00000000..dee7d2a3 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemDescriptor.java @@ -0,0 +1,117 @@ +package com.checkmarx.eclipse.devassist.problems; + +import java.util.List; + +import org.eclipse.core.resources.IFile; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; + +/** + * Eclipse equivalent of JetBrains ProblemDescriptor. + * + * Represents a detected problem/issue in a file with: + * - Issue metadata (file, scan issue, line number) + * - Human-readable description + * - Associated fixes for the problem + * + * Option B: Full structure with fixes list, mirroring JetBrains. + */ +public class ProblemDescriptor { + + private final IFile file; + private final ScanIssue scanIssue; + private final int lineNumber; + private final String description; + private final List fixes; + + /** + * Constructor for ProblemDescriptor. + * + * @param file The file being analyzed + * @param scanIssue The scan issue + * @param lineNumber Line number of the issue + * @param description Human-readable description + * @param fixes Associated fixes + */ + public ProblemDescriptor(IFile file, ScanIssue scanIssue, int lineNumber, + String description, List fixes) { + this.file = file; + this.scanIssue = scanIssue; + this.lineNumber = lineNumber; + this.description = description; + this.fixes = fixes; + } + + public IFile getFile() { + return file; + } + + public ScanIssue getScanIssue() { + return scanIssue; + } + + public int getLineNumber() { + return lineNumber; + } + + public String getDescription() { + return description; + } + + public List getFixes() { + return fixes; + } + + /** + * Get the problem fixes as an array. + * + * @return Array of fixes (or empty array if none) + */ + public Object[] getFixesArray() { + return fixes != null ? fixes.toArray() : new Object[0]; + } + + /** + * Builder for ProblemDescriptor. + */ + public static class Builder { + private IFile file; + private ScanIssue scanIssue; + private int lineNumber; + private String description; + private List fixes; + + public Builder file(IFile file) { + this.file = file; + return this; + } + + public Builder scanIssue(ScanIssue scanIssue) { + this.scanIssue = scanIssue; + return this; + } + + public Builder lineNumber(int lineNumber) { + this.lineNumber = lineNumber; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder fixes(List fixes) { + this.fixes = fixes; + return this; + } + + public ProblemDescriptor build() { + return new ProblemDescriptor(file, scanIssue, lineNumber, description, fixes); + } + } + + public static Builder builder() { + return new Builder(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemHelper.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemHelper.java new file mode 100644 index 00000000..19e9717b --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemHelper.java @@ -0,0 +1,174 @@ +package com.checkmarx.eclipse.devassist.problems; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.IDocument; + +import com.checkmarx.eclipse.devassist.basescanner.ScannerService; +import com.checkmarx.eclipse.devassist.model.ScanIssue; + +/** + * Helper class that aggregates all context needed for problem processing. + * + * Holds: file, project, document, scanners, issues, holder service, decorator. + * Used by orchestration flow to pass context to various processing stages. + * + * Mirrors JetBrains ProblemHelper with Eclipse types. + */ +public class ProblemHelper { + + private final IFile file; + private final IProject project; + private final String filePath; + private final IDocument document; + private final List supportedScanners; + private final List scanIssueList; + private final ProblemHolderService problemHolderService; + private final ProblemDecorator problemDecorator; + + /** + * Constructor for ProblemHelper. + */ + public ProblemHelper(IFile file, IProject project, String filePath, + IDocument document, List supportedScanners, + List scanIssueList, ProblemHolderService problemHolderService, + ProblemDecorator problemDecorator) { + this.file = file; + this.project = project; + this.filePath = filePath; + this.document = document; + this.supportedScanners = supportedScanners; + this.scanIssueList = scanIssueList; + this.problemHolderService = problemHolderService; + this.problemDecorator = problemDecorator; + } + + public IFile getFile() { + return file; + } + + public IProject getProject() { + return project; + } + + public String getFilePath() { + return filePath; + } + + public IDocument getDocument() { + return document; + } + + public List getSupportedScanners() { + return supportedScanners; + } + + public List getScanIssueList() { + return scanIssueList; + } + + public ProblemHolderService getProblemHolderService() { + return problemHolderService; + } + + public ProblemDecorator getProblemDecorator() { + return problemDecorator; + } + + /** + * Builder method enforcing mandatory fields: file, project. + * + * Mirrors JetBrains ProblemHelper.builder(PsiFile, Project). + * + * @param file IFile to process + * @param project IProject containing the file + * @return Builder with file and project set + * @throws IllegalArgumentException if file or project is null + */ + public static Builder builder(IFile file, IProject project) { + if (Objects.isNull(file) || Objects.isNull(project)) { + throw new IllegalArgumentException( + "Mandatory fields required: file, project"); + } + return new Builder() + .file(file) + .project(project); + } + + /** + * Create a new builder from this ProblemHelper. + * + * @return Builder with all fields from this instance + */ + public Builder toBuilder() { + return builder(this.file, this.project) + .filePath(this.filePath) + .document(this.document) + .supportedScanners(this.supportedScanners) + .scanIssueList(this.scanIssueList) + .problemHolderService(this.problemHolderService) + .problemDecorator(this.problemDecorator); + } + + /** + * Builder for ProblemHelper. + */ + public static class Builder { + private IFile file; + private IProject project; + private String filePath; + private IDocument document; + private List supportedScanners; + private List scanIssueList; + private ProblemHolderService problemHolderService; + private ProblemDecorator problemDecorator; + + public Builder file(IFile file) { + this.file = file; + return this; + } + + public Builder project(IProject project) { + this.project = project; + return this; + } + + public Builder filePath(String filePath) { + this.filePath = filePath; + return this; + } + + public Builder document(IDocument document) { + this.document = document; + return this; + } + + public Builder supportedScanners(List supportedScanners) { + this.supportedScanners = supportedScanners; + return this; + } + + public Builder scanIssueList(List scanIssueList) { + this.scanIssueList = scanIssueList; + return this; + } + + public Builder problemHolderService(ProblemHolderService problemHolderService) { + this.problemHolderService = problemHolderService; + return this; + } + + public Builder problemDecorator(ProblemDecorator problemDecorator) { + this.problemDecorator = problemDecorator; + return this; + } + + public ProblemHelper build() { + return new ProblemHelper(file, project, filePath, document, + supportedScanners, scanIssueList, problemHolderService, problemDecorator); + } + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemHolderService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemHolderService.java new file mode 100644 index 00000000..26b20456 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ProblemHolderService.java @@ -0,0 +1,276 @@ +package com.checkmarx.eclipse.devassist.problems; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.e4.core.services.events.IEventBroker; +import org.eclipse.ui.PlatformUI; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * In-memory cache for scan results (ScanIssue), keyed by file path. + * + * Thread-safe via ConcurrentHashMap. Used to avoid redundant scans + * and to enable result restoration when files are reopened. + * + * Mirrors JetBrains ProblemHolderService pattern with Eclipse IEventBroker for notifications. + */ +public class ProblemHolderService { + + private static final String LOG_TAG = "[PROBLEM-HOLDER]"; + public static final String ISSUES_UPDATED_TOPIC = "com/checkmarx/issues/updated"; + + // Session property key for storing service in project + public static final String SERVICE_KEY = ProblemHolderService.class.getName() + + ".INSTANCE"; + + private final ConcurrentHashMap> fileToScanIssues = + new ConcurrentHashMap<>(); + private final ConcurrentHashMap> fileToProblemDescriptors = + new ConcurrentHashMap<>(); + + /** + * Returns the instance of this service for the given project. + * + * @param project the project. + * @return the instance of this service for the given project. + */ + public static ProblemHolderService getInstance(IProject project) { + if (project == null) { + return null; + } + try { + org.eclipse.core.runtime.QualifiedName key = new org.eclipse.core.runtime.QualifiedName( + "com.checkmarx.eclipse.plugin", "problem-holder-service"); + ProblemHolderService instance = (ProblemHolderService) project.getSessionProperty(key); + if (instance == null) { + instance = new ProblemHolderService(); + project.setSessionProperty(key, instance); + } + return instance; + } catch (Exception e) { + return new ProblemHolderService(); + } + } + + /** + * Cache scan issues for a file. + * + * @param filePath Absolute file path + * @param issues Issues found by scanners + */ + public void addScanIssues(String filePath, List issues) { + if (filePath == null || issues == null) { + return; + } + fileToScanIssues.put(filePath, new ArrayList<>(issues)); + // **KEY: Notify all listeners of the update (JetBrains pattern)** + publishIssuesUpdated(); + } + + /** + * Get cached scan issues for a file. + * + * @param filePath Absolute file path + * @return Cached issues or empty list + */ + public List getScanIssuesByFile(String filePath) { + if (filePath == null) { + return Collections.emptyList(); + } + + List cached = fileToScanIssues.get(filePath); + return cached != null ? new ArrayList<>(cached) : Collections.emptyList(); + } + + /** + * Get all cached issues across all files. + * + * @return Map of file path → issues + */ + public Map> getAllScanIssues() { + + Map> result = new HashMap<>(); + for (Map.Entry> entry : fileToScanIssues.entrySet()) { + result.put(entry.getKey(), new ArrayList<>(entry.getValue())); + } + int totalIssues = result.values().stream().mapToInt(List::size).sum(); + return result; + } + + /** + * Merge new issues with existing issues for a file. + * Deduplicates by issue ID. + * + * @param filePath Absolute file path + * @param newIssues Issues to merge + */ + public void mergeScanIssues(String filePath, List newIssues) { + if (filePath == null || newIssues == null) { + return; + } + + List existing = fileToScanIssues.getOrDefault(filePath, new ArrayList<>()); + Map merged = new HashMap<>(); + + // Add existing issues + for (ScanIssue issue : existing) { + merged.put(issue.getScanIssueId(), issue); + } + + // Add/override with new issues (by ID) + for (ScanIssue issue : newIssues) { + merged.put(issue.getScanIssueId(), issue); + } + + fileToScanIssues.put(filePath, new ArrayList<>(merged.values())); + CxLogger.info(LOG_TAG + " Merged " + newIssues.size() + " issues for: " + filePath); + + // **KEY: Notify listeners when cache is modified** + publishIssuesUpdated(); + } + + /** + * Clear cached issues for a file. + * + * @param filePath Absolute file path + */ + public void removeScanIssues(String filePath) { + if (filePath == null) { + return; + } + + fileToScanIssues.remove(filePath); + CxLogger.info(LOG_TAG + " Cleared cache for: " + filePath); + } + + /** + * Remove cached scan issues for a specific scanner type and file. + * Mirrors JetBrains DevAssistScanScheduler.cacheScanResults() pattern. + * + * When a partial re-scan is performed (e.g., only ASCA is rescanned), + * this method removes the old results for THAT scanner type before + * merging the new results. + * + * @param scannerType Name of the scanner engine (e.g., "ASCA", "OSS", "IaC") + * @param filePath Absolute file path + */ + public void removeScanIssuesByFileAndScanner(String scannerType, String filePath) { + if (filePath == null || scannerType == null) { + return; + } + + List existing = fileToScanIssues.getOrDefault(filePath, new ArrayList<>()); + List filtered = new ArrayList<>(); + + // Keep only issues from OTHER scanners + for (ScanIssue issue : existing) { + if (issue.getScanEngine() != null && + !issue.getScanEngine().name().equals(scannerType)) { + filtered.add(issue); + } + } + + fileToScanIssues.put(filePath, filtered); + CxLogger.info(LOG_TAG + " Removed " + scannerType + " issues for: " + filePath + + " (kept " + filtered.size() + " issues from other scanners)"); + } + + /** + * Clear all caches (on project close). + */ + public void clearAll() { + fileToScanIssues.clear(); + CxLogger.info(LOG_TAG + " All caches cleared"); + } + + /** + * Get cache statistics for debugging. + * + * @return Summary string + */ + public String getCacheStats() { + int fileCount = fileToScanIssues.size(); + int totalIssues = fileToScanIssues.values().stream() + .mapToInt(List::size) + .sum(); + return "Files: " + fileCount + ", Total Issues: " + totalIssues; + } + + /** + * Publish issues update via Eclipse IEventBroker. + * Subscribers listen on ISSUES_UPDATED_TOPIC using @UIEventTopic annotation. + * + * @see com.checkmarx.eclipse.devassist.ui.findings.CxFindingsView + */ + private void publishIssuesUpdated() { + try { + IEventBroker eventBroker = (IEventBroker) PlatformUI.getWorkbench().getService(IEventBroker.class); + if (eventBroker != null) { + Map> allIssues = getAllScanIssues(); + + eventBroker.post(ISSUES_UPDATED_TOPIC, allIssues); + } else { + System.err.println(LOG_TAG + " [EVENT-BROKER] ✗ EventBroker not available"); + } + } catch (Exception e) { + System.err.println(LOG_TAG + " [EVENT-BROKER] Error publishing event: " + e.getMessage()); + e.printStackTrace(); + } + } + + public static void addToCxOneFindings(IFile file, List problemsList) { + getInstance(file.getProject()).addScanIssues(file.getFullPath().toOSString(), problemsList); + } + + /** + * Cache problem descriptors for a file. + * + * @param filePath Absolute file path + * @param descriptors Problem descriptors to cache + */ + public void addProblemDescriptors(String filePath, List descriptors) { + if (filePath == null || descriptors == null) { + return; + } + fileToProblemDescriptors.put(filePath, new ArrayList<>(descriptors)); + CxLogger.info(LOG_TAG + " Cached " + descriptors.size() + " problem descriptors for: " + filePath); + } + + /** + * Get cached problem descriptors for a file. + * + * @param filePath Absolute file path + * @return Cached problem descriptors or empty list + */ + public List getProblemDescriptors(String filePath) { + if (filePath == null) { + return Collections.emptyList(); + } + List cached = fileToProblemDescriptors.get(filePath); + return cached != null ? Collections.unmodifiableList(cached) : Collections.emptyList(); + } + + /** + * Remove cached problem descriptors for a file. + * + * @param filePath Absolute file path + */ + public void removeProblemDescriptorsForFile(String filePath) { + if (filePath == null) { + return; + } + fileToProblemDescriptors.remove(filePath); + CxLogger.info(LOG_TAG + " Removed problem descriptors for: " + filePath); + } + +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ScanIssueProcessor.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ScanIssueProcessor.java new file mode 100644 index 00000000..405fcda6 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/problems/ScanIssueProcessor.java @@ -0,0 +1,223 @@ +package com.checkmarx.eclipse.devassist.problems; + +import java.util.Objects; + +import org.eclipse.core.resources.IFile; +import org.eclipse.jface.text.IDocument; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Processor that validates individual scan issues and creates problem descriptors. + * + * Encapsulates logic for: + * - Validating scan issue data (location, line, severity) + * - Creating problem descriptors for valid issues + * - Triggering decoration for highlighted issues + * + * CRITICAL: Prevents crashes from invalid data by validating before processing. + * + * Mirrors JetBrains ScanIssueProcessor. + */ +public class ScanIssueProcessor { + + private static final String LOG_TAG = "[SCAN-ISSUE-PROCESSOR]"; + + private final IFile file; + private final IDocument document; + private final ProblemHelper problemHelper; + + /** + * Constructor that takes file, document, and problemHelper. + * + * @param file The file being processed + * @param document The document + * @param problemHelper Problem helper with context + */ + public ScanIssueProcessor(IFile file, IDocument document, ProblemHelper problemHelper) { + this.file = file; + this.document = document; + this.problemHelper = problemHelper; + } + + /** + * Alternate constructor that extracts file and document from ProblemHelper. + * + * Mirrors JetBrains ScanIssueProcessor(ProblemHelper). + * + * @param problemHelper Problem helper containing file, document, etc. + */ + public ScanIssueProcessor(ProblemHelper problemHelper) { + this.file = problemHelper.getFile(); + this.document = problemHelper.getDocument(); + this.problemHelper = problemHelper; + } + + /** + * Process a single scan issue and create a problem descriptor if valid. + * + * Validation pipeline: + * 1. Check location exists and is not empty + * 2. Extract line number from location + * 3. Check line is within document range + * 4. Check severity is present and not blank + * 5. If all valid: create problem descriptor + * 6. If decorator enabled: highlight the issue + * + * Mirrors JetBrains ScanIssueProcessor.processScanIssue(). + * + * @param scanIssue Scan issue to process + * @param isDecoratorEnabled Whether to add visual decorations + * @return ProblemDescriptor if valid, null if invalid + */ + public ProblemDescriptor processScanIssue(ScanIssue scanIssue, boolean isDecoratorEnabled) { + + // Validation: location exists and is not empty + if (!isValidLocation(scanIssue)) { + CxLogger.info(LOG_TAG + " Invalid location for: " + scanIssue.getTitle()); + return null; + } + + // Extract line number + int problemLineNumber = scanIssue.getLocations().get(0).getLine(); + + // Validation: line number and severity are valid + if (!isValidLineAndSeverity(problemLineNumber, scanIssue)) { + CxLogger.info(LOG_TAG + " Invalid line/severity for: " + scanIssue.getTitle() + + " (line=" + problemLineNumber + ", severity=" + scanIssue.getSeverity() + ")"); + return null; + } + + try { + return processValidIssue(scanIssue, problemLineNumber, isDecoratorEnabled); + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Exception processing issue: " + + scanIssue.getTitle() + ": " + e.getMessage(), e); + return null; + } + } + + /** + * Validate that scan issue has a location. + * + * @param scanIssue Scan issue to validate + * @return true if location exists and is not empty + */ + private boolean isValidLocation(ScanIssue scanIssue) { + return scanIssue.getLocations() != null && !scanIssue.getLocations().isEmpty(); + } + + /** + * Validate line number and severity. + * + * @param lineNumber Line number to check + * @param scanIssue Scan issue with severity + * @return true if line is in range and severity is not blank + */ + private boolean isValidLineAndSeverity(int lineNumber, ScanIssue scanIssue) { + // Check line is within document bounds + if (isLineOutOfRange(lineNumber)) { + return false; + } + // Check severity is present and not blank + return scanIssue.getSeverity() != null && !scanIssue.getSeverity().isBlank(); + } + + /** + * Check if line number is outside document range. + * + * @param lineNumber Line number to check + * @return true if line is out of range + */ + private boolean isLineOutOfRange(int lineNumber) { + try { + int lineCount = document.getNumberOfLines(); + return lineNumber < 1 || lineNumber > lineCount; + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error checking line range: " + e.getMessage(), e); + return true; + } + } + + /** + * Process a valid scan issue. + * + * 1. Check if it's a "problem" (not just info/note) + * 2. If problem: create problem descriptor via ProblemBuilder + * 3. If decorator enabled: highlight the issue + * + * @param scanIssue The valid scan issue + * @param problemLineNumber Line number (already validated) + * @param isDecoratorEnabled Whether to decorate + * @return ProblemDescriptor if it's a problem, null if just info + */ + private ProblemDescriptor processValidIssue( + ScanIssue scanIssue, + int problemLineNumber, + boolean isDecoratorEnabled) { + + boolean isProblem = isProblem(scanIssue.getSeverity().toLowerCase()); + + ProblemDescriptor problemDescriptor = null; + if (isProblem) { + problemDescriptor = createProblemDescriptor(scanIssue, problemLineNumber); + } + + if (isDecoratorEnabled) { + highlightIssueIfNeeded(scanIssue, problemLineNumber, isProblem); + } + + return problemDescriptor; + } + + /** + * Check if severity indicates a reportable problem. + * Matches severity table in ProblemDecorator.mapSeverityToAnnotationType(). + * + * @param severity Severity string (lowercase) + * @return true if problem, false if info/note/unknown/ok/ignored + */ + private boolean isProblem(String severity) { + return severity.equals("malicious") || + severity.equals("critical") || + severity.equals("high") || + severity.equals("medium") || + severity.equals("low"); + } + + /** + * Create a problem descriptor via ProblemBuilder. + * + * @param scanIssue The scan issue + * @param problemLineNumber Line number + * @return ProblemDescriptor, or null on error + */ + private ProblemDescriptor createProblemDescriptor(ScanIssue scanIssue, int problemLineNumber) { + try { + return ProblemBuilder.build(problemHelper, scanIssue, problemLineNumber); + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Failed to create descriptor for: " + + scanIssue.getTitle() + ": " + e.getMessage(), e); + return null; + } + } + + /** + * Highlight the issue in the editor and add gutter icon. + * + * Delegates to ProblemDecorator to add visual decoration. + * + * @param scanIssue The scan issue + * @param problemLineNumber Line number + * @param isProblem Whether it's a problem or just note + */ + private void highlightIssueIfNeeded(ScanIssue scanIssue, int problemLineNumber, boolean isProblem) { + ProblemDecorator problemDecorator = problemHelper.getProblemDecorator(); + if (Objects.isNull(problemDecorator)) { + problemDecorator = new ProblemDecorator(); + } + problemDecorator.highlightLineAddGutterIconForProblem( + problemHelper, scanIssue, isProblem, problemLineNumber); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScanResultAdaptor.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScanResultAdaptor.java new file mode 100644 index 00000000..295e3bb3 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScanResultAdaptor.java @@ -0,0 +1,272 @@ +package com.checkmarx.eclipse.devassist.scanners.asca; + +import com.checkmarx.ast.asca.ScanDetail; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.model.Location; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.model.Vulnerability; +import com.checkmarx.eclipse.devassist.utils.DevAssistUtils; +import com.checkmarx.eclipse.common.utils.CxLogger; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Adapter class for handling ASCA scan results and converting them into a standardized format. + * + * This class wraps a ASCA {@link ScanResult} instance and provides methods to process and extract + * meaningful scan issues based on ASCA findings detected in the files. + * + * Features: + * - Groups multiple vulnerabilities on the same line + * - Sorts vulnerabilities by severity precedence + * - Filters ignored vulnerabilities (optional) + * - Generates proper unique IDs + * - Tracks location information + * + * Adapted from JetBrains implementation for Eclipse platform. + */ +public class AscaScanResultAdaptor implements ScanResult { + + private static final String LOG_TAG = "[ASCA-ADAPTOR]"; + private static final String MULTIPLE_ISSUES_SUFFIX = " ASCA issues"; + + private final com.checkmarx.ast.asca.ScanResult ascaScanResult; + private final String filePath; + private final List scanIssues; + + /** + * Constructs an instance of AscaScanResultAdaptor with the specified ASCA scan results. + * + * @param ascaScanResult the ASCA scan results to be wrapped + * @param filePath the path of the file being scanned + */ + public AscaScanResultAdaptor(com.checkmarx.ast.asca.ScanResult ascaScanResult, String filePath) { + this.ascaScanResult = ascaScanResult; + this.filePath = filePath; + this.scanIssues = buildIssues(); + } + + @Override + public com.checkmarx.ast.asca.ScanResult getResults() { + return ascaScanResult; + } + + @Override + public List getIssues() { + return scanIssues; + } + + /** + * Builds a list of ScanIssue objects from the ASCA scan results. + * Groups multiple vulnerabilities on the same line and sorts them by severity. + */ + private List buildIssues() { + if (ascaScanResult == null || ascaScanResult.getScanDetails() == null) { + CxLogger.info(LOG_TAG + " No scan results or scan details available"); + return Collections.emptyList(); + } + + List scanDetails = ascaScanResult.getScanDetails(); + if (scanDetails.isEmpty()) { + return Collections.emptyList(); + } + + // Group scan details by line number, then sort by severity precedence + Map> groupedIssues = scanDetails.stream() + .filter(Objects::nonNull) + .collect(Collectors.groupingBy( + ScanDetail::getLine, + Collectors.collectingAndThen(Collectors.toList(), detailsList -> { + detailsList.sort(Comparator.comparingInt(detail -> + getSeverityPrecedence(detail.getSeverity()))); + return detailsList; + }) + )); + + List issues = groupedIssues.values().stream() + .map(this::createScanIssueForGroup) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + CxLogger.info(LOG_TAG + " Converted " + issues.size() + " grouped scan issues for file: " + filePath); + return issues; + } + + /** + * Creates a ScanIssue from a group of ASCA scan details that are on the same line. + * + * @param ascaScanDetails the list of ASCA scan details for the same line (already sorted by severity) + * @return a ScanIssue representing the ASCA finding(s), or null if conversion fails + */ + private ScanIssue createScanIssueForGroup(List ascaScanDetails) { + if (ascaScanDetails == null || ascaScanDetails.isEmpty()) { + return null; + } + + try { + ScanIssue scanIssue = getScanIssue(ascaScanDetails); + + // Add vulnerabilities from all details in the group + for (int i = 0; i < ascaScanDetails.size(); i++) { + ScanDetail detail = ascaScanDetails.get(i); + String vulnerabilityId = (i == 0) ? scanIssue.getScanIssueId() : null; + Vulnerability vuln = createVulnerability(detail, vulnerabilityId); + scanIssue.getVulnerabilities().add(vuln); + } + + // Update title based on actual number of vulnerabilities + updateScanIssueTitleAndLocation(scanIssue, ascaScanDetails); + + CxLogger.info(LOG_TAG + " Created ScanIssue with " + scanIssue.getVulnerabilities().size() + + " vulnerabilities on line " + scanIssue.getProblematicLineNumber()); + return scanIssue; + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to convert scan details group to ScanIssue: " + e.getMessage()); + return null; + } + } + + /** + * Creates a ScanIssue with appropriate title and basic properties from a group of ASCA scan details. + * + * @param ascaScanDetails the list of ASCA scan details (already sorted by severity) + * @return a ScanIssue with basic properties set + */ + private ScanIssue getScanIssue(List ascaScanDetails) { + ScanIssue scanIssue = new ScanIssue(); + ScanDetail firstDetail = ascaScanDetails.get(0); // Highest severity (already sorted) + + // Set title based on whether there are multiple issues on the same line + String title; + if (ascaScanDetails.size() > 1) { + title = ascaScanDetails.size() + MULTIPLE_ISSUES_SUFFIX; + } else { + title = firstDetail.getRuleName(); + } + + scanIssue.setTitle(title); + scanIssue.setDescription(firstDetail.getDescription()); + scanIssue.setSeverity(mapSeverity(firstDetail.getSeverity())); + scanIssue.setFilePath(filePath); + scanIssue.setScanEngine(ScanEngine.ASCA); + scanIssue.setProblematicLineNumber(firstDetail.getLine()); + scanIssue.setRuleId(firstDetail.getRuleID()); + + // Generate unique ID based on line, rule ID, and rule name + String scanIssueId = generateUniqueId(firstDetail); + scanIssue.setScanIssueId(scanIssueId); + + return scanIssue; + } + + /** + * Creates a Vulnerability object from a ASCA scan detail. + * + * @param scanDetail the ASCA scan detail + * @param overrideId optional vulnerability ID to use instead of generating one + * @return a Vulnerability object + */ + private Vulnerability createVulnerability(ScanDetail scanDetail, String overrideId) { + Vulnerability vulnerability = new Vulnerability(); + + // Generate or use provided vulnerability ID + String vulnerabilityId = generateUniqueId(scanDetail); + if (overrideId != null && !overrideId.isBlank()) { + vulnerabilityId = overrideId; + } + + vulnerability.setVulnerabilityId(vulnerabilityId); + vulnerability.setTitle(scanDetail.getRuleName()); + vulnerability.setDescription(scanDetail.getDescription()); + vulnerability.setSeverity(mapSeverity(scanDetail.getSeverity())); + + CxLogger.info(LOG_TAG + " Created vulnerability '" + scanDetail.getRuleName() + + "' with vulnerabilityId '" + vulnerabilityId + "'"); + + return vulnerability; + } + + /** + * Updates the ScanIssue title and location based on vulnerability count and scan details. + */ + private void updateScanIssueTitleAndLocation(ScanIssue scanIssue, List ascaScanDetails) { + // Update title based on actual number of vulnerabilities + if (scanIssue.getVulnerabilities().size() == 1) { + scanIssue.setTitle(scanIssue.getVulnerabilities().get(0).getTitle()); + } else if (scanIssue.getVulnerabilities().size() > 1) { + scanIssue.setTitle(scanIssue.getVulnerabilities().size() + MULTIPLE_ISSUES_SUFFIX); + } + + // Add location information from first detail + ScanDetail firstDetail = ascaScanDetails.get(0); + Location location = new Location(); + location.setLine(firstDetail.getLine()); + scanIssue.getLocations().add(location); + } + + /** + * Maps ASCA severity levels to standardized severity strings. + * + * @param ascaSeverity the ASCA severity level + * @return standardized severity string + */ + private String mapSeverity(String ascaSeverity) { + if (ascaSeverity == null) { + return "Medium"; + } + + switch (ascaSeverity.toLowerCase()) { + case "critical": + return "Critical"; + case "high": + return "High"; + case "medium": + return "Medium"; + case "low": + return "Low"; + case "info": + return "Low"; + default: + return "Medium"; + } + } + + /** + * Get severity precedence for sorting (higher number = higher severity). + */ + private int getSeverityPrecedence(String severity) { + if (severity == null) { + return 3; + } + + switch (severity.toLowerCase()) { + case "critical": + return 5; + case "high": + return 4; + case "medium": + return 3; + case "low": + return 2; + case "info": + return 1; + default: + return 3; + } + } + + /** + * Generates a unique ID for the given scan detail. + */ + private String generateUniqueId(ScanDetail scanDetail) { + if (scanDetail != null) { + return DevAssistUtils.generateUniqueId( + scanDetail.getLine(), + scanDetail.getRuleID() + scanDetail.getRuleName(), + scanDetail.getFileName()); + } + return ScanEngine.ASCA.name(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScannerCommand.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScannerCommand.java new file mode 100644 index 00000000..2c996b92 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScannerCommand.java @@ -0,0 +1,54 @@ +package com.checkmarx.eclipse.devassist.scanners.asca; + +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerCommand; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.IDocument; + +/** + * ASCA Scanner Command that manages the lifecycle of ASCA realtime scanning. + * Integrates with the scanner registry system to handle enabling/disabling of ASCA scanning. + */ +public class AscaScannerCommand extends BaseScannerCommand { + + public AscaScannerService ascaScannerService; + private static final String LOG_TAG = "[ASCA-COMMAND]"; + + /** + * Create an ASCA scanner command for a project. + * + * @param project Eclipse project + */ + public AscaScannerCommand(IProject project) { + super(project, AscaScannerService.createConfig()); + this.ascaScannerService = new AscaScannerService(project); + CxLogger.info(LOG_TAG + " Created for project: " + project.getName()); + } + + @Override + public void initializeScanner() { + CxLogger.info(LOG_TAG + " Initialized for real-time scanning"); + } + + /** + * Perform an ASCA scan on a file. + * + * @param filePath File path to scan + * @param document Document content + * @return Scan result + */ + public ScanResult scan(String filePath, IDocument document) { + return ascaScannerService.scanWithDocument(filePath, document); + } + + @Override + public void dispose() { + try { + ascaScannerService.close(); + CxLogger.info(LOG_TAG + " Disposed for project: " + project.getName()); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error disposing: " + e.getMessage()); + } + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScannerService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScannerService.java new file mode 100644 index 00000000..c507d54c --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/asca/AscaScannerService.java @@ -0,0 +1,351 @@ +package com.checkmarx.eclipse.devassist.scanners.asca; + +import com.checkmarx.ast.asca.ScanResult; +import com.checkmarx.ast.wrapper.CxException; +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerService; +import com.checkmarx.eclipse.devassist.common.ScannerConfig; +import com.checkmarx.eclipse.devassist.factory.CxWrapperFactory; +import com.checkmarx.eclipse.devassist.utils.DevAssistConstants; +import com.checkmarx.eclipse.devassist.utils.ScanEngine; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * ASCA (Application Source Code Analysis) scanner service. + * + * Scans source code files for vulnerabilities using the CxWrapper. Includes + * comprehensive file handling, temporary file management with security checks, + * and proper error handling. + * + * Adapted from JetBrains implementation for Eclipse platform. + */ +public class AscaScannerService extends BaseScannerService { + + private static final String LOG_TAG = "[ASCA-SERVICE]"; + private static final String ASCA_DIR = "CxASCA"; + private static final Object SCAN_LOCK = new Object(); + + public AscaScannerService(IProject project) { + super(project, createConfig()); + } + + /** + * Create default ASCA scanner configuration. + */ + public static ScannerConfig createConfig() { + return ScannerConfig.builder() + .engineName(ScanEngine.ASCA.name()) + .configSection(DevAssistConstants.ASCA_REALTIME_SCANNER) + .activateKey(DevAssistConstants.ACTIVATE_ASCA_REALTIME_SCANNER) + .enabledMessage(DevAssistConstants.ASCA_REALTIME_SCANNER_START) + .disabledMessage(DevAssistConstants.ASCA_REALTIME_SCANNER_DISABLED) + .errorMessage(DevAssistConstants.ERROR_ASCA_REALTIME_SCANNER) + .build(); + } + + @Override + protected boolean isFileTypeSupported(String filePath) { + if (filePath == null) { + return false; + } + + String lowerPath = filePath.toLowerCase(); + for (String ext : DevAssistConstants.ASCA_SUPPORTED_EXTENSIONS) { + if (lowerPath.endsWith("." + ext)) { + return true; + } + } + return false; + } + + @Override + public com.checkmarx.eclipse.devassist.common.ScanResult scan(String filePath) { + IDocument liveDocument = com.checkmarx.eclipse.devassist.utils.DevAssistUtils.getLiveDocumentForFile(filePath); + com.checkmarx.eclipse.devassist.common.ScanResult result = scanWithDocument(filePath, + liveDocument != null ? liveDocument : new Document()); + return (com.checkmarx.eclipse.devassist.common.ScanResult) (com.checkmarx.eclipse.devassist.common.ScanResult) result; + } + + /** + * Primary scan method - gets file content and executes scan. + */ + public com.checkmarx.eclipse.devassist.common.ScanResult scanWithDocument(String filePath, IDocument document) { + return scanInternal(filePath, document, project); + } + + @Override + public void close() throws Exception { + // No resources to close + } + + private com.checkmarx.eclipse.devassist.common.ScanResult scanInternal(String filePath, IDocument document, IProject proj) { + if (!shouldScanFile(filePath)) { + return null; + } + try { + // Get file content from document or file system + String fileContent = getFileContent(filePath, document); + if (fileContent == null) { + CxLogger.warning(LOG_TAG + " Could not read file content: " + filePath); + return null; + } + // Run ASCA scan with proper temp file management + Object rawResults = runAscaScan(filePath, fileContent); + if (rawResults == null) { + return null; + } + return new AscaScanResultAdaptor((com.checkmarx.ast.asca.ScanResult) rawResults, filePath); + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Scan failed: " + e.getMessage(), e); + return null; + } + } + + /** + * Get file content from document (if available) or from file system. + */ + + private String getFileContent(String filePath, IDocument document) { + // 1. Try reading from the in-memory document buffer first + if (document != null) { + String content = document.get(); + if (content != null && !content.isEmpty()) { + return content; + } + } + if (filePath == null || filePath.isBlank()) { + return null; + } + // 2. Try resolving filesystem location via Workspace without taking workspace + // locks + java.nio.file.Path nioPath = null; + try { + org.eclipse.core.runtime.IPath eclipsePath = new org.eclipse.core.runtime.Path(filePath); + IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(eclipsePath); + + if (file != null && file.getLocation() != null) { + // Get direct OS filesystem path from IFile (prevents blocking + // file.getContents() lock) + nioPath = file.getLocation().toFile().toPath(); + } + } catch (Exception e) { + // Fallback if path isn't a valid workspace path + } + if (nioPath == null) { + try { + nioPath = java.nio.file.Paths.get(filePath); + } catch (Exception e) { + return null; + } + } + // 3. Perform standard Java NIO read on physical path (Interrupt-safe) + try { + if (java.nio.file.Files.exists(nioPath) && java.nio.file.Files.isRegularFile(nioPath)) { + return java.nio.file.Files.readString(nioPath, java.nio.charset.StandardCharsets.UTF_8); + } + } catch (java.io.IOException e) { + CxLogger.warning(LOG_TAG + " Failed to read file content from disk: " + e.getMessage()); + } catch (Exception e) { + if (e instanceof InterruptedException || e.getCause() instanceof InterruptedException) { + // Restore interrupted flag without failing the application + Thread.currentThread().interrupt(); + CxLogger.warning(LOG_TAG + " File reading interrupted for: " + filePath); + } else { + CxLogger.warning(LOG_TAG + " Unexpected error reading file: " + e.getMessage()); + } + } + return null; + } + + /** + * Run ASCA scan with synchronized temp file management. Ensures temp files are + * properly created and cleaned up. + */ + private Object runAscaScan(String filePath, String fileContent) { + synchronized (SCAN_LOCK) { + String tempFilePath = saveTempFile(Paths.get(filePath).getFileName().toString(), fileContent); + if (tempFilePath == null) { + CxLogger.warning(LOG_TAG + " Failed to create temporary file"); + return null; + } + + try { + CxLogger.info(LOG_TAG + " Starting ASCA scan: " + filePath); + String ignoreFilePath = getIgnoreFilePath(); + Object scanResult = executeAscaScanner(tempFilePath, ignoreFilePath); + CxLogger.info(LOG_TAG + " ASCA scan completed"); + return scanResult; + } finally { + deleteFile(tempFilePath); + } + } + } + + /** + * Execute ASCA scan using CxWrapperFactory. + */ + private Object executeAscaScanner(String filePath, String ignoreFilePath) { + try { + return scanAscaFile(filePath, true, "Eclipse", ignoreFilePath); + } catch (Exception e) { + CxLogger.error(LOG_TAG + " ASCA scan error: " + e.getMessage(), e); + return null; + } + } + + /** + * Get ignore file path for ASCA scanning. + * Returns empty string by default - can be extended to read from .checkmarxIgnored file. + */ + private String getIgnoreFilePath() { + return ""; + } + + /** + * Get secure temporary directory with validation. Prevents directory traversal + * attacks. + */ + private Path getSecureTempDirectory() throws SecurityException { + try { + String tempOSPath = System.getProperty("java.io.tmpdir"); + if (tempOSPath == null || tempOSPath.trim().isEmpty()) { + throw new SecurityException("System temp directory not available"); + } + + Path baseTempDir = Paths.get(tempOSPath).toAbsolutePath().normalize(); + + if (!Files.exists(baseTempDir) || !Files.isDirectory(baseTempDir)) { + throw new SecurityException("System temp directory not valid: " + baseTempDir); + } + + Path ascaTempDir = baseTempDir.resolve(ASCA_DIR).normalize(); + + // Security check: ensure ASCA dir is within system temp + if (!ascaTempDir.startsWith(baseTempDir)) { + throw new SecurityException("ASCA temp directory outside system temp"); + } + + return ascaTempDir; + + } catch (Exception e) { + throw new SecurityException("Failed to create secure temp directory", e); + } + } + + private String saveTempFile(String fileName, String fileContent) { + try { + // Get secure temp directory + Path tempDir = getSecureTempDirectory(); + createTempFolder(tempDir); + + // Sanitize fileName to prevent directory traversal attacks + String sanitizedFileName = sanitizeFileName(fileName); + + // Create secure path with normalization + Path tempFilePath = tempDir.resolve(sanitizedFileName).normalize(); + + // Security check: ensure the resolved path is still within the temp directory + if (!tempFilePath.startsWith(tempDir)) { + return null; + } + + Files.write(tempFilePath, fileContent.getBytes()); + return tempFilePath.toAbsolutePath().toString(); + } catch (SecurityException e) { + return null; + } catch (IOException e) { + return null; + } + } + + + /** + * Sanitize file name to prevent directory traversal attacks. + */ + private String sanitizeFileName(String fileName) { + if (fileName == null || fileName.trim().isEmpty()) { + return "temp_asca.tmp"; + } + + // Remove path separators and dangerous characters + String sanitized = fileName.replaceAll("[/\\\\:*?\"<>|]", "_").replaceAll("\\.\\.+", ".") // Replace multiple + // dots + .trim(); + + if (sanitized.isEmpty() || sanitized.equals(".") || sanitized.equals("..")) { + sanitized = "temp_asca.tmp"; + } + + // Limit length for filesystem compatibility + if (sanitized.length() > 200) { + String extension = ""; + int lastDot = sanitized.lastIndexOf('.'); + if (lastDot > 0) { + extension = sanitized.substring(lastDot); + sanitized = sanitized.substring(0, Math.min(200 - extension.length(), lastDot)); + } else { + sanitized = sanitized.substring(0, 200); + } + sanitized = sanitized + extension; + } + + return sanitized; + } + + /** + * Delete temporary file with security checks. + */ + private void deleteFile(String filePath) { + if (filePath == null || filePath.trim().isEmpty()) { + return; + } + + try { + Path path = Paths.get(filePath).toAbsolutePath().normalize(); + Path tempDir = getSecureTempDirectory(); + + // Security check: only delete files in temp directory + if (!path.startsWith(tempDir)) { + CxLogger.warning(LOG_TAG + " Security violation: file outside temp: " + filePath); + return; + } + + Files.deleteIfExists(path); + CxLogger.info(LOG_TAG + " Temporary file deleted: " + path); + + } catch (SecurityException e) { + CxLogger.error(LOG_TAG + " Security error deleting file: " + e.getMessage(), e); + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to delete temp file: " + filePath); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Unexpected error deleting temp file: " + e.getMessage()); + } + } + + + private com.checkmarx.ast.asca.ScanResult scanAscaFile(String path, boolean ascaLatestVersion, String agent, + String ignoreFilePath) throws IOException, CxException, InterruptedException { + com.checkmarx.ast.asca.ScanResult scanResult = null; + try { + scanResult = CxWrapperFactory.build().ScanAsca(path, ascaLatestVersion, agent, null); + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (CxException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return scanResult; + } + +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScanResultAdaptor.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScanResultAdaptor.java new file mode 100644 index 00000000..e86f696e --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScanResultAdaptor.java @@ -0,0 +1,175 @@ +package com.checkmarx.eclipse.devassist.scanners.containers; + +import com.checkmarx.ast.containersrealtime.ContainersRealtimeImage; +import com.checkmarx.ast.containersrealtime.ContainersRealtimeResults; +import com.checkmarx.ast.containersrealtime.ContainersRealtimeVulnerability; +import com.checkmarx.ast.realtime.RealtimeLocation; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.model.Location; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.Vulnerability; +import com.checkmarx.eclipse.devassist.utils.DevAssistUtils; +import com.checkmarx.eclipse.common.utils.CxLogger; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * Adaptor for Container image scan results in Eclipse. + * + * Converts typed container vulnerability data (ContainersRealtimeResults) into + * standardized ScanIssue, Vulnerability, and Location objects. + */ +public class ContainerScanResultAdaptor implements ScanResult { + + private static final String LOG_TAG = "[CONTAINER-ADAPTOR]"; + + private static final String MALICIOUS_RISK_CONTAINER = "Container image contains malicious risk dependencies or configuration."; + private static final String CRITICAL_RISK_CONTAINER = "Container image contains critical severity security vulnerabilities."; + private static final String HIGH_RISK_CONTAINER = "Container image contains high severity security vulnerabilities."; + private static final String MEDIUM_RISK_CONTAINER = "Container image contains medium severity security vulnerabilities."; + private static final String LOW_RISK_CONTAINER = "Container image contains low severity security vulnerabilities."; + + private final ContainersRealtimeResults containersRealtimeResults; + private final String fileType; + private final String filePath; + private final List scanIssues; + + /** + * Constructs an instance of ContainerScanResultAdaptor with typed Container real-time results. + * + * @param containersRealtimeResults the container real-time scan results from AST SDK + * @param fileType the file extension/type (e.g., "dockerfile") + * @param filePath the project-relative or absolute file path + */ + public ContainerScanResultAdaptor(ContainersRealtimeResults containersRealtimeResults, String fileType, String filePath) { + this.containersRealtimeResults = containersRealtimeResults; + this.fileType = fileType; + this.filePath = filePath; + this.scanIssues = buildIssues(); + } + + @Override + public ContainersRealtimeResults getResults() { + return containersRealtimeResults; + } + + @Override + public List getIssues() { + return scanIssues; + } + + /** + * Processes images obtained from the scan results and converts them into standardized scan issues. + */ + public List buildIssues() { + List images = Objects.nonNull(getResults()) ? getResults().getImages() : null; + if (Objects.isNull(images) || images.isEmpty()) { + return Collections.emptyList(); + } + return images.stream() + .map(this::createScanIssue) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * Creates a ScanIssue object based on the provided ContainersRealtimeImage. + */ + private ScanIssue createScanIssue(ContainersRealtimeImage containersImageObj) { + try { + ScanIssue scanIssue = new ScanIssue(); + scanIssue.setScanEngine(ScanEngine.CONTAINERS); + scanIssue.setTitle(containersImageObj.getImageName()); + scanIssue.setImageTag(containersImageObj.getImageTag()); + scanIssue.setSeverity(DevAssistUtils.normalizeSeverity(containersImageObj.getStatus())); + scanIssue.setFileType(this.fileType); + scanIssue.setFilePath(this.filePath); + + if (Objects.nonNull(containersImageObj.getLocations()) && !containersImageObj.getLocations().isEmpty()) { + containersImageObj.getLocations().forEach(location -> + scanIssue.getLocations().add(createLocation(location))); + } + + if (Objects.nonNull(containersImageObj.getVulnerabilities()) && !containersImageObj.getVulnerabilities().isEmpty()) { + containersImageObj.getVulnerabilities().forEach(vulnerability -> + scanIssue.getVulnerabilities().add(createVulnerability(vulnerability))); + } + + scanIssue.setScanIssueId(getUniqueId(scanIssue)); + + int line = !scanIssue.getLocations().isEmpty() ? scanIssue.getLocations().get(0).getLine() : 1; + scanIssue.setProblematicLineNumber(line); + + return scanIssue; + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error creating scan issue for image " + containersImageObj.getImageName() + ": " + e.getMessage()); + return null; + } + } + + /** + * Creates a Vulnerability instance based on the provided ContainersRealtimeVulnerability. + */ + private Vulnerability createVulnerability(ContainersRealtimeVulnerability vulnerabilityObj) { + Vulnerability vulnerability = new Vulnerability(); + vulnerability.setCve(vulnerabilityObj.getCve()); + vulnerability.setDescription(this.getDescription(vulnerabilityObj.getSeverity())); + vulnerability.setSeverity(DevAssistUtils.normalizeSeverity(vulnerabilityObj.getSeverity())); + return vulnerability; + } + + /** + * Maps severity string into standard risk description text for container vulnerabilities. + */ + private String getDescription(String severity) { + if (Objects.isNull(severity) || severity.isEmpty()) { + return severity; + } + String normalized = severity.toUpperCase(); + switch (normalized) { + case "MALICIOUS": + return MALICIOUS_RISK_CONTAINER; + case "CRITICAL": + return CRITICAL_RISK_CONTAINER; + case "HIGH": + return HIGH_RISK_CONTAINER; + case "MEDIUM": + return MEDIUM_RISK_CONTAINER; + case "LOW": + return LOW_RISK_CONTAINER; + default: + return severity; + } + } + + /** + * Creates a Location object based on the provided RealtimeLocation. + * Note: Adjusts zero-based line numbers from scan results to one-based line numbers. + */ + private Location createLocation(RealtimeLocation location) { + int line = getLine(location); + int startIndex = location.getStartIndex(); + int endIndex = location.getEndIndex(); + return new Location(line, startIndex, endIndex); + } + + /** + * Retrieves the line number from the given RealtimeLocation object and increments it by 1. + */ + private int getLine(RealtimeLocation location) { + return location.getLine() + 1; + } + + /** + * Generates a unique ID for the given scan issue. + */ + private String getUniqueId(ScanIssue scanIssue) { + int line = (Objects.nonNull(scanIssue.getLocations()) && !scanIssue.getLocations().isEmpty()) + ? scanIssue.getLocations().get(0).getLine() : 0; + return DevAssistUtils.generateUniqueId(line, scanIssue.getTitle(), scanIssue.getImageTag()); + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScannerCommand.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScannerCommand.java new file mode 100644 index 00000000..4823b62e --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScannerCommand.java @@ -0,0 +1,109 @@ +package com.checkmarx.eclipse.devassist.scanners.containers; + +import com.checkmarx.ast.containersrealtime.ContainersRealtimeResults; +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerCommand; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.IDocument; + +import java.util.Objects; + +/** + * Container Scanner Command that manages the lifecycle of container realtime scanning in Eclipse. + * Coordinates execution, file eligibility validation, and disposal for a given workspace project. + * Extends BaseScannerCommand for consistent registration lifecycle. + */ +public class ContainerScannerCommand extends BaseScannerCommand { + + private static final String LOG_TAG = "[CONTAINER-COMMAND]"; + + private final ContainerScannerService containerScannerService; + private boolean isInitialized = false; + + /** + * Main constructor for initializing the command with a project. + * + * @param project the Eclipse project instance + */ + public ContainerScannerCommand(IProject project) { + this(project, new ContainerScannerService(project)); + } + + /** + * Dependency injection constructor (useful for unit testing or custom service setup). + * + * @param project the Eclipse project instance + * @param containerScannerService custom or pre-configured scanner service + */ + public ContainerScannerCommand(IProject project, ContainerScannerService containerScannerService) { + super(project, ContainerScannerService.createConfig()); + this.containerScannerService = containerScannerService; + CxLogger.info(LOG_TAG + " Created for project: " + project.getName()); + } + + /** + * Initializes the scanner, invoked when scanner is registered. + */ + @Override + public void initializeScanner() { + if (!isInitialized) { + this.isInitialized = true; + String projectName = Objects.nonNull(project) ? project.getName() : "Unknown"; + CxLogger.info(LOG_TAG + " Container Scanner Command initialized for project: " + projectName); + } + } + + /** + * Evaluates whether the specified file path is eligible for a Container scan + * (Dockerfiles, Docker Compose, or Helm charts). + * + * @param filePath project-relative or absolute file path + * @return true if the file should be scanned, false otherwise + */ + public boolean shouldScan(String filePath) { + return containerScannerService.shouldScanFile(filePath); + } + + /** + * Triggers a Container Realtime scan for the specified file path and active document. + * + * @param filePath absolute path to the file being scanned + * @param document the open Eclipse IDocument buffer (or null if scanning directly from disk) + * @return strongly typed ScanResult containing ContainersRealtimeResults and converted ScanIssues + */ + public ScanResult scan(String filePath, IDocument document) { + if (!shouldScan(filePath)) { + return null; + } + return containerScannerService.scan(filePath, document, project); + } + + /** + * Returns the underlying ContainerScannerService instance. + * + * @return the active ContainerScannerService + */ + public ContainerScannerService getScannerService() { + return containerScannerService; + } + + /** + * Disposes underlying resources and cleans up temporary structures. + * Automatically called when the project or plugin context is closed/unloaded. + */ + @Override + public void dispose() { + try { + if (containerScannerService != null) { + containerScannerService.close(); + } + this.isInitialized = false; + String projectName = Objects.nonNull(project) ? project.getName() : "Unknown"; + CxLogger.info(LOG_TAG + " Container Scanner Command disposed for project: " + projectName); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error disposing Container Scanner Command: " + e.getMessage()); + } + super.dispose(); + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScannerService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScannerService.java new file mode 100644 index 00000000..7b5ef919 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/containers/ContainerScannerService.java @@ -0,0 +1,296 @@ +package com.checkmarx.eclipse.devassist.scanners.containers; + +import com.checkmarx.ast.containersrealtime.ContainersRealtimeResults; +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerService; +import com.checkmarx.eclipse.devassist.utils.DevAssistUtils; +import com.checkmarx.eclipse.devassist.common.ScannerConfig; +import com.checkmarx.eclipse.devassist.factory.CxWrapperFactory; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.utils.DevAssistConstants; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.IDocument; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.LocalTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Container image scanner service for Eclipse. + * + * Handles file detection (Docker, Docker Compose, Helm), secure temporary folder management, + * and direct invocation of Checkmarx Container Realtime scanning via CxWrapperFactory. + */ +public class ContainerScannerService extends BaseScannerService { + + private static final String LOG_TAG = "[CONTAINER-SERVICE]"; + private static final String CONTAINER_DIR = "CxContainer"; + private static final Object SCAN_LOCK = new Object(); + + private static final List CONTAINERS_FILE_PATTERNS = List.of( + "**/dockerfile*", + "**/*.containerfile", + "**/*.image", + "**/docker-compose*.yml", + "**/docker-compose*.yaml" + ); + + private static final List CONTAINER_HELM_EXCLUDED_FILES = List.of( + "chart.yaml", + "chart.yml", + "values.yaml", + "values.yml" + ); + + private String fileType; + + public ContainerScannerService(IProject project) { + super(project, createConfig()); + } + + /** + * Create default Container scanner configuration. + */ + public static ScannerConfig createConfig() { + return ScannerConfig.builder() + .engineName(ScanEngine.CONTAINERS.name()) + .configSection(DevAssistConstants.CONTAINER_REALTIME_SCANNER) + .activateKey(DevAssistConstants.ACTIVATE_CONTAINER_REALTIME_SCANNER) + .enabledMessage(DevAssistConstants.CONTAINER_REALTIME_SCANNER_START) + .disabledMessage(DevAssistConstants.CONTAINER_REALTIME_SCANNER_DISABLED) + .errorMessage(DevAssistConstants.ERROR_CONTAINER_REALTIME_SCANNER) + .build(); + } + + @Override + protected boolean isFileTypeSupported(String filePath) { + return isContainersFilePatternMatching(filePath) || isHelmFile(filePath); + } + + /** + * Checks whether the supplied file path matches container file patterns (Dockerfile, Docker Compose, etc.). + */ + private boolean isContainersFilePatternMatching(String filePath) { + String lowerPath = filePath.toLowerCase(); + List pathMatchers = CONTAINERS_FILE_PATTERNS.stream() + .map(p -> FileSystems.getDefault().getPathMatcher("glob:" + p)) + .collect(Collectors.toList()); + + Path path = Paths.get(lowerPath); + for (PathMatcher pathMatcher : pathMatchers) { + if (pathMatcher.matches(path) || lowerPath.contains("dockerfile")) { + if (DevAssistUtils.isDockerComposeFile(lowerPath)) { + this.fileType = DevAssistUtils.DOCKER_COMPOSE; + } else if (DevAssistUtils.isDockerFile(lowerPath)) { + this.fileType = DevAssistUtils.DOCKERFILE; + } + return true; + } + } + return false; + } + + /** + * Checks whether the supplied file path is part of a Helm chart. + */ + public boolean isHelmFile(String filePath) { + if (filePath == null) { + return false; + } + String lowerPath = filePath.toLowerCase(); + if (DevAssistUtils.isYamlFile(lowerPath)) { + String fileName = Paths.get(filePath).getFileName().toString().toLowerCase(); + if (CONTAINER_HELM_EXCLUDED_FILES.contains(fileName)) { + return false; + } + if (lowerPath.contains("/helm/")) { + this.fileType = DevAssistUtils.HELM; + return true; + } + } + return false; + } + + /** + * Primary scan method. Reads content, creates isolated temporary directory structure, + * executes the container realtime scan, and updates ignored issues. + */ + public ScanResult scan(String filePath, IDocument document, IProject proj) { + if (!shouldScanFile(filePath)) { + return null; + } + + synchronized (SCAN_LOCK) { + String fileContent = getFileContent(filePath, document); + if (fileContent == null || fileContent.isBlank()) { + CxLogger.warning(LOG_TAG + " Could not read or file empty: " + filePath); + return null; + } + + Path tempBaseDir = getSecureTempDirectory(); + Path tempSubFolder = null; + Path tempFilePath = null; + + try { + String fileName = Paths.get(filePath).getFileName().toString(); + String prefix = isHelmFile(filePath) ? "helm-" : fileName + "-"; + String folderName = prefix + generateFileHash(filePath); + + tempSubFolder = tempBaseDir.resolve(folderName).normalize(); + createTempFolder(tempSubFolder); + + tempFilePath = tempSubFolder.resolve(fileName).normalize(); + Files.writeString(tempFilePath, fileContent, StandardCharsets.UTF_8); + + CxLogger.info(LOG_TAG + " Start Container Realtime Scan On File: " + filePath); +// String ignoreFilePath = DevAssistUtils.getIgnoreFilePath(proj != null ? proj : this.project); + + ContainersRealtimeResults scanResults = null; + try { + scanResults = CxWrapperFactory.build().containersRealtimeScan(tempFilePath.toString(), ""); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + updateIgnoredFileDataOnLatestResult(tempFilePath.toString(), proj != null ? proj : this.project, filePath); + + return new ContainerScanResultAdaptor(scanResults, this.fileType, filePath); + + } catch (IOException e) { + CxLogger.error(LOG_TAG + " Container Realtime Scan failed: " + e.getMessage(), e); + } finally { + if (Objects.nonNull(tempSubFolder)) { + deleteTempFolder(tempSubFolder); + } + } + } + return null; + } + + /** + * Re-runs scan without ignore settings to calculate line updates for ignored entries. + */ + private void updateIgnoredFileDataOnLatestResult(String tempFilePath, IProject proj, String filePath) { +// try { +// IgnoreManager ignoreManager = new IgnoreManager(proj); +// if (ignoreManager.hasIgnoredEntries(ScanEngine.CONTAINERS)) { +// CxLogger.info(LOG_TAG + " Performing full scan to update line numbers for ignored packages"); +// ContainersRealtimeResults fullScanResults = CxWrapperFactory.build() +// .containersRealtimeScan(tempFilePath, ""); +// +// if (fullScanResults != null) { +// ContainerScanResultAdaptor fullScanResultAdaptor = new ContainerScanResultAdaptor(fullScanResults, this.fileType, filePath); +// ignoreManager.updateLineNumbersForIgnoredEntries(fullScanResultAdaptor, filePath); +// } +// } +// } catch (Exception e) { +// CxLogger.warning(LOG_TAG + " Exception occurred while updating ignored file line numbers: " + e.getMessage()); +// } + } + + /** + * Reads file content from Eclipse IDocument buffer or disk filesystem. + */ + private String getFileContent(String filePath, IDocument document) { + if (document != null) { + String content = document.get(); + if (content != null && !content.isEmpty()) { + return content; + } + } + + if (filePath == null || filePath.isBlank()) { + return null; + } + + try { + Path nioPath = Paths.get(filePath); + if (Files.exists(nioPath) && Files.isRegularFile(nioPath)) { + return Files.readString(nioPath, StandardCharsets.UTF_8); + } + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to read file content from disk: " + e.getMessage()); + } + return null; + } + + /** + * Generates a unique 16-character hexadecimal hash using SHA-256 for temporary directory names. + */ + private String generateFileHash(String relativePath) { + try { + LocalTime time = LocalTime.now(); + String timeSuffix = String.format("%02d%02d", time.getMinute(), time.getSecond()); + String combined = relativePath + timeSuffix + UUID.randomUUID().toString().substring(0, 5); + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hashBytes = digest.digest(combined.getBytes(StandardCharsets.UTF_8)); + StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + hexString.append(String.format("%02x", b)); + } + return hexString.substring(0, 16); + } catch (NoSuchAlgorithmException e) { + return Integer.toHexString((relativePath + System.currentTimeMillis()).hashCode()); + } + } + + private Path getSecureTempDirectory() { + String tempOSPath = System.getProperty("java.io.tmpdir"); + if (tempOSPath == null || tempOSPath.isBlank()) { + tempOSPath = System.getProperty("user.home"); + } + Path baseTempDir = Paths.get(tempOSPath).toAbsolutePath().normalize(); + return baseTempDir.resolve(CONTAINER_DIR).normalize(); + } + + protected void createTempFolder(Path tempDir) { + if (!Files.exists(tempDir)) { + try { + Files.createDirectories(tempDir); + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to create temp folder: " + e.getMessage()); + } + } + } + + protected void deleteTempFolder(Path path) { + if (path == null || !Files.exists(path)) { + return; + } + try { + Files.walk(path) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + CxLogger.info(LOG_TAG + " Temporary folder deleted: " + path.toAbsolutePath()); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to delete temporary directory: " + e.getMessage()); + } + } + + /** + * Compatibility method matching ScannerService interface. + */ + @Override + public ScanResult scan(String filePath) { + if (!shouldScanFile(filePath)) { + return null; + } + IDocument liveDocument = DevAssistUtils.getLiveDocumentForFile(filePath); + return scan(filePath, liveDocument, project); + } + + @Override + public void close() throws Exception { + // No persistent connections to close + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScanResultAdaptor.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScanResultAdaptor.java new file mode 100644 index 00000000..c1d9f48c --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScanResultAdaptor.java @@ -0,0 +1,254 @@ +package com.checkmarx.eclipse.devassist.scanners.iac; + +import com.checkmarx.ast.iacrealtime.IacRealtimeResults; +import com.checkmarx.ast.realtime.RealtimeLocation; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.model.Location; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.model.Vulnerability; +import com.checkmarx.eclipse.devassist.utils.DevAssistUtils; +import com.checkmarx.eclipse.common.utils.CxLogger; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Adapter class for handling IaC scan results and converting them into a standardized format. + * + * This class wraps an IaC {@link IacRealtimeResults} instance and provides methods to process and extract + * meaningful scan issues based on IaC misconfigurations detected in the files. + * + * Features: + * - Groups multiple misconfigurations on the same line + * - Sorts misconfigurations by severity precedence + * - Generates proper unique IDs + * - Tracks location information + * + * Adapted from JetBrains implementation for Eclipse platform. + */ +public class IacScanResultAdaptor implements ScanResult { + + private static final String LOG_TAG = "[IAC-ADAPTOR]"; + private static final String MULTIPLE_ISSUES_SUFFIX = " IaC misconfigurations"; + + private final IacRealtimeResults iacRealtimeResults; + private final String filePath; + private final List scanIssues; + + public IacScanResultAdaptor(IacRealtimeResults iacRealtimeResults, String filePath) { + this.iacRealtimeResults = iacRealtimeResults; + this.filePath = filePath; + this.scanIssues = buildIssues(); + } + + @Override + public IacRealtimeResults getResults() { + return iacRealtimeResults; + } + + @Override + public List getIssues() { + return scanIssues; + } + + private List buildIssues() { + if (iacRealtimeResults == null || iacRealtimeResults.getResults() == null) { + CxLogger.info(LOG_TAG + " No scan results available"); + return Collections.emptyList(); + } + + List issues = iacRealtimeResults.getResults(); + if (issues.isEmpty()) { + return Collections.emptyList(); + } + + // Group issues by line number, then sort by severity precedence + Map> groupedIssues = issues.stream() + .filter(Objects::nonNull) + .collect(Collectors.groupingBy( + issue -> { + if (issue.getLocations() != null && !issue.getLocations().isEmpty()) { + return issue.getLocations().get(0).getLine(); + } + return 1; + }, + Collectors.collectingAndThen(Collectors.toList(), issuesList -> { + issuesList.sort(Comparator.comparingInt(issue -> + getSeverityPrecedence(issue.getSeverity()))); + return issuesList; + }) + )); + + List scanIssues = groupedIssues.values().stream() + .map(this::createScanIssueForGroup) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + CxLogger.info(LOG_TAG + " Converted " + scanIssues.size() + " grouped scan issues for file: " + filePath); + return scanIssues; + } + + private ScanIssue createScanIssueForGroup(List iacIssues) { + if (iacIssues == null || iacIssues.isEmpty()) { + return null; + } + + try { + ScanIssue scanIssue = getScanIssue(iacIssues); + + // Add vulnerabilities from all issues in the group + for (int i = 0; i < iacIssues.size(); i++) { + IacRealtimeResults.Issue iacIssue = iacIssues.get(i); + String vulnerabilityId = (i == 0) ? scanIssue.getScanIssueId() : null; + Vulnerability vuln = createVulnerability(iacIssue, vulnerabilityId); + scanIssue.getVulnerabilities().add(vuln); + } + + // Update title based on actual number of vulnerabilities + updateScanIssueTitleAndLocation(scanIssue, iacIssues); + + CxLogger.info(LOG_TAG + " Created ScanIssue with " + scanIssue.getVulnerabilities().size() + + " vulnerabilities on line " + scanIssue.getProblematicLineNumber()); + return scanIssue; + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to convert issues group to ScanIssue: " + e.getMessage()); + return null; + } + } + + private ScanIssue getScanIssue(List iacIssues) { + ScanIssue scanIssue = new ScanIssue(); + IacRealtimeResults.Issue firstIssue = iacIssues.get(0); + + int firstLine = 1; + if (firstIssue.getLocations() != null && !firstIssue.getLocations().isEmpty()) { + firstLine = firstIssue.getLocations().get(0).getLine(); + } + + // Set title based on whether there are multiple issues on the same line + String title; + if (iacIssues.size() > 1) { + title = iacIssues.size() + MULTIPLE_ISSUES_SUFFIX; + } else { + title = firstIssue.getTitle(); + } + + scanIssue.setTitle(title); + scanIssue.setDescription(firstIssue.getDescription()); + scanIssue.setSeverity(mapSeverity(firstIssue.getSeverity())); + scanIssue.setFilePath(filePath); + scanIssue.setScanEngine(ScanEngine.IAC); + scanIssue.setProblematicLineNumber(firstLine); + + String scanIssueId = generateUniqueId(firstIssue, firstLine); + scanIssue.setScanIssueId(scanIssueId); + + return scanIssue; + } + + private Vulnerability createVulnerability(IacRealtimeResults.Issue iacIssue, String overrideId) { + Vulnerability vulnerability = new Vulnerability(); + + int firstLine = 1; + if (iacIssue.getLocations() != null && !iacIssue.getLocations().isEmpty()) { + firstLine = iacIssue.getLocations().get(0).getLine(); + } + + String vulnerabilityId = generateUniqueId(iacIssue, firstLine); + if (overrideId != null && !overrideId.isBlank()) { + vulnerabilityId = overrideId; + } + + vulnerability.setVulnerabilityId(vulnerabilityId); + vulnerability.setTitle(iacIssue.getTitle()); + vulnerability.setDescription(iacIssue.getDescription()); + vulnerability.setSeverity(mapSeverity(iacIssue.getSeverity())); + + CxLogger.info(LOG_TAG + " Created vulnerability '" + iacIssue.getTitle() + + "' with vulnerabilityId '" + vulnerabilityId + "'"); + + return vulnerability; + } + + private void updateScanIssueTitleAndLocation(ScanIssue scanIssue, List iacIssues) { + // Update title based on actual number of vulnerabilities + if (scanIssue.getVulnerabilities().size() == 1) { + scanIssue.setTitle(scanIssue.getVulnerabilities().get(0).getTitle()); + } else if (scanIssue.getVulnerabilities().size() > 1) { + scanIssue.setTitle(scanIssue.getVulnerabilities().size() + MULTIPLE_ISSUES_SUFFIX); + } + + // Add location information from issues + for (IacRealtimeResults.Issue iacIssue : iacIssues) { + if (iacIssue.getLocations() != null) { + for (RealtimeLocation loc : iacIssue.getLocations()) { + Location location = new Location(); + location.setLine(loc.getLine()+1); + location.setStartIndex(loc.getStartIndex()); + location.setEndIndex(loc.getEndIndex()); + scanIssue.getLocations().add(location); + } + } + } + + // Ensure at least one location + if (scanIssue.getLocations().isEmpty()) { + Location location = new Location(); + location.setLine(scanIssue.getProblematicLineNumber()); + scanIssue.getLocations().add(location); + } + } + + private String mapSeverity(String severity) { + if (severity == null) { + return "Medium"; + } + + switch (severity.toLowerCase()) { + case "critical": + return "Critical"; + case "high": + return "High"; + case "medium": + return "Medium"; + case "low": + return "Low"; + case "info": + return "Low"; + default: + return "Medium"; + } + } + + private int getSeverityPrecedence(String severity) { + if (severity == null) { + return 3; + } + + switch (severity.toLowerCase()) { + case "critical": + return 5; + case "high": + return 4; + case "medium": + return 3; + case "low": + return 2; + case "info": + return 1; + default: + return 3; + } + } + + private String generateUniqueId(IacRealtimeResults.Issue iacIssue, int line) { + if (iacIssue != null) { + return DevAssistUtils.generateUniqueId( + line, + iacIssue.getSimilarityId() + iacIssue.getTitle(), + filePath); + } + return ScanEngine.IAC.name(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScannerCommand.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScannerCommand.java new file mode 100644 index 00000000..505aec53 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScannerCommand.java @@ -0,0 +1,77 @@ +package com.checkmarx.eclipse.devassist.scanners.iac; + +import com.checkmarx.ast.iacrealtime.IacRealtimeResults; +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerCommand; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.IDocument; + +/** + * Command for coordinating IaC scanner operations. + * + * Manages the lifecycle of IaC realtime scanning in Eclipse, integrating with + * the scanner registry system to handle enabling/disabling of IaC scanning. + * Extends BaseScannerCommand for consistent registration lifecycle. + */ +public class IacScannerCommand extends BaseScannerCommand { + + private static final String LOG_TAG = "[IAC-COMMAND]"; + + private final IacScannerService scannerService; + + public IacScannerCommand(IProject project, IacScannerService scannerService) { + super(project, IacScannerService.createConfig()); + this.scannerService = scannerService; + CxLogger.info(LOG_TAG + " Created for project: " + project.getName()); + } + + public IacScannerCommand(IProject project) { + this(project, new IacScannerService(project)); + } + + /** + * Initializes the scanner, invoked when scanner is registered. + * IaC scans are triggered on demand via editor file changes rather than bulk project scans. + */ + @Override + public void initializeScanner() { + CxLogger.info(LOG_TAG + " Initialized for project: " + project.getName()); + } + + /** + * Determines whether a file path should be scanned by the IaC scanner. + * + * @param filePath path to evaluate + * @return {@code true} if the file is an IaC file eligible for scanning + */ + public boolean shouldScan(String filePath) { + return scannerService.shouldScanFile(filePath); + } + + /** + * Executes an IaC scan on a specific file given its document content. + * + * @param filePath path to the file being scanned + * @param document editor document content + * @return ScanResult containing issues found, or null + */ + public ScanResult scan(String filePath, IDocument document) { + return scannerService.scan(filePath, document, project); + } + + /** + * Disposes the scanner and releases associated resources. + * Triggered when project is closed or scanner is unregistered. + */ + @Override + public void dispose() { + try { + scannerService.close(); + CxLogger.info(LOG_TAG + " Disposed for project: " + project.getName()); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error disposing: " + e.getMessage()); + } + super.dispose(); + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScannerService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScannerService.java new file mode 100644 index 00000000..8bd3a1df --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/iac/IacScannerService.java @@ -0,0 +1,322 @@ +package com.checkmarx.eclipse.devassist.scanners.iac; + +import com.checkmarx.ast.iacrealtime.IacRealtimeResults; +import com.checkmarx.ast.wrapper.CxException; +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerService; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.common.ScannerConfig; +import com.checkmarx.eclipse.devassist.factory.CxWrapperFactory; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.utils.DevAssistUtils; +import com.checkmarx.eclipse.devassist.utils.DevAssistConstants; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.apache.commons.lang3.tuple.Pair; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.LocalTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Realtime IaC scanner service for Eclipse. + * + * Manages temporary folder creation, file hash generation, type extraction + * (Terraform, CloudFormation, Kubernetes, Dockerfile, etc.), execution of + * Checkmarx IaC real-time scans, and updating ignored issue tracking data. + */ +public class IacScannerService extends BaseScannerService { + + private static final String LOG_TAG = "[IAC-SERVICE]"; + private static final String IAC_DIR = "CxIaC"; + private static final String DOCKERFILE = "dockerfile"; + private static final Object SCAN_LOCK = new Object(); + + // Supported glob patterns for IaC files + private static final List IAC_SUPPORTED_PATTERNS = List.of( + "*.tf", "*.tf.json", + "*.yaml", "*.yml", + "*.json", + "Dockerfile", "Dockerfile.*", "*.dockerfile", "dockerfile", "dockerfile.*" + ); + + // Supported extensions for IaC files + private static final Set IAC_FILE_EXTENSIONS = Set.of( + "tf", "tf.json", "yaml", "yml", "json", "dockerfile" + ); + + private String fileType; + + public IacScannerService(IProject project) { + super(project, createConfig()); + } + + /** + * Create default IaC scanner configuration. + */ + public static ScannerConfig createConfig() { + return ScannerConfig.builder() + .engineName(ScanEngine.IAC.name()) + .configSection(DevAssistConstants.IAC_REALTIME_SCANNER) + .activateKey(DevAssistConstants.ACTIVATE_IAC_REALTIME_SCANNER) + .enabledMessage(DevAssistConstants.IAC_REALTIME_SCANNER_START) + .disabledMessage(DevAssistConstants.IAC_REALTIME_SCANNER_DISABLED) + .errorMessage(DevAssistConstants.ERROR_IAC_REALTIME_SCANNER) + .build(); + } + + /** + * Checks if the provided file path corresponds to a supported IaC file. + * Also detects and assigns the appropriate file type (e.g., dockerfile or extension). + */ + @Override + protected boolean isFileTypeSupported(String filePath) { + if (filePath == null || filePath.isBlank()) { + return false; + } + + String lowerPath = filePath.toLowerCase(); + List pathMatchers = IAC_SUPPORTED_PATTERNS.stream() + .map(p -> FileSystems.getDefault().getPathMatcher("glob:" + p)) + .collect(Collectors.toList()); + + Path path = Paths.get(lowerPath); + for (PathMatcher pathMatcher : pathMatchers) { + if (pathMatcher.matches(path.getFileName())) { + fileType = isDockerFile(lowerPath) ? DOCKERFILE : getFileExtension(filePath); + return true; + } + } + + String extension = getFileExtension(filePath); + if (extension == null) { + return false; + } + + fileType = extension.toLowerCase(); + return IAC_FILE_EXTENSIONS.contains(fileType); + } + + @Override + public void close() throws Exception { + // No resources to release + } + + /** + * Primary scan method. Converts editor/document contents to a temporary isolated file + * and executes the real-time IaC scan via CxWrapperFactory. + */ + public ScanResult scan(String filePath, IDocument document, IProject proj) { + if (!shouldScanFile(filePath)) { + return null; + } + + Path tempFolderPath = getSecureTempDirectory(); + Pair saveResult = null; + + synchronized (SCAN_LOCK) { + try { + createTempFolder(tempFolderPath); + + String fileContent = getFileContent(filePath, document); + if (fileContent == null || fileContent.isBlank()) { + CxLogger.warning(LOG_TAG + " No content found in file: " + filePath); + return null; + } + + saveResult = saveTempFiles(tempFolderPath, filePath, fileContent); + if (Objects.nonNull(saveResult)) { + String tempFilePath = saveResult.getLeft().toString(); + CxLogger.info(LOG_TAG + " Start IAC Realtime Scan On File: " + filePath); + + String containerTool = "docker"; +// String ignoreFilePath = getIgnoreFilePath(proj); + + IacRealtimeResults scanResults = null; + try { + scanResults = CxWrapperFactory.build() + .iacRealtimeScan(tempFilePath, containerTool, ""); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if (scanResults == null) { + return null; + } + + IacScanResultAdaptor scanResultAdaptor = new IacScanResultAdaptor(scanResults, filePath); + + // Perform secondary scan to sync updated line numbers for ignored issues if needed +// updateIgnoredFileDataOnLatestResult(tempFilePath, proj, filePath); + + return scanResultAdaptor; + } + } catch (IOException e) { + CxLogger.error(LOG_TAG + " Error executing IaC scanner for " + filePath + ": " + e.getMessage(), e); + } finally { + CxLogger.info(filePath); + if (Objects.nonNull(saveResult)) { + deleteTempFolder(saveResult.getRight()); + } + } + } + return null; + } + + /** + * Compatibility method matching ScannerService interface. + */ + @Override + public ScanResult scan(String filePath) { + if (!shouldScanFile(filePath)) { + return null; + } + IDocument liveDocument = com.checkmarx.eclipse.devassist.utils.DevAssistUtils.getLiveDocumentForFile(filePath); + return scan(filePath, liveDocument != null ? liveDocument : new Document(), project); + } + + /** + * Performs a full scan without passing the ignore file to update line numbers of ignored entries. + */ + private void updateIgnoredFileDataOnLatestResult(String tempFilePath, IProject proj, String filePath) { +// try { +// String ignoreFilePath = getIgnoreFilePath(proj); +// if (ignoreFilePath != null && !ignoreFilePath.isBlank() && new File(ignoreFilePath).exists()) { +// CxLogger.debug(LOG_TAG + " IaC: Performing full scan without ignore file to update line numbers"); +// +// IacRealtimeResults fullScanResults = CxWrapperFactory.build() +// .iacRealtimeScan(tempFilePath, DevAssistUtils.getContainerTool(), ""); +// +// if (fullScanResults != null) { +// IacScanResultAdaptor fullScanResultAdaptor = new IacScanResultAdaptor(fullScanResults, fileType, filePath); +// // Hook for updating ignored line markers if IgnoreManager is active +// } +// } +// } catch (IOException | CxException | InterruptedException e) { +// CxLogger.warning(LOG_TAG + " RTS-IaC: Exception occurred while performing full scan without ignore file: " + e.getMessage()); +// } + } + + /** + * Saves file content to an isolated subfolder inside the temporary directory using a hashed name. + */ + private Pair saveTempFiles(Path tempFolder, String filePath, String fileContent) throws IOException { + String fileName = Paths.get(filePath).getFileName().toString(); + Path tempSubFolder = tempFolder.resolve(fileName + "-" + generateFileHash(fileName)); + return createSubFolderAndSaveFile(tempSubFolder, fileName, fileContent); + } + + /** + * Creates a target subfolder and writes the file content. + */ + private Pair createSubFolderAndSaveFile(Path tempSubFolder, String fileName, String fileContent) throws IOException { + createTempFolder(tempSubFolder); + Path fullTargetPath = tempSubFolder.resolve(fileName); + Files.writeString(fullTargetPath, fileContent, StandardCharsets.UTF_8); + return Pair.of(fullTargetPath, tempSubFolder); + } + + /** + * Generates a 16-character SHA-256 hash derived from the relative file path and timestamp. + */ + private String generateFileHash(String relativePath) { + try { + LocalTime time = LocalTime.now(); + String timeSuffix = String.format("%02d%02d", time.getMinute(), time.getSecond()); + String combined = relativePath + timeSuffix; + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hashBytes = digest.digest(combined.getBytes(StandardCharsets.UTF_8)); + StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + hexString.append(String.format("%02x", b)); + } + return hexString.substring(0, 16); + } catch (NoSuchAlgorithmException e) { + return Integer.toHexString((relativePath + System.currentTimeMillis()).hashCode()); + } + } + + private Path getSecureTempDirectory() { + String tempOSPath = System.getProperty("java.io.tmpdir"); + return Paths.get(tempOSPath, IAC_DIR).toAbsolutePath().normalize(); + } + + protected void createTempFolder(Path tempDir) { + if (!Files.exists(tempDir)) { + try { + Files.createDirectories(tempDir); + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to create temp folder: " + e.getMessage()); + } + } + } + + protected void deleteTempFolder(Path tempDir) { + if (tempDir == null || !Files.exists(tempDir)) { + return; + } + try (var stream = Files.walk(tempDir)) { + stream.sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to clean up temp folder: " + e.getMessage()); + } + } + + private String getFileContent(String filePath, IDocument document) { + if (document != null) { + String content = document.get(); + if (content != null && !content.isEmpty()) { + return content; + } + } + + if (filePath == null || filePath.isBlank()) { + return null; + } + + try { + Path nioPath = Paths.get(filePath); + if (Files.exists(nioPath) && Files.isRegularFile(nioPath)) { + return Files.readString(nioPath, StandardCharsets.UTF_8); + } + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to read file content from disk: " + e.getMessage()); + } + return null; + } + + private boolean isDockerFile(String filePath) { + String fileName = Paths.get(filePath).getFileName().toString().toLowerCase(); + return fileName.contains("dockerfile"); + } + + private String getFileExtension(String filePath) { + if (filePath == null) { + return null; + } + int lastDot = filePath.lastIndexOf('.'); + if (lastDot > 0 && lastDot < filePath.length() - 1) { + return filePath.substring(lastDot + 1).toLowerCase(); + } + return null; + } + +// private String getIgnoreFilePath(IProject proj) { +// try { +// return DevAssistUtils.getIgnoreFilePath(proj); +// } catch (Exception e) { +// return ""; +// } +// } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScanResultAdaptor.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScanResultAdaptor.java new file mode 100644 index 00000000..add85055 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScanResultAdaptor.java @@ -0,0 +1,196 @@ +package com.checkmarx.eclipse.devassist.scanners.oss; + +import com.checkmarx.ast.ossrealtime.OssRealtimeResults; +import com.checkmarx.ast.ossrealtime.OssRealtimeScanPackage; +import com.checkmarx.ast.ossrealtime.OssRealtimeVulnerability; +import com.checkmarx.ast.realtime.RealtimeLocation; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.model.Location; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.Vulnerability; +import com.checkmarx.eclipse.devassist.utils.DevAssistUtils; +import com.checkmarx.eclipse.common.utils.CxLogger; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * Adaptor class for handling OSS scan results and converting them into a standardized format + * using the {@link ScanResult} interface. + * + * This class wraps an {@link OssRealtimeResults} instance and provides methods to process and extract + * meaningful scan issues based on vulnerabilities detected in the packages. + * + * Adapted from JetBrains implementation for Eclipse platform. + */ +public class OssScanResultAdaptor implements ScanResult { + + private static final String LOG_TAG = "[OSS-ADAPTOR]"; + + private final OssRealtimeResults ossRealtimeResults; + private final String filePath; + private final List scanIssues; + + /** + * Constructs an instance of {@code OssScanResultAdaptor} with the specified OSS real-time results. + * + * @param ossRealtimeResults the OSS real-time scan results to be wrapped by this adapter + * @param filePath the path of the file being scanned + */ + public OssScanResultAdaptor(OssRealtimeResults ossRealtimeResults, String filePath) { + this.ossRealtimeResults = ossRealtimeResults; + this.filePath = filePath; + this.scanIssues = buildIssues(); + } + + /** + * Retrieves the raw OSS real-time scan results wrapped by this adapter. + * + * @return an {@link OssRealtimeResults} instance containing the results of the OSS scan + */ + @Override + public OssRealtimeResults getResults() { + return ossRealtimeResults; + } + + /** + * Retrieves a list of scan issues discovered in the OSS real-time scan. + * + * @return a list of {@link ScanIssue} objects representing findings, or an empty list if none + */ + @Override + public List getIssues() { + return scanIssues; + } + + /** + * Builds a list of ScanIssue objects from the OSS scan results. + * Processes packages obtained from scan results into standardized ScanIssue items. + * + * @return a list of ScanIssue objects + */ + private List buildIssues() { + List packages = Objects.nonNull(getResults()) ? getResults().getPackages() : null; + if (Objects.isNull(packages) || packages.isEmpty()) { + CxLogger.info(LOG_TAG + " No scan results or packages available"); + return Collections.emptyList(); + } + + List issues = packages.stream() + .map(this::createScanIssue) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + CxLogger.info(LOG_TAG + " Converted " + issues.size() + " OSS scan issues for file: " + filePath); + return issues; + } + + /** + * Creates a {@link ScanIssue} object based on the provided {@link OssRealtimeScanPackage}. + * + * @param packageObj the package object containing scan findings + * @return a structured {@link ScanIssue} instance + */ + private ScanIssue createScanIssue(OssRealtimeScanPackage packageObj) { + if (packageObj == null) { + return null; + } + + try { + ScanIssue scanIssue = new ScanIssue(); + + scanIssue.setPackageManager(packageObj.getPackageManager()); + scanIssue.setTitle(packageObj.getPackageName()); + scanIssue.setPackageVersion(packageObj.getPackageVersion()); + scanIssue.setScanEngine(ScanEngine.OSS); + scanIssue.setSeverity(DevAssistUtils.normalizeSeverity(packageObj.getStatus())); + scanIssue.setFilePath(this.filePath); + + // Process location information + if (Objects.nonNull(packageObj.getLocations()) && !packageObj.getLocations().isEmpty()) { + packageObj.getLocations().forEach(location -> + scanIssue.getLocations().add(createLocation(location))); + } + + // Process vulnerabilities + if (Objects.nonNull(packageObj.getVulnerabilities()) && !packageObj.getVulnerabilities().isEmpty()) { + packageObj.getVulnerabilities().forEach(vulnerability -> + scanIssue.getVulnerabilities().add(createVulnerability(vulnerability))); + } + + // Set primary problem line based on first location (if available) + int primaryLine = (Objects.nonNull(scanIssue.getLocations()) && !scanIssue.getLocations().isEmpty()) + ? scanIssue.getLocations().get(0).getLine() + : 1; + scanIssue.setProblematicLineNumber(primaryLine); + + // Generate unique ID based on line, package manager + title, and version + scanIssue.setScanIssueId(getUniqueId(scanIssue)); + + return scanIssue; + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to convert package to ScanIssue: " + e.getMessage()); + return null; + } + } + + /** + * Creates a {@link Vulnerability} instance based on the provided {@link OssRealtimeVulnerability}. + * + * @param vulnerabilityObj the OSS vulnerability object + * @return a standardized {@link Vulnerability} object + */ + private Vulnerability createVulnerability(OssRealtimeVulnerability vulnerabilityObj) { + Vulnerability vulnerability = new Vulnerability(); + + vulnerability.setCve(vulnerabilityObj.getCve()); + vulnerability.setTitle(vulnerabilityObj.getCve()); + vulnerability.setDescription(vulnerabilityObj.getDescription()); + vulnerability.setSeverity(DevAssistUtils.normalizeSeverity(vulnerabilityObj.getSeverity())); + vulnerability.setFixVersion(vulnerabilityObj.getFixVersion()); + + return vulnerability; + } + + /** + * Creates a {@link Location} object based on the provided {@link RealtimeLocation}. + * + * @param location the real-time location details + * @return a new {@link Location} instance with 1-based line indexing + */ + private Location createLocation(RealtimeLocation location) { + return new Location(getLine(location), location.getStartIndex(), location.getEndIndex()); + } + + /** + * Adjusts zero-based line numbers from OSS scanner to 1-based line numbers. + * + * @param location the real-time location + * @return 1-based line number + */ + private int getLine(RealtimeLocation location) { + return location.getLine() + 1; + } + + /** + * Generates a unique ID for the given scan issue using line, package identifier, and version. + * + * @param scanIssue the scan issue + * @return unique string identifier + */ + private String getUniqueId(ScanIssue scanIssue) { + int line = (Objects.nonNull(scanIssue.getLocations()) && !scanIssue.getLocations().isEmpty()) + ? scanIssue.getLocations().get(0).getLine() + : 0; + + return DevAssistUtils.generateUniqueId( + line, + scanIssue.getPackageManager() + scanIssue.getTitle(), + scanIssue.getPackageVersion() + ); + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScannerCommand.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScannerCommand.java new file mode 100644 index 00000000..716b5794 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScannerCommand.java @@ -0,0 +1,178 @@ +package com.checkmarx.eclipse.devassist.scanners.oss; + +import java.nio.file.FileSystems; +import java.nio.file.PathMatcher; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceVisitor; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; + +import com.checkmarx.ast.ossrealtime.OssRealtimeResults; +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerCommand; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.problems.ProblemHolderService; +import com.checkmarx.eclipse.devassist.utils.DevAssistConstants; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Command for coordinating OSS scanner operations in Eclipse. + * + * Manages the lifecycle and initialization of OSS scanning: + * - Extends BaseScannerCommand for consistent registration lifecycle + * - Traverses project workspace files recursively upon initialization + * - Executes background job scans on supported manifest files + * - Publishes findings via ProblemHolderService + */ +public class OssScannerCommand extends BaseScannerCommand { + + private static final String LOG_TAG = "[OSS-COMMAND]"; + + public final OssScannerService ossScannerService; + + public OssScannerCommand(IProject project) { + super(project, OssScannerService.createConfig()); + this.ossScannerService = new OssScannerService(project); + CxLogger.info(LOG_TAG + " Created for project: " + project.getName()); + } + + /** + * Initializes the scanner, invoked when scanner is registered. + * Launches a background Eclipse Job to scan all manifest files in the project workspace. + */ + @Override + public void initializeScanner() { + Job scanJob = new Job("Starting Checkmarx OSS Real-time Scan") { + @Override + protected IStatus run(IProgressMonitor monitor) { + monitor.beginTask("Scanning manifest files in project: " + project.getName(), IProgressMonitor.UNKNOWN); + scanAllManifestFilesInFolder(monitor); + monitor.done(); + return Status.OK_STATUS; + } + }; + scanJob.schedule(); + } + + /** + * Scans all manifest files in the opened project workspace. + * Recursively iterates through project resources (excluding node_modules) + * and triggers an OSS real-time scan on each matching manifest file. + */ + private void scanAllManifestFilesInFolder(IProgressMonitor monitor) { + if (project == null || !project.isOpen()) { + return; + } + + List matchedFiles = new ArrayList<>(); + + List pathMatchers = DevAssistConstants.MANIFEST_FILE_PATTERNS.stream() + .map(p -> FileSystems.getDefault().getPathMatcher("glob:" + p)) + .collect(Collectors.toList()); + + try { + // Recursively traverse project workspace files (equivalent to ProjectRootManager in JetBrains) + project.accept(new IResourceVisitor() { + @Override + public boolean visit(IResource resource) throws CoreException { + if (monitor.isCanceled()) { + return false; + } + + // Skip node_modules folder subtree entirely + if (resource.getType() == IResource.FOLDER && resource.getName().equals("node_modules")) { + return false; + } + + if (resource.getType() == IResource.FILE && resource.exists()) { + IFile file = (IFile) resource; + String path = file.getLocation() != null ? file.getLocation().toOSString() : file.getFullPath().toString(); + + for (PathMatcher matcher : pathMatchers) { + if (matcher.matches(Paths.get(path))) { + matchedFiles.add(file); + break; + } + } + } + return true; + } + }); + } catch (CoreException e) { + CxLogger.error(LOG_TAG + " Exception during workspace traversal for project " + project.getName() + ": " + e.getMessage(), e); + } + + // Execute scan on each discovered manifest file + for (IFile file : matchedFiles) { + if (monitor.isCanceled()) { + break; + } + + String uri = file.getLocation() != null ? file.getLocation().toOSString() : file.getFullPath().toString(); + try { + // Perform OSS scan using service + ScanResult ossRealtimeResults = ossScannerService.scanWithDocument(uri, new Document()); + + if (Objects.isNull(ossRealtimeResults)) { + CxLogger.warning(LOG_TAG + " Scan failed for manifest file: " + uri); + continue; + } + + // Add findings to problem markers + List issues = ossRealtimeResults.getIssues(); + ProblemHolderService.addToCxOneFindings(file, issues); + + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Scan failed for manifest file: " + uri + " with exception: " + e.getMessage()); + } + } + } + + /** + * Check if a file should be scanned by this command. + */ + public boolean shouldScan(String filePath) { + return ossScannerService.shouldScanFile(filePath); + } + + /** + * Execute scan on a file with document content. + */ + public ScanResult scan(String filePath, IDocument document) { + return ossScannerService.scanWithDocument(filePath, document); + } + + /** + * Execute scan on a file path directly. + */ + public ScanResult scan(String filePath) { + return ossScannerService.scan(filePath); + } + + /** + * Disposes the scanner and releases resources. + */ + @Override + public void dispose() { + try { + ossScannerService.close(); + CxLogger.info(LOG_TAG + " Disposed for project: " + project.getName()); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error disposing: " + e.getMessage()); + } + super.dispose(); + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScannerService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScannerService.java new file mode 100644 index 00000000..65180e2b --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/oss/OssScannerService.java @@ -0,0 +1,310 @@ +package com.checkmarx.eclipse.devassist.scanners.oss; + +import com.checkmarx.ast.ossrealtime.OssRealtimeResults; +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerService; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.common.ScannerConfig; +import com.checkmarx.eclipse.devassist.factory.CxWrapperFactory; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.utils.DevAssistConstants; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.LocalTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Realtime OSS manifest scanner service for Eclipse that handles temporary file isolation, + * companion lock file resolution (e.g. package-lock.json), and invocation of the Checkmarx OSS engine. + * + * Adapted to mirror JetBrains scanner service features. + */ +public class OssScannerService extends BaseScannerService { + + private static final String LOG_TAG = "[OSS-SERVICE]"; + private static final String OSS_DIR = "CxOSS"; + private static final Object SCAN_LOCK = new Object(); + + public OssScannerService(IProject project) { + super(project, createConfig()); + } + + /** + * Create default OSS scanner configuration. + */ + public static ScannerConfig createConfig() { + return ScannerConfig.builder() + .engineName(ScanEngine.OSS.name()) + .configSection(DevAssistConstants.OSS_REALTIME_SCANNER) + .activateKey(DevAssistConstants.ACTIVATE_OSS_REALTIME_SCANNER) + .enabledMessage(DevAssistConstants.OSS_REALTIME_SCANNER_START) + .disabledMessage(DevAssistConstants.OSS_REALTIME_SCANNER_DISABLED) + .errorMessage(DevAssistConstants.ERROR_OSS_REALTIME_SCANNER) + .build(); + } + + @Override + protected boolean isFileTypeSupported(String filePath) { + if (filePath == null) { + return false; + } + + Path path = Paths.get(filePath); + List pathMatchers = DevAssistConstants.MANIFEST_FILE_PATTERNS.stream() + .map(p -> FileSystems.getDefault().getPathMatcher("glob:" + p)) + .collect(Collectors.toList()); + + for (PathMatcher pathMatcher : pathMatchers) { + if (pathMatcher.matches(path)) { + return true; + } + } + return false; + } + + @Override + public void close() throws Exception { + // No resources to close + } + + @Override + public com.checkmarx.eclipse.devassist.common.ScanResult scan(String filePath) { + IDocument liveDocument = com.checkmarx.eclipse.devassist.utils.DevAssistUtils.getLiveDocumentForFile(filePath); + return scanWithDocument(filePath, liveDocument != null ? liveDocument : new Document()); + } + + /** + * Primary scan method - gets file content, isolates into temp folder with companion files, and executes scan. + */ + public ScanResult scanWithDocument(String filePath, IDocument document) { + if (!shouldScanFile(filePath)) { + return null; + } + + String fileContent = getFileContent(filePath, document); + if (fileContent == null || fileContent.isBlank()) { + CxLogger.warning(LOG_TAG + " Could not read or empty file content: " + filePath); + return null; + } + + Path tempSubFolder = getTempSubFolderPathAsPath(filePath); + + synchronized (SCAN_LOCK) { + try { + createTempFolder(tempSubFolder); + + Optional mainTempPath = saveMainManifestFile(tempSubFolder, filePath, fileContent); + if (mainTempPath.isEmpty()) { + return null; + } + + // Copy companion lock file (e.g., package-lock.json) into temp folder if available + saveCompanionFile(tempSubFolder, filePath); + + CxLogger.info(LOG_TAG + " Starting Realtime OSS Scan on File: " + filePath); + + OssRealtimeResults scanResults = CxWrapperFactory.build().ossRealtimeScan(mainTempPath.get(), ""); + if (scanResults == null) { + return null; + } + + OssScanResultAdaptor scanResultAdaptor = new OssScanResultAdaptor(scanResults, filePath); + + return scanResultAdaptor; + + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Scan failed for file " + filePath + ": " + e.getMessage(), e); + return null; + } finally { + CxLogger.info(LOG_TAG + " Deleting temporary OSS folder"); + deleteTempFolder(tempSubFolder); + } + } + } + + /** + * Performs full scan without passing ignore file to update line numbers of ignored entries. + */ +// private void updateIgnoredFileDataOnLatestResult(String tempFilePath, IProject proj, String filePath) { +// try { +// // Extension point for ignore manager syncing when ignore files are active +// String ignoreFilePath = getIgnoreFilePath(proj); +// if (ignoreFilePath != null && !ignoreFilePath.isBlank() && new File(ignoreFilePath).exists()) { +// CxLogger.info(LOG_TAG + " Performing full scan to update line numbers for ignored packages"); +// OssRealtimeResults fullScanResults = CxWrapperFactory.build().ossRealtimeScan(tempFilePath, ""); +// if (fullScanResults != null && fullScanResults.getPackages() != null) { +// OssScanResultAdaptor fullScanResultAdaptor = new OssScanResultAdaptor(fullScanResults, filePath); +// // Connects with ignore manager line number updater if implemented +// } +// } +// } catch (Exception e) { +// CxLogger.warning(LOG_TAG + " Exception occurred while performing full scan without ignore file: " + e.getMessage()); +// } +// } + + /** + * Persists the main manifest file into the temporary directory for scanning. + */ + private Optional saveMainManifestFile(Path tempSubFolder, String originalFilePath, String fileContent) { + try { + String fileName = Paths.get(originalFilePath).getFileName().toString(); + Path tempFilePath = tempSubFolder.resolve(fileName); + Files.writeString(tempFilePath, fileContent, StandardCharsets.UTF_8); + return Optional.of(tempFilePath.toString()); + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to write main manifest temp file: " + e.getMessage()); + return Optional.empty(); + } + } + + /** + * Copies a companion lock file (e.g., package-lock.json) into the temporary directory + * when it exists alongside the scanned manifest. + */ + private void saveCompanionFile(Path tempFolderPath, String originalFilePath) { + if (originalFilePath == null || originalFilePath.isEmpty() || tempFolderPath == null) { + return; + } + + Path originalPath = Paths.get(originalFilePath); + String parentFileName = originalPath.getFileName().toString(); + String companionFileName = getCompanionFileName(parentFileName); + + if (companionFileName.isEmpty()) { + return; + } + + Path parentPath = originalPath.getParent(); + if (parentPath == null) { + return; + } + + Path companionOriginalPath = parentPath.resolve(companionFileName); + if (!Files.exists(companionOriginalPath)) { + return; + } + + Path companionTempPath = tempFolderPath.resolve(companionFileName); + try { + Files.copy(companionOriginalPath, companionTempPath, StandardCopyOption.REPLACE_EXISTING); + CxLogger.info(LOG_TAG + " Copied companion file: " + companionFileName); + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Error occurred while saving companion file: " + e.getMessage()); + } + } + + /** + * Infers companion lock file name based on manifest file name. + */ + private String getCompanionFileName(String fileName) { + if ("package.json".equalsIgnoreCase(fileName)) { + return "package-lock.json"; + } + if (fileName.toLowerCase().endsWith(".csproj")) { + return "package.lock.json"; + } + return ""; + } + + /** + * Resolves temporary sub-folder path allocated for the file scan. + */ + private Path getTempSubFolderPathAsPath(String filePath) { + String baseTempPath = System.getProperty("java.io.tmpdir"); + Path baseDir = Paths.get(baseTempPath).resolve(OSS_DIR); + String relativePath = Paths.get(filePath).getFileName().toString(); + return baseDir.resolve(toSafeTempFileName(relativePath, filePath)); + } + + /** + * Creates a deterministic, filesystem-safe file name for storing the manifest in the temp directory. + */ + private String toSafeTempFileName(String relativePath, String fullPath) { + String baseName = Paths.get(relativePath).getFileName().toString(); + String hash = generateFileHash(fullPath); + return baseName + "-" + hash; + } + + /** + * Generates a short hash based on the manifest path and current time to avoid collisions. + */ + private String generateFileHash(String relativePath) { + try { + LocalTime time = LocalTime.now(); + String timeSuffix = String.format("%02d%02d", time.getMinute(), time.getSecond()); + String combined = relativePath + timeSuffix + UUID.randomUUID().toString().substring(0, 5); + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hashBytes = digest.digest(combined.getBytes(StandardCharsets.UTF_8)); + StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + hexString.append(String.format("%02x", b)); + } + return hexString.substring(0, 16); + } catch (NoSuchAlgorithmException e) { + return Integer.toHexString((relativePath + System.currentTimeMillis()).hashCode()); + } + } + + protected void createTempFolder(Path tempDir) { + try { + if (!Files.exists(tempDir)) { + Files.createDirectories(tempDir); + } + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to create temporary folder: " + e.getMessage()); + } + } + + protected void deleteTempFolder(Path tempDir) { + if (tempDir == null || !Files.exists(tempDir)) { + return; + } + try (var stream = Files.walk(tempDir)) { + stream.sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to clean up temp folder: " + e.getMessage()); + } + } + + private String getFileContent(String filePath, IDocument document) { + if (document != null) { + String content = document.get(); + if (content != null && !content.isEmpty()) { + return content; + } + } + + if (filePath == null || filePath.isBlank()) { + return null; + } + + try { + Path nioPath = Paths.get(filePath); + if (Files.exists(nioPath) && Files.isRegularFile(nioPath)) { + return Files.readString(nioPath, StandardCharsets.UTF_8); + } + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to read file content from disk: " + e.getMessage()); + } + return null; + } + +// private String getIgnoreFilePath(IProject proj) { +// try { +// return DevAssistUtils.getIgnoreFilePath(proj); +// } catch (Exception e) { +// return ""; +// } +// } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScanResultAdaptor.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScanResultAdaptor.java new file mode 100644 index 00000000..5f908056 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScanResultAdaptor.java @@ -0,0 +1,161 @@ +package com.checkmarx.eclipse.devassist.scanners.secrets; + +import com.checkmarx.ast.realtime.RealtimeLocation; +import com.checkmarx.ast.secretsrealtime.SecretsRealtimeResults; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.model.Location; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.model.Vulnerability; +import com.checkmarx.eclipse.devassist.utils.DevAssistUtils; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * Adapter class for handling Secrets scan results and converting them into a standardized format + * using the {@link ScanResult} interface. + * This class wraps a {@link SecretsRealtimeResults} instance and provides methods to process and extract + * meaningful scan issues based on secrets detected in the files. + */ +public class SecretsScanResultAdaptor implements ScanResult { + + private final SecretsRealtimeResults secretsRealtimeResults; + private final String filePath; + private final List scanIssues; + + /** + * Constructs an instance of {@code SecretsScanResultAdaptor} with the specified Secrets real-time results. + * This adapter allows conversion and processing of Secrets scan results into a standardized format. + * + * @param secretsRealtimeResults the Secrets real-time scan results to be wrapped by this adapter + * @param filePath the path of the scanned file + */ + public SecretsScanResultAdaptor(SecretsRealtimeResults secretsRealtimeResults, String filePath) { + this.secretsRealtimeResults = secretsRealtimeResults; + this.filePath = filePath; + this.scanIssues = buildIssues(); + } + + /** + * Retrieves the Secrets real-time scan results wrapped by this adapter. + * + * @return the Secrets scan results instance containing the results of the Secrets scan + */ + @Override + public SecretsRealtimeResults getResults() { + return secretsRealtimeResults; + } + + /** + * Retrieves a list of scan issues discovered in the Secrets real-time scan. + * + * @return a list of {@code ScanIssue} objects representing the secrets found during the scan + */ + @Override + public List getIssues() { + return scanIssues; + } + + /** + * Retrieves a list of scan issues discovered in the Secrets real-time scan. + * This method processes the secrets obtained from the scan results, + * converts them into standardized scan issues, and returns the list. + * If no secrets are found, an empty list is returned. + * + * @return a list of {@code ScanIssue} objects representing the secrets found during the scan, + * or an empty list if no secrets are detected. + */ + public List buildIssues() { + if (Objects.isNull(getResults())) { + return Collections.emptyList(); + } + + List secrets = getResults().getSecrets(); + if (Objects.isNull(secrets) || secrets.isEmpty()) { + return Collections.emptyList(); + } + + return secrets.stream() + .map(this::createScanIssue) + .collect(Collectors.toList()); + } + + /** + * Creates a {@code ScanIssue} object based on the provided secret result. + * The method processes the secret details and converts them into a structured format to + * represent a scan issue. + * + * @param secret the secret result containing information about the detected secret, + * including its title, severity, description, and locations. + * @return a {@code ScanIssue} object encapsulating the details such as title, scan engine, + * severity, and secret locations derived from the provided secret result. + */ + private ScanIssue createScanIssue(SecretsRealtimeResults.Secret secret) { + ScanIssue scanIssue = new ScanIssue(); + + scanIssue.setTitle(secret.getTitle()); + scanIssue.setScanEngine(ScanEngine.SECRETS); + scanIssue.setSeverity(secret.getSeverity()); + scanIssue.setFilePath(this.filePath); + scanIssue.setDescription(secret.getDescription()); // Set description on ScanIssue for tooltip display + scanIssue.setSecretValue(secret.getSecretValue()); + + // Add locations if available + if (Objects.nonNull(secret.getLocations()) && !secret.getLocations().isEmpty()) { + secret.getLocations().forEach(location -> + scanIssue.getLocations().add(createLocation(location))); + } + + // Fallback location if none are provided by the engine + if (scanIssue.getLocations().isEmpty()) { + Location fallbackLocation = new Location(1, 0, 100); + scanIssue.getLocations().add(fallbackLocation); + } + + // Create vulnerability with secret details + Vulnerability vulnerability = new Vulnerability(); + vulnerability.setTitle(secret.getTitle()); + vulnerability.setDescription(secret.getDescription()); + vulnerability.setSeverity(secret.getSeverity()); + + scanIssue.getVulnerabilities().add(vulnerability); + scanIssue.setScanIssueId(getUniqueId(scanIssue)); + return scanIssue; + } + + /** + * Creates a {@code Location} object based on the provided location information. + * This method extracts the line, start index, and end index from the given + * location and constructs a new {@code Location} instance. + * + * @param location the location containing details such as line, + * start index, and end index for the location. + * @return a new {@code Location} instance with the appropriate line and indices. + */ + private Location createLocation(RealtimeLocation location) { + return new Location(getLine(location), location.getStartIndex(), location.getEndIndex()); + } + + /** + * Retrieves the line number from the given {@code RealtimeLocation} object, increments it by one, and returns the result. + * + * @param location the {@code RealtimeLocation} object containing the original line number + * @return the incremented line number based on the {@code RealtimeLocation}'s line value + * @apiNote Current Secrets scan result line numbers are zero-based, so this method adjusts them to be one-based. + */ + private int getLine(RealtimeLocation location) { + return location.getLine() + 1; + } + + /** + * Generates a unique ID for the given scan issue. + */ + private String getUniqueId(ScanIssue scanIssue) { + int line = (Objects.nonNull(scanIssue.getLocations()) && !scanIssue.getLocations().isEmpty()) + ? scanIssue.getLocations().get(0).getLine() : 0; + return DevAssistUtils.generateUniqueId(line, scanIssue.getTitle(), scanIssue.getDescription()); + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScannerCommand.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScannerCommand.java new file mode 100644 index 00000000..44b395ee --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScannerCommand.java @@ -0,0 +1,53 @@ +package com.checkmarx.eclipse.devassist.scanners.secrets; + +import com.checkmarx.ast.secretsrealtime.SecretsRealtimeResults; +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerCommand; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.IDocument; + +/** + * Command for coordinating Secrets scanner operations. + * Extends BaseScannerCommand for consistent registration lifecycle. + */ +public class SecretsScannerCommand extends BaseScannerCommand { + + private static final String LOG_TAG = "[SECRETS-COMMAND]"; + + private final SecretsScannerService scannerService; + + public SecretsScannerCommand(IProject project) { + super(project, SecretsScannerService.createConfig()); + this.scannerService = new SecretsScannerService(project); + CxLogger.info(LOG_TAG + " Created for project: " + project.getName()); + } + + /** + * Initializes the scanner, invoked when scanner is registered. + */ + @Override + public void initializeScanner() { + // Secrets scanning is triggered on demand via editor file changes + CxLogger.info(LOG_TAG + " Initialized for project: " + project.getName()); + } + + public boolean shouldScan(String filePath) { + return scannerService.shouldScanFile(filePath); + } + + public ScanResult scan(String filePath, IDocument document) { + return scannerService.scan(filePath, document, project); + } + + @Override + public void dispose() { + try { + scannerService.close(); + CxLogger.info(LOG_TAG + " Disposed for project: " + project.getName()); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error disposing: " + e.getMessage()); + } + super.dispose(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScannerService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScannerService.java new file mode 100644 index 00000000..1fba92d4 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/scanners/secrets/SecretsScannerService.java @@ -0,0 +1,300 @@ +package com.checkmarx.eclipse.devassist.scanners.secrets; + +import com.checkmarx.ast.secretsrealtime.SecretsRealtimeResults; +import com.checkmarx.ast.wrapper.CxException; +import com.checkmarx.eclipse.devassist.basescanner.BaseScannerService; +import com.checkmarx.eclipse.devassist.common.ScanResult; +import com.checkmarx.eclipse.devassist.common.ScannerConfig; +import com.checkmarx.eclipse.devassist.factory.CxWrapperFactory; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.utils.DevAssistUtils; +import com.checkmarx.eclipse.devassist.utils.DevAssistConstants; +import com.checkmarx.eclipse.common.utils.CxLogger; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.LocalTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Realtime Secrets scanner service for Eclipse. + * + * Manages temporary directory creation, file hashing, file exclusion filtering, + * execution of Checkmarx Secrets real-time scans via CxWrapperFactory, and updating + * line numbers for ignored secrets. + */ +public class SecretsScannerService extends BaseScannerService { + + private static final String LOG_TAG = "[SECRETS-SERVICE]"; + private static final String SECRETS_DIR = "CxSecrets"; + private static final Object SCAN_LOCK = new Object(); + + // Glob patterns for manifest files that should be excluded from Secrets scanning + private static final List MANIFEST_FILE_PATTERNS = List.of( + "package.json", "pom.xml", "go.mod", "requirements.txt", + "Gemfile", "Cargo.toml", "composer.json", "package-lock.json", "yarn.lock" + ); + + public SecretsScannerService(IProject project) { + super(project, createConfig()); + } + + /** + * Create default Secrets scanner configuration. + */ + public static ScannerConfig createConfig() { + return ScannerConfig.builder() + .engineName(ScanEngine.SECRETS.name()) + .configSection(DevAssistConstants.SECRETS_REALTIME_SCANNER) + .activateKey(DevAssistConstants.ACTIVATE_SECRETS_REALTIME_SCANNER) + .enabledMessage(DevAssistConstants.SECRETS_REALTIME_SCANNER_START) + .disabledMessage(DevAssistConstants.SECRETS_REALTIME_SCANNER_DISABLED) + .errorMessage(DevAssistConstants.ERROR_SECRETS_REALTIME_SCANNER) + .build(); + } + + /** + * Determines whether a file should be excluded from Secrets scanning. + */ + private boolean isExcludedFileForSecretsScanning(String filePath) { + if (filePath == null || filePath.isBlank()) { + return true; + } + + Path path = Paths.get(filePath.toLowerCase()); + List manifestMatchers = MANIFEST_FILE_PATTERNS.stream() + .map(p -> FileSystems.getDefault().getPathMatcher("glob:" + p)) + .collect(Collectors.toList()); + + for (PathMatcher matcher : manifestMatchers) { + if (matcher.matches(path.getFileName())) { + return true; + } + } + + // Exclude Checkmarx ignore list files + String normalized = filePath.replace("\\", "/"); + return normalized.contains("/.checkmarxIgnored") || + normalized.contains("/.checkmarxIgnoredTempList"); + } + + @Override + protected boolean isFileTypeSupported(String filePath) { + return !isExcludedFileForSecretsScanning(filePath); + } + + @Override + public void close() throws Exception { + // No resources to release + } + + /** + * Primary scan method. Converts editor/document contents to an isolated temporary file + * and executes the real-time Secrets scan via CxWrapperFactory. + */ + public ScanResult scan(String filePath, IDocument document, IProject proj) { + if (!shouldScanFile(filePath)) { + return null; + } + + Path tempSubFolder = getTempSubFolderPathAsPath(filePath); + + synchronized (SCAN_LOCK) { + try { + createTempFolder(tempSubFolder); + + String fileContent = getFileContent(filePath, document); + if (fileContent == null || fileContent.isBlank()) { + CxLogger.warning(filePath + " Secrets scanner: file content is empty or unreadable"); + return null; + } + + Optional tempFilePath = saveFileForScanning(tempSubFolder, filePath, fileContent); + if (tempFilePath.isEmpty()) { + CxLogger.warning(LOG_TAG + " Secrets scanner: failed to save file - " + filePath); + return null; + } + + CxLogger.info(LOG_TAG + " Starting scan: " + filePath); +// String ignoreFilePath = getIgnoreFilePath(proj); + + SecretsRealtimeResults scanResults = CxWrapperFactory.build() + .secretsRealtimeScan(tempFilePath.get(), ""); + + if (scanResults == null) { + CxLogger.warning(LOG_TAG + " Secrets scanner: no results returned - " + filePath); + return null; + } + + int secretCount = scanResults.getSecrets() != null ? scanResults.getSecrets().size() : 0; + CxLogger.info(LOG_TAG + " Scan completed: " + filePath + " (" + secretCount + " secrets found)"); + + SecretsScanResultAdaptor scanResultAdaptor = new SecretsScanResultAdaptor(scanResults, filePath); + + // Perform secondary scan to update line numbers for ignored entries if required + updateIgnoredFileDataOnLatestResult(tempFilePath.get(), proj, filePath); + + return scanResultAdaptor; + + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Secrets scanner error for " + filePath + ": " + e.getMessage(), e); + } finally { + CxLogger.warning(LOG_TAG + " Cleaning up temp folder: " + tempSubFolder); + deleteTempFolder(tempSubFolder); + } + } + return null; + } + + /** + * Compatibility method matching ScannerService interface. + */ + @Override + public ScanResult scan(String filePath) { + if (!shouldScanFile(filePath)) { + return null; + } + IDocument liveDocument = com.checkmarx.eclipse.devassist.utils.DevAssistUtils.getLiveDocumentForFile(filePath); + return scan(filePath, liveDocument != null ? liveDocument : new Document(), project); + } + + /** + * Performs a full scan without passing the ignore file to update line numbers of ignored entries. + */ + private void updateIgnoredFileDataOnLatestResult(String tempFilePath, IProject proj, String filePath) { +//// String ignoreFilePath = getIgnoreFilePath(proj); +// if (ignoreFilePath != null && !ignoreFilePath.isBlank() && new File(ignoreFilePath).exists()) { +// CxLogger.warning(LOG_TAG + " Secrets: Performing full scan without ignore file to update line numbers"); +// +// SecretsRealtimeResults fullScanResults = null; +// try { +// fullScanResults = CxWrapperFactory.build() +// .secretsRealtimeScan(tempFilePath, ""); +// } catch (Exception e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// +// if (fullScanResults != null) { +// SecretsScanResultAdaptor fullScanResultAdaptor = new SecretsScanResultAdaptor(fullScanResults, filePath); +// // Hook for updating ignored line markers if IgnoreManager is active +// } +// } + } + + /** + * Resolves a unique subfolder path for storing the temporary file. + */ + private Path getTempSubFolderPathAsPath(String originalFilePath) { + Path baseTempPath = getSecureTempDirectory(); + String safeFileName = toSafeTempFileName(originalFilePath); + return baseTempPath.resolve(safeFileName); + } + + /** + * Creates a deterministic, filesystem-safe file name containing base name and a hash suffix. + */ + private String toSafeTempFileName(String filePath) { + String baseName = Paths.get(filePath).getFileName().toString(); + String hash = generateFileHash(filePath); + return baseName + "-" + hash; + } + + /** + * Generates a 16-character SHA-256 hash derived from the relative file path, timestamp, and UUID. + */ + private String generateFileHash(String relativePath) { + try { + LocalTime time = LocalTime.now(); + String timeSuffix = String.format("%02d%02d", time.getMinute(), time.getSecond()); + String combined = relativePath + timeSuffix + UUID.randomUUID().toString().substring(0, 5); + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hashBytes = digest.digest(combined.getBytes(StandardCharsets.UTF_8)); + StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + hexString.append(String.format("%02x", b)); + } + return hexString.substring(0, 16); + } catch (NoSuchAlgorithmException e) { + return Integer.toHexString((relativePath + System.currentTimeMillis()).hashCode()); + } + } + + /** + * Saves the content into a temporary file inside the target subfolder. + */ + private Optional saveFileForScanning(Path tempSubFolder, String originalFilePath, String fileContent) throws IOException { + String fileName = Paths.get(originalFilePath).getFileName().toString(); + Path tempFilePath = tempSubFolder.resolve(fileName); + Files.writeString(tempFilePath, fileContent, StandardCharsets.UTF_8); + return Optional.of(tempFilePath.toString()); + } + + private Path getSecureTempDirectory() { + String tempOSPath = System.getProperty("java.io.tmpdir"); + return Paths.get(tempOSPath, SECRETS_DIR).toAbsolutePath().normalize(); + } + + protected void createTempFolder(Path tempDir) { + if (!Files.exists(tempDir)) { + try { + Files.createDirectories(tempDir); + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to create temp folder: " + e.getMessage()); + } + } + } + + protected void deleteTempFolder(Path tempDir) { + if (tempDir == null || !Files.exists(tempDir)) { + return; + } + try (var stream = Files.walk(tempDir)) { + stream.sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to clean up temp folder: " + e.getMessage()); + } + } + + private String getFileContent(String filePath, IDocument document) { + if (document != null) { + String content = document.get(); + if (content != null && !content.isEmpty()) { + return content; + } + } + + if (filePath == null || filePath.isBlank()) { + return null; + } + + try { + Path nioPath = Paths.get(filePath); + if (Files.exists(nioPath) && Files.isRegularFile(nioPath)) { + return Files.readString(nioPath, StandardCharsets.UTF_8); + } + } catch (IOException e) { + CxLogger.warning(LOG_TAG + " Failed to read file content from disk: " + e.getMessage()); + } + return null; + } + +// private String getIgnoreFilePath(IProject proj) { +// try { +// return DevAssistUtils.getIgnoreFilePath(proj); +// } catch (Exception e) { +// return ""; +// } +// } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/CxFindingsView.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/CxFindingsView.java new file mode 100644 index 00000000..ccdad4bb --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/CxFindingsView.java @@ -0,0 +1,1595 @@ +package com.checkmarx.eclipse.devassist.ui.findings; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.events.ControlAdapter; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.ui.part.ViewPart; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.preference.PreferenceDialog; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.dialogs.PreferencesUtil; +import org.eclipse.ui.ide.IDE; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.QualifiedName; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.apache.commons.lang3.StringUtils; + +import com.checkmarx.eclipse.devassist.ui.findings.provider.FindingsContentProvider; +import com.checkmarx.eclipse.devassist.ui.findings.provider.FindingsLabelProvider; +import com.checkmarx.eclipse.common.events.SettingsTopics; +import com.checkmarx.eclipse.common.properties.SharedPreferences; +import com.checkmarx.eclipse.devassist.backend.Constants; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.ui.findings.model.ScanDetailWithPath; +import com.checkmarx.eclipse.devassist.model.Location; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.problems.ProblemHolderService; +import com.checkmarx.eclipse.devassist.ui.findings.actions.VulnerabilityFilterAction; +import com.checkmarx.eclipse.devassist.ui.findings.actions.VulnerabilityFilterState; +import com.checkmarx.eclipse.devassist.ui.findings.ignored.IgnoredProblemsStore; +import com.checkmarx.eclipse.devassist.ui.findings.ignored.IgnoredProblemsStore.IgnoredProblemsListener; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Control; + + +/** + * Custom Findings View for displaying Checkmarx scan results. + * Extends {@link ViewPart} to provide a custom view in Eclipse. + * Manages a tree view of vulnerabilities with filtering and navigation capabilities. + * Uses {@link TreeViewer} for flexible tree rendering with custom providers. + */ +public class CxFindingsView extends ViewPart implements IgnoredProblemsListener { + + public static final String ID = "com.checkmarx.eclipse.devassist.ui.findings.CxFindingsView"; + private org.osgi.service.event.EventHandler eventHandler; + private org.osgi.service.event.EventHandler settingsEventHandler; + + private TreeViewer treeViewer; + private Map> currentIssues = new HashMap<>(); + private IgnoredProblemsStore ignoredStore; + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); + public static final Image FINDINGS_PROMOTIONAL_CUBE = createScaledImage("/icons/cx-one-assist-cube.png", 240); + private static final Image CHECKMARX_OPEN_SETTINGS_LOGO = + AbstractUIPlugin.imageDescriptorFromPlugin(Constants.MAIN_PLUGIN_ID, "/icons/checkmarx-80.png").createImage(); + + public CxFindingsView() { + super(); + } + + + @Override + public void createPartControl(Composite parent) { + this.parentComposite = parent; + + // Set a clean 1-column layout on parent + GridLayout parentLayout = new GridLayout(1, true); + parentLayout.marginWidth = 0; + parentLayout.marginHeight = 0; + parentLayout.horizontalSpacing = 0; + parentLayout.verticalSpacing = 0; + parent.setLayout(parentLayout); + + // Always subscribe to events first + subscribeToEventBroker(); + + // Register ignored problems listener + ignoredStore = IgnoredProblemsStore.getInstance(); + ignoredStore.addListener(this); + + // Initial render check + refreshViewMode(); + } + + + /** + * Loads an image and scales it down to the given max width (maintaining aspect ratio) + * if it is larger than that width. + */ + private static Image createScaledImage(String path, int maxWidth) { + Image original = AbstractUIPlugin.imageDescriptorFromPlugin(Constants.MAIN_PLUGIN_ID, path).createImage(); + if (original.getBounds().width <= maxWidth) { + return original; + } + + double scale = (double) maxWidth / original.getBounds().width; + int scaledWidth = maxWidth; + int scaledHeight = (int) Math.round(original.getBounds().height * scale); + + ImageData scaledData = original.getImageData().scaledTo(scaledWidth, scaledHeight); + Image scaledImage = new Image(original.getDevice(), scaledData); + original.dispose(); + return scaledImage; + } + + /** + * Determines which panel to draw based on current credentials status. + */ + private void refreshViewMode() { + if (parentComposite == null || parentComposite.isDisposed()) { + return; + } + + if (StringUtils.isBlank(SharedPreferences.getApiKey())) { + drawMissingCredentialsPanel(parentComposite); + } else { + loadCachedIssues(); + drawFindingsPanel(parentComposite); + } + } + + + /** + * Loads initial cached scan issues from workspace session properties. + */ + private void loadCachedIssues() { + try { + IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); + if (projects.length > 0 && projects[0].isOpen()) { + IProject project = projects[0]; + ProblemHolderService problemHolder = (ProblemHolderService) project.getSessionProperty( + new QualifiedName("com.checkmarx.eclipse.plugin", "problem-holder")); + + if (problemHolder != null) { + Map> existingIssues = problemHolder.getAllScanIssues(); + if (existingIssues != null && !existingIssues.isEmpty()) { + this.currentIssues = existingIssues; + } + } + } + } catch (Exception e) { + System.err.println("[FINDINGS] Error reading cached issues: " + e.getMessage()); + } + } + + + private Composite openSettingsComposite; + + /** + * Renders the missing credentials panel centered inside the view parent. + */ + private void drawMissingCredentialsPanel(Composite parent) { + // Dispose all existing UI components in the view container + for (Control child : parent.getChildren()) { + child.dispose(); + } + + clearToolbar(); + + openSettingsComposite = new Composite(parent, SWT.NONE); + openSettingsComposite.setLayout(new GridLayout(1, true)); + openSettingsComposite.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true)); + + // Logo + final Label cxLogo = new Label(openSettingsComposite, SWT.NONE); + cxLogo.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); + cxLogo.setImage(CHECKMARX_OPEN_SETTINGS_LOGO); + + // Open Settings Button + Button btn = new Button(openSettingsComposite, SWT.NONE); + btn.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); + btn.setText(Constants.BTN_OPEN_SETTINGS); + + btn.addListener(SWT.Selection, event -> { + PreferenceDialog pref = PreferencesUtil.createPreferenceDialogOn( + shell, "com.checkmarx.eclipse.properties.preferencespage", null, null); + if (pref != null) { + pref.open(); + } + }); + + parent.layout(true, true); + } + + private void drawFindingsPanel(Composite parent) { + // Clear out missing credentials panel if it exists + for (Control child : parent.getChildren()) { + child.dispose(); + } + + SashForm sashForm = new SashForm(parent, SWT.HORIZONTAL); + sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + sashForm.setLayout(new FillLayout()); + + Composite treeComposite = new Composite(sashForm, SWT.NONE); + treeComposite.setLayout(new FillLayout()); + + treeViewer = new TreeViewer(treeComposite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + treeViewer.setContentProvider(new FindingsContentProvider()); + treeViewer.setLabelProvider(new FindingsLabelProvider()); + + Composite promotionalComposite = new Composite(sashForm, SWT.NONE); + drawPromotionalPanel(promotionalComposite); + + sashForm.setWeights(new int[] { 70, 30 }); + + setupToolbar(); + setupTreeListeners(); + + if (!currentIssues.isEmpty()) { + refreshTreeWithFilter(); + } + + parent.layout(true, true); + } + + /** + * Renders the promotional cube image and description text in the right-hand pane + * of the findings split view. + */ + private void drawPromotionalPanel(Composite promotionalComposite) { + GridLayout layout = new GridLayout(1, false); + layout.marginLeft = 0; + layout.marginRight = 40; + layout.marginHeight = 10; + promotionalComposite.setLayout(layout); + + Label cubeLabel = new Label(promotionalComposite, SWT.NONE); + cubeLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); + cubeLabel.setImage(FINDINGS_PROMOTIONAL_CUBE); + Label descriptionLabel = new Label(promotionalComposite, SWT.WRAP); + GridData descriptionData = new GridData(SWT.LEFT, SWT.CENTER, true, false); + descriptionLabel.setLayoutData(descriptionData); + descriptionLabel.setText(Constants.FINDINGS_PROMO_DESCRIPTION); + + // SWT.WRAP labels need an explicit widthHint to wrap and left-align under the image + // instead of growing to one unbroken line. The pane has no real bounds yet at this + // point (the parent hasn't laid out), so compute it once asynchronously after the + // initial layout, and again whenever the pane is resized (e.g. by dragging the sash). + Runnable applyWrapWidth = () -> { + if (promotionalComposite.isDisposed()) { + return; + } + int availableWidth = promotionalComposite.getClientArea().width + - (layout.marginLeft + layout.marginRight); + if (availableWidth > 0 && descriptionData.widthHint != availableWidth) { + descriptionData.widthHint = availableWidth; + promotionalComposite.layout(true); + } + }; + + promotionalComposite.addControlListener(new ControlAdapter() { + @Override + public void controlResized(ControlEvent e) { + applyWrapWidth.run(); + } + }); + Display.getDefault().asyncExec(applyWrapWidth); + } + + /** + * Subscribes to IEventBroker for issue updates & settings changes. + */ + private void subscribeToEventBroker() { + try { + org.eclipse.e4.core.services.events.IEventBroker eventBroker = + getSite().getService(org.eclipse.e4.core.services.events.IEventBroker.class); + + if (eventBroker == null) { + eventBroker = PlatformUI.getWorkbench().getService( + org.eclipse.e4.core.services.events.IEventBroker.class); + } + + if (eventBroker != null) { + // Topic 1: Scan issues updated + eventHandler = event -> { + Object data = event.getProperty(org.eclipse.e4.core.services.events.IEventBroker.DATA); + if (data instanceof Map) { + @SuppressWarnings("unchecked") + Map> newIssues = (Map>) data; + + Display.getDefault().asyncExec(() -> { + this.currentIssues = newIssues; + if (treeViewer != null && !treeViewer.getControl().isDisposed()) { + refreshTreeWithFilter(); + } + }); + } + }; + eventBroker.subscribe(ProblemHolderService.ISSUES_UPDATED_TOPIC, eventHandler); + + // Topic 2: Settings/Credentials applied or changed + settingsEventHandler = event -> { + Display.getDefault().asyncExec(() -> { + refreshViewMode(); + }); + }; + eventBroker.subscribe(SettingsTopics.TOPIC_APPLY_SETTINGS, settingsEventHandler); + } + } catch (Exception e) { + System.err.println("[FINDINGS] Error subscribing to IEventBroker: " + e.getMessage()); + e.printStackTrace(); + } + } + + @Override + public void dispose() { + + + // 1. Unsubscribe from IEventBroker to prevent memory leaks + if (eventHandler != null) { + try { + org.eclipse.e4.core.services.events.IEventBroker eventBroker = + org.eclipse.ui.PlatformUI.getWorkbench().getService( + org.eclipse.e4.core.services.events.IEventBroker.class); + + if (eventBroker != null) { + eventBroker.unsubscribe(eventHandler); + + } + } catch (Exception e) { + System.err.println("[FINDINGS] Error unsubscribing from IEventBroker: " + e.getMessage()); + } + } + + // 2. Unsubscribe from IgnoredProblemsStore + if (ignoredStore != null) { + // If your IgnoredProblemsStore supports removing listeners, call it here: + // ignoredStore.removeListener(this); + } + + super.dispose(); + } + + private Composite parentComposite; + + + private void initFindingsViewUI() { + try { + + IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); + + if (projects.length > 0 && projects[0].isOpen()) { + IProject project = projects[0]; + ProblemHolderService problemHolder = (ProblemHolderService) project.getSessionProperty( + new QualifiedName("com.checkmarx.eclipse.plugin", "problem-holder")); + + if (problemHolder != null) { + Map> existingIssues = problemHolder.getAllScanIssues(); + if (existingIssues != null && !existingIssues.isEmpty()) { + this.currentIssues = existingIssues; + } + } + } + + subscribeToEventBroker(); + + ignoredStore = IgnoredProblemsStore.getInstance(); + ignoredStore.addListener(this); + + drawFindingsPanel(parentComposite); + + } catch (Exception e) { + System.err.println("[FINDINGS] Error during view creation: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Removes every contribution from the view toolbar. + */ + private void clearToolbar() { + IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager(); + toolbar.removeAll(); + toolbar.update(true); + getViewSite().getActionBars().updateActionBars(); + } + + private void setupToolbar() { + + IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager(); + + // The same IToolBarManager instance survives every re-render of the view, + // so previous contributions must be dropped before re-adding them. + toolbar.removeAll(); + + // Add filter actions + VulnerabilityFilterAction.IFilterChangeListener filterListener = () -> { + + refreshTreeWithFilter(); + }; + + toolbar.add(new VulnerabilityFilterAction.MaliciousFilter(filterListener)); + toolbar.add(new VulnerabilityFilterAction.CriticalFilter(filterListener)); + toolbar.add(new VulnerabilityFilterAction.HighFilter(filterListener)); + toolbar.add(new VulnerabilityFilterAction.MediumFilter(filterListener)); + toolbar.add(new VulnerabilityFilterAction.LowFilter(filterListener)); + + toolbar.add(new org.eclipse.jface.action.Separator("\t")); + + // Shared Eclipse images (replace with your own icons later) + ISharedImages images = PlatformUI.getWorkbench().getSharedImages(); + + // Toggle Expand/Collapse action + Action toggleExpandCollapseAction = new Action("Expand All", Action.AS_PUSH_BUTTON) { + + private boolean expanded = false; + + { + setToolTipText("Collapse All Findings"); + setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL)); + } + + @Override + public void run() { + if (expanded) { + treeViewer.collapseAll(); + setText("Expand All"); + setToolTipText("Expand All Findings"); + setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL_DISABLED)); + } else { + treeViewer.expandAll(); + setText("Collapse All"); + setToolTipText("Collapse All Findings"); + setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL)); + } + + expanded = !expanded; + } + }; + + toolbar.add(toggleExpandCollapseAction); + + // Add spacing before preferences button + toolbar.add(new org.eclipse.jface.action.Separator("\t")); + + // Preferences action: opens the same preference page as the main results view + Action openPreferencesPageAction = new Action() { + @Override + public void run() { + PreferenceDialog pref = PreferencesUtil.createPreferenceDialogOn( + shell, "com.checkmarx.eclipse.properties.preferencespage", null, null); + if (pref != null) { + pref.open(); + } + } + }; + + // Toolbar preferences button + Action toolbarPreferencesAction = + new Action("\u2000?", Action.AS_PUSH_BUTTON) { + @Override + public void run() { + openPreferencesPageAction.run(); + } + }; + + toolbarPreferencesAction.setToolTipText("Checkmarx Preferences"); + toolbar.add(toolbarPreferencesAction); + + toolbar.update(true); + getViewSite().getActionBars().updateActionBars(); + + } + private void setupTreeListeners() { + Tree tree = treeViewer.getTree(); + + + //Listner for redirection + tree.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + + navigateToSelectedIssue(treeViewer.getSelection()); + } + }); + + // Right-click context menu + tree.addMouseListener(new MouseAdapter() { + @Override + public void mouseDown(MouseEvent e) { + if (e.button == 3) { + + showContextMenu(e); + } + } + }); + + + } + + private void navigateToSelectedIssue(ISelection selection) { + + if (selection instanceof IStructuredSelection) { + IStructuredSelection ssel = (IStructuredSelection) selection; + Object element = ssel.getFirstElement(); + + if (element instanceof ScanDetailWithPath) { + ScanDetailWithPath detailWithPath = (ScanDetailWithPath) element; + navigateToIssue(detailWithPath); + } + } + } + + private void navigateToIssue(ScanDetailWithPath detailWithPath) { + ScanIssue detail = detailWithPath.getDetail(); + + // Use resolved file path from ScanIssue (if available) or fallback to detailWithPath + String filePath = detail.getFilePath(); + if (filePath == null) { + filePath = detailWithPath.getFilePath(); + } + + if (detail.getLocations() != null && !detail.getLocations().isEmpty()) { + Location location = detail.getLocations().get(0); + + openFileInEditor(filePath, location.getLine(), detail); + } else { + + } + } + + /** + * Show detailed information about an issue. + */ + private void showIssueDetails(ScanIssue issue) { + StringBuilder details = new StringBuilder(); + details.append("\n========== ISSUE DETAILS ==========\n"); + details.append("Title: ").append(issue.getTitle()).append("\n"); + details.append("Severity: ").append(issue.getSeverity()).append("\n"); + details.append("Scan Engine: ").append(issue.getScanEngine()).append("\n"); + details.append("Description: ").append(issue.getDescription()).append("\n"); + details.append("Issue ID: ").append(issue.getScanIssueId()).append("\n"); + + if (issue.getPackageVersion() != null) { + details.append("Package Version: ").append(issue.getPackageVersion()).append("\n"); + } + if (issue.getCve() != null) { + details.append("CVE: ").append(issue.getCve()).append("\n"); + } + if (issue.getRemediationAdvise() != null) { + details.append("Remediation: ").append(issue.getRemediationAdvise()).append("\n"); + } + if (issue.getLocations() != null && !issue.getLocations().isEmpty()) { + Location loc = issue.getLocations().get(0); + details.append("Location: Line ").append(loc.getLine()).append(", Col ").append(loc.getStartIndex()).append("\n"); + } + details.append("====================================\n"); + + + } + + /** + * Fix issue with AI Assist. + */ + private void fixWithAIAssist(ScanIssue issue) { + + try { + // Build remediation prompt based on engine type + String prompt = com.checkmarx.eclipse.devassist.ui.findings.integration.RemediationPromptBuilder + .buildRemediationPrompt(issue); + + if (prompt == null || prompt.isEmpty()) { + + showErrorNotification("Failed to build prompt for this issue type"); + return; + } + + // Send to Copilot via integration + + boolean success = com.checkmarx.eclipse.devassist.ui.findings.integration.CopilotIntegration + .sendPromptToCopilot(prompt); + + if (success) { + + } else { + + } + + } catch (Exception e) { + + e.printStackTrace(); + showErrorNotification("Error: " + e.getMessage()); + } + } + + /** + * Show error notification to user + */ + private void showErrorNotification(String message) { + org.eclipse.swt.widgets.MessageBox msgBox = new org.eclipse.swt.widgets.MessageBox( + treeViewer.getTree().getShell(), + org.eclipse.swt.SWT.ERROR); + msgBox.setMessage(message); + msgBox.setText("Checkmarx AI Assist"); + msgBox.open(); + } + + /** + * Ignore this specific finding and remove from the Findings View. + * The finding is added to the IgnoredProblemsStore and appears in the Ignored Problems Window. + */ + private void ignoreThisFinding(ScanIssue issue) { + + try { + // Verify store is initialized + if (ignoredStore == null) { + System.err.println("[FINDINGS] ERROR: IgnoredProblemsStore is NULL!"); + showErrorNotification("Error: IgnoredProblemsStore not initialized"); + return; + } + + + + // Add to ignored store with full finding details for display in Ignored Problems View + ignoredStore.ignoreProblem(issue); + + + // Check if it was actually added + boolean isIgnored = ignoredStore.isIgnored(issue.getScanIssueId()); + + // Refresh the tree to remove the ignored finding + + refreshTreeWithFilter(); + + + + } catch (Exception e) { + System.err.println("[FINDINGS] ✗ Error ignoring finding: " + e.getMessage()); + e.printStackTrace(); + showErrorNotification("Failed to ignore finding: " + e.getMessage()); + } + } + + /** + * Ignore all findings of the same type/package. + * For OSS: ignores all findings with the same package version + * For CONTAINERS: ignores all findings with the same image tag + */ + private void ignoreAllOfType(ScanIssue issue) { + + try { + int ignoredCount = 0; + String typeIdentifier = issue.getPackageVersion() != null ? issue.getPackageVersion() : issue.getImageTag(); + + // Iterate through all current issues and ignore matching ones + for (List issues : currentIssues.values()) { + for (ScanIssue currentIssue : issues) { + // Match by same type/package/image + if (currentIssue.getScanEngine() == issue.getScanEngine()) { + String currentTypeIdentifier = currentIssue.getPackageVersion() != null ? + currentIssue.getPackageVersion() : currentIssue.getImageTag(); + + if (typeIdentifier != null && typeIdentifier.equals(currentTypeIdentifier)) { + ignoredStore.ignoreProblem(currentIssue); + ignoredCount++; + } + } + } + } + + + refreshTreeWithFilter(); + + + } catch (Exception e) { + System.err.println("[FINDINGS] ✗ Error ignoring findings of type: " + e.getMessage()); + e.printStackTrace(); + showErrorNotification("Failed to ignore findings of this type: " + e.getMessage()); + } + } + + /** + * Copy issue details to clipboard as JSON. + */ + private void copyIssueDetails(ScanIssue issue) { + StringBuilder json = new StringBuilder(); + json.append("{\n"); + json.append(" \"title\": \"").append(escapeJson(issue.getTitle())).append("\",\n"); + json.append(" \"severity\": \"").append(issue.getSeverity()).append("\",\n"); + json.append(" \"scanEngine\": \"").append(issue.getScanEngine()).append("\",\n"); + json.append(" \"description\": \"").append(escapeJson(issue.getDescription())).append("\",\n"); + json.append(" \"issueId\": \"").append(issue.getScanIssueId()).append("\"\n"); + json.append("}\n"); + + try { + java.awt.Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(new java.awt.datatransfer.StringSelection(json.toString()), null); + + + } catch (Exception e) { + + } + } + + private String escapeJson(String text) { + if (text == null) return ""; + return text.replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "\\r"); + } + + private void openFileInEditor(String filePath, int lineNumber, ScanIssue issue) { + try { + + + IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation( + new org.eclipse.core.runtime.Path(filePath)); + + if (file == null || !file.exists()) { + + return; + } + + // 1. Open file in active workbench page + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + IEditorPart editor = IDE.openEditor(page, file); + + + // **CRITICAL FIX: Navigation-based opens don't trigger IPartListener2 events** + // Directly set up real-time scanning and apply cached decorations + // Pass the editor to avoid re-searching for it (which fails on MavenPomEditor) + setupRealtimeScanningForFile(file, editor); + + // 2. Ensure marker exists and explicitly set LINE_NUMBER + createMarkerForIssue(file, issue); + + // 3. Navigate using standard ITextEditor adapter (or fall back to marker navigation) + boolean scrolledSuccessfully = scrollToLine(editor, lineNumber); + if (!scrolledSuccessfully) { + highlightViaMarker(editor, file, issue); + } + + } catch (Exception e) { + + e.printStackTrace(); + } + } + + /** + * Set up real-time scanning and apply cached decorations for a file. + * Called when file is opened via navigation to ensure we don't miss IPartListener2 events. + */ + private void setupRealtimeScanningForFile(org.eclipse.core.resources.IFile file, IEditorPart editor) { + if (file == null || editor == null) { + + return; + } + + + + + try { + // Extract document for real-time scanning + org.eclipse.jface.text.IDocument document = null; + String filePath = file.getLocation().toOSString(); + String fileName = file.getName(); + + + + // Try method 1: Direct ITextEditor instance check + if (editor instanceof org.eclipse.ui.texteditor.ITextEditor) { + + org.eclipse.ui.texteditor.ITextEditor textEditor = (org.eclipse.ui.texteditor.ITextEditor) editor; + document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); + } + + // Try method 2: ITextEditor Adapter pattern (for MavenPomEditor, etc.) + if (document == null) { + + org.eclipse.ui.texteditor.ITextEditor textEditor = editor.getAdapter(org.eclipse.ui.texteditor.ITextEditor.class); + if (textEditor != null) { + + document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); + } + } + + // Try method 3: Direct IDocument adapter (some editors provide this directly) + if (document == null) { + + document = editor.getAdapter(org.eclipse.jface.text.IDocument.class); + if (document != null) { + + } + } + + if (document == null) { + + return; + } + + + + + + // Create a scan job for this file + com.checkmarx.eclipse.devassist.ui.findings.realtime.RealTimeScanJob scanJob = + new com.checkmarx.eclipse.devassist.ui.findings.realtime.RealTimeScanJob(file, fileName); + + + + + + // Create a document listener that reschedules the job on every keystroke + com.checkmarx.eclipse.devassist.inspection.DevAssistScanScheduler scheduler = null; + if (file != null) { + try { + org.eclipse.core.resources.IProject project = file.getProject(); + if (project != null) { + scheduler = (com.checkmarx.eclipse.devassist.inspection.DevAssistScanScheduler) project.getSessionProperty( + new org.eclipse.core.runtime.QualifiedName("com.checkmarx.eclipse.plugin", "scan-scheduler")); + } + } catch (Exception e) { + // Ignore if scheduler not available + } + } + com.checkmarx.eclipse.devassist.ui.findings.realtime.CheckmarxDocumentListener docListener = + new com.checkmarx.eclipse.devassist.ui.findings.realtime.CheckmarxDocumentListener(fileName, scanJob, file, scheduler); + + // Register the document listener + document.addDocumentListener(docListener); + + + + + // Apply cached decorations if findings exist for this file + // Pass the editor directly to avoid search issues with MavenPomEditor + applyCachedDecorationsForFile(file, document, editor); + + + + } catch (Exception e) { + System.err.println("[REALTIME-SETUP] ✗ EXCEPTION during setup: " + e.getMessage()); + System.err.println("[REALTIME-SETUP] Exception type: " + e.getClass().getName()); + System.err.println("[REALTIME-SETUP] Stack trace:"); + e.printStackTrace(); + } + } + + /** + * Apply cached decorations (gutter icons, underlines) when editor is opened via navigation. + * Uses the provided editor directly instead of searching for it. + */ + private void applyCachedDecorationsForFile(org.eclipse.core.resources.IFile file, + org.eclipse.jface.text.IDocument document, + org.eclipse.ui.IEditorPart editor) { + if (file == null || document == null || editor == null) { + return; + } + + try { + String filePath = file.getLocation().toOSString(); + org.eclipse.core.resources.IProject project = file.getProject(); + + if (project == null) { + return; + } + + // Get cached findings for this file + ProblemHolderService problemHolder = + (ProblemHolderService) project.getSessionProperty( + new org.eclipse.core.runtime.QualifiedName("com.checkmarx.eclipse.plugin", "problem-holder")); + + if (problemHolder == null) { + return; + } + + java.util.List cachedIssues = problemHolder.getScanIssuesByFile(filePath); + + if (cachedIssues == null || cachedIssues.isEmpty()) { + + return; + } + + // Apply decorations directly using the provided editor + + applyDecorationsDirectly(editor, file, cachedIssues); + + } catch (Exception e) { + System.err.println("[REALTIME-SETUP] Error applying cached decorations: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Apply decorations directly to the provided editor without searching for it. + * This avoids issues with MavenPomEditor not being found by IFile comparison. + */ + private void applyDecorationsDirectly(org.eclipse.ui.IEditorPart editor, + org.eclipse.core.resources.IFile file, + java.util.List scanIssues) { + if (editor == null || file == null || scanIssues == null || scanIssues.isEmpty()) { + return; + } + + try { + // Get the text editor + org.eclipse.ui.texteditor.ITextEditor textEditor = + editor.getAdapter(org.eclipse.ui.texteditor.ITextEditor.class); + + if (textEditor == null) { + + return; + } + + // Get document provider and input + org.eclipse.ui.texteditor.IDocumentProvider docProvider = textEditor.getDocumentProvider(); + if (docProvider == null) { + + return; + } + + // Get annotation model from the document provider (proper way for all editor types) + org.eclipse.jface.text.source.IAnnotationModel annotationModel = + docProvider.getAnnotationModel(textEditor.getEditorInput()); + + if (annotationModel == null) { + + return; + } + + + + // Get document from provider + org.eclipse.jface.text.IDocument document = docProvider.getDocument(textEditor.getEditorInput()); + + if (document == null) { + + return; + } + + // Apply each issue's decoration using OSS-specific logic + java.util.List annotations = + new java.util.ArrayList<>(); + + for (ScanIssue issue : scanIssues) { + try { + // Create annotation + com.checkmarx.eclipse.devassist.ui.findings.editor.FindingsAnnotation annotation = + createAnnotationForIssue(issue); + + if (annotation == null) { + continue; + } + + // Calculate position (OSS = first line only) + org.eclipse.jface.text.Position pos = calculatePositionForIssue(document, issue); + + if (pos != null && pos.getLength() > 0) { + annotationModel.addAnnotation(annotation, pos); + annotations.add(annotation); + + } + } catch (Exception e) { + System.err.println("[REALTIME-SETUP-DIRECT] Error decorating issue: " + e.getMessage()); + } + } + + + + } catch (Exception e) { + System.err.println("[REALTIME-SETUP-DIRECT] ✗ Error applying decorations directly: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Create annotation for an issue. + */ + private com.checkmarx.eclipse.devassist.ui.findings.editor.FindingsAnnotation createAnnotationForIssue(ScanIssue issue) { + try { + String annotationType = mapSeverityToAnnotationType(issue.getSeverity()); + return new com.checkmarx.eclipse.devassist.ui.findings.editor.FindingsAnnotation( + annotationType, + issue.getTitle(), + issue.getDescription() + ); + } catch (Exception e) { + return null; + } + } + + /** + * Map severity to annotation type. + * Handles all 8 severity levels including OK, UNKNOWN, and IGNORED. + */ + private String mapSeverityToAnnotationType(String severity) { + if (severity == null) { + return "com.checkmarx.eclipse.findings.unknown"; + } + String upper = severity.toUpperCase(); + if (upper.contains("MALICIOUS")) { + return "com.checkmarx.eclipse.findings.malicious"; + } + if (upper.contains("CRITICAL") || upper.contains("ERROR")) { + return "com.checkmarx.eclipse.findings.critical"; + } + if (upper.contains("HIGH")) { + return "com.checkmarx.eclipse.findings.high"; + } + if (upper.contains("MEDIUM")) { + return "com.checkmarx.eclipse.findings.medium"; + } + if (upper.contains("LOW") || upper.contains("INFO")) { + return "com.checkmarx.eclipse.findings.low"; + } + if (upper.contains("UNKNOWN")) { + return "com.checkmarx.eclipse.findings.unknown"; + } + if (upper.contains("OK")) { + return "com.checkmarx.eclipse.findings.ok"; + } + if (upper.contains("IGNORED")) { + return "com.checkmarx.eclipse.findings.ignored"; + } + return "com.checkmarx.eclipse.findings.unknown"; + } + + /** + * Calculate position for an issue (OSS = first line only). + */ + private org.eclipse.jface.text.Position calculatePositionForIssue(org.eclipse.jface.text.IDocument document, ScanIssue issue) { + try { + if (issue.getLocations() == null || issue.getLocations().isEmpty()) { + return null; + } + + com.checkmarx.eclipse.devassist.model.Location location = issue.getLocations().get(0); + int lineNumber = location.getLine() - 1; // 0-based + + int lineCount = document.getNumberOfLines(); + if (lineNumber < 0 || lineNumber >= lineCount) { + return null; + } + + org.eclipse.jface.text.IRegion lineInfo = document.getLineInformation(lineNumber); + int offset = lineInfo.getOffset(); + int length = lineInfo.getLength(); + + // FIX: Skip leading whitespace to match ProblemDecorator.calculateRange() + int trimOffset = getLeadingWhitespaceOffset(document, offset, length); + int adjustedOffset = offset + trimOffset; + int adjustedLength = Math.max(1, length - trimOffset); + + return new org.eclipse.jface.text.Position(adjustedOffset, adjustedLength); + + } catch (Exception e) { + return null; + } + } + + /** + * Scroll editor to specific line number using native Eclipse ITextEditor adapter. + */ + private boolean scrollToLine(IEditorPart editor, int lineNumber) { + if (editor == null || lineNumber <= 0) return false; + + try { + // Use Eclipse's standard adapter pattern instead of reflection + org.eclipse.ui.texteditor.ITextEditor textEditor = editor.getAdapter(org.eclipse.ui.texteditor.ITextEditor.class); + if (textEditor == null && editor instanceof org.eclipse.ui.texteditor.ITextEditor) { + textEditor = (org.eclipse.ui.texteditor.ITextEditor) editor; + } + + if (textEditor != null) { + org.eclipse.ui.texteditor.IDocumentProvider provider = textEditor.getDocumentProvider(); + if (provider != null) { + org.eclipse.jface.text.IDocument document = provider.getDocument(textEditor.getEditorInput()); + if (document != null && lineNumber <= document.getNumberOfLines()) { + // Line numbers in IDocument are 0-indexed + int lineOffset = document.getLineOffset(lineNumber - 1); + textEditor.selectAndReveal(lineOffset, 0); + + return true; + } + } + } + } catch (Exception e) { + + } + return false; + } + + /** + * Ensures IMarker.LINE_NUMBER is explicitly set as a 1-based Integer attribute. + */ + private void createMarkerForIssue(IFile file, ScanIssue issue) { + if (file == null || issue == null || issue.getLocations() == null || issue.getLocations().isEmpty()) { + return; + } + + try { + IMarker existingMarker = findMarkerForIssue(file, issue); + if (existingMarker != null && existingMarker.exists()) { + return; + } + + // 1. Create the marker using the declared ID + IMarker newMarker = file.createMarker("com.checkmarx.eclipse.plugin.checkmarxProblemMarker"); + + // 2. Set Standard Core Eclipse Attributes (CRITICAL for Quick Fix matching) + int lineNumber = issue.getLocations().get(0).getLine(); + newMarker.setAttribute(IMarker.LINE_NUMBER, lineNumber > 0 ? lineNumber : 1); + newMarker.setAttribute(IMarker.MESSAGE, issue.getTitle() != null ? issue.getTitle() : "Checkmarx Finding"); + newMarker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING); + newMarker.setAttribute(IMarker.USER_EDITABLE, false); + + // FIX: Set character offsets with whitespace trimming (so underline doesn't include leading spaces) + setMarkerCharacterOffsets(newMarker, file, lineNumber); + + // 3. Populate custom attributes + com.checkmarx.eclipse.devassist.ui.findings.marker.MarkerIssueMapper.populateMarker(newMarker, issue); + + + + } catch (org.eclipse.core.runtime.CoreException e) { + System.err.println("[FINDINGS] Error creating marker: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Apply highlighting to the problematic line. + */ + /** + * Navigate to the marker that corresponds to this issue. + * JDT's editor will automatically underline the marker and respect + * the marker annotation infrastructure (no custom hover registration needed). + */ + private void highlightViaMarker(org.eclipse.ui.IEditorPart editor, IFile file, ScanIssue issue) { + try { + if (editor == null || file == null || issue == null) { + return; + } + + // Find the marker corresponding to this issue + IMarker marker = findMarkerForIssue(file, issue); + if (marker != null && marker.exists()) { + org.eclipse.ui.ide.IDE.gotoMarker(editor, marker); + + } else { + + } + } catch (Exception e) { + + } + } + + /** + * Find the IMarker that corresponds to a ScanIssue. + * Matches by file, line number, and optionally title. + */ + private IMarker findMarkerForIssue(IFile file, ScanIssue issue) { + if (file == null || issue == null || issue.getLocations() == null || issue.getLocations().isEmpty()) { + return null; + } + + int issueLine = issue.getLocations().get(0).getLine(); + String issueTitle = issue.getTitle(); + + try { + IMarker[] markers = file.findMarkers("com.checkmarx.eclipse.plugin.checkmarxProblemMarker", true, org.eclipse.core.resources.IResource.DEPTH_ZERO); + for (IMarker marker : markers) { + int markerLine = marker.getAttribute(org.eclipse.core.resources.IMarker.LINE_NUMBER, -1); + if (markerLine == issueLine) { + // Optional: also match by message prefix for better accuracy + String markerMsg = marker.getAttribute(org.eclipse.core.resources.IMarker.MESSAGE, ""); + if (issueTitle == null || issueTitle.isEmpty() || markerMsg.contains(issueTitle)) { + return marker; + } + } + } + } catch (Exception e) { + + } + + return null; + } + + /** + * Create a marker for a ScanIssue. + * + * **CRITICAL FIX**: Markers were never being created, only searched for. + * This method creates markers on-demand when user navigates to an issue. + * + * **Works for ALL file types**: Java, Python, C++, JavaScript, YAML, XML, etc. + * Uses Eclipse's universal IMarker API (not language-specific). + * + * Marker attributes are populated using MarkerIssueMapper to store + * all ScanIssue data in marker attributes for later retrieval. + * + * @param file File to create marker in + * @param issue ScanIssue to create marker for + */ +// private void createMarkerForIssue(IFile file, ScanIssue issue) { +// if (file == null || issue == null || issue.getLocations() == null || issue.getLocations().isEmpty()) { +// +// return; +// } +// +// try { +// +// +// +// +// +// +// +// +// // Step 1: Check if marker already exists for this issue +// IMarker existingMarker = findMarkerForIssue(file, issue); +// if (existingMarker != null && existingMarker.exists()) { +// +// return; +// } +// +// // Step 2: Create new marker using Eclipse's universal IMarker API +// // **KEY**: Uses IMarker.PROBLEM which works for ALL file types +// // - NOT language-specific (works for Java, Python, C++, JS, YAML, etc.) +// // - Marker appears in Eclipse's Problems View +// // - Can be navigated with IDE.gotoMarker() +// IMarker newMarker = file.createMarker("com.checkmarx.eclipse.plugin.checkmarxProblemMarker"); +// +// +// // Step 3: Populate marker attributes using MarkerIssueMapper +// // This stores all ScanIssue data in marker for later retrieval +// com.checkmarx.eclipse.devassist.ui.findings.marker.MarkerIssueMapper.populateMarker(newMarker, issue); +// +// +// // Step 4: Verify marker creation +// if (newMarker.exists()) { +// String markerMsg = newMarker.getAttribute(org.eclipse.core.resources.IMarker.MESSAGE, ""); +// int markerLine = newMarker.getAttribute(org.eclipse.core.resources.IMarker.LINE_NUMBER, -1); +// int markerSeverity = newMarker.getAttribute(org.eclipse.core.resources.IMarker.SEVERITY, -1); +// +// +// +// +// +// +// +// } else { +// +// } +// +// } catch (org.eclipse.core.runtime.CoreException e) { +// System.err.println("[FINDINGS] [MARKER-CREATE] ✗ CoreException creating marker: " + e.getMessage()); +// e.printStackTrace(); +// } catch (Exception e) { +// System.err.println("[FINDINGS] [MARKER-CREATE] ✗ Error creating marker: " + e.getMessage()); +// e.printStackTrace(); +// } +// } + + private void showContextMenu(MouseEvent e) { + ISelection selection = treeViewer.getSelection(); + if (!(selection instanceof IStructuredSelection)) { + + return; + } + + IStructuredSelection ssel = (IStructuredSelection) selection; + Object element = ssel.getFirstElement(); + + if (!(element instanceof ScanDetailWithPath)) { + + return; + } + + ScanDetailWithPath detailWithPath = (ScanDetailWithPath) element; + ScanIssue issue = detailWithPath.getDetail(); + + + + org.eclipse.swt.widgets.Menu menu = new org.eclipse.swt.widgets.Menu(treeViewer.getTree()); + + // Menu Item 1: View Details + org.eclipse.swt.widgets.MenuItem viewDetailsItem = new org.eclipse.swt.widgets.MenuItem(menu, SWT.PUSH); + viewDetailsItem.setText("View Details"); + viewDetailsItem.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { + @Override + public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { + + showIssueDetails(issue); + } + }); + + // Menu Item 2: Fix with AI Assist + org.eclipse.swt.widgets.MenuItem fixWithAIItem = new org.eclipse.swt.widgets.MenuItem(menu, SWT.PUSH); + fixWithAIItem.setText("Fix with AI Assist"); + fixWithAIItem.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { + @Override + public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { + + fixWithAIAssist(issue); + } + }); + + // Menu Item 3: Ignore This Finding + org.eclipse.swt.widgets.MenuItem ignoreItem = new org.eclipse.swt.widgets.MenuItem(menu, SWT.PUSH); + ignoreItem.setText("Ignore This Finding"); + ignoreItem.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { + @Override + public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { + + ignoreThisFinding(issue); + } + }); + + // Menu Item 4: Ignore All of This Type (for OSS and CONTAINERS) + if (issue.getScanEngine() == ScanEngine.OSS || issue.getScanEngine() == ScanEngine.CONTAINERS) { + org.eclipse.swt.widgets.MenuItem ignoreAllItem = new org.eclipse.swt.widgets.MenuItem(menu, SWT.PUSH); + ignoreAllItem.setText("Ignore All of This Type"); + ignoreAllItem.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { + @Override + public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { + + ignoreAllOfType(issue); + } + }); + } + + // Separator + new org.eclipse.swt.widgets.MenuItem(menu, SWT.SEPARATOR); + + // Menu Item 5: Copy Issue Details + org.eclipse.swt.widgets.MenuItem copyItem = new org.eclipse.swt.widgets.MenuItem(menu, SWT.PUSH); + copyItem.setText("Copy Issue Details (JSON)"); + copyItem.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { + @Override + public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { + + copyIssueDetails(issue); + } + }); + + // Menu Item 6: Open in Terminal + org.eclipse.swt.widgets.MenuItem terminalItem = new org.eclipse.swt.widgets.MenuItem(menu, SWT.PUSH); + terminalItem.setText("Navigate to Line"); + terminalItem.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { + @Override + public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { + + navigateToIssue(detailWithPath); + } + }); + + menu.setLocation(treeViewer.getTree().toDisplay(e.x, e.y)); + menu.setVisible(true); + } + + private void refreshTreeWithFilter() { + + + + + // Apply active filters and refresh + VulnerabilityFilterState filterState = VulnerabilityFilterState.getInstance(); + + + Map> filteredIssues = new HashMap<>(); + int totalBefore = 0; + int totalAfter = 0; + + for (String filePath : currentIssues.keySet()) { + List issues = currentIssues.get(filePath); + if (issues == null) continue; + + totalBefore += issues.size(); + List filtered = new java.util.ArrayList<>(); + + for (ScanIssue issue : issues) { + // ✅ Safe null guard FIRST before calling any methods on issue + if (issue == null || issue.getSeverity() == null) { + + continue; + } + + String issueId = issue.getScanIssueId(); + boolean isIgnored = ignoredStore != null && ignoredStore.isIgnored(issueId); + boolean hasFilter = filterState.hasFilter(issue.getSeverity()); + boolean isProblem = com.checkmarx.eclipse.devassist.utils.DevAssistUtils.isProblem(issue.getSeverity()); + + + + // Filter by OK/UNKNOWN/IGNORED severity (Phase 3) + if (!isProblem) { + + continue; + } + // Filter by severity preference + if (!hasFilter) { + + continue; + } + // Filter out ignored problems + if (isIgnored) { + + continue; + } + + + filtered.add(issue); + } + + if (!filtered.isEmpty()) { + filteredIssues.put(filePath, filtered); + totalAfter += filtered.size(); + } + } + + + + + + // ✅ Verify treeViewer control before manipulating UI + if (treeViewer != null && treeViewer.getControl() != null && !treeViewer.getControl().isDisposed()) { + + // Save current expansion state to avoid full tree rebuild + Object[] expandedElements = treeViewer.getExpandedElements(); + + // Use setInput() for initial population, refresh() for subsequent updates + Object currentInput = treeViewer.getInput(); + if (currentInput == null) { + // First time: full tree setup with initial data + treeViewer.setInput(filteredIssues); + treeViewer.expandAll(); + } else { + // Subsequent updates: use targeted refresh instead of full rebuild + // This avoids rebuilding the entire tree on every single-file scan + treeViewer.setInput(filteredIssues); + + // Restore expansion state for files that still exist in filtered results + java.util.List validExpanded = new java.util.ArrayList<>(); + for (Object element : expandedElements) { + if (element instanceof com.checkmarx.eclipse.devassist.ui.findings.model.FileNodeLabel) { + com.checkmarx.eclipse.devassist.ui.findings.model.FileNodeLabel fileNode = + (com.checkmarx.eclipse.devassist.ui.findings.model.FileNodeLabel) element; + if (filteredIssues.containsKey(fileNode.getFilePath())) { + validExpanded.add(element); + } + } + } + + if (!validExpanded.isEmpty()) { + treeViewer.setExpandedElements(validExpanded.toArray()); + } else { + // If no previous expansion state, expand all + treeViewer.expandAll(); + } + } + } + + // Update view title with problem count + setPartName("Checkmarx One Assist Findings " + totalAfter); + } + + /** + * Refresh the tree with new issues. Safely dispatches to the SWT UI Thread. + * + * @param issues Map of file paths to list of scan issues + */ + public void refreshTree(Map> issues) { + if (issues == null) return; + + + + + + int totalIssues = issues.values().stream().filter(java.util.Objects::nonNull).mapToInt(List::size).sum(); + + + // Log issues by severity + Map severityCounts = new HashMap<>(); + issues.values().forEach(issueList -> { + if (issueList != null) { + issueList.forEach(issue -> { + if (issue != null && issue.getSeverity() != null) { + String severity = issue.getSeverity().toLowerCase(); + severityCounts.put(severity, severityCounts.getOrDefault(severity, 0L) + 1); + } + }); + } + }); + + + + for (String filePath : issues.keySet()) { + List fileIssues = issues.get(filePath); + } + + + this.currentIssues = issues; + + // ✅ Thread-safe dispatching for background updates + org.eclipse.swt.widgets.Display.getDefault().asyncExec(() -> { + if (treeViewer != null && treeViewer.getControl() != null && !treeViewer.getControl().isDisposed()) { + refreshTreeWithFilter(); + } + }); + + + } + + @Override + public void setFocus() { + if (treeViewer != null && treeViewer.getControl() != null && !treeViewer.getControl().isDisposed()) { + treeViewer.getControl().setFocus(); + } + } + + public TreeViewer getTreeViewer() { + return treeViewer; + } + + /** + * Listener implementation: called when ignored problems are restored or cleared. + */ + @Override + public void onIgnoredProblemsChanged() { + + if (treeViewer != null && treeViewer.getControl() != null && !treeViewer.getControl().isDisposed()) { + treeViewer.getControl().getDisplay().asyncExec(this::refreshTreeWithFilter); + } + } + + + private void setMarkerCharacterOffsets(IMarker marker, IFile file, int lineNumber) { + try { + org.eclipse.ui.IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (window == null) return; + org.eclipse.ui.IWorkbenchPage page = window.getActivePage(); + if (page == null) return; + org.eclipse.ui.IEditorPart editor = page.getActiveEditor(); + if (editor == null) return; + + org.eclipse.ui.texteditor.ITextEditor textEditor = editor.getAdapter(org.eclipse.ui.texteditor.ITextEditor.class); + if (textEditor == null) return; + + org.eclipse.jface.text.IDocument doc = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); + if (doc == null || lineNumber <= 0 || lineNumber > doc.getNumberOfLines()) return; + + int lineIdx = lineNumber - 1; + int lineOffset = doc.getLineOffset(lineIdx); + int lineLen = doc.getLineLength(lineIdx); + + int trimOffset = getLeadingWhitespaceOffset(doc, lineOffset, lineLen); + marker.setAttribute(IMarker.CHAR_START, lineOffset + trimOffset); + marker.setAttribute(IMarker.CHAR_END, lineOffset + lineLen); + + } catch (Exception e) { + // If we can't set char offsets, marker will still work with line-based positioning + } + } + + private int getLeadingWhitespaceOffset(org.eclipse.jface.text.IDocument document, int lineOffset, int lineLength) { + try { + String lineText = document.get(lineOffset, lineLength); + int count = 0; + for (int i = 0; i < lineText.length(); i++) { + if (!Character.isWhitespace(lineText.charAt(i))) break; + count++; + } + return count; + } catch (Exception e) { + return 0; + } + } + +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/actions/VulnerabilityFilterAction.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/actions/VulnerabilityFilterAction.java new file mode 100644 index 00000000..028e9561 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/actions/VulnerabilityFilterAction.java @@ -0,0 +1,80 @@ +package com.checkmarx.eclipse.devassist.ui.findings.actions; + +import org.eclipse.jface.action.Action; + +/** + * Base toggle action for severity filters in the Findings view. + */ +public abstract class VulnerabilityFilterAction extends Action { + + private final String severity; + private final IFilterChangeListener filterChangeListener; + + public interface IFilterChangeListener { + void onFilterChanged(); + } + + public VulnerabilityFilterAction(String severity, IFilterChangeListener listener) { + super(severity, Action.AS_CHECK_BOX); + this.severity = severity; + this.filterChangeListener = listener; + + setText(severity.substring(0, 1).toUpperCase() + severity.substring(1)); + setImageDescriptor(org.eclipse.ui.plugin.AbstractUIPlugin + .imageDescriptorFromPlugin("com.checkmarx.eclipse.plugin", + "icons/severity/" + severity + "_20.svg")); + setToolTipText("Filter " + severity + " severity findings"); + + // Set initial state + setChecked(VulnerabilityFilterState.getInstance().hasFilter(severity)); + } + + @Override + public void run() { + VulnerabilityFilterState filterState = VulnerabilityFilterState.getInstance(); + if (isChecked()) { + filterState.addFilter(severity); + } else { + filterState.removeFilter(severity); + } + + if (filterChangeListener != null) { + filterChangeListener.onFilterChanged(); + } + } + + public String getSeverity() { + return severity; + } + + // Concrete implementations for each severity level + public static class MaliciousFilter extends VulnerabilityFilterAction { + public MaliciousFilter(IFilterChangeListener listener) { + super("malicious", listener); + } + } + + public static class CriticalFilter extends VulnerabilityFilterAction { + public CriticalFilter(IFilterChangeListener listener) { + super("critical", listener); + } + } + + public static class HighFilter extends VulnerabilityFilterAction { + public HighFilter(IFilterChangeListener listener) { + super("high", listener); + } + } + + public static class MediumFilter extends VulnerabilityFilterAction { + public MediumFilter(IFilterChangeListener listener) { + super("medium", listener); + } + } + + public static class LowFilter extends VulnerabilityFilterAction { + public LowFilter(IFilterChangeListener listener) { + super("low", listener); + } + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/actions/VulnerabilityFilterState.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/actions/VulnerabilityFilterState.java new file mode 100644 index 00000000..9e2b7d21 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/actions/VulnerabilityFilterState.java @@ -0,0 +1,67 @@ +package com.checkmarx.eclipse.devassist.ui.findings.actions; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * Holds filter state (set of severity levels) for the Findings view. + * Singleton pattern for managing active filters across the application. + */ +public class VulnerabilityFilterState { + + private static final VulnerabilityFilterState INSTANCE = new VulnerabilityFilterState(); + + private final Set selectedFilters = Collections.synchronizedSet(new HashSet<>()); + + private VulnerabilityFilterState() { + // Initialize with default filters (all severities) + selectedFilters.add("malicious"); + selectedFilters.add("critical"); + selectedFilters.add("high"); + selectedFilters.add("medium"); + selectedFilters.add("low"); + } + + public static VulnerabilityFilterState getInstance() { + return INSTANCE; + } + + public Set getFilters() { + return selectedFilters; + } + + public void addFilter(String severity) { + if (severity != null) { + selectedFilters.add(severity.toLowerCase()); + } + } + + public void removeFilter(String severity) { + if (severity != null) { + selectedFilters.remove(severity.toLowerCase()); + } + } + + public boolean hasFilter(String severity) { + if (severity == null) { + + return false; + } + boolean result = selectedFilters.contains(severity.toLowerCase()); + return result; + } + + public void clearFilters() { + selectedFilters.clear(); + } + + public void resetToDefaults() { + selectedFilters.clear(); + selectedFilters.add("malicious"); + selectedFilters.add("critical"); + selectedFilters.add("high"); + selectedFilters.add("medium"); + selectedFilters.add("low"); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/dialogs/ProblemDescription.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/dialogs/ProblemDescription.java new file mode 100644 index 00000000..5dc0a5f1 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/dialogs/ProblemDescription.java @@ -0,0 +1,181 @@ +package com.checkmarx.eclipse.devassist.ui.findings.dialogs; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.Vulnerability; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Responsible for handling and formatting descriptions of scan issues. + * Provides utility methods to construct and format messages for different issue types. + * Uses HTML formatting for rich text display. + */ +public final class ProblemDescription { + + private static final String TITLE_FONT_SIZE = "font-size:11px;"; + private static final String TITLE_FONT_FAMILY = "font-family: menlo;"; + private static final String CELL_LINE_HEIGHT_STYLE = "line-height:16px;vertical-align:middle;"; + private static final String SECONDARY_SPAN_STYLE = "display:inline-block;vertical-align:middle;line-height:16px;font-size:11px;color:#ADADAD;"; + + private static final String TABLE_WITH_TR = ""; + + /** + * Formats a description for the given scan issue. + * + * @param scanIssue the ScanIssue object + * @return formatted HTML description + */ + public String formatDescription(ScanIssue scanIssue) { + StringBuilder descBuilder = new StringBuilder(); + descBuilder.append(""); + + switch (scanIssue.getScanEngine()) { + case OSS: + buildOSSDescription(descBuilder, scanIssue); + break; + case ASCA: + buildASCADescription(descBuilder, scanIssue); + break; + case SECRETS: + buildSecretsDescription(descBuilder, scanIssue); + break; + case IAC: + buildIACDescription(descBuilder, scanIssue); + break; + case CONTAINERS: + buildContainerDescription(descBuilder, scanIssue); + break; + default: + buildDefaultDescription(descBuilder, scanIssue); + } + + descBuilder.append(""); + return descBuilder.toString(); + } + + private void buildOSSDescription(StringBuilder descBuilder, ScanIssue scanIssue) { + descBuilder.append(TABLE_WITH_TR) + .append("") + .append("
") + .append("

") + .append("").append(escapeHtml(scanIssue.getTitle())).append("@") + .append(escapeHtml(scanIssue.getPackageVersion())).append("") + .append(" - ") + .append(escapeHtml(scanIssue.getSeverity())).append(" Risk Package") + .append("

"); + buildVulnerabilitySection(descBuilder, scanIssue); + } + + private void buildContainerDescription(StringBuilder descBuilder, ScanIssue scanIssue) { + descBuilder.append(TABLE_WITH_TR) + .append("") + .append("") + .append("

") + .append("").append(escapeHtml(scanIssue.getTitle())).append("@") + .append(escapeHtml(scanIssue.getImageTag())).append("") + .append("

"); + buildVulnerabilitySection(descBuilder, scanIssue); + } + + private void buildIACDescription(StringBuilder descBuilder, ScanIssue scanIssue) { + List vulnerabilities = scanIssue.getVulnerabilities(); + if (vulnerabilities != null) { + for (Vulnerability vulnerability : vulnerabilities) { + descBuilder.append(TABLE_WITH_TR) + .append("") + .append("") + .append("

") + .append("").append(escapeHtml(vulnerability.getTitle())).append("") + .append(" - ").append(escapeHtml(vulnerability.getDescription())) + .append(" - IaC vulnerability") + .append("

"); + } + } + } + + private void buildSecretsDescription(StringBuilder descBuilder, ScanIssue scanIssue) { + descBuilder.append(TABLE_WITH_TR) + .append("") + .append("") + .append("

") + .append("").append(escapeHtml(formatTitle(scanIssue.getTitle()))).append("") + .append(" - Secret finding") + .append("

"); + } + + private void buildASCADescription(StringBuilder descBuilder, ScanIssue scanIssue) { + List vulnerabilities = scanIssue.getVulnerabilities(); + if (vulnerabilities != null) { + for (Vulnerability vulnerability : vulnerabilities) { + descBuilder.append(TABLE_WITH_TR) + .append("") + .append("") + .append("

") + .append("").append(escapeHtml(vulnerability.getTitle())).append("") + .append(" - ").append(escapeHtml(vulnerability.getDescription())) + .append(" - SAST vulnerability") + .append("

"); + } + } + } + + private void buildDefaultDescription(StringBuilder descBuilder, ScanIssue scanIssue) { + descBuilder.append("
").append(escapeHtml(scanIssue.getTitle())).append(" -") + .append(escapeHtml(scanIssue.getDescription())).append("
"); + } + + private void buildVulnerabilitySection(StringBuilder descBuilder, ScanIssue scanIssue) { + List vulnerabilityList = scanIssue.getVulnerabilities(); + if (vulnerabilityList == null || vulnerabilityList.isEmpty()) { + return; + } + + descBuilder.append("
").append(TABLE_WITH_TR); + Map vulnerabilityCount = vulnerabilityList.stream() + .map(Vulnerability::getSeverity) + .collect(Collectors.groupingBy(severity -> severity, Collectors.counting())); + + vulnerabilityCount.forEach((severity, count) -> { + descBuilder.append("") + .append("") + .append(count).append(""); + }); + + descBuilder.append("
"); + } + + /** + * Formats a kebab-case title into Title-Case. + */ + private String formatTitle(String title) { + if (title == null || title.isEmpty()) { + return ""; + } + return Arrays.stream(title.split("-")) + .map(word -> word.isEmpty() ? "" : Character.toUpperCase(word.charAt(0)) + word.substring(1).toLowerCase()) + .collect(Collectors.joining("-")); + } + + /** + * Escape HTML special characters. + */ + private String escapeHtml(String text) { + if (text == null) { + return ""; + } + return text.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\"", """) + .replace("'", "'"); + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/editor/FindingsAnnotation.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/editor/FindingsAnnotation.java new file mode 100644 index 00000000..b6fa460c --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/editor/FindingsAnnotation.java @@ -0,0 +1,71 @@ +//package com.checkmarx.eclipse.devassist.ui.findings.editor; +// +//import org.eclipse.jface.text.source.Annotation; +// +///** +// * Custom annotation for Findings window highlighting. +// * Represents a security finding annotation in the editor with title and description. +// */ +//public class FindingsAnnotation extends Annotation { +// +// private final String title; +// private final String description; +// +// public FindingsAnnotation(String annotationType, String title, String description) { +// super(annotationType, false, null); +// this.title = title; +// this.description = description; +// } +// +// public String getTitle() { +// return title; +// } +// +// public String getDescription() { +// return description; +// } +// +// @Override +// public String getText() { +// return title; +// } +//} +package com.checkmarx.eclipse.devassist.ui.findings.editor; + +import java.util.ArrayList; +import java.util.List; +import org.eclipse.jface.text.source.Annotation; + +public class FindingsAnnotation extends Annotation { + + private String title; + private String description; + private List buttons = new ArrayList<>(); + + public FindingsAnnotation(String type, String title, String description) { + super(type, false, title); + this.title = title; + this.description = description; + } + + public void addButton(String label, Runnable action) { + buttons.add(new AnnotationButton(label, action)); + } + + public List getButtons() { + return buttons; + } + + public String getTitle() { return title; } + public String getDescription() { return description; } + + public static class AnnotationButton { + public String label; + public Runnable action; + + public AnnotationButton(String label, Runnable action) { + this.label = label; + this.action = action; + } + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/editor/FindingsEditorOverlay.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/editor/FindingsEditorOverlay.java new file mode 100644 index 00000000..b1bed62e --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/editor/FindingsEditorOverlay.java @@ -0,0 +1,140 @@ +package com.checkmarx.eclipse.devassist.ui.findings.editor; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.Position; +import org.eclipse.jface.text.source.IAnnotationModel; +import org.eclipse.jface.text.source.ISourceViewer; +import org.eclipse.ui.editors.text.TextEditor; +import com.checkmarx.eclipse.devassist.model.Location; +import com.checkmarx.eclipse.devassist.model.ScanIssue; + +/** + * Manages highlighting and underlining of problematic code lines in the editor. + * Provides visual feedback for findings by underlining vulnerable code with severity-based colors. + * + * Supports: + * - Red wavy underline for CRITICAL/HIGH issues + * - Yellow wavy underline for MEDIUM issues + * - Blue wavy underline for LOW issues + * - Auto-clear on navigation away + */ +public class FindingsEditorOverlay { + + // These match the annotation types defined in plugin.xml + private static final String ANNOTATION_TYPE_MALICIOUS = "com.checkmarx.eclipse.findings.malicious"; + private static final String ANNOTATION_TYPE_CRITICAL = "com.checkmarx.eclipse.findings.critical"; + private static final String ANNOTATION_TYPE_HIGH = "com.checkmarx.eclipse.findings.high"; + private static final String ANNOTATION_TYPE_MEDIUM = "com.checkmarx.eclipse.findings.medium"; + private static final String ANNOTATION_TYPE_LOW = "com.checkmarx.eclipse.findings.low"; + + /** + * Highlight a problematic line in the editor. + * + * @param editor The TextEditor to highlight in + * @param issue The scan issue containing location information + */ + public static void highlightIssueLine(TextEditor editor, ScanIssue issue) { + try { + if (editor == null || issue == null || issue.getLocations() == null || issue.getLocations().isEmpty()) { + return; + } + + Location location = issue.getLocations().get(0); + int lineNumber = location.getLine() - 1; // Convert to 0-based + + ISourceViewer viewer = (ISourceViewer) editor.getAdapter(ISourceViewer.class); + if (viewer == null) { + + return; + } + + IDocument document = viewer.getDocument(); + if (document == null || lineNumber < 0 || lineNumber >= document.getNumberOfLines()) { + + return; + } + + // Get line start and end offsets + int lineStartOffset = document.getLineOffset(lineNumber); + int lineLength = document.getLineLength(lineNumber); + int lineEndOffset = lineStartOffset + lineLength; + + // Create annotation for the line + String annotationType = getAnnotationTypeForSeverity(issue.getSeverity()); + FindingsAnnotation annotation = new FindingsAnnotation(annotationType, issue.getTitle(), issue.getDescription()); + Position position = new Position(lineStartOffset, lineEndOffset - lineStartOffset); + + // Add annotation to model + IAnnotationModel annotationModel = viewer.getAnnotationModel(); + if (annotationModel != null) { + annotationModel.addAnnotation(annotation, position); + + + + + + } + } catch (BadLocationException e) { + + } + } + + /** + * Clear all findings annotations from the editor. + */ + public static void clearHighlights(TextEditor editor) { + try { + if (editor == null) { + return; + } + + ISourceViewer viewer = (ISourceViewer) editor.getAdapter(ISourceViewer.class); + if (viewer == null) { + return; + } + + IAnnotationModel annotationModel = viewer.getAnnotationModel(); + if (annotationModel == null) { + return; + } + + // Remove all findings annotations + annotationModel.getAnnotationIterator().forEachRemaining(annotation -> { + if (annotation instanceof FindingsAnnotation) { + annotationModel.removeAnnotation(annotation); + } + }); + + + } catch (Exception e) { + + } + } + + /** + * Get annotation type based on severity level. + * Maps all problem severities to their corresponding annotation types. + */ + private static String getAnnotationTypeForSeverity(String severity) { + if (severity == null) { + return ANNOTATION_TYPE_MEDIUM; + } + + switch (severity.toLowerCase()) { + case "malicious": + return ANNOTATION_TYPE_MALICIOUS; + case "critical": + case "high": + return ANNOTATION_TYPE_CRITICAL; + case "medium": + return ANNOTATION_TYPE_MEDIUM; + case "low": + case "info": + return ANNOTATION_TYPE_LOW; + default: + return ANNOTATION_TYPE_MEDIUM; + } + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/icons/IconRegistry.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/icons/IconRegistry.java new file mode 100644 index 00000000..1a996ca6 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/icons/IconRegistry.java @@ -0,0 +1,121 @@ +package com.checkmarx.eclipse.devassist.ui.findings.icons; + +import org.eclipse.jface.resource.ImageRegistry; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import com.checkmarx.eclipse.devassist.backend.Constants; + +/** + * Registry for managing Checkmarx severity icons. + * Handles icon loading and caching for different sizes and themes. + */ +public class IconRegistry { + + public enum Size { + SMALL("_16"), + MEDIUM("_20"); + + private final String suffix; + + Size(String suffix) { + this.suffix = suffix; + } + + public String getSuffix() { + return suffix; + } + } + + public enum Severity { + MALICIOUS("malicious"), + CRITICAL("critical"), + HIGH("high"), + MEDIUM("medium"), + LOW("low"); + + private final String name; + + Severity(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + private static ImageRegistry imageRegistry; + + static { + initializeRegistry(); + } + + private static void initializeRegistry() { + imageRegistry = PlatformUI.getWorkbench().getDisplay() != null + ? new ImageRegistry(PlatformUI.getWorkbench().getDisplay()) + : new ImageRegistry(); + + // Register small icons (16px) + registerIcon("malicious_16", "icons/severity/malicious_16.svg"); + registerIcon("critical_16", "icons/severity/critical_16.svg"); + registerIcon("high_16", "icons/severity/high_16.svg"); + registerIcon("medium_16", "icons/severity/medium_16.svg"); + registerIcon("low_16", "icons/severity/low_16.svg"); + + // Register medium icons (20px) + registerIcon("malicious_20", "icons/severity/malicious_20.svg"); + registerIcon("critical_20", "icons/severity/critical_20.svg"); + registerIcon("high_20", "icons/severity/high_20.svg"); + registerIcon("medium_20", "icons/severity/medium_20.svg"); + registerIcon("low_20", "icons/severity/low_20.svg"); + + // Register base icons + registerIcon("malicious", "icons/severity/malicious.svg"); + registerIcon("critical", "icons/severity/critical.svg"); + registerIcon("high", "icons/severity/high.svg"); + registerIcon("medium", "icons/severity/medium.svg"); + registerIcon("low", "icons/severity/low.svg"); + } + + private static void registerIcon(String key, String path) { + AbstractUIPlugin.imageDescriptorFromPlugin(Constants.MAIN_PLUGIN_ID, path); + imageRegistry.put(key, AbstractUIPlugin.imageDescriptorFromPlugin(Constants.MAIN_PLUGIN_ID, path)); + } + + /** + * Get icon for a severity level and size. + * + * @param severity Severity level (case-insensitive) + * @param size Icon size + * @return Image instance or null if not found + */ + public static Image getIcon(String severity, Size size) { + if (severity == null) { + return null; + } + + String key = severity.toLowerCase() + size.getSuffix(); + return imageRegistry.get(key); + } + + /** + * Get icon for a severity level with default small size. + * + * @param severity Severity level + * @return Image instance or null if not found + */ + public static Image getIcon(String severity) { + return getIcon(severity, Size.SMALL); + } + + /** + * Get image registry. + * + * @return ImageRegistry instance + */ + public static ImageRegistry getRegistry() { + return imageRegistry; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/icons/SeverityImageComposer.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/icons/SeverityImageComposer.java new file mode 100644 index 00000000..980648f1 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/icons/SeverityImageComposer.java @@ -0,0 +1,243 @@ +package com.checkmarx.eclipse.devassist.ui.findings.icons; + +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Display; +import com.checkmarx.eclipse.devassist.ui.findings.model.FileNodeLabel; +import java.util.HashMap; +import java.util.Map; + +/** + * Composes severity icons into a single visual representation. + * Creates badges like: [C:4] [H:3] [M:1] as actual icon images + */ +public class SeverityImageComposer { + + private static final Map compositeImageCache = new HashMap<>(); + + /** + * Create a full composite image with severity icon badges displayed inline. + * Shows actual colored severity icons (🔴 🟠 🟡 🟢) after the filename. + */ + public static Image createFullCompositeImage(FileNodeLabel fileNode) { + if (fileNode == null || fileNode.getProblemCount() == null || fileNode.getProblemCount().isEmpty()) { + return null; + } + + try { + Display display = Display.getDefault(); + Image compositeImage = createFullBadgeImage(display, fileNode); + return compositeImage; + } catch (Exception e) { + return null; + } + } + + /** + * Create a composite image showing severity icons with counts inline. + * Example: Creates visual badges for Critical:4, High:3, Medium:1 + */ + public static Image createSeverityBadgeImage(FileNodeLabel fileNode) { + if (fileNode == null || fileNode.getProblemCount() == null || fileNode.getProblemCount().isEmpty()) { + return null; + } + + // Create cache key + String cacheKey = createCacheKey(fileNode); + if (compositeImageCache.containsKey(cacheKey)) { + return compositeImageCache.get(cacheKey); + } + + try { + // Get display for image creation + Display display = Display.getDefault(); + + // Create a composite image showing severity badges + // Format: Show icon + count for each severity with > 0 count + Image compositeImage = createBadgeImage(display, fileNode); + + if (compositeImage != null) { + compositeImageCache.put(cacheKey, compositeImage); + } + + return compositeImage; + } catch (Exception e) { + return null; + } + } + + /** + * Create a badge image showing severity levels inline + */ + private static Image createBadgeImage(Display display, FileNodeLabel fileNode) { + try { + // Get individual severity icons + Image criticalIcon = IconRegistry.getIcon("critical", IconRegistry.Size.SMALL); // 16x16 + Image highIcon = IconRegistry.getIcon("high", IconRegistry.Size.SMALL); + Image mediumIcon = IconRegistry.getIcon("medium", IconRegistry.Size.SMALL); + Image lowIcon = IconRegistry.getIcon("low", IconRegistry.Size.SMALL); + + // Calculate total width needed + int iconSize = 16; + int spacing = 1; + int width = 0; + + if (hasCount(fileNode, "critical")) { + width += iconSize + spacing; + } + if (hasCount(fileNode, "high")) { + width += iconSize + spacing; + } + if (hasCount(fileNode, "medium")) { + width += iconSize + spacing; + } + if (hasCount(fileNode, "low")) { + width += iconSize + spacing; + } + + if (width == 0) { + return null; + } + + // Adjust width to remove last spacing + width = Math.max(0, width - spacing); + + // Create composite image + Image compositeImage = new Image(display, width, iconSize); + GC gc = new GC(compositeImage); + gc.setBackground(display.getSystemColor(org.eclipse.swt.SWT.COLOR_WIDGET_BACKGROUND)); + gc.fillRectangle(0, 0, width, iconSize); + gc.setAntialias(org.eclipse.swt.SWT.ON); + + int x = 0; + int y = 0; + + // Draw critical icon if count > 0 + if (hasCount(fileNode, "critical") && criticalIcon != null) { + gc.drawImage(criticalIcon, x, y); + x += iconSize + spacing; + } + + // Draw high icon if count > 0 + if (hasCount(fileNode, "high") && highIcon != null) { + gc.drawImage(highIcon, x, y); + x += iconSize + spacing; + } + + // Draw medium icon if count > 0 + if (hasCount(fileNode, "medium") && mediumIcon != null) { + gc.drawImage(mediumIcon, x, y); + x += iconSize + spacing; + } + + // Draw low icon if count > 0 + if (hasCount(fileNode, "low") && lowIcon != null) { + gc.drawImage(lowIcon, x, y); + x += iconSize + spacing; + } + + gc.dispose(); + return compositeImage; + + } catch (Exception e) { + return null; + } + } + + /** + * Create a full badge image showing only severity icons inline (no text). + * Displays: [🔴][🟠][🟡][🟢] based on which severities have counts + */ + private static Image createFullBadgeImage(Display display, FileNodeLabel fileNode) { + try { + // Get individual severity icons + Image criticalIcon = IconRegistry.getIcon("critical", IconRegistry.Size.SMALL); // 16x16 + Image highIcon = IconRegistry.getIcon("high", IconRegistry.Size.SMALL); + Image mediumIcon = IconRegistry.getIcon("medium", IconRegistry.Size.SMALL); + Image lowIcon = IconRegistry.getIcon("low", IconRegistry.Size.SMALL); + + // Calculate total width needed + int iconSize = 16; + int spacing = 2; + int totalWidth = 0; + + // Count how many icons we need + int iconCount = 0; + if (hasCount(fileNode, "critical")) iconCount++; + if (hasCount(fileNode, "high")) iconCount++; + if (hasCount(fileNode, "medium")) iconCount++; + if (hasCount(fileNode, "low")) iconCount++; + + if (iconCount == 0) { + return null; + } + + // Calculate width: (iconSize + spacing) * count - spacing + totalWidth = (iconSize + spacing) * iconCount - spacing; + + // Create composite image with severity icons + Image compositeImage = new Image(display, totalWidth, iconSize); + GC gc = new GC(compositeImage); + gc.setBackground(display.getSystemColor(org.eclipse.swt.SWT.COLOR_WIDGET_BACKGROUND)); + gc.fillRectangle(0, 0, totalWidth, iconSize); + gc.setAntialias(org.eclipse.swt.SWT.ON); + + int x = 0; + int y = 0; + + // Draw critical icon + if (hasCount(fileNode, "critical") && criticalIcon != null) { + gc.drawImage(criticalIcon, x, y); + x += iconSize + spacing; + } + + // Draw high icon + if (hasCount(fileNode, "high") && highIcon != null) { + gc.drawImage(highIcon, x, y); + x += iconSize + spacing; + } + + // Draw medium icon + if (hasCount(fileNode, "medium") && mediumIcon != null) { + gc.drawImage(mediumIcon, x, y); + x += iconSize + spacing; + } + + // Draw low icon + if (hasCount(fileNode, "low") && lowIcon != null) { + gc.drawImage(lowIcon, x, y); + x += iconSize + spacing; + } + + gc.dispose(); + return compositeImage; + + } catch (Exception e) { + return null; + } + } + + private static boolean hasCount(FileNodeLabel fileNode, String severity) { + Long count = fileNode.getProblemCount().get(severity); + return count != null && count > 0; + } + + private static String createCacheKey(FileNodeLabel fileNode) { + StringBuilder key = new StringBuilder(); + key.append("c:").append(fileNode.getProblemCount().getOrDefault("critical", 0L)).append("|"); + key.append("h:").append(fileNode.getProblemCount().getOrDefault("high", 0L)).append("|"); + key.append("m:").append(fileNode.getProblemCount().getOrDefault("medium", 0L)).append("|"); + key.append("l:").append(fileNode.getProblemCount().getOrDefault("low", 0L)); + return key.toString(); + } + + public static void clearCache() { + for (Image img : compositeImageCache.values()) { + if (img != null && !img.isDisposed()) { + img.dispose(); + } + } + compositeImageCache.clear(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/ignored/IgnoredProblemsStore.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/ignored/IgnoredProblemsStore.java new file mode 100644 index 00000000..94bd402d --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/ignored/IgnoredProblemsStore.java @@ -0,0 +1,212 @@ +package com.checkmarx.eclipse.devassist.ui.findings.ignored; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.runtime.preferences.ConfigurationScope; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.osgi.service.prefs.BackingStoreException; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; + +/** + * Persistent storage for ignored problems. Uses Eclipse preferences to store + * ignored problem IDs. Provides thread-safe access to ignored problems list. + */ +public class IgnoredProblemsStore { + + private static final String PLUGIN_ID = "com.checkmarx.ast.eclipse"; + private static final String PREF_IGNORED_PROBLEMS = "ignoredProblems"; + private static final String SEPARATOR = ","; + + private static final IgnoredProblemsStore INSTANCE = new IgnoredProblemsStore(); + private final Set ignoredProblemIds = Collections.synchronizedSet(new HashSet<>()); + private final Map ignoredProblemsCache = Collections.synchronizedMap(new HashMap<>()); + private final List listeners = Collections.synchronizedList(new ArrayList<>()); + + private IgnoredProblemsStore() { + loadFromPreferences(); + } + + public static IgnoredProblemsStore getInstance() { + return INSTANCE; + } + + /** + * Add a problem to the ignored list (by ID only). + */ + public void ignoreProblem(String problemId) { + if (problemId != null && ignoredProblemIds.add(problemId)) { + + saveToPreferences(); + notifyListeners(); + } + } + + /** + * Add a finding to the ignored list with full finding details. + * This allows findings from the Findings View to be properly displayed in the Ignored Problems View. + */ + public void ignoreProblem(ScanIssue issue) { + if (issue != null && issue.getScanIssueId() != null) { + + ignoreProblem(issue.getScanIssueId()); + // Cache the full issue details for later retrieval + ignoredProblemsCache.put(issue.getScanIssueId(), issue); + + } else { + + } + } + + /** + * Remove a problem from the ignored list (restore it). + */ + public void restoreProblem(String problemId) { + if (problemId != null && ignoredProblemIds.remove(problemId)) { + + ignoredProblemsCache.remove(problemId); + saveToPreferences(); + notifyListeners(); + } + } + + /** + * Check if a problem is ignored. + */ + public boolean isIgnored(String problemId) { + return problemId != null && ignoredProblemIds.contains(problemId); + } + + /** + * Get all ignored problem IDs. + */ + public Set getIgnoredProblemIds() { + return new HashSet<>(ignoredProblemIds); + } + + /** + * Filter a list of issues, returning only non-ignored ones. + */ + public List filterActiveProblems(List issues) { + List active = new ArrayList<>(); + for (ScanIssue issue : issues) { + if (!isIgnored(issue.getScanIssueId())) { + active.add(issue); + } + } + return active; + } + + /** + * Get only ignored issues from a list. + */ + public List getIgnoredProblems(List allIssues) { + List ignored = new ArrayList<>(); + for (ScanIssue issue : allIssues) { + if (isIgnored(issue.getScanIssueId())) { + ignored.add(issue); + } + } + return ignored; + } + + /** + * Get all ignored issues including cached findings from the Findings View. + * Combines issues from the provided list with cached issue details. + */ + public List getAllIgnoredProblems(List allIssues) { + List result = new ArrayList<>(); + + // First add ignored issues from the provided list + if (allIssues != null) { + for (ScanIssue issue : allIssues) { + if (isIgnored(issue.getScanIssueId())) { + result.add(issue); + } + } + } + + // Then add any cached issues not yet in the result (e.g., findings from Findings View) + for (Map.Entry entry : ignoredProblemsCache.entrySet()) { + if (isIgnored(entry.getKey()) && !result.stream().anyMatch(i -> i.getScanIssueId().equals(entry.getKey()))) { + result.add(entry.getValue()); + } + } + + return result; + } + + /** + * Clear all ignored problems. + */ + public void clearAll() { + ignoredProblemIds.clear(); + ignoredProblemsCache.clear(); + saveToPreferences(); + notifyListeners(); + + } + + /** + * Register listener for ignore/restore events. + */ + public void addListener(IgnoredProblemsListener listener) { + if (listener != null) { + listeners.add(listener); + } + } + + /** + * Unregister listener. + */ + public void removeListener(IgnoredProblemsListener listener) { + listeners.remove(listener); + } + + private void notifyListeners() { + for (IgnoredProblemsListener listener : listeners) { + listener.onIgnoredProblemsChanged(); + } + } + + private void loadFromPreferences() { + try { + IEclipsePreferences prefs = ConfigurationScope.INSTANCE.getNode(PLUGIN_ID); + String ignored = prefs.get(PREF_IGNORED_PROBLEMS, ""); + if (!ignored.isEmpty()) { + String[] ids = ignored.split(SEPARATOR); + for (String id : ids) { + if (!id.trim().isEmpty()) { + ignoredProblemIds.add(id.trim()); + } + } + + } + } catch (Exception e) { + System.err.println("[IGNORED-STORE] Error loading preferences: " + e.getMessage()); + } + } + + private void saveToPreferences() { + try { + IEclipsePreferences prefs = ConfigurationScope.INSTANCE.getNode(PLUGIN_ID); + String ignored = String.join(SEPARATOR, ignoredProblemIds); + prefs.put(PREF_IGNORED_PROBLEMS, ignored); + prefs.flush(); + + } catch (BackingStoreException e) { + System.err.println("[IGNORED-STORE] Error saving preferences: " + e.getMessage()); + } + } + + public interface IgnoredProblemsListener { + void onIgnoredProblemsChanged(); + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/integration/CopilotIntegration.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/integration/CopilotIntegration.java new file mode 100644 index 00000000..165f6a5d --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/integration/CopilotIntegration.java @@ -0,0 +1,381 @@ +package com.checkmarx.eclipse.devassist.ui.findings.integration; + +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.commands.ICommandService; +import org.eclipse.core.commands.Command; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.statushandlers.StatusManager; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.IStatus; +import java.util.HashMap; +import java.util.Map; + +import com.checkmarx.eclipse.common.utils.CxLogger; +import com.checkmarx.eclipse.devassist.backend.Constants; + +/** + * Integration with GitHub Copilot for Eclipse. + * + * Attempts to send prompts to Copilot chat via available commands. + * Falls back to clipboard if Copilot is unavailable. + * + * Implementation Strategy: + * 1. Try to find and execute Copilot commands (70% probability they exist) + * 2. If commands not available, copy prompt to clipboard + * 3. User can manually paste into Copilot Chat + * + * This ensures users always have the prompt available, either: + * - Sent automatically to Copilot (best case) + * - In clipboard for manual paste (fallback) + */ +public class CopilotIntegration { + + private static final String LOG_PREFIX = "[COPILOT-INTEGRATION]"; + + /** + * Known Copilot command IDs to try (in priority order) + * Using Microsoft Copilot for Eclipse commands + */ + private static final String COPILOT_OPEN_COMMAND = "com.microsoft.copilot.eclipse.commands.openChatView"; + private static final String COPILOT_INPUT_PARAM = "com.microsoft.copilot.eclipse.commands.openChatView.inputValue"; + private static final String COPILOT_AUTO_SEND_PARAM = "com.microsoft.copilot.eclipse.commands.openChatView.autoSend"; + + /** + * Send a prompt to Copilot Chat. + * + * Smart fallback strategy: + * 1. Try to send via Copilot command (best case) + * 2. If command fails, copy to clipboard (fallback) + * 3. Show appropriate notification based on what succeeded + * + * @param prompt The prompt to send to Copilot + * @return true if successfully sent via command or clipboard + */ + public static boolean sendPromptToCopilot(String prompt) { + if (prompt == null || prompt.isEmpty()) { + CxLogger.error("Cannot send empty prompt to Copilot", new Exception("Empty prompt")); + return false; + } + + CxLogger.info(LOG_PREFIX + " Attempting to send prompt to Copilot..."); + + // Step 1: Try to send prompt via Copilot command + boolean copilotSuccess = tryPasteAndSendToCopilot(prompt); + + if (copilotSuccess) { + CxLogger.info(LOG_PREFIX + " ✓ Successfully sent prompt via Copilot command"); + return true; + } + + // Step 2: Fallback - copy to clipboard if command failed + CxLogger.warning(LOG_PREFIX + " Copilot command failed - falling back to clipboard"); + boolean clipboardSuccess = copyToClipboard(prompt); + + if (clipboardSuccess) { + CxLogger.info(LOG_PREFIX + " ✓ Prompt copied to clipboard as fallback"); + showNotification( + "Fix Prompt Copied (Copilot Unavailable)", + "The Copilot command is not available.\n\n" + + "✓ The fix prompt has been copied to your clipboard.\n\n" + + "Open Microsoft Copilot Chat and paste (Ctrl+V) to get AI-powered fix suggestions.", + IStatus.INFO + ); + return true; // Success because clipboard worked + } + + // Both methods failed + CxLogger.error(LOG_PREFIX + " Failed to send prompt - both command and clipboard failed", + new Exception("Copilot command and clipboard fallback both failed")); + showNotification( + "Failed to Send Prompt", + "Could not send prompt to Copilot Chat or copy to clipboard.\n\n" + + "Please check that Copilot is properly installed.", + IStatus.WARNING + ); + return false; + } + + /** + * Tries to paste the prompt into Copilot Chat and trigger send + * + * @param prompt The prompt to paste + * @return true if successfully pasted, false otherwise + */ + private static boolean tryPasteAndSendToCopilot(String prompt) { + final boolean[] success = { false }; + + try { + // Step 1: Try to execute Copilot open command with prompt + CxLogger.info(LOG_PREFIX + " Attempting to execute Copilot open command with prompt..."); + boolean commandExecuted = executeOpenCopilotCommand(prompt); + if (commandExecuted) { + CxLogger.info(LOG_PREFIX + " ✓ Copilot command executed successfully - prompt sent!"); + return true; // Success - command handled it all + } else { + CxLogger.warning(LOG_PREFIX + " Copilot command execution failed - attempting manual paste fallback"); + } + + // Step 2: Try to find and paste into the view + Display.getDefault().syncExec(() -> { + try { + IWorkbenchWindow activeWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (activeWindow == null) { + CxLogger.warning(LOG_PREFIX + " No active workbench window"); + return; + } + + IWorkbenchPage activePage = activeWindow.getActivePage(); + if (activePage == null) { + CxLogger.warning(LOG_PREFIX + " No active workbench page"); + return; + } + + // Try known Copilot view IDs + String[] copilotViewIds = { + "GitHub.Copilot.Chat.View", + "com.github.copilot.chat.view", + "copilot.chatView", + "com.github.copilot.views.CopilotChatView" + }; + + IViewPart copilotView = null; + String foundViewId = null; + for (String viewId : copilotViewIds) { + try { + copilotView = activePage.findView(viewId); + if (copilotView != null) { + foundViewId = viewId; + CxLogger.info(LOG_PREFIX + " Found Copilot Chat view: " + viewId); + break; + } + } catch (Exception e) { + // Try next + } + } + + if (copilotView == null) { + CxLogger.warning(LOG_PREFIX + " Could not find Copilot Chat view after command execution"); + return; + } + + // Activate the view and bring to front + activePage.activate(copilotView); + activeWindow.getShell().forceActive(); + CxLogger.info(LOG_PREFIX + " Activated Copilot Chat view: " + foundViewId); + + // Find the text input field + Control control = copilotView.getAdapter(Control.class); + if (control == null || control.isDisposed()) { + CxLogger.warning(LOG_PREFIX + " Could not get control from Copilot view"); + return; + } + + Text inputField = findTextInputField(control); + if (inputField == null || inputField.isDisposed()) { + CxLogger.warning(LOG_PREFIX + " Could not find text input field in Copilot Chat"); + return; + } + + // Focus and set the content + inputField.setFocus(); + inputField.setText(prompt); + + CxLogger.info(LOG_PREFIX + " ✓ Successfully pasted prompt into Copilot Chat input field"); + success[0] = true; + + // Note: We don't auto-send to give user a chance to review + // User can press Enter or click Send button manually + + } catch (Exception e) { + CxLogger.warning(LOG_PREFIX + " Error pasting to Copilot Chat: " + e.getMessage()); + e.printStackTrace(); + } + }); + + } catch (Exception e) { + CxLogger.error(LOG_PREFIX + " Error in tryPasteAndSendToCopilot: " + e.getMessage(), e); + } + + return success[0]; + } + + /** + * Executes Microsoft Copilot for Eclipse command to open chat with prompt + * + * @param prompt The prompt to send to Copilot + * @return true if command was executed successfully, false otherwise + */ + private static boolean executeOpenCopilotCommand(String prompt) { + final boolean[] success = { false }; + + try { + Display.getDefault().syncExec(() -> { + try { + // Get the command service + ICommandService commandService = PlatformUI.getWorkbench() + .getService(ICommandService.class); + + if (commandService == null) { + CxLogger.warning(LOG_PREFIX + " ICommandService not available"); + return; + } + + // Get the Copilot open command + Command command = commandService.getCommand(COPILOT_OPEN_COMMAND); + + if (command == null) { + CxLogger.warning(LOG_PREFIX + " Copilot command not found: " + COPILOT_OPEN_COMMAND); + return; + } + + if (!command.isEnabled()) { + CxLogger.warning(LOG_PREFIX + " Copilot command is not enabled"); + return; + } + + CxLogger.info(LOG_PREFIX + " Found Copilot command: " + COPILOT_OPEN_COMMAND); + + // Create parameters map for the command + java.util.Map parameters = new java.util.HashMap<>(); + parameters.put(COPILOT_INPUT_PARAM, prompt); + parameters.put(COPILOT_AUTO_SEND_PARAM, "true"); + + // Execute the command with parameters + try { + + command.executeWithChecks(new ExecutionEvent( + command, + parameters, + null, + null + )); + + + + + CxLogger.info(LOG_PREFIX + " ✓ Successfully executed Copilot command with prompt"); + success[0] = true; + + + + } catch (Exception e) { + CxLogger.warning(LOG_PREFIX + " Command execution failed: " + e.getMessage()); + e.printStackTrace(); + } + + } catch (Exception e) { + CxLogger.warning(LOG_PREFIX + " Error executing Copilot command: " + e.getMessage()); + } + }); + + } catch (Exception e) { + CxLogger.error(LOG_PREFIX + " Error in executeOpenCopilotCommand: " + e.getMessage(), e); + } + + return success[0]; + } + + + /** + * Recursively searches for a Text widget that appears to be the chat input (fallback) + * + * @param control The control to search + * @return The text widget if found, null otherwise + */ + private static Text findTextInputField(Control control) { + if (control == null || control.isDisposed()) { + return null; + } + + // If this is a Text widget, it might be the input field + if (control instanceof Text) { + Text text = (Text) control; + // Look for text widget that's editable and multi-line + if (!text.isDisposed() && (text.getStyle() & SWT.MULTI) != 0) { + return text; + } + } + + // Recursively search children if this is a composite + if (control instanceof Composite) { + Composite composite = (Composite) control; + Control[] children = composite.getChildren(); + for (Control child : children) { + Text found = findTextInputField(child); + if (found != null) { + return found; + } + } + } + + return null; + } + + /** + * Copies text to system clipboard + * + * @param text The text to copy + * @return true if successful, false otherwise + */ + private static boolean copyToClipboard(String text) { + try { + Display display = Display.getDefault(); + + display.syncExec(() -> { + Clipboard clipboard = new Clipboard(display); + TextTransfer transfer = TextTransfer.getInstance(); + clipboard.setContents(new Object[] { text }, new org.eclipse.swt.dnd.Transfer[] { transfer }); + clipboard.dispose(); + }); + + CxLogger.info(LOG_PREFIX + " Text copied to clipboard"); + return true; + } catch (Exception e) { + CxLogger.error(LOG_PREFIX + " Failed to copy to clipboard: " + e.getMessage(), e); + return false; + } + } + + /** + * Shows a notification to the user + * + * @param title The notification title + * @param message The notification message + * @param severity The severity (IStatus.INFO, IStatus.WARNING, etc) + */ + private static void showNotification(String title, String message, int severity) { + try { + Display.getDefault().asyncExec(() -> { + IStatus status = new Status( + severity, + Constants.MAIN_PLUGIN_ID, + title + "\n" + message + ); + StatusManager.getManager().handle(status, StatusManager.SHOW | StatusManager.LOG); + }); + } catch (Exception e) { + CxLogger.warning(LOG_PREFIX + " Failed to show notification: " + e.getMessage()); + } + } + + /** + * Checks if Copilot is available in this Eclipse instance + * Currently returns false as we use clipboard method as primary approach + * + * @return true if Copilot is available + */ + public static boolean isCopilotAvailable() { + // Clipboard method is always available as fallback + return false; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/integration/RemediationPromptBuilder.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/integration/RemediationPromptBuilder.java new file mode 100644 index 00000000..b5dee657 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/integration/RemediationPromptBuilder.java @@ -0,0 +1,274 @@ +package com.checkmarx.eclipse.devassist.ui.findings.integration; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.ScanEngine; + +/** + * Builds engine-specific remediation prompts for Copilot. + * + * Generates context-aware prompts based on vulnerability type: + * - ASCA (SAST): Code analysis with line numbers and remediation advice + * - OSS (Dependencies): Package information and upgrade paths + * - SECRETS: Credential type and revocation steps + * - CONTAINERS: Image information and vulnerability sources + * - IAC: Configuration details and expected vs actual values + * + * Each prompt type is optimized for the scan engine context. + */ +public class RemediationPromptBuilder { + + /** + * Build a remediation prompt for the given scan issue + * + * @param issue The scan issue to build prompt for + * @return The remediation prompt, or empty string if unable to build + */ + public static String buildRemediationPrompt(ScanIssue issue) { + if (issue == null) { + return ""; + } + + ScanEngine engine = issue.getScanEngine(); + + switch (engine) { + case ASCA: + return buildASCAPrompt(issue); + case OSS: + return buildOSSPrompt(issue); + case SECRETS: + return buildSecretPrompt(issue); + case CONTAINERS: + return buildContainerPrompt(issue); + case IAC: + return buildIACPrompt(issue); + default: + return buildGenericPrompt(issue); + } + } + + /** + * Build prompt for ASCA (SAST) vulnerabilities + * Context: Code analysis with line numbers and severity + */ + private static String buildASCAPrompt(ScanIssue issue) { + return String.format( + "You are a code security expert. Please fix the following code vulnerability:\n\n" + + "**Issue:** %s\n" + + "**Severity:** %s\n" + + "**Description:** %s\n" + + "**Line Number:** %d\n" + + "**File:** %s\n" + + "%s" + // Remediation advice if available + "\n**Requirements for the fix:**\n" + + "1. Must address the security vulnerability\n" + + "2. Should maintain code readability\n" + + "3. Must preserve existing functionality\n" + + "4. Include necessary imports/dependencies\n" + + "5. Follow Java best practices\n\n" + + "Provide the corrected code snippet.", + + issue.getTitle(), + formatSeverity(issue.getSeverity()), + issue.getDescription(), + issue.getProblematicLineNumber(), + issue.getFilePath(), + buildRemediationAdviceSection(issue) + ); + } + + /** + * Build prompt for OSS (Open Source Software) vulnerabilities + * Context: Dependency vulnerabilities with version information + */ + private static String buildOSSPrompt(ScanIssue issue) { + return String.format( + "A vulnerability was detected in an open source dependency:\n\n" + + "**Package:** %s\n" + + "**Severity:** %s\n" + + "**Description:** %s\n" + + "%s" + // Version info if available + "\n**What needs to be done:**\n" + + "1. Identify recommended safe version to upgrade to\n" + + "2. Provide upgrade command (Maven/Gradle/npm/pip as applicable)\n" + + "3. List any configuration changes needed\n" + + "4. Note any compatibility concerns\n" + + "5. Suggest testing approach\n\n" + + "Please provide step-by-step remediation instructions.", + + issue.getTitle(), + formatSeverity(issue.getSeverity()), + issue.getDescription(), + buildVersionInfo(issue) + ); + } + + /** + * Build prompt for SECRETS (credential leaks) + * Context: Exposed credentials that need immediate action + */ + private static String buildSecretPrompt(ScanIssue issue) { + return String.format( + "**SECURITY ALERT:** A secret/credential has been detected in the code:\n\n" + + "**Secret Type:** %s\n" + + "**Severity:** %s\n" + + "**Description:** %s\n" + + "**File:** %s\n\n" + + "**Immediate Actions Required:**\n" + + "1. If this is a real credential, immediately revoke/rotate it in the management console\n" + + "2. Generate new credentials if necessary\n" + + "3. Update application configuration to use new credentials\n" + + "4. Remove the hardcoded credential from source code\n\n" + + "**Best Practices to Prevent:**\n" + + "- Use environment variables or secrets manager\n" + + "- Never commit secrets to version control\n" + + "- Use tools like GitGuardian or TruffleHog to scan commits\n" + + "- Implement pre-commit hooks to prevent secret commits\n\n" + + "Provide detailed steps for proper secret management.", + + issue.getTitle(), + formatSeverity(issue.getSeverity()), + issue.getDescription(), + issue.getFilePath() + ); + } + + /** + * Build prompt for CONTAINERS (container image vulnerabilities) + * Context: Docker/container image vulnerabilities + */ + private static String buildContainerPrompt(ScanIssue issue) { + return String.format( + "A vulnerability was detected in a container image:\n\n" + + "**Image/Library:** %s\n" + + "**Severity:** %s\n" + + "**Description:** %s\n" + + "**File:** %s\n" + + "%s" + // Version info if available + "\n**Remediation Steps:**\n" + + "1. Use specific version tags instead of 'latest'\n" + + "2. Update base image to patched version\n" + + "3. Use minimal base images (alpine, distroless)\n" + + "4. Implement scanning in CI/CD pipeline\n" + + "5. Regular image updates and patching\n\n" + + "Provide updated Dockerfile snippet and best practices.", + + issue.getTitle(), + formatSeverity(issue.getSeverity()), + issue.getDescription(), + issue.getFilePath(), + buildVersionInfo(issue) + ); + } + + /** + * Build prompt for IAC (Infrastructure as Code) issues + * Context: Configuration and infrastructure vulnerabilities + */ + private static String buildIACPrompt(ScanIssue issue) { + return String.format( + "An infrastructure configuration vulnerability was detected:\n\n" + + "**Issue:** %s\n" + + "**Severity:** %s\n" + + "**Description:** %s\n" + + "**File:** %s\n" + + "**Type:** Infrastructure as Code (Terraform/CloudFormation/YAML)\n" + + "%s" + // Configuration details if available + "\n**Security Requirements:**\n" + + "1. Enable encryption where applicable\n" + + "2. Enforce authentication and authorization\n" + + "3. Use least privilege principles\n" + + "4. Enable logging and monitoring\n" + + "5. Follow cloud provider security best practices\n\n" + + "Provide corrected configuration and explanation of security improvements.", + + issue.getTitle(), + formatSeverity(issue.getSeverity()), + issue.getDescription(), + issue.getFilePath(), + buildConfigInfo(issue) + ); + } + + /** + * Generic prompt for unknown engine types + */ + private static String buildGenericPrompt(ScanIssue issue) { + return String.format( + "A security issue was detected in the code:\n\n" + + "**Issue:** %s\n" + + "**Severity:** %s\n" + + "**Description:** %s\n" + + "**File:** %s\n\n" + + "Please provide:\n" + + "1. Root cause analysis\n" + + "2. Security implications\n" + + "3. Step-by-step fix\n" + + "4. Prevention strategies\n\n" + + "Ensure the fix follows security best practices.", + + issue.getTitle(), + formatSeverity(issue.getSeverity()), + issue.getDescription(), + issue.getFilePath() + ); + } + + /** + * Helper: Format severity level + */ + private static String formatSeverity(String severity) { + if (severity == null) return "UNKNOWN"; + switch (severity.toUpperCase()) { + case "CRITICAL": + return "🔴 CRITICAL - Requires immediate attention"; + case "HIGH": + return "🟠 HIGH - Should be fixed soon"; + case "MEDIUM": + return "🟡 MEDIUM - Should be addressed"; + case "LOW": + return "🟢 LOW - May be fixed in next iteration"; + default: + return severity; + } + } + + /** + * Helper: Build remediation advice section if available + */ + private static String buildRemediationAdviceSection(ScanIssue issue) { + String advice = issue.getRemediationAdvise(); + if (advice != null && !advice.isEmpty()) { + return "\n**Remediation Advice:** " + advice; + } + return ""; + } + + /** + * Helper: Build version information section + */ + private static String buildVersionInfo(ScanIssue issue) { + StringBuilder sb = new StringBuilder(); + + String currentVersion = issue.getPackageVersion(); + if (currentVersion != null && !currentVersion.isEmpty()) { + sb.append("\n**Current Version:** ").append(currentVersion); + } + + // Note: Recommended version may be available from API in future versions + // For now, we rely on Copilot to suggest the safe version + + return sb.toString(); + } + + /** + * Helper: Build configuration details section + */ + private static String buildConfigInfo(ScanIssue issue) { + String description = issue.getDescription(); + if (description != null && description.length() > 100) { + return "\n**Details:** " + description; + } + return ""; + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/marker/MarkerIssueMapper.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/marker/MarkerIssueMapper.java new file mode 100644 index 00000000..8df2d57f --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/marker/MarkerIssueMapper.java @@ -0,0 +1,196 @@ +package com.checkmarx.eclipse.devassist.ui.findings.marker; + +import org.eclipse.core.resources.IMarker; + +import com.checkmarx.eclipse.common.enums.Severity; +import com.checkmarx.eclipse.devassist.model.Location; +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import com.checkmarx.eclipse.devassist.model.ScanIssue; + +/** + * Maps between ScanIssue objects and IMarker attributes. + * This is the single source of truth for marker attribute serialization. + * Allows marker resolution to reconstruct finding details without searching. + */ +public class MarkerIssueMapper { + + // Marker attribute names (prefixed with cx. to avoid collision) + private static final String ATTR_ISSUE_ID = "cx.issueId"; + private static final String ATTR_SEVERITY = "cx.severity"; + private static final String ATTR_TITLE = "cx.title"; + private static final String ATTR_DESCRIPTION = "cx.description"; + private static final String ATTR_REMEDIATION = "cx.remediation"; + private static final String ATTR_RULE_ID = "cx.ruleId"; + private static final String ATTR_FILE_PATH = "cx.filePath"; + private static final String ATTR_SCAN_ENGINE = "cx.scanEngine"; + + /** + * Reconstruct a ScanIssue from marker attributes. + * Called by marker resolution to populate the details dialog. + * + * @param marker the IMarker containing serialized issue data + * @return reconstructed ScanIssue, or null if reconstruction fails + */ + public static ScanIssue fromMarker(IMarker marker) { + try { + String issueId = marker.getAttribute(ATTR_ISSUE_ID, ""); + String severity = marker.getAttribute(ATTR_SEVERITY, "MEDIUM"); + String title = marker.getAttribute(ATTR_TITLE, marker.getAttribute(IMarker.MESSAGE, "")); + String description = marker.getAttribute(ATTR_DESCRIPTION, ""); + String remediation = marker.getAttribute(ATTR_REMEDIATION, null); + Integer ruleId = null; + try { + Object ruleIdObj = marker.getAttribute(ATTR_RULE_ID); + if (ruleIdObj instanceof Integer) { + ruleId = (Integer) ruleIdObj; + } else if (ruleIdObj instanceof String && !ruleIdObj.toString().isEmpty()) { + ruleId = Integer.parseInt(ruleIdObj.toString()); + } + } catch (Exception e) { + // Keep ruleId as null + } + String filePath = marker.getAttribute(ATTR_FILE_PATH, ""); + String scanEngineStr = marker.getAttribute(ATTR_SCAN_ENGINE, "ASCA"); + int lineNumber = marker.getAttribute(IMarker.LINE_NUMBER, 1); + int charStart = marker.getAttribute(IMarker.CHAR_START, 0); + int charEnd = marker.getAttribute(IMarker.CHAR_END, 0); + + // Reconstruct ScanIssue + ScanIssue issue = new ScanIssue(); + issue.setScanIssueId(issueId); + issue.setSeverity(severity); + issue.setTitle(title); + issue.setDescription(description); + issue.setRemediationAdvise(remediation); + issue.setRuleId(ruleId); + issue.setFilePath(filePath); + + // Parse scan engine + try { + issue.setScanEngine(ScanEngine.valueOf(scanEngineStr)); + } catch (IllegalArgumentException e) { + issue.setScanEngine(ScanEngine.ASCA); + } + + // Reconstruct location + Location location = new Location(); + location.setLine(lineNumber); + location.setStartIndex(charStart); + location.setEndIndex(charEnd); + issue.setLocations(java.util.Collections.singletonList(location)); + + return issue; + } catch (Exception e) { + + e.printStackTrace(); + return null; + } + } + + /** + * Populate marker attributes from a ScanIssue. + * Called when creating markers from findings. + * + * @param marker the IMarker to populate + * @param issue the ScanIssue containing data to serialize + */ + public static void populateMarker(IMarker marker, ScanIssue issue) { + try { + if (issue.getScanIssueId() != null && !issue.getScanIssueId().isEmpty()) { + marker.setAttribute(ATTR_ISSUE_ID, issue.getScanIssueId()); + } + + if (issue.getSeverity() != null && !issue.getSeverity().isEmpty()) { + marker.setAttribute(ATTR_SEVERITY, issue.getSeverity()); + } + + if (issue.getTitle() != null && !issue.getTitle().isEmpty()) { + marker.setAttribute(ATTR_TITLE, issue.getTitle()); + // Also set MESSAGE for default marker hover display + marker.setAttribute(IMarker.MESSAGE, issue.getTitle()); + } + + if (issue.getDescription() != null && !issue.getDescription().isEmpty()) { + marker.setAttribute(ATTR_DESCRIPTION, issue.getDescription()); + } + + if (issue.getRemediationAdvise() != null && !issue.getRemediationAdvise().isEmpty()) { + marker.setAttribute(ATTR_REMEDIATION, issue.getRemediationAdvise()); + } + + if (issue.getRuleId() != null) { + marker.setAttribute(ATTR_RULE_ID, issue.getRuleId()); + } + + if (issue.getFilePath() != null && !issue.getFilePath().isEmpty()) { + marker.setAttribute(ATTR_FILE_PATH, issue.getFilePath()); + } + + if (issue.getScanEngine() != null) { + marker.setAttribute(ATTR_SCAN_ENGINE, issue.getScanEngine().toString()); + } + + // Set standard marker attributes from location + if (issue.getLocations() != null && !issue.getLocations().isEmpty()) { + Location location = issue.getLocations().get(0); + marker.setAttribute(IMarker.LINE_NUMBER, location.getLine()); + marker.setAttribute(IMarker.CHAR_START, location.getStartIndex()); + marker.setAttribute(IMarker.CHAR_END, location.getEndIndex()); + + // Calculate severity for Eclipse marker system (0=info, 1=warning, 2=error) + int severity = calculateMarkerSeverity(issue.getSeverity()); + marker.setAttribute(IMarker.SEVERITY, severity); + } + + + + } catch (Exception e) { + + e.printStackTrace(); + } + } + + /** + * Convert Checkmarx severity to Eclipse marker severity level. + */ + private static int calculateMarkerSeverity(String severity) { + if (severity == null) { + return IMarker.SEVERITY_WARNING; + } + + switch (severity.toLowerCase()) { + case "critical": + case "high": + return IMarker.SEVERITY_ERROR; + case "medium": + return IMarker.SEVERITY_WARNING; + case "low": + case "info": + return IMarker.SEVERITY_INFO; + default: + return IMarker.SEVERITY_WARNING; + } + } + + /** + * Convert Checkmarx Severity enum to Eclipse marker severity level. + */ + private static int toEclipseSeverity(Severity severity) { + if (severity == null) { + return IMarker.SEVERITY_WARNING; + } + + switch (severity) { + case CRITICAL: + case HIGH: + return IMarker.SEVERITY_ERROR; + case MEDIUM: + return IMarker.SEVERITY_WARNING; + case LOW: + case INFO: + default: + return IMarker.SEVERITY_INFO; + } + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/model/FileNodeLabel.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/model/FileNodeLabel.java new file mode 100644 index 00000000..3c8cbaba --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/model/FileNodeLabel.java @@ -0,0 +1,86 @@ +package com.checkmarx.eclipse.devassist.ui.findings.model; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.utils.DevAssistUtils; +import org.eclipse.swt.graphics.Image; +import java.util.List; +import java.util.Map; +import java.util.HashMap; + +/** + * Represents a file node in the findings tree. + * Contains file metadata, issue counts grouped by severity, and file type icon. + * Icon is resolved at node creation time, following the JetBrains plugin pattern. + */ +public class FileNodeLabel { + + private final String fileName; + private final String filePath; + private final List issues; + private final Map problemCount; + private final Image icon; + + public FileNodeLabel(String fileName, String filePath, List issues) { + this(fileName, filePath, issues, null, null); + } + + public FileNodeLabel(String fileName, String filePath, List issues, Image icon) { + this(fileName, filePath, issues, calculateProblemCount(issues), icon); + } + + public FileNodeLabel(String fileName, String filePath, List issues, Map problemCount, Image icon) { + this.fileName = fileName; + this.filePath = filePath; + this.issues = issues; + this.problemCount = problemCount != null ? problemCount : calculateProblemCount(issues); + this.icon = icon; + } + + /** + * Calculate problem counts grouped by severity. + * Severity keys are normalized to lowercase for consistent lookups. + */ + private static Map calculateProblemCount(List issues) { + Map counts = new HashMap<>(); + + if (issues == null || issues.isEmpty()) { + return counts; + } + + for (ScanIssue issue : issues) { + String severity = issue.getSeverity(); + if (severity != null) { + // Normalize severity to lowercase for consistent map keys + String normalizedSeverity = severity.toLowerCase(); + counts.put(normalizedSeverity, counts.getOrDefault(normalizedSeverity, 0L) + 1); + } + } + + return counts; + } + + public String getFileName() { + return fileName; + } + + public String getFilePath() { + return filePath; + } + + public List getIssues() { + return issues; + } + + public Map getProblemCount() { + return problemCount; + } + + public Image getIcon() { + return icon; + } + + @Override + public String toString() { + return fileName; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/model/ScanDetailWithPath.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/model/ScanDetailWithPath.java new file mode 100644 index 00000000..b0c4be77 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/model/ScanDetailWithPath.java @@ -0,0 +1,31 @@ +package com.checkmarx.eclipse.devassist.ui.findings.model; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; + +/** + * Represents a scan issue with its associated file path. + * Used as a leaf node in the findings tree. + */ +public class ScanDetailWithPath { + + private final ScanIssue detail; + private final String filePath; + + public ScanDetailWithPath(ScanIssue detail, String filePath) { + this.detail = detail; + this.filePath = filePath; + } + + public ScanIssue getDetail() { + return detail; + } + + public String getFilePath() { + return filePath; + } + + @Override + public String toString() { + return detail != null ? detail.getTitle() : "Unknown"; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/provider/FindingsContentProvider.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/provider/FindingsContentProvider.java new file mode 100644 index 00000000..7eaa61de --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/provider/FindingsContentProvider.java @@ -0,0 +1,112 @@ +package com.checkmarx.eclipse.devassist.ui.findings.provider; + +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.IEditorRegistry; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.graphics.Image; + +import com.checkmarx.eclipse.devassist.ui.findings.model.FileNodeLabel; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.ui.findings.model.ScanDetailWithPath; + +import java.util.List; +import java.util.Map; + +/** + * Content provider for the Findings tree viewer. + * Implements {@link ITreeContentProvider} to provide hierarchical content structure. + * Organizes scan issues by file path as parent nodes with individual issues as children. + */ +public class FindingsContentProvider implements ITreeContentProvider { + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + + @Override + public Object[] getElements(Object inputElement) { + if (inputElement instanceof Map) { + @SuppressWarnings("unchecked") + Map> map = (Map>) inputElement; + return map.entrySet().stream() + .map(entry -> { + String fileName = getFileName(entry.getKey()); + Image fileIcon = getFileIcon(fileName); + return new FileNodeLabel( + fileName, + entry.getKey(), + entry.getValue(), + fileIcon); + }) + .toArray(); + } + return new Object[0]; + } + + private Image getFileIcon(String fileName) { + if (fileName == null || fileName.isEmpty()) { + return null; + } + + try { + IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry(); + ImageDescriptor imageDescriptor = registry.getImageDescriptor(fileName); + + if (imageDescriptor != null) { + Image image = imageDescriptor.createImage(); + if (image != null) { + return image; + } + } + } catch (Exception e) { + } + + return null; + } + + @Override + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof FileNodeLabel) { + FileNodeLabel fileNode = (FileNodeLabel) parentElement; + return fileNode.getIssues().stream() + .map(issue -> new ScanDetailWithPath(issue, fileNode.getFilePath())) + .toArray(); + } + return new Object[0]; + } + + @Override + public Object getParent(Object element) { + if (element instanceof ScanDetailWithPath) { + // Parent is the file node - would need to track in the model + return null; + } + return null; + } + + @Override + public boolean hasChildren(Object element) { + if (element instanceof FileNodeLabel) { + return !((FileNodeLabel) element).getIssues().isEmpty(); + } + return false; + } + + private String getFileName(String filePath) { + if (filePath == null || filePath.isEmpty()) { + return "Unknown"; + } + int lastSeparator = Math.max(filePath.lastIndexOf('/'), filePath.lastIndexOf('\\')); + if (lastSeparator >= 0) { + return filePath.substring(lastSeparator + 1); + } + return filePath; + } + + @Override + public void dispose() { + // Cleanup if needed + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/provider/FindingsLabelProvider.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/provider/FindingsLabelProvider.java new file mode 100644 index 00000000..0d462a32 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/provider/FindingsLabelProvider.java @@ -0,0 +1,164 @@ +package com.checkmarx.eclipse.devassist.ui.findings.provider; + +import java.util.Map; +import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.StyledString; +import org.eclipse.jface.viewers.ViewerCell; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Event; + +import com.checkmarx.eclipse.devassist.ui.findings.model.FileNodeLabel; +import com.checkmarx.eclipse.devassist.ui.findings.model.ScanDetailWithPath; +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.ui.findings.icons.IconRegistry; + +/** + * Label provider tailored exactly to render severity shield badges + * sequentially to the right of file labels. + */ +public class FindingsLabelProvider extends DelegatingStyledCellLabelProvider { + + private static final String[] SEVERITIES = { "critical", "high", "medium", "low" }; + private static final int BETWEEN_BADGE_SPACING = 4; // Space between different shield groups + private static final int TEXT_TO_BADGE_PADDING = 28; // Space after filename before first badge + + public FindingsLabelProvider() { + super(new IStyledLabelProvider() { + @Override + public StyledString getStyledText(Object element) { + if (element instanceof FileNodeLabel) { + return new StyledString(((FileNodeLabel) element).getFileName()); + } else if (element instanceof ScanDetailWithPath) { + return new StyledString(formatIssueText(((ScanDetailWithPath) element).getDetail())); + } + return new StyledString(element.toString()); + } + + @Override + public Image getImage(Object element) { + if (element instanceof FileNodeLabel) { + return ((FileNodeLabel) element).getIcon(); + } else if (element instanceof ScanDetailWithPath) { + String severity = ((ScanDetailWithPath) element).getDetail().getSeverity(); + return IconRegistry.getIcon(severity, IconRegistry.Size.SMALL); + } + return null; + } + + @Override public void dispose() {} + @Override public void addListener(ILabelProviderListener l) {} + @Override public void removeListener(ILabelProviderListener l) {} + @Override public boolean isLabelProperty(Object el, String prop) { return false; } + + private String formatIssueText(ScanIssue detail) { + switch (detail.getScanEngine()) { + case OSS: return detail.getSeverity() + "-risk package: " + detail.getTitle() + "@" + detail.getPackageVersion() + getLineNumberText(detail); + case SECRETS: return detail.getSeverity() + "-risk secret: " + detail.getTitle() + getLineNumberText(detail); + case CONTAINERS: return detail.getSeverity() + "-risk container image: " + detail.getTitle() + ":" + detail.getImageTag() + getLineNumberText(detail); + case ASCA: + case IAC: return detail.getTitle() + getLineNumberText(detail); + default: return detail.getDescription() + getLineNumberText(detail); + } + } + + private String getLineNumberText(ScanIssue detail) { + if (detail.getLocations() != null && !detail.getLocations().isEmpty()) { + return " [Ln " + detail.getLocations().get(0).getLine() + ", Col " + detail.getLocations().get(0).getStartIndex() + "]"; + } + return ""; + } + }); + } + + @Override + protected void measure(Event event, Object element) { + super.measure(event, element); + + if (element instanceof FileNodeLabel) { + FileNodeLabel fileNode = (FileNodeLabel) element; + Map counts = fileNode.getProblemCount(); + + if (counts != null && !counts.isEmpty()) { + int extraWidth = TEXT_TO_BADGE_PADDING; + for (String severity : SEVERITIES) { + if (counts.containsKey(severity) && counts.get(severity) > 0) { + String countStr = String.valueOf(counts.get(severity)); + int textWidth = event.gc.textExtent(countStr).x; + // 16px (Icon) + 4px (Gap between icon & number) + number length + gap to next badge + extraWidth += 16 + 0 + textWidth + BETWEEN_BADGE_SPACING; + } + } + event.width += extraWidth; + } + } + } + + @Override + protected void paint(Event event, Object element) { + // 1. Draw standard tree node elements (Expand/collapse arrows, file icons, text strings) + super.paint(event, element); + + // 2. Lay down the right-aligned badges + if (element instanceof FileNodeLabel) { + FileNodeLabel fileNode = (FileNodeLabel) element; + Map counts = fileNode.getProblemCount(); + + if (counts != null && !counts.isEmpty()) { + // Determine exactly where the file label ends horizontally + Point textSize = event.gc.textExtent(fileNode.getFileName()); + + // Base offset: layout context starting position + text length + margin padding + int currentX = event.x + textSize.x + TEXT_TO_BADGE_PADDING; + + int rowHeight = event.height; + int iconY = event.y + (rowHeight - 16) / 2; + int textY = event.y + (rowHeight - event.gc.getFontMetrics().getHeight()) / 2; + + for (String severity : SEVERITIES) { + Long count = counts.get(severity); + if (count != null && count > 0) { + // Grab actual shield PNG asset + Image badgePng = IconRegistry.getIcon(severity, IconRegistry.Size.SMALL); + + if (badgePng != null) { + // Draw Shield Badge + event.gc.drawImage(badgePng, currentX, iconY); + currentX += 16 + 4; // Shift right right past shield + a tiny gap + + // Draw Count Number tightly next to the shield + String countStr = String.valueOf(count); + + // Match text color dynamically (Use foreground selection color if item is highlighted) + if ((event.detail & SWT.SELECTED) != 0) { + event.gc.setForeground(event.display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)); + } else { + event.gc.setForeground(event.display.getSystemColor(SWT.COLOR_LIST_FOREGROUND)); + } + + // Make count text bold + org.eclipse.swt.graphics.Font originalFont = event.gc.getFont(); + org.eclipse.swt.graphics.FontData[] fontData = originalFont.getFontData(); + for (org.eclipse.swt.graphics.FontData fd : fontData) { + fd.setStyle(fd.getStyle() | SWT.BOLD); + } + org.eclipse.swt.graphics.Font boldFont = new org.eclipse.swt.graphics.Font(event.display, fontData); + event.gc.setFont(boldFont); + + event.gc.drawString(countStr, currentX, textY, true); + + // Restore original font + event.gc.setFont(originalFont); + boldFont.dispose(); + + // Advance cursor layout pointer to the next shield group block + currentX += event.gc.textExtent(countStr).x + BETWEEN_BADGE_SPACING; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/CheckmarxDocumentListener.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/CheckmarxDocumentListener.java new file mode 100644 index 00000000..13d1a362 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/CheckmarxDocumentListener.java @@ -0,0 +1,108 @@ +package com.checkmarx.eclipse.devassist.ui.findings.realtime; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.QualifiedName; +import org.eclipse.jface.text.DocumentEvent; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentListener; + +import com.checkmarx.eclipse.devassist.inspection.DevAssistScanScheduler; + +/** + * Real-time document listener for Checkmarx scanning. + * + * Equivalent to JetBrains' LocalInspectionTool.buildVisitor() — detects when + * the user edits the currently opened file and triggers a real-time scan with + * debounce (1 second of inactivity). + * + * This listener observes every keystroke and delegates to DevAssistScanScheduler + * for debounced scanning coordination. + */ +public class CheckmarxDocumentListener implements IDocumentListener { + + private final RealTimeScanJob scanJob; + private final IFile file; + private final String fileName; + private final DevAssistScanScheduler scheduler; + private volatile boolean skipNextChange = false; + private volatile long lastRescheduleTime = 0; + + /** + * Create a document listener for a specific file. + * + * @param fileName the name of the file being edited (for logging) + * @param scanJob the RealTimeScanJob to trigger on document changes + * @param file the IFile being edited + * @param scheduler the scheduler to coordinate scan rescheduling + */ + public CheckmarxDocumentListener(String fileName, RealTimeScanJob scanJob, IFile file, DevAssistScanScheduler scheduler) { + this.fileName = fileName; + this.scanJob = scanJob; + this.file = file; + this.scheduler = scheduler; + } + + /** + * Called when the document is about to be changed. + * We don't need to do anything here, but we implement it for completeness. + */ + @Override + public void documentAboutToBeChanged(DocumentEvent event) { + // No action needed before change + } + + /** + * Called when the document has been changed. + * Triggers the debounced real-time scan via DevAssistScanScheduler. + * + * This is equivalent to JetBrains' InspectionVisitor methods being called + * during AST traversal — every edit triggers a potential scan. + */ + @Override + public void documentChanged(DocumentEvent event) { + try { + // Skip rescheduling if this is a programmatic change (e.g., annotation updates) + if (skipNextChange) { + skipNextChange = false; + return; + } + + // Prevent StackOverflowError from rapid recursive reschedules + long now = System.currentTimeMillis(); + if (now - lastRescheduleTime < 100) { + return; + } + lastRescheduleTime = now; + + // Reschedule the debounced scan job via scheduler + // This cancels the previous job (if still scheduled) and starts a new 1-second timer + if (scheduler != null && file != null) { + scheduler.rescheduleInspection(file, 1000); // 1000ms = 1 second debounce + } else if (scanJob != null) { + // Fallback to direct reschedule if scheduler not available + scanJob.reschedule(1000); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void setSkipNextChange(boolean skip) { + this.skipNextChange = skip; + } + + /** + * Dispose this listener and clean up associated resources. + * Call this when the editor is closed. + */ + public void dispose() { + if (scanJob != null) { + scanJob.cancel(); + } + } + + public String getFileName() { + return fileName; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/CheckmarxEditorListener.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/CheckmarxEditorListener.java new file mode 100644 index 00000000..6fd14af3 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/CheckmarxEditorListener.java @@ -0,0 +1,408 @@ +package com.checkmarx.eclipse.devassist.ui.findings.realtime; + +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IPartListener2; +import org.eclipse.ui.IWorkbenchPartReference; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.source.ISourceViewer; +import org.eclipse.ui.texteditor.ITextEditor; +import org.eclipse.core.runtime.ILog; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; + +import java.util.HashMap; +import java.util.Map; + +import com.checkmarx.eclipse.devassist.problems.ProblemHolderService; +import com.checkmarx.eclipse.devassist.problems.ProblemDecorator; + +/** + * Real-time editor listener for Checkmarx scanning. + * + * Equivalent to JetBrains' LocalInspectionTool integration — listens for editor + * open/close events and registers document listeners for real-time scanning. + * + * When a text editor opens: + * 1. Create a RealTimeScanJob for that file + * 2. Register a CheckmarxDocumentListener on the document + * 3. Every keystroke triggers the document listener + * 4. Document listener reschedules the job (1-second debounce) + * 5. When debounce expires, RealTimeScanJob.run() executes the scan + * + * When the editor closes: + * - Dispose of the document listener and cancel the job + */ +public class CheckmarxEditorListener implements IPartListener2 { + + /** + * Map of documents to their associated listeners. + * Key: IDocument hash code (unique identifier for the document) + * Value: CheckmarxDocumentListener (for cleanup on editor close) + */ + private final Map activeListeners = new HashMap<>(); + + /** + * Map of documents to their associated scan jobs. + * Key: IDocument hash code + * Value: RealTimeScanJob (for cleanup and tracking) + */ + private final Map activeScanJobs = new HashMap<>(); + + public CheckmarxEditorListener() { + + } + + /** + * Get the Eclipse log for this plugin. + */ + private ILog getLog() { + return Platform.getLog(getClass()); + } + + /** + * Called when an editor part is opened. + * Register real-time scanning for this editor. + */ + @Override + public void partOpened(IWorkbenchPartReference partRef) { + try { + Object part = partRef.getPart(false); + if (part instanceof IEditorPart) { + setupRealtimeScanning((IEditorPart) part); + } + } catch (Exception e) { + System.err.println("[REALTIME] Error in partOpened: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Called when an editor is activated. + * Setup scanning if not done, or trigger rescan if switching to an already-open tab. + */ + @Override + public void partActivated(IWorkbenchPartReference partRef) { + try { + Object part = partRef.getPart(false); + if (part instanceof IEditorPart) { + IEditorPart editor = (IEditorPart) part; + IDocument document = getDocumentFromEditor(editor); + if (document != null) { + int documentId = document.hashCode(); + // If already set up, trigger a rescan when user switches to tab + if (activeListeners.containsKey(documentId)) { + RealTimeScanJob scanJob = activeScanJobs.get(documentId); + if (scanJob != null) { + + scanJob.reschedule(0); + } + return; + } + } + // Not yet set up - do initial setup + setupRealtimeScanning(editor); + } + } catch (Exception e) { + System.err.println("[REALTIME] Error in partActivated: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Called when an editor is closed. + * Clean up document listeners and cancel pending scan jobs. + */ + @Override + public void partClosed(IWorkbenchPartReference partRef) { + try { + Object part = partRef.getPart(false); + if (part instanceof IEditorPart) { + cleanupRealtimeScanning((IEditorPart) part); + } + } catch (Exception e) { + System.err.println("[REALTIME] Error in partClosed: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Setup real-time scanning on the given editor. + * + * @param editor the editor part (should be a text editor) + */ + private void setupRealtimeScanning(IEditorPart editor) { + if (editor == null) { + return; + } + + // Get the document from the editor + IDocument document = getDocumentFromEditor(editor); + if (document == null) { + // Not a text editor or no document available + return; + } + + // Use document hash code as a unique identifier + int documentId = document.hashCode(); + + // Check if we've already set up scanning for this document + if (activeListeners.containsKey(documentId)) { + + return; + } + + // Get file name for logging + String fileName = extractFileNameFromEditor(editor); + + + // Log to Eclipse Error Log + String message = "User opened the file: " + fileName; + getLog().log(new Status(Status.INFO, "com.checkmarx.eclipse.plugin", message)); + + // Create a scan job for this file + // Note: We extract the IFile from the editor if possible, otherwise use null + // (The actual file can be obtained from the editor input) + org.eclipse.core.resources.IFile file = extractFileFromEditor(editor); + RealTimeScanJob scanJob = new RealTimeScanJob(file, fileName); + + // Get the scheduler from project session properties + com.checkmarx.eclipse.devassist.inspection.DevAssistScanScheduler scheduler = null; + if (file != null) { + try { + org.eclipse.core.resources.IProject project = file.getProject(); + if (project != null) { + scheduler = (com.checkmarx.eclipse.devassist.inspection.DevAssistScanScheduler) project.getSessionProperty( + new org.eclipse.core.runtime.QualifiedName("com.checkmarx.eclipse.plugin", "scan-scheduler")); + } + } catch (Exception e) { + + } + } + + // Create a document listener that will reschedule the job on every keystroke + CheckmarxDocumentListener docListener = new CheckmarxDocumentListener(fileName, scanJob, file, scheduler); + + // Register the document listener + try { + document.addDocumentListener(docListener); + + // Store the listener and job for later cleanup + activeListeners.put(documentId, docListener); + activeScanJobs.put(documentId, scanJob); + + + + // **CRITICAL FIX: Apply cached decorations if findings exist for this file** + // JetBrains pattern: when editor opens, apply cached decorations immediately + // This fixes the issue where decorations don't appear if editor wasn't open during scan + applyCachedDecorationsForFile(file, document); + + // **CRITICAL FIX: Trigger initial scan when file is opened** + // JetBrains pattern: scan on file open, then on keystroke debounce + // Without this, opening a file doesn't trigger any scan — only edits do + + scanJob.reschedule(0); + + } catch (Exception e) { + System.err.println("[REALTIME] ✗ Error registering document listener: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Cleanup real-time scanning on the given editor. + * + * @param editor the editor part being closed + */ + private void cleanupRealtimeScanning(IEditorPart editor) { + if (editor == null) { + return; + } + + // Get the document from the editor + IDocument document = getDocumentFromEditor(editor); + if (document == null) { + return; + } + + int documentId = document.hashCode(); + + // Remove the document listener + CheckmarxDocumentListener listener = activeListeners.remove(documentId); + if (listener != null) { + try { + document.removeDocumentListener(listener); + listener.dispose(); + + } catch (Exception e) { + System.err.println("[REALTIME] Error removing document listener: " + e.getMessage()); + } + } + + // Cancel the scan job + RealTimeScanJob scanJob = activeScanJobs.remove(documentId); + if (scanJob != null) { + scanJob.cancel(); + + } + } + + /** + * Extract the IDocument from an editor. + * Handles both standard ITextEditor and editors like MavenPomEditor. + * + * @param editor the editor part + * @return the document, or null if not available + */ + private IDocument getDocumentFromEditor(IEditorPart editor) { + if (editor == null) { + return null; + } + + // Try method 1: Direct ITextEditor instance + if (editor instanceof ITextEditor) { + ITextEditor textEditor = (ITextEditor) editor; + try { + return textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); + } catch (Exception e) { + // Fall through to try adapter pattern + } + } + + // Try method 2: Adapter pattern (for MavenPomEditor and other non-ITextEditor editors) + try { + ITextEditor textEditor = editor.getAdapter(ITextEditor.class); + if (textEditor != null) { + return textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); + } + } catch (Exception e) { + // Fall through to next method + } + + // Try method 3: Direct IDocument adapter (some editors provide this) + try { + IDocument document = editor.getAdapter(IDocument.class); + if (document != null) { + return document; + } + } catch (Exception e) { + // Fall through + } + + return null; + } + + /** + * Extract the file name from an editor for logging. + * + * @param editor the editor part + * @return the file name, or "unknown" if not available + */ + private String extractFileNameFromEditor(IEditorPart editor) { + try { + return editor.getEditorInput().getName(); + } catch (Exception e) { + return "unknown"; + } + } + + /** + * Extract the IFile from an editor (may return null for non-workspace files). + * + * @param editor the editor part + * @return the IFile, or null if not available + */ + private org.eclipse.core.resources.IFile extractFileFromEditor(IEditorPart editor) { + try { + if (editor.getEditorInput() instanceof org.eclipse.ui.part.FileEditorInput) { + org.eclipse.ui.part.FileEditorInput fileInput = + (org.eclipse.ui.part.FileEditorInput) editor.getEditorInput(); + return fileInput.getFile(); + } + } catch (Exception e) { + // Ignore exceptions; file extraction is optional + } + return null; + } + + /** + * Apply cached decorations (gutter icons, underlines) when editor opens. + * + * JetBrains pattern: when an editor opens, check if there are cached findings + * and apply decorations immediately. This ensures decorations appear even if + * the editor wasn't open when the scan completed. + * + * @param file the Eclipse IFile being opened + * @param document the document for the file + */ + private void applyCachedDecorationsForFile(org.eclipse.core.resources.IFile file, IDocument document) { + if (file == null || document == null) { + return; + } + + try { + String filePath = file.getLocation().toOSString(); + org.eclipse.core.resources.IProject project = file.getProject(); + + if (project == null) { + return; + } + + // Get cached findings for this file + ProblemHolderService problemHolder = + (ProblemHolderService) project.getSessionProperty( + new org.eclipse.core.runtime.QualifiedName("com.checkmarx.eclipse.plugin", "problem-holder")); + + if (problemHolder == null) { + return; + } + + java.util.List cachedIssues = + problemHolder.getScanIssuesByFile(filePath); + + if (cachedIssues == null || cachedIssues.isEmpty()) { + + return; + } + + // Apply decorations for cached findings + + ProblemDecorator.decorateEditor(file, cachedIssues); + + } catch (Exception e) { + System.err.println("[REALTIME] Error applying cached decorations: " + e.getMessage()); + e.printStackTrace(); + } + } + + // Implement other IPartListener2 methods (not used for real-time scanning) + + @Override + public void partBroughtToTop(IWorkbenchPartReference partRef) {} + + @Override + public void partDeactivated(IWorkbenchPartReference partRef) {} + + @Override + public void partHidden(IWorkbenchPartReference partRef) {} + + @Override + public void partVisible(IWorkbenchPartReference partRef) {} + + @Override + public void partInputChanged(IWorkbenchPartReference partRef) {} + + /** + * Get the number of active listeners (for testing/debugging). + */ + public int getActiveListenerCount() { + return activeListeners.size(); + } + + /** + * Get the number of active scan jobs (for testing/debugging). + */ + public int getActiveScanJobCount() { + return activeScanJobs.size(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/RealTimeScanJob.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/RealTimeScanJob.java new file mode 100644 index 00000000..f1ee83ae --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/RealTimeScanJob.java @@ -0,0 +1,240 @@ +package com.checkmarx.eclipse.devassist.ui.findings.realtime; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.ILog; +import org.eclipse.core.runtime.Platform; + +/** + * Real-time scan job with debounce support. + * + * When the user edits a file, CheckmarxDocumentListener calls reschedule() repeatedly + * as the user types. This job cancels the previous scheduled execution and starts a + * new 1-second timer, so the scan only runs after the user pauses typing. + * + * Equivalent to: + * - JetBrains' real-time inspection pipeline (with debounce built-in) + * - Eclipse's incremental builder, but for on-demand scanning + * + * This is a background Job, so it runs off the UI thread and won't freeze the editor. + */ +public class RealTimeScanJob extends Job { + + private final IFile file; + private final String fileName; + + // Store the timestamp when the user last made changes + private long lastChangeTime = System.currentTimeMillis(); + + /** + * Create a real-time scan job for a specific file. + * + * @param file the IFile resource to scan + * @param fileName the file name (for logging) + */ + public RealTimeScanJob(IFile file, String fileName) { + super("Checkmarx Real-Time Scan: " + fileName); + this.file = file; + this.fileName = fileName; + + // Configure job properties for background execution + setSystem(false); // Show in progress view + setPriority(Job.DECORATE); // Lower priority than user interactions + setUser(false); // Not a user-initiated job + + + } + + /** + * Get the Eclipse log for this plugin. + */ + private ILog getLog() { + return Platform.getLog(getClass()); + } + + /** + * Reschedule this job with a given delay (debounce). + * + * If the job is already scheduled, it is cancelled and rescheduled with a new delay. + * This ensures the scan only runs after the user stops typing for the specified delay. + * + * @param delayMs delay in milliseconds before the job should run + */ + public synchronized void reschedule(long delayMs) { + // Update the last change time + this.lastChangeTime = System.currentTimeMillis(); + + // Cancel any previously scheduled execution + cancel(); + + // Schedule the job to run after the delay + schedule(delayMs); + + + } + + /** + * Run the real-time scan. + * + * This method is called by the Eclipse Jobs framework after the debounce delay expires. + * It performs the actual scanning logic. + * + * Currently, this just logs a message. In production, you would: + * 1. Parse the file + * 2. Run security checks (synchronously or via backend API) + * 3. Create markers for problems found + * 4. Update the editor decoration + * + * @param monitor progress monitor for cancellation support + * @return Status.OK if successful, Status.CANCEL if cancelled + */ + @Override + protected IStatus run(IProgressMonitor monitor) { + try { + // Check if file still exists and is accessible + if (file == null || !file.exists()) { + + return Status.CANCEL_STATUS; + } + + // Check if the job was cancelled while waiting + if (monitor.isCanceled()) { + + return Status.CANCEL_STATUS; + } + + // **STEP 1: Check authentication status** + if (!isUserAuthenticated()) { + + + return Status.OK_STATUS; // Return OK but don't scan + } + + + + + + + // Call our backend scanners via ScanManager + try { + org.eclipse.core.resources.IProject project = file.getProject(); + if (project == null || !project.isOpen()) { + + return Status.OK_STATUS; + } + + String projectName = project.getName(); + org.eclipse.core.runtime.QualifiedName registryKey = new org.eclipse.core.runtime.QualifiedName( + "com.checkmarx.eclipse.plugin", "scanner-registry"); + org.eclipse.core.runtime.QualifiedName stateHolderKey = new org.eclipse.core.runtime.QualifiedName( + "com.checkmarx.eclipse.plugin", "state-holder"); + + // Get or lazily initialize backend services + com.checkmarx.eclipse.devassist.backend.ScannerRegistry registry = + (com.checkmarx.eclipse.devassist.backend.ScannerRegistry) + project.getSessionProperty(registryKey); + + com.checkmarx.eclipse.devassist.backend.DevAssistScanStateHolder stateHolder = + (com.checkmarx.eclipse.devassist.backend.DevAssistScanStateHolder) + project.getSessionProperty(stateHolderKey); + + // Lazy initialization if not found + if (registry == null) { + + registry = new com.checkmarx.eclipse.devassist.backend.ScannerRegistry(project); + project.setSessionProperty(registryKey, registry); + + } + + if (stateHolder == null) { + + stateHolder = new com.checkmarx.eclipse.devassist.backend.DevAssistScanStateHolder(); + project.setSessionProperty(stateHolderKey, stateHolder); + + } + + // Execute backend scanners + + com.checkmarx.eclipse.devassist.common.ScanManager scanManager = + new com.checkmarx.eclipse.devassist.common.ScanManager(registry, stateHolder); + + String filePath = file.getLocation().toOSString(); + + + java.util.List issues = + scanManager.scanFile(filePath); + + + for (com.checkmarx.eclipse.devassist.model.ScanIssue issue : issues) { + } + + // Publish results to UI + + if (!issues.isEmpty()) { + com.checkmarx.eclipse.devassist.backend.result.ResultPublisher.publishResults(file, issues); + + } else { + + } + + } catch (Exception e) { + System.err.println("[REALTIME] ✗ ERROR in step above: " + e.getMessage()); + e.printStackTrace(); + System.err.println("[REALTIME] Stack trace:"); + for (StackTraceElement elem : e.getStackTrace()) { + System.err.println("[REALTIME] at " + elem); + } + } + + + return Status.OK_STATUS; + + } catch (Exception e) { + System.err.println("[REALTIME] ✗ UNEXPECTED ERROR during real-time scan: " + e.getMessage()); + e.printStackTrace(); + System.err.println("[REALTIME] Full stack trace:"); + for (StackTraceElement elem : e.getStackTrace()) { + System.err.println("[REALTIME] at " + elem); + } + // Return error status but don't fail the job permanently + return new Status(IStatus.WARNING, "com.checkmarx.eclipse.plugin", + "Real-time scan failed for " + fileName, e); + } + } + + /** + * Check if user is authenticated by checking if API key is configured. + */ + private boolean isUserAuthenticated() { + String apiKey = com.checkmarx.eclipse.common.properties.SharedPreferences.getApiKey(); + return apiKey != null && !apiKey.trim().isEmpty(); + } + + @Override + public boolean belongsTo(Object family) { + // Group all Checkmarx real-time scan jobs together + // This allows Eclipse to cancel all scans at once if needed + return family != null && family.equals("com.checkmarx.realtime.scan"); + } + + /** + * Called when the job is cancelled. + * Cleanup any resources if needed. + */ + @Override + protected void canceling() { + + super.canceling(); + } + + public String getFileName() { + return fileName; + } + + public IFile getFile() { + return file; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/resolution/CheckmarxMarkerResolutionGenerator.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/resolution/CheckmarxMarkerResolutionGenerator.java new file mode 100644 index 00000000..31584f54 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/resolution/CheckmarxMarkerResolutionGenerator.java @@ -0,0 +1,26 @@ +package com.checkmarx.eclipse.devassist.ui.findings.resolution; + +import org.eclipse.core.resources.IMarker; +import org.eclipse.ui.IMarkerResolution; +import org.eclipse.ui.IMarkerResolutionGenerator2; + +/** + * Provides marker resolutions for Checkmarx findings. + * Invoked when user presses Ctrl+1 on a marker or selects "Quick Fix" from context menu. + * Implements IMarkerResolutionGenerator2 for efficient hasResolutions() check. + */ +public class CheckmarxMarkerResolutionGenerator implements IMarkerResolutionGenerator2 { + + @Override + public IMarkerResolution[] getResolutions(IMarker marker) { + return new IMarkerResolution[] { + new ViewFindingDetailsResolution(marker) + }; + } + + @Override + public boolean hasResolutions(IMarker marker) { + // We always provide the "View Finding Details" resolution + return true; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/resolution/ViewFindingDetailsResolution.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/resolution/ViewFindingDetailsResolution.java new file mode 100644 index 00000000..7881693f --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/resolution/ViewFindingDetailsResolution.java @@ -0,0 +1,258 @@ +package com.checkmarx.eclipse.devassist.ui.findings.resolution; + +import org.eclipse.core.resources.IMarker; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.dnd.Transfer; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IMarkerResolution2; +import org.eclipse.ui.PlatformUI; + +import com.checkmarx.eclipse.devassist.ui.findings.marker.MarkerIssueMapper; +import com.checkmarx.eclipse.devassist.model.ScanIssue; + +/** + * Marker resolution that opens a dialog showing complete finding details. + * Reconstructs ScanIssue from marker attributes and displays rich UI. + * Implements IMarkerResolution2 for better performance with hasResolutions() check. + */ +public class ViewFindingDetailsResolution implements IMarkerResolution2 { + + public ViewFindingDetailsResolution(IMarker marker) { + // Constructor parameter kept for instantiation, marker details retrieved from run() parameter + } + + @Override + public String getLabel() { + return "View Finding Details"; + } + + @Override + public String getDescription() { + return "Open detailed information about this Checkmarx finding"; + } + + @Override + public Image getImage() { + // Optional: Return an icon. For now, use default + return null; + } + + @Override + public void run(IMarker marker) { + try { + // Reconstruct ScanIssue from marker attributes + ScanIssue issue = MarkerIssueMapper.fromMarker(marker); + if (issue == null) { + + return; + } + + // Open the details dialog + FindingDetailsDialog dialog = new FindingDetailsDialog( + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), + issue + ); + dialog.open(); + + + + } catch (Exception e) { + + e.printStackTrace(); + } + } + + /** + * Simple dialog that displays finding details. + * Reuses the UI structure from FindingsInformationControl. + */ + private static class FindingDetailsDialog extends Dialog { + + private ScanIssue issue; + + public FindingDetailsDialog(Shell parentShell, ScanIssue issue) { + super(parentShell); + this.issue = issue; + setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL); + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText("Checkmarx Finding Details - " + (issue.getTitle() != null ? issue.getTitle() : "")); + newShell.setSize(500, 400); + + // Center on screen + Shell parent = getParentShell(); + if (parent != null) { + org.eclipse.swt.graphics.Rectangle bounds = parent.getBounds(); + Point size = newShell.getSize(); + newShell.setLocation( + bounds.x + (bounds.width - size.x) / 2, + bounds.y + (bounds.height - size.y) / 2 + ); + } + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite container = (Composite) super.createDialogArea(parent); + container.setLayout(new GridLayout(1, false)); + + // Severity label with icon + Label severityLabel = new Label(container, SWT.NONE); + severityLabel.setText(getSeverityIcon(issue.getSeverity()) + " " + getSeverityText(issue.getSeverity())); + severityLabel.setFont(container.getDisplay().getSystemFont()); + GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); + severityLabel.setLayoutData(gd); + + // Title label + Label titleLabel = new Label(container, SWT.WRAP); + titleLabel.setText("Title: " + (issue.getTitle() != null ? issue.getTitle() : "")); + gd = new GridData(SWT.FILL, SWT.CENTER, true, false); + gd.widthHint = 480; + titleLabel.setLayoutData(gd); + + // Description text (scrollable) + Text descriptionText = new Text(container, SWT.WRAP | SWT.READ_ONLY | SWT.V_SCROLL | SWT.BORDER); + descriptionText.setText(issue.getDescription() != null ? issue.getDescription() : ""); + gd = new GridData(SWT.FILL, SWT.FILL, true, true); + gd.heightHint = 120; + gd.widthHint = 480; + descriptionText.setLayoutData(gd); + + // Remediation advice (if available) + if (issue.getRemediationAdvise() != null && !issue.getRemediationAdvise().isEmpty()) { + Label remediationLabel = new Label(container, SWT.WRAP); + remediationLabel.setText("Remediation: " + issue.getRemediationAdvise()); + gd = new GridData(SWT.FILL, SWT.CENTER, true, false); + gd.widthHint = 480; + remediationLabel.setLayoutData(gd); + } + + // Buttons composite + Composite buttonsComposite = new Composite(container, SWT.NONE); + buttonsComposite.setLayout(new GridLayout(4, true)); + gd = new GridData(SWT.FILL, SWT.CENTER, true, false); + buttonsComposite.setLayoutData(gd); + + // Quick Fix button + Button quickFixBtn = new Button(buttonsComposite, SWT.PUSH); + quickFixBtn.setText("⚡ Quick Fix"); + quickFixBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + quickFixBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + onQuickFixClick(); + } + }); + + // Ignore button + Button ignoreBtn = new Button(buttonsComposite, SWT.PUSH); + ignoreBtn.setText("🚫 Ignore"); + ignoreBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + ignoreBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + onIgnoreClick(); + } + }); + + // Copy button + Button copyBtn = new Button(buttonsComposite, SWT.PUSH); + copyBtn.setText("📋 Copy"); + copyBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + copyBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + onCopyClick(); + } + }); + + // Open Window button + Button openBtn = new Button(buttonsComposite, SWT.PUSH); + openBtn.setText("🪟 Details"); + openBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + openBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + onOpenWindowClick(); + } + }); + + return container; + } + + @Override + protected void createButtonsForButtonBar(Composite parent) { + // Remove default OK/Cancel buttons, add Close button + createButton(parent, org.eclipse.jface.dialogs.IDialogConstants.CLOSE_ID, "Close", true); + } + + private void onQuickFixClick() { + + // TODO: Implement remediation integration + } + + private void onIgnoreClick() { + + // TODO: Implement ignore logic + } + + private void onCopyClick() { + String title = issue.getTitle() != null ? issue.getTitle() : ""; + String description = issue.getDescription() != null ? issue.getDescription() : ""; + String text = title + "\n" + description; + + getShell().getDisplay().asyncExec(() -> { + Clipboard clipboard = new Clipboard(getShell().getDisplay()); + TextTransfer transfer = TextTransfer.getInstance(); + clipboard.setContents(new Object[] { text }, new Transfer[] { transfer }); + clipboard.dispose(); + + }); + } + + private void onOpenWindowClick() { + + // TODO: Open Findings window and navigate to this issue + } + + private String getSeverityIcon(String severity) { + if (severity == null) { + return "⚪"; + } + switch (severity.toLowerCase()) { + case "critical": + return "🔴"; + case "high": + return "🟠"; + case "medium": + return "🟡"; + case "low": + return "🟢"; + default: + return "⚪"; + } + } + + private String getSeverityText(String severity) { + return severity != null ? severity.toUpperCase() : "UNKNOWN"; + } + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/utils/FindingsUtils.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/utils/FindingsUtils.java new file mode 100644 index 00000000..486a986e --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/utils/FindingsUtils.java @@ -0,0 +1,94 @@ +package com.checkmarx.eclipse.devassist.ui.findings.utils; + +import com.checkmarx.eclipse.devassist.model.ScanIssue; +import com.checkmarx.eclipse.devassist.model.ScanEngine; + +import java.util.Arrays; +import java.util.List; + +/** + * Utility methods for findings view. + */ +public class FindingsUtils { + + private static final List SEVERITY_ORDER = Arrays.asList( + "malicious", "critical", "high", "medium", "low"); + + /** + * Check if a severity level represents a problem. + * + * @param severity Severity level + * @return true if severity is a problem level + */ + public static boolean isProblem(String severity) { + if (severity == null) { + return false; + } + String lower = severity.toLowerCase(); + return lower.equals("malicious") || lower.equals("critical") + || lower.equals("high") || lower.equals("medium") || lower.equals("low"); + } + + /** + * Get severity order priority (lower number = higher severity). + * + * @param severity Severity level + * @return Priority index (0 = highest) + */ + public static int getSeverityPriority(String severity) { + if (severity == null) { + return Integer.MAX_VALUE; + } + int index = SEVERITY_ORDER.indexOf(severity.toLowerCase()); + return index >= 0 ? index : Integer.MAX_VALUE; + } + + /** + * Get formatted issue text based on scan engine type. + * + * @param issue Scan issue + * @return Formatted text + */ + public static String getFormattedIssueText(ScanIssue issue) { + if (issue == null) { + return ""; + } + + ScanEngine engine = issue.getScanEngine(); + if (engine == null) { + return issue.getDescription(); + } + + switch (engine) { + case OSS: + return issue.getSeverity() + "-risk package: " + issue.getTitle() + "@" + issue.getPackageVersion(); + case SECRETS: + return issue.getSeverity() + "-risk secret: " + issue.getTitle(); + case CONTAINERS: + return issue.getSeverity() + "-risk container image: " + issue.getTitle() + ":" + issue.getImageTag(); + case ASCA: + case IAC: + return issue.getTitle(); + default: + return issue.getDescription(); + } + } + + /** + * Extract file name from full path. + * + * @param filePath Full file path + * @return File name + */ + public static String getFileName(String filePath) { + if (filePath == null || filePath.isEmpty()) { + return "Unknown"; + } + int lastSeparator = Math.max(filePath.lastIndexOf('/'), filePath.lastIndexOf('\\')); + if (lastSeparator >= 0) { + return filePath.substring(lastSeparator + 1); + } + return filePath; + } +} + diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistConstants.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistConstants.java new file mode 100644 index 00000000..30ca3d16 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistConstants.java @@ -0,0 +1,159 @@ +package com.checkmarx.eclipse.devassist.utils; + +import java.util.List; + +/** + * The DevAssistConstants class defines a collection of constant values + * related to real-time scanning functionalities, including support for + * different scanning engines and associated configurations. + */ +public final class DevAssistConstants { + + private DevAssistConstants() { + throw new UnsupportedOperationException("Cannot instantiate DevAssistConstants class"); + } + + // Tab Name Constants + public static final String DEVASSIST_TAB = "Checkmarx One Assist Findings"; + public static final String IGNORED_FINDINGS_TAB = "Ignored Findings"; + public static final String DEVASSIST_PLUGIN_FINDINGS_WINDOW_NAME = "Checkmarx Developer Assist Findings"; + + // OSS Scanner Constants + public static final String ACTIVATE_OSS_REALTIME_SCANNER = "Activate OSS-Realtime"; + public static final String OSS_REALTIME_SCANNER = "Checkmarx Open Source Realtime Scanner (OSS-Realtime)"; + public static final String OSS_REALTIME_SCANNER_START = "Realtime OSS Scanner Engine started"; + public static final String OSS_REALTIME_SCANNER_DISABLED = "Realtime OSS Scanner Engine disabled"; + public static final String OSS_REALTIME_SCANNER_DIRECTORY = "Cx-oss-realtime-scanner"; + public static final String ERROR_OSS_REALTIME_SCANNER = "Failed to handle OSS Realtime scan"; + + // Container Scanner Constants + public static final String ACTIVATE_CONTAINER_REALTIME_SCANNER = "Activate Containers-Realtime"; + public static final String CONTAINER_REALTIME_SCANNER = "Checkmarx Containers Realtime Scanner (Containers-Realtime)"; + public static final String CONTAINER_REALTIME_SCANNER_START = "Realtime Containers Scanner Engine started"; + public static final String CONTAINER_REALTIME_SCANNER_DISABLED = "Realtime Containers Scanner Engine disabled"; + public static final String CONTAINER_REALTIME_SCANNER_DIRECTORY = "Cx-containers-realtime-scanner"; + public static final String ERROR_CONTAINER_REALTIME_SCANNER = "Failed to handle Containers Realtime scan"; + + // Secrets Scanner Constants + public static final String ACTIVATE_SECRETS_REALTIME_SCANNER = "Activate Secrets-Realtime"; + public static final String SECRETS_REALTIME_SCANNER = "Checkmarx Secrets Realtime Scanner (Secrets-Realtime)"; + public static final String SECRETS_REALTIME_SCANNER_START = "Realtime Secrets Scanner Engine started"; + public static final String SECRETS_REALTIME_SCANNER_DISABLED = "Realtime Secrets Scanner Engine disabled"; + public static final String SECRETS_REALTIME_SCANNER_DIRECTORY = "Cx-secrets-realtime-scanner"; + public static final String ERROR_SECRETS_REALTIME_SCANNER = "Failed to handle Secrets Realtime scan"; + + // IaC Scanner Constants + public static final String ACTIVATE_IAC_REALTIME_SCANNER = "Activate IAC-Realtime"; + public static final String IAC_REALTIME_SCANNER = "Checkmarx IAC Realtime Scanner (IAC-Realtime)"; + public static final String IAC_REALTIME_SCANNER_START = "Realtime IAC Scanner Engine started"; + public static final String IAC_REALTIME_SCANNER_DISABLED = "Realtime IAC Scanner Engine disabled"; + public static final String IAC_REALTIME_SCANNER_DIRECTORY = "Cx-iac-realtime-scanner"; + public static final String ERROR_IAC_REALTIME_SCANNER = "Failed to handle IAC Realtime scan"; + public static final String IAC_PREREQUISITE = "Please refer IAC RealTime Scanner Prerequisites"; + public static final String IAC_ENGINE_VALIDATION_ERROR = "Checkmarx Containers Management Tool Error"; + + // ASCA Scanner Constants + public static final String ACTIVATE_ASCA_REALTIME_SCANNER = "Activate ASCA-Realtime"; + public static final String ASCA_REALTIME_SCANNER = "Checkmarx AI Secure Coding Assistant (ASCA)"; + public static final String ASCA_REALTIME_SCANNER_START = "AI Secure Coding Assistant Engine started."; + public static final String ASCA_REALTIME_SCANNER_DISABLED = "AI Secure Coding Assistant Engine disabled."; + public static final String ERROR_ASCA_REALTIME_SCANNER = "Failed to handle ASCA Realtime scan"; + + // ASCA Supported File Extensions + public static final List ASCA_SUPPORTED_EXTENSIONS = List.of( + "java", "cs", "go", "py", "js", "jsx", "ts", "tsx", "rb", "cpp" + ); + + // Dev Assist Fixes Constants + public static final String FIX_WITH_CXONE_ASSIST = "Fix with Checkmarx One Assist"; + public static final String FIX_WITH_DEV_ASSIST = "Fix with Checkmarx Developer Assist"; + public static final String VIEW_DETAILS_FIX_NAME = "View details"; + public static final String IGNORE_THIS_VULNERABILITY_FIX_NAME = "Ignore this vulnerability"; + public static final String IGNORE_ALL_OF_THIS_TYPE_FIX_NAME = "Ignore all of this type"; + + // Manifest file patterns + public static final List MANIFEST_FILE_PATTERNS = List.of( + "**/Directory.Packages.props", + "**/packages.config", + "**/pom.xml", + "**/package.json", + "**/requirements.txt", + "**/go.mod", + "**/*.csproj", + "**/build.gradle", + "**/build.gradle.kts", + "**/yarn.lock", + "**/*.sbt", + "**/Gemfile", + "**/bower.json", + "**/requirement-*.txt", + "**/requirements-*.txt", + "**/Setup.py", + "**/Setup.cfg", + "**/pyproject.toml", + "**/poetry.lock", + "**/Package.swift", + "**/Package.resolved", + "**/composer.json", + "**/composer.lock", + "**/*.podspec.json", + "**/*.podspec", + "**/Podfile", + "**/Podfile.lock", + "**/Cartfile.resolved", + "**/Gemfile.lock", + "**/cpanfile.snapshot", + "**/cpanfile", + "**/pubspec.lock" + ); + + // Container file patterns + public static final List CONTAINERS_FILE_PATTERNS = List.of( + "**/dockerfile", + "**/dockerfile-*", + "**/dockerfile.*", + "**/docker-compose.yml", + "**/docker-compose.yaml", + "**/docker-compose-*.yml", + "**/docker-compose-*.yaml" + ); + + // IaC file patterns and extensions + public static final List IAC_SUPPORTED_PATTERNS = List.of( + "**/dockerfile", + "**/*.auto.tfvars", + "**/*.terraform.tfvars" + ); + + public static final List IAC_FILE_EXTENSIONS = List.of( + "tf", "yaml", "yml", "json", "proto", "dockerfile" + ); + + // Multiple issues on same line + public static final String MULTIPLE_IAC_ISSUES = " IAC issues detected on this line"; + public static final String MULTIPLE_ASCA_ISSUES = " ASCA violations detected on this line"; + + // Container file types + public static final String DOCKERFILE = "dockerfile"; + public static final String DOCKER_COMPOSE = "docker-compose"; + public static final String HELM = "helm"; + public static final List CONTAINER_HELM_EXTENSION = List.of("yml", "yaml"); + public static final List CONTAINER_HELM_EXCLUDED_FILES = List.of("chart.yml", "chart.yaml"); + + // Container image risk descriptions + public static final String MALICIOUS_RISK_CONTAINER = "Malicious-risk container image"; + public static final String CRITICAL_RISK_CONTAINER = "Critical-risk container image"; + public static final String HIGH_RISK_CONTAINER = "High-risk container image"; + public static final String MEDIUM_RISK_CONTAINER = "Medium-risk container image"; + public static final String LOW_RISK_CONTAINER = "Low-risk container image"; + + // General constants + public static final String SEVERITY_PACKAGE = "Severity Package"; + public static final String THEME = "THEME"; + public static final String CX_AGENT_NAME = "Checkmarx One Assist"; + public static final String CX_DEVASSIST_AGENT_NAME = "Checkmarx Developer Assist"; + public static final List AI_AGENT_FILES = List.of("/Dummy.txt", "/", "/AIAssistantInput"); + public static final String SEPARATOR = ":"; + public static final String QUICK_FIX = "QUICK_FIX"; + public static final String UNDO = "Undo"; +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistUtils.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistUtils.java new file mode 100644 index 00000000..84889bc4 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistUtils.java @@ -0,0 +1,258 @@ +package com.checkmarx.eclipse.devassist.utils; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; +import java.util.Base64; +import java.util.List; +import java.util.Objects; + +import org.eclipse.core.resources.IFile; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jgit.annotations.NonNull; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorReference; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.texteditor.ITextEditor; + +import com.checkmarx.eclipse.devassist.backend.SeverityLevel; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Utility class for DevAssist operations. Provides methods for encoding, decoding, + * severity normalization, and file type detection. + */ +public class DevAssistUtils { + private static final String LOG_TAG = "[DEV-ASSIST-UTILS]"; + + public static final String DOCKERFILE = "dockerfile"; + public static final String DOCKER_COMPOSE = "docker-compose"; + public static final String HELM = "helm"; + + private DevAssistUtils() { + // Private constructor to prevent instantiation + } + + /** + * Generate a unique ID for scan issue based on line, rule info, and file name. + * Mirrors JetBrains pattern: base64(line + ruleInfo + fileName) + * + * @param line Line number where issue occurs + * @param ruleInfo Rule ID + Rule Name concatenated + * @param fileName Name of the file (not full path, just filename) + * @return Deterministic base64-encoded ID + */ + public static String generateUniqueId(int line, String ruleInfo, String fileName) { + String input = line + "|" + ruleInfo + "|" + fileName; + return encodeBase64(input); + } + + /** + * Encode the input string using Base64. Uses UTF-8 encoding to match JetBrains + * implementation. + * + * @param input String to be encoded + * @return Base64 encoded string + */ + public static String encodeBase64(String input) { + if (input == null || input.isEmpty()) { + CxLogger.warning(LOG_TAG + " Attempting to encode null or empty string"); + return ""; + } + try { + return Base64.getEncoder().encodeToString(input.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Error encoding string to Base64: " + e.getMessage(), e); + return ""; + } + } + + /** + * Decode a Base64 string back to its original form. Used for debugging or ID + * verification. + * + * @param encoded Base64 encoded string + * @return Decoded string + */ + public static String decodeBase64(String encoded) { + if (encoded == null || encoded.isEmpty()) { + return ""; + } + try { + return new String(Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error decoding Base64 string: " + e.getMessage()); + return ""; + } + } + + /** + * Normalize severity string to match SeverityLevel enum format (capitalized). + * + * @param severity Raw severity string from API + * @return Normalized severity in SeverityLevel format, or original if no match + */ + public static String normalizeSeverity(String severity) { + if (severity == null || severity.isEmpty()) { + return "Unknown"; + } + String upper = severity.toUpperCase(); + switch (upper) { + case "MALICIOUS": + return SeverityLevel.MALICIOUS.getSeverity(); + case "CRITICAL": + return SeverityLevel.CRITICAL.getSeverity(); + case "HIGH": + return SeverityLevel.HIGH.getSeverity(); + case "MEDIUM": + return SeverityLevel.MEDIUM.getSeverity(); + case "LOW": + return SeverityLevel.LOW.getSeverity(); + case "UNKNOWN": + return SeverityLevel.UNKNOWN.getSeverity(); + case "OK": + return SeverityLevel.OK.getSeverity(); + case "IGNORED": + return SeverityLevel.IGNORED.getSeverity(); + default: + return severity; + } + } + + /** + * Check if severity represents a problem (displayable finding). + * + * @param severity Severity string (case-insensitive) + * @return true if severity is a problem, false if OK/UNKNOWN/IGNORED + */ + public static boolean isProblem(String severity) { + if (severity == null) { + return false; + } + return !severity.equalsIgnoreCase(SeverityLevel.OK.getSeverity()) + && !severity.equalsIgnoreCase(SeverityLevel.UNKNOWN.getSeverity()) + && !severity.equalsIgnoreCase(SeverityLevel.IGNORED.getSeverity()); + } + + /** + * Check if the given file path corresponds to a Docker Compose file. + * + * @param filePath Full path to the file + * @return true if it's a Docker Compose file, false otherwise + */ + public static boolean isDockerComposeFile(@NonNull String filePath) { + return Paths.get(filePath).getFileName().toString().toLowerCase().contains("docker-compose"); + } + + /** + * Check if the given file path corresponds to a Dockerfile. + * + * @param filePath Full path to the file + * @return true if it's a Dockerfile, false otherwise + */ + public static boolean isDockerFile(@NonNull String filePath) { + return Paths.get(filePath).getFileName().toString().toLowerCase().contains("dockerfile"); + } + + /** + * Check if the given file path is a YAML file. + * + * @param filePath Full path to the file + * @return true if it's a YAML file, false otherwise + */ + public static boolean isYamlFile(String filePath) { + if (Objects.isNull(filePath) || filePath.isBlank()) { + return false; + } + String fileExtension = getFileExtension(filePath); + return Objects.nonNull(fileExtension) + && DevAssistConstants.CONTAINER_HELM_EXTENSION.contains(fileExtension.toLowerCase()); + } + + /** + * Extracts the file extension from a given file path string. + * + * @param filePath absolute or relative path to the file + * @return lower-case extension without the leading dot, or null if no extension exists + */ + public static String getFileExtension(String filePath) { + if (filePath == null || filePath.isBlank()) { + return null; + } + int lastDot = filePath.lastIndexOf('.'); + int lastSeparator = Math.max(filePath.lastIndexOf('/'), filePath.lastIndexOf('\\')); + + if (lastDot > lastSeparator && lastDot < filePath.length() - 1) { + return filePath.substring(lastDot + 1).toLowerCase(); + } + return null; + } + + /** + * Get the live IDocument for a file if it is currently open in an editor. + * + * CRITICAL: Every scanner's scan(String filePath) previously passed a brand-new + * empty Document, which forced getFileContent() to fall back to reading the file + * from disk. This meant real-time scans always scanned the last SAVED content, + * never the current unsaved edit - causing results to lag one edit/save behind. + * + * Runs the editor lookup on the UI thread (via syncExec) since scan() is invoked + * from a background Job thread and Workbench/editor APIs are not thread-safe. + * + * @param filePath Absolute OS file path to look up + * @return the live IDocument if the file is open in a text editor, else null + */ + public static IDocument getLiveDocumentForFile(String filePath) { + if (filePath == null || filePath.isBlank()) { + return null; + } + + final IDocument[] result = new IDocument[1]; + try { + Display display = Display.getDefault(); + if (display == null || display.isDisposed()) { + return null; + } + + display.syncExec(() -> { + try { + IWorkbench workbench = PlatformUI.getWorkbench(); + if (workbench == null || workbench.isClosing()) { + return; + } + for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) { + for (IWorkbenchPage page : window.getPages()) { + for (IEditorReference ref : page.getEditorReferences()) { + IEditorPart editor = ref.getEditor(false); + if (!(editor instanceof ITextEditor)) { + continue; + } + ITextEditor textEditor = (ITextEditor) editor; + try { + IFile file = textEditor.getEditorInput().getAdapter(IFile.class); + if (file != null && file.getLocation() != null + && file.getLocation().toOSString().equals(filePath)) { + result[0] = textEditor.getDocumentProvider() + .getDocument(textEditor.getEditorInput()); + return; + } + } catch (Exception e) { + // Skip editors we can't inspect + } + } + } + } + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error resolving live document for: " + filePath + " - " + e.getMessage()); + } + }); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Error in getLiveDocumentForFile: " + e.getMessage()); + } + + return result[0]; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/ScanEngine.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/ScanEngine.java new file mode 100644 index 00000000..26086213 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/ScanEngine.java @@ -0,0 +1,21 @@ +package com.checkmarx.eclipse.devassist.utils; + +/** + * Enumeration representing various scanning engines supported by the system. + * Each constant signifies a specific type of scanning capability provided by the platform. + * + * The available scanning engines are: + * - OSS: Represents scanning for Open Source Software dependencies and vulnerabilities. + * - SECRETS: Represents scanning for sensitive information such as secrets and credentials in the code. + * - CONTAINERS: Represents scanning for vulnerabilities in container images. + * - IAC: Represents scanning for Infrastructure as Code issues and misconfigurations. + * - ASCA: Represents scanning for Application Security Code Analysis. + */ +public enum ScanEngine { + OSS, + SECRETS, + CONTAINERS, + IAC, + ASCA, + ALL +} diff --git a/pom.xml b/pom.xml index ddc93a88..11e77754 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,8 @@ + common-lib + devassist-lib checkmarx-ast-eclipse-plugin com.checkmarx.eclipse.feature com.checkmarx.eclipse.site @@ -118,7 +120,7 @@ ${project.artifactId}_${unqualifiedVersion}.${buildQualifier} - + @@ -130,7 +132,7 @@ ${tycho.version} JavaSE-17 - ignore + consider linux From 86b13ef6aabaaa4c1b391276d33dea317f625370 Mon Sep 17 00:00:00 2001 From: Aniket Shinde Date: Sat, 8 Aug 2026 13:07:58 +0530 Subject: [PATCH 02/19] Gutter icons --- devassist-lib/plugin.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/devassist-lib/plugin.xml b/devassist-lib/plugin.xml index 0dd5b49e..c3b7040d 100644 --- a/devassist-lib/plugin.xml +++ b/devassist-lib/plugin.xml @@ -87,7 +87,7 @@ Date: Sat, 8 Aug 2026 15:00:47 +0530 Subject: [PATCH 03/19] lib --- .gitattributes | 1 + .gitignore | 1 + common-lib/.project | 8 +++++++- devassist-lib/.project | 8 +++++++- devassist-lib/lib/ast-cli-java-wrapper-2.4.24.jar | 3 +++ devassist-lib/lib/commons-lang3-3.18.0.jar | 3 +++ devassist-lib/lib/jackson-annotations-2.21.jar | 3 +++ devassist-lib/lib/jackson-core-2.21.4.jar | 3 +++ devassist-lib/lib/jackson-databind-2.21.5.jar | 3 +++ devassist-lib/lib/slf4j-api-2.0.17.jar | 3 +++ devassist-lib/lib/slf4j-reload4j-2.0.17.jar | 3 +++ devassist-lib/lib/slf4j-simple-2.0.17.jar | 3 +++ 12 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 devassist-lib/lib/ast-cli-java-wrapper-2.4.24.jar create mode 100644 devassist-lib/lib/commons-lang3-3.18.0.jar create mode 100644 devassist-lib/lib/jackson-annotations-2.21.jar create mode 100644 devassist-lib/lib/jackson-core-2.21.4.jar create mode 100644 devassist-lib/lib/jackson-databind-2.21.5.jar create mode 100644 devassist-lib/lib/slf4j-api-2.0.17.jar create mode 100644 devassist-lib/lib/slf4j-reload4j-2.0.17.jar create mode 100644 devassist-lib/lib/slf4j-simple-2.0.17.jar diff --git a/.gitattributes b/.gitattributes index b9b6fd84..d1213751 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,3 +13,4 @@ checkmarx-ast-eclipse-plugin/lib/ast-cli-java-wrapper-2.4.20.jar filter=lfs diff checkmarx-ast-eclipse-plugin/lib/ast-cli-java-wrapper-2.4.21.jar filter=lfs diff=lfs merge=lfs -text checkmarx-ast-eclipse-plugin/lib/ast-cli-java-wrapper-2.4.23.jar filter=lfs diff=lfs merge=lfs -text checkmarx-ast-eclipse-plugin/lib/ast-cli-java-wrapper-2.4.24.jar filter=lfs diff=lfs merge=lfs -text +devassist-lib/lib/*.jar filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index f560f662..767b2e32 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ .vs/ *.jar !checkmarx-ast-eclipse-plugin/lib/*.jar +!devassist-lib/lib/*.jar diff --git a/common-lib/.project b/common-lib/.project index f1006388..45eb413e 100644 --- a/common-lib/.project +++ b/common-lib/.project @@ -20,9 +20,15 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature - \ No newline at end of file + diff --git a/devassist-lib/.project b/devassist-lib/.project index 3b6ad123..7c973ce5 100644 --- a/devassist-lib/.project +++ b/devassist-lib/.project @@ -20,9 +20,15 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature - \ No newline at end of file + diff --git a/devassist-lib/lib/ast-cli-java-wrapper-2.4.24.jar b/devassist-lib/lib/ast-cli-java-wrapper-2.4.24.jar new file mode 100644 index 00000000..b4e1e934 --- /dev/null +++ b/devassist-lib/lib/ast-cli-java-wrapper-2.4.24.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e664771fd767accd5bd47057c5a6d4cc86d292c93191200d061ded6e3e527bdf +size 135732567 diff --git a/devassist-lib/lib/commons-lang3-3.18.0.jar b/devassist-lib/lib/commons-lang3-3.18.0.jar new file mode 100644 index 00000000..b3a4eb8a --- /dev/null +++ b/devassist-lib/lib/commons-lang3-3.18.0.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4eeeae8d20c078abb64b015ec158add383ac581571cddc45c68f0c9ae0230720 +size 702952 diff --git a/devassist-lib/lib/jackson-annotations-2.21.jar b/devassist-lib/lib/jackson-annotations-2.21.jar new file mode 100644 index 00000000..7a137fe2 --- /dev/null +++ b/devassist-lib/lib/jackson-annotations-2.21.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53ca085f4a150f703f49e1aabd935bd03b43e1ea3d55d135438292af22cef56b +size 82104 diff --git a/devassist-lib/lib/jackson-core-2.21.4.jar b/devassist-lib/lib/jackson-core-2.21.4.jar new file mode 100644 index 00000000..d43b85b8 --- /dev/null +++ b/devassist-lib/lib/jackson-core-2.21.4.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b40a06396f239f8de2da57419adde6e94e5edc18a2171d471ea05eeed4e5c2d +size 594183 diff --git a/devassist-lib/lib/jackson-databind-2.21.5.jar b/devassist-lib/lib/jackson-databind-2.21.5.jar new file mode 100644 index 00000000..188a54f7 --- /dev/null +++ b/devassist-lib/lib/jackson-databind-2.21.5.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:507418c0fafd38b2b2cfb704521630da613a8e4cc8381195a6f418017883e2c0 +size 1705906 diff --git a/devassist-lib/lib/slf4j-api-2.0.17.jar b/devassist-lib/lib/slf4j-api-2.0.17.jar new file mode 100644 index 00000000..181ddf15 --- /dev/null +++ b/devassist-lib/lib/slf4j-api-2.0.17.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b751d952061954d5abfed7181c1f645d336091b679891591d63329c622eb832 +size 69908 diff --git a/devassist-lib/lib/slf4j-reload4j-2.0.17.jar b/devassist-lib/lib/slf4j-reload4j-2.0.17.jar new file mode 100644 index 00000000..07eb8d6c --- /dev/null +++ b/devassist-lib/lib/slf4j-reload4j-2.0.17.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62dfd069563dbce91d276c9a38d557da49df7be15b03bb898b63b5390c6bb889 +size 10734 diff --git a/devassist-lib/lib/slf4j-simple-2.0.17.jar b/devassist-lib/lib/slf4j-simple-2.0.17.jar new file mode 100644 index 00000000..00965c2b --- /dev/null +++ b/devassist-lib/lib/slf4j-simple-2.0.17.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddfea59ac074c6d3e24ac2c38622d2d963895e17f70b38ed4bdae4d780be6964 +size 15716 From 6445837d01b68497493dca6f99c320b8249eb4e2 Mon Sep 17 00:00:00 2001 From: Aniket Shinde Date: Sun, 9 Aug 2026 07:26:12 +0530 Subject: [PATCH 04/19] Save --- .../eclipse/plugin/tests/ui/BaseUITest.java | 5 +- .../plugin/tests/ui/BestFixLocationTest.java | 2 +- .../ast/eclipse/plugin/tests/ui/TestScan.java | 2 +- .../eclipse/plugin/tests/ui/TestTriage.java | 2 +- .../ast/eclipse/plugin/tests/ui/TestUI.java | 2 +- .../tests/unit/runner/AuthenticatorTest.java | 2 +- .../tests/unit/utils/PluginUtilsTest.java | 2 +- .../ActionOpenPreferencesPageTest.java | 2 +- .../eclipse/properties/Preferences.java | 39 -- .../eclipse/properties/PreferencesPage.java | 173 ------- .../checkmarx/eclipse/utils/PluginUtils.java | 3 +- .../eclipse/views/CheckmarxView.java | 4 +- .../checkmarx/eclipse/views/DataProvider.java | 6 +- .../views/actions/ActionCancelScan.java | 2 +- .../actions/ActionOpenPreferencesPage.java | 2 +- .../views/actions/ActionStartScan.java | 2 +- .../eclipse/views/actions/ToolBarActions.java | 2 +- common-lib/.classpath | 10 +- .../org.eclipse.core.resources.prefs | 2 + common-lib/META-INF/MANIFEST.MF | 22 +- .../preferences/CheckmarxPreferencePage.java | 219 +++++++++ .../properties/AuthButtonFieldEditor.java | 6 +- .../properties/CxPreferencesDialogSizing.java | 50 ++ .../common}/properties/LabelFieldEditor.java | 2 +- .../common/properties/Preferences.java | 51 ++ .../common/properties/PreferencesPage.java | 357 ++++++++++++++ .../common/properties/SharedPreferences.java | 31 -- .../eclipse/common}/runner/Authenticator.java | 4 +- .../common/runner/TenantSettingsProvider.java | 52 ++ .../common}/utils/PluginConstants.java | 2 +- .../org.eclipse.core.resources.prefs | 2 + devassist-lib/META-INF/MANIFEST.MF | 2 +- .../listener/ProjectLifecycleListener.java | 2 +- .../configuration/McpInstallService.java | 157 ++++++ .../configuration/McpSettingsInjector.java | 352 ++++++++++++++ .../devassist/state/ScanFrequency.java | 36 ++ .../eclipse/devassist/state/ScannerState.java | 46 ++ .../devassist/state/ScannerStateManager.java | 73 +++ .../ui/findings/realtime/RealTimeScanJob.java | 2 +- .../ui/preferences/WelcomeDialog.java | 460 ++++++++++++++++++ .../devassist/utils/DevAssistConstants.java | 15 + 41 files changed, 1931 insertions(+), 276 deletions(-) delete mode 100644 checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/Preferences.java delete mode 100644 checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/PreferencesPage.java create mode 100644 common-lib/.settings/org.eclipse.core.resources.prefs create mode 100644 common-lib/src/com/checkmarx/eclipse/common/preferences/CheckmarxPreferencePage.java rename {checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse => common-lib/src/com/checkmarx/eclipse/common}/properties/AuthButtonFieldEditor.java (91%) create mode 100644 common-lib/src/com/checkmarx/eclipse/common/properties/CxPreferencesDialogSizing.java rename {checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse => common-lib/src/com/checkmarx/eclipse/common}/properties/LabelFieldEditor.java (96%) create mode 100644 common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java create mode 100644 common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java delete mode 100644 common-lib/src/com/checkmarx/eclipse/common/properties/SharedPreferences.java rename {checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse => common-lib/src/com/checkmarx/eclipse/common}/runner/Authenticator.java (93%) create mode 100644 common-lib/src/com/checkmarx/eclipse/common/runner/TenantSettingsProvider.java rename {checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse => common-lib/src/com/checkmarx/eclipse/common}/utils/PluginConstants.java (99%) create mode 100644 devassist-lib/.settings/org.eclipse.core.resources.prefs create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpSettingsInjector.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScanFrequency.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScannerState.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScannerStateManager.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/ui/preferences/WelcomeDialog.java diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/BaseUITest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/BaseUITest.java index 175febc8..346934e7 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/BaseUITest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/BaseUITest.java @@ -16,12 +16,13 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; + +import com.checkmarx.eclipse.common.utils.PluginConstants; + import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree; import org.eclipse.swt.widgets.Decorations; import org.eclipse.swt.widgets.Tree; -import com.checkmarx.eclipse.utils.PluginConstants; - import checkmarx.ast.eclipse.plugin.tests.common.Environment; public abstract class BaseUITest { diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/BestFixLocationTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/BestFixLocationTest.java index 3a4c686a..66a5e5b8 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/BestFixLocationTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/BestFixLocationTest.java @@ -7,7 +7,7 @@ import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem; import org.junit.jupiter.api.Test; -import com.checkmarx.eclipse.utils.PluginConstants; +import com.checkmarx.eclipse.common.utils.PluginConstants; public class BestFixLocationTest extends BaseUITest{ diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestScan.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestScan.java index 64507314..2bb308f4 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestScan.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestScan.java @@ -13,7 +13,7 @@ import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton; import org.junit.jupiter.api.Test; -import com.checkmarx.eclipse.utils.PluginConstants; +import com.checkmarx.eclipse.common.utils.PluginConstants; import checkmarx.ast.eclipse.plugin.tests.common.Environment; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestTriage.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestTriage.java index 89b48777..867352a4 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestTriage.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestTriage.java @@ -17,7 +17,7 @@ import org.junit.jupiter.api.Test; import com.checkmarx.eclipse.common.enums.Severity; -import com.checkmarx.eclipse.utils.PluginConstants; +import com.checkmarx.eclipse.common.utils.PluginConstants; public class TestTriage extends BaseUITest { diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestUI.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestUI.java index 441e25af..4633bac8 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestUI.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/ui/TestUI.java @@ -27,7 +27,7 @@ import com.checkmarx.eclipse.enums.ActionName; import com.checkmarx.eclipse.common.enums.Severity; -import com.checkmarx.eclipse.utils.PluginConstants; +import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.views.actions.ToolBarActions; import checkmarx.ast.eclipse.plugin.tests.common.Environment; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java index becefbdc..365a06d5 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java @@ -15,7 +15,7 @@ import com.checkmarx.ast.wrapper.CxWrapper; import com.checkmarx.eclipse.runner.Authenticator; import com.checkmarx.eclipse.common.utils.CxLogger; -import com.checkmarx.eclipse.utils.PluginConstants; +import com.checkmarx.eclipse.common.utils.PluginConstants; class AuthenticatorTest { diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java index 63a5233a..3906d7f5 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java @@ -33,8 +33,8 @@ import com.checkmarx.ast.results.result.Node; import com.checkmarx.ast.results.result.Result; import com.checkmarx.eclipse.common.enums.Severity; +import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.properties.Preferences; -import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.utils.PluginUtils; import com.checkmarx.eclipse.views.DataProvider; import com.checkmarx.eclipse.views.DisplayModel; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/actions/ActionOpenPreferencesPageTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/actions/ActionOpenPreferencesPageTest.java index 64d4c0fa..a54a3bd9 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/actions/ActionOpenPreferencesPageTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/views/actions/ActionOpenPreferencesPageTest.java @@ -15,8 +15,8 @@ import org.mockito.MockedStatic; import org.mockito.Mockito; +import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.enums.ActionName; -import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.views.DisplayModel; import com.checkmarx.eclipse.views.actions.ActionOpenPreferencesPage; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/Preferences.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/Preferences.java deleted file mode 100644 index f991a1bc..00000000 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/Preferences.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.checkmarx.eclipse.properties; - -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.preferences.InstanceScope; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.ui.preferences.ScopedPreferenceStore; - -import com.checkmarx.eclipse.Activator; - -public class Preferences { - - public static final String QUALIFIER = "com.checkmarx.eclipse"; - public static final String API_KEY = "apiKey"; - public static final String ADDITIONAL_OPTIONS = "additionalOptions"; - - public static final ScopedPreferenceStore STORE = new ScopedPreferenceStore(InstanceScope.INSTANCE, QUALIFIER); - - private Preferences() { - } - - public static String getPref(String key) { - return Platform.getPreferencesService().getString(Preferences.QUALIFIER, key, null, null); - } - - public static String getApiKey() { - return getPref(API_KEY); - } - - - public static String getAdditionalOptions() { - return getPref(ADDITIONAL_OPTIONS); - } - - public static void store(String key, String value) { - IPreferenceStore prefStore = Activator.getDefault().getPreferenceStore(); - prefStore.setValue(key, value); - } - -} diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/PreferencesPage.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/PreferencesPage.java deleted file mode 100644 index e722b342..00000000 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/PreferencesPage.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.checkmarx.eclipse.properties; - -import java.util.concurrent.CompletableFuture; - -import com.checkmarx.eclipse.common.events.SettingsTopics; - -import org.eclipse.jface.preference.FieldEditor; -import org.eclipse.jface.preference.FieldEditorPreferencePage; -import org.eclipse.jface.preference.StringFieldEditor; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPreferencePage; - -import com.checkmarx.eclipse.Activator; -import com.checkmarx.eclipse.runner.Authenticator; -import com.checkmarx.eclipse.common.utils.CxLogger; -import com.checkmarx.eclipse.utils.PluginConstants; -import com.checkmarx.eclipse.utils.PluginUtils; -import org.eclipse.swt.widgets.Link; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.browser.IWorkbenchBrowserSupport; -import org.eclipse.ui.PartInitException; - -import java.net.MalformedURLException; -import java.net.URL; - - -public class PreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { - public PreferencesPage() { - super(GRID); - Activator.getDefault().getPreferenceStore().addPropertyChangeListener(this::handlePropertyChange); - } - - private void handlePropertyChange(PropertyChangeEvent event) { - - } - - @Override - public void init(IWorkbench workbench) { - setPreferenceStore(Preferences.STORE); - setMessage("Checkmarx One preferences"); - } - - @Override - protected void createFieldEditors() { - Composite topComposite = new Composite(getFieldEditorParent(), SWT.NONE); - GridData topGridData = new GridData(); - topGridData.horizontalAlignment = GridData.FILL; - topGridData.verticalAlignment = GridData.FILL; - topGridData.grabExcessHorizontalSpace = true; - topComposite.setLayoutData(topGridData); - - getFieldEditorParent().setLayoutData(topGridData); - - GridLayout parentLayout = new GridLayout(); - parentLayout.numColumns = 1; - parentLayout.horizontalSpacing = 0; - parentLayout.verticalSpacing = 0; - parentLayout.marginHeight = 0; - parentLayout.marginWidth = 0; - topComposite.setLayout(parentLayout); - - StringFieldEditor apiKey = new StringFieldEditor(Preferences.API_KEY, PluginConstants.PREFERENCES_API_KEY, topComposite); - addField(apiKey); - Text textControl = apiKey.getTextControl(topComposite); - textControl.setEchoChar('*'); - - StringFieldEditor additionalParams = new StringFieldEditor(Preferences.ADDITIONAL_OPTIONS, - PluginConstants.PREFERENCES_ADDITIONAL_OPTIONS, StringFieldEditor.UNLIMITED, StringFieldEditor.VALIDATE_ON_KEY_STROKE, topComposite); - addField(additionalParams); - - //set the width for API Key text field - GridData gridData = new GridData(SWT.BEGINNING, SWT.CENTER, true, false); - gridData.widthHint = 500; // Some width - gridData.grabExcessHorizontalSpace = false; - gridData.horizontalAlignment = GridData.FILL; - textControl.setLayoutData(gridData); - - addField(space()); - - - Link cliHelp = new Link(getFieldEditorParent(), SWT.NONE); - cliHelp.setText("CLI command that supports a set of global flags"); - cliHelp.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false)); - GridData linkGridData = new GridData(SWT.END, SWT.CENTER, true, false); - cliHelp.setLayoutData(linkGridData); - cliHelp.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport(); - try { - browserSupport.getExternalBrowser().openURL(new URL(e.text)); - } catch (PartInitException | MalformedURLException e1) { - CxLogger.error("Failed to open CLI help documentation link.", e1); - e1.printStackTrace(); - } - } - }); - - addField(space()); - - Label connectionLabel = new Label(getFieldEditorParent(), SWT.WRAP); - connectionLabel.setLayoutData( - new GridData(SWT.FILL, SWT.CENTER, true, false) - ); - - Button connectionButton = new Button(topComposite, SWT.PUSH); - connectionButton.setText(PluginConstants.PREFERENCES_TEST_CONNECTION); - connectionButton.setEnabled(!apiKey.getStringValue().trim().isEmpty()); - textControl.addModifyListener(e -> { - connectionButton.setEnabled(!textControl.getText().trim().isEmpty()); - }); - connectionButton.addSelectionListener(new SelectionAdapter() { - - public void widgetSelected(SelectionEvent e) { - - String apiKey_str = apiKey.getStringValue(); - - String additionalParams_str = additionalParams.getStringValue(); - connectionButton.setEnabled(false); - connectionLabel.setText(PluginConstants.PREFERENCES_VALIDATING_STATE); - getFieldEditorParent().layout(); - CompletableFuture.supplyAsync(() -> { - try { - return Authenticator.INSTANCE.doAuthentication( - apiKey_str, additionalParams_str); - } catch (Throwable t) { - CxLogger.error(PluginConstants.ERROR_AUTHENTICATING_AST, new Exception(t)); - return t.getMessage(); - } - }).thenAccept((result) -> Display.getDefault().syncExec(() -> { - connectionLabel.setText(mapAuthResult(result)); - getFieldEditorParent().layout(); - connectionButton.setEnabled(true); - })); - } - }); - } - - - - private static String mapAuthResult(String result) { - if (result != null && result.contains(PluginConstants.AUTH_SUCCESS_PATTERN)) { - return PluginConstants.AUTH_SUCCESS_DISPLAY; - } - return result; - } - - private FieldEditor space() { - return new LabelFieldEditor("", getFieldEditorParent()); - } - - @Override - public boolean performOk() { - boolean ok = super.performOk(); - - if (ok) { - PluginUtils.getEventBroker().post(SettingsTopics.TOPIC_APPLY_SETTINGS, PluginConstants.EMPTY_STRING); - } - - return ok; - } -} \ No newline at end of file diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginUtils.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginUtils.java index 94ade55a..aa26bc66 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginUtils.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginUtils.java @@ -26,7 +26,8 @@ import com.checkmarx.eclipse.enums.ActionName; import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.common.utils.CxLogger; -import com.checkmarx.eclipse.properties.Preferences; +import com.checkmarx.eclipse.common.utils.PluginConstants; +import com.checkmarx.eclipse.common.properties.Preferences; import com.checkmarx.eclipse.views.DataProvider; import com.checkmarx.eclipse.views.DisplayModel; import com.checkmarx.eclipse.views.filters.FilterState; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/CheckmarxView.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/CheckmarxView.java index b4366c05..86cfec99 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/CheckmarxView.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/CheckmarxView.java @@ -93,10 +93,10 @@ import com.checkmarx.eclipse.Activator; import com.checkmarx.eclipse.enums.ActionName; import com.checkmarx.eclipse.common.enums.Severity; -import com.checkmarx.eclipse.properties.Preferences; +import com.checkmarx.eclipse.common.properties.Preferences; import com.checkmarx.eclipse.common.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.utils.NotificationPopUpUI; -import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.utils.PluginUtils; import com.checkmarx.eclipse.views.actions.ToolBarActions; import com.checkmarx.eclipse.views.filters.FilterState; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/DataProvider.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/DataProvider.java index 72884426..0b9b7c41 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/DataProvider.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/DataProvider.java @@ -30,10 +30,10 @@ import com.checkmarx.ast.wrapper.CxConfig; import com.checkmarx.ast.wrapper.CxException; import com.checkmarx.ast.wrapper.CxWrapper; -import com.checkmarx.eclipse.properties.Preferences; -import com.checkmarx.eclipse.runner.Authenticator; +import com.checkmarx.eclipse.common.properties.Preferences; +import com.checkmarx.eclipse.common.runner.Authenticator; import com.checkmarx.eclipse.common.utils.CxLogger; -import com.checkmarx.eclipse.utils.PluginConstants; +import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.utils.PluginUtils; import com.checkmarx.eclipse.views.filters.FilterState; diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionCancelScan.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionCancelScan.java index 42bc5ea0..8103d7c0 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionCancelScan.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionCancelScan.java @@ -4,8 +4,8 @@ import org.eclipse.jface.viewers.TreeViewer; import com.checkmarx.eclipse.Activator; +import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.enums.ActionName; -import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.views.DisplayModel; public class ActionCancelScan extends CxBaseAction { diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionOpenPreferencesPage.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionOpenPreferencesPage.java index f1c8cc30..8f88fb92 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionOpenPreferencesPage.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionOpenPreferencesPage.java @@ -6,8 +6,8 @@ import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.PreferencesUtil; +import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.enums.ActionName; -import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.views.DisplayModel; public class ActionOpenPreferencesPage extends CxBaseAction { diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionStartScan.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionStartScan.java index bccdb3d7..d7e7aed3 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionStartScan.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ActionStartScan.java @@ -41,8 +41,8 @@ import com.checkmarx.eclipse.views.PluginListenerDefinition; import com.google.common.eventbus.EventBus; import com.checkmarx.eclipse.common.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.utils.NotificationPopUpUI; -import com.checkmarx.eclipse.utils.PluginConstants; import com.checkmarx.eclipse.utils.PluginUtils; public class ActionStartScan extends CxBaseAction { diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ToolBarActions.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ToolBarActions.java index 7ba5f4e7..3732ec38 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ToolBarActions.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/views/actions/ToolBarActions.java @@ -24,7 +24,7 @@ import com.checkmarx.eclipse.enums.PluginListenerType; import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.common.utils.CxLogger; -import com.checkmarx.eclipse.utils.PluginConstants; +import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.views.DataProvider; import com.checkmarx.eclipse.views.DisplayModel; import com.checkmarx.eclipse.views.PluginListenerDefinition; diff --git a/common-lib/.classpath b/common-lib/.classpath index bebfa806..f676a50d 100644 --- a/common-lib/.classpath +++ b/common-lib/.classpath @@ -1,7 +1,13 @@ - + + + + + + + - \ No newline at end of file + diff --git a/common-lib/.settings/org.eclipse.core.resources.prefs b/common-lib/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/common-lib/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/common-lib/META-INF/MANIFEST.MF b/common-lib/META-INF/MANIFEST.MF index cd398271..b7b88f2b 100644 --- a/common-lib/META-INF/MANIFEST.MF +++ b/common-lib/META-INF/MANIFEST.MF @@ -4,9 +4,27 @@ Bundle-Name: Checkmarx Common Library Bundle-SymbolicName: com.checkmarx.eclipse.common Bundle-Version: 1.0.0.qualifier Bundle-Vendor: Checkmarx -Require-Bundle: org.eclipse.core.runtime +Bundle-ClassPath: ., + lib/ast-cli-java-wrapper-2.4.24.jar, + lib/jackson-core-2.21.4.jar, + lib/jackson-databind-2.21.5.jar, + lib/jackson-annotations-2.21.jar, + lib/slf4j-api-2.0.17.jar, + lib/slf4j-simple-2.0.17.jar, + lib/slf4j-reload4j-2.0.17.jar, + lib/commons-lang3-3.18.0.jar +Require-Bundle: org.eclipse.core.runtime, + org.eclipse.ui.ide, + org.eclipse.jface.text, + org.eclipse.text, + org.eclipse.jdt.ui, + org.eclipse.ui, + org.eclipse.ui.workbench.texteditor, + org.eclipse.ui.editors, + lib/ast-cli-java-wrapper-2.4.24.jar Bundle-RequiredExecutionEnvironment: JavaSE-17 Export-Package: com.checkmarx.eclipse.common.enums, com.checkmarx.eclipse.common.events, com.checkmarx.eclipse.common.properties, - com.checkmarx.eclipse.common.utils \ No newline at end of file + com.checkmarx.eclipse.common.runner, + com.checkmarx.eclipse.common.utils diff --git a/common-lib/src/com/checkmarx/eclipse/common/preferences/CheckmarxPreferencePage.java b/common-lib/src/com/checkmarx/eclipse/common/preferences/CheckmarxPreferencePage.java new file mode 100644 index 00000000..f5e62fd7 --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/preferences/CheckmarxPreferencePage.java @@ -0,0 +1,219 @@ +package com.checkmarx.eclipse.common.preferences; + +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; + +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.preference.PreferencePage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyleRange; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.*; +import org.eclipse.ui.preferences.ScopedPreferenceStore; +import org.eclipse.core.runtime.preferences.InstanceScope; + +/** + * Preference page for configuring Checkmarx scanner settings. + * Allows users to enable/disable individual scanners and select scan frequency. + */ +public class CheckmarxPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { + + // Preference Keys + public static final String PREF_ASCA_ENABLED = "scanner.asca.enabled"; + public static final String PREF_OSS_ENABLED = "scanner.oss.enabled"; + public static final String PREF_SECRETS_ENABLED = "scanner.secrets.enabled"; + public static final String PREF_CONTAINERS_ENABLED = "scanner.containers.enabled"; + public static final String PREF_IAC_ENABLED = "scanner.iac.enabled"; + public static final String PREF_CONTAINERS_TOOL = "scanner.containers.tool"; + + // Controls + private Label assistMessageLabel; + private Button ascaCheckbox; + private Label ascaInstallationMsg; + private Button ossCheckbox; + private Button secretsCheckbox; + private Button containersCheckbox; + private Button iacCheckbox; + private Combo containersToolCombo; + private Label mcpStatusLabel; + + public static final String DEVASSIST_PLUGIN_REALTIME_SCANNERS_OSS_TITLE= "Checkmarx Developer Assist Open Source Realtime Scanner (OSS-Realtime): Activate OSS-Realtime"; + public static final String DEVASSIST_PLUGIN_REALTIME_SCANNERS_SECRETS_TITLE="Checkmarx Developer Assist Secret Detection Realtime Scanner: Activate Secret Detection Realtime"; + public static final String DEVASSIST_PLUGIN_REALTIME_SCANNERS_CONTAINERS_TITLE= "Checkmarx Developer Assist Containers Realtime Scanner: Activate Containers Realtime"; + public static final String DEVASSIST_PLUGIN_REALTIME_SCANNERS_IAC_TITLE= "Checkmarx Developer Assist IAC Realtime Scanner: Activate IAC Realtime"; + public static final String DEVASSIST_PLUGIN_REALTIME_SCANNERS_ASCA_TITLE= "Checkmarx Developer Assist AI Secure Coding Assistant (ASCA): Activate ASCA"; + public static final String DEVASSIST_PLUGIN_REALTIME_SCANNERS_IAC_PREFIX= "Checkmarx Developer Assist IAC Realtime Scanner: Containers Management Tool"; + public static final String DEVASSIST_PLUGIN_WELCOME_TITLE= "Welcome to Checkmarx Developer Assist"; + public static final String CONTAINERS_TOOL_DESCRIPTION="Select the Containers Management Tool to use for IaC scanning."; + + public CheckmarxPreferencePage() { + super(); + // Pass the Bundle-SymbolicName of the plugin storing the preferences + IPreferenceStore store = new ScopedPreferenceStore( + InstanceScope.INSTANCE, + "com.checkmarx.eclipse.plugin" // Replace with exact Bundle-SymbolicName from MANIFEST.MF + ); + setPreferenceStore(store); + } + + @Override + protected Control createContents(Composite parent) { + Composite mainPanel = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(1, false); + layout.verticalSpacing = 8; + layout.horizontalSpacing = 0; + mainPanel.setLayout(layout); + mainPanel.setLayoutData(new GridData(GridData.FILL_BOTH)); + + // Assist Message Label (Hidden by default, red text) + assistMessageLabel = new Label(mainPanel, SWT.NONE); + assistMessageLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_RED)); + GridData msgData = new GridData(GridData.FILL_HORIZONTAL); + msgData.exclude = true; // Equivalent to hidemode 3 + assistMessageLabel.setLayoutData(msgData); + assistMessageLabel.setVisible(false); + + // --- ASCA Section --- + createSectionHeader(mainPanel, DEVASSIST_PLUGIN_REALTIME_SCANNERS_ASCA_TITLE); + Composite ascaComp = createIndentComposite(mainPanel); + ascaCheckbox = new Button(ascaComp, SWT.CHECK); + ascaCheckbox.setText("Enable ASCA Scanner"); + + // --- OSS Section --- + createSectionHeader(mainPanel, DEVASSIST_PLUGIN_REALTIME_SCANNERS_OSS_TITLE); + Composite ossComp = createIndentComposite(mainPanel); + ossCheckbox = new Button(ossComp, SWT.CHECK); + ossCheckbox.setText("Enable OSS Scanner"); + + // --- Secrets Section --- + createSectionHeader(mainPanel, DEVASSIST_PLUGIN_REALTIME_SCANNERS_SECRETS_TITLE); + Composite secretsComp = createIndentComposite(mainPanel); + secretsCheckbox = new Button(secretsComp, SWT.CHECK); + secretsCheckbox.setText("Enable Secrets Scanner"); + + // --- Containers Section --- + createSectionHeader(mainPanel, DEVASSIST_PLUGIN_REALTIME_SCANNERS_CONTAINERS_TITLE); + Composite containersComp = createIndentComposite(mainPanel); + containersCheckbox = new Button(containersComp, SWT.CHECK); + containersCheckbox.setText("Enable Container Scanner"); + + // --- IaC Section --- + createSectionHeader(mainPanel, DEVASSIST_PLUGIN_REALTIME_SCANNERS_IAC_TITLE); + Composite iacComp = createIndentComposite(mainPanel); + iacCheckbox = new Button(iacComp, SWT.CHECK); + iacCheckbox.setText("Enable IaC Scanner"); + + // --- Container Tool Selection Section --- + createSectionHeader(mainPanel, DEVASSIST_PLUGIN_REALTIME_SCANNERS_IAC_PREFIX); + Composite containerToolComp = createIndentComposite(mainPanel); + Label containerDesc = new Label(containerToolComp, SWT.WRAP); + containerDesc.setText(CONTAINERS_TOOL_DESCRIPTION); + GridData descData = new GridData(GridData.FILL_HORIZONTAL); + containerDesc.setLayoutData(descData); + + containersToolCombo = new Combo(containerToolComp, SWT.READ_ONLY); + containersToolCombo.setItems(new String[] { "docker", "podman"}); + containersToolCombo.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); + + loadValues(); + return mainPanel; + } + + private Composite createIndentComposite(Composite parent) { + Composite comp = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(1, false); + layout.marginLeft = 15; + layout.marginTop = 0; + comp.setLayout(layout); + comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + return comp; + } + + private void loadValues() { + IPreferenceStore store = getPreferenceStore(); + ascaCheckbox.setSelection(store.getBoolean(PREF_ASCA_ENABLED)); + ossCheckbox.setSelection(store.getBoolean(PREF_OSS_ENABLED)); + secretsCheckbox.setSelection(store.getBoolean(PREF_SECRETS_ENABLED)); + containersCheckbox.setSelection(store.getBoolean(PREF_CONTAINERS_ENABLED)); + iacCheckbox.setSelection(store.getBoolean(PREF_IAC_ENABLED)); + + String tool = store.getString(PREF_CONTAINERS_TOOL); + if (tool != null && !tool.isBlank()) { + containersToolCombo.setText(tool); + } else if (containersToolCombo.getItemCount() > 0) { + containersToolCombo.select(0); + } + } + + @Override + protected void performDefaults() { + IPreferenceStore store = getPreferenceStore(); + ascaCheckbox.setSelection(store.getDefaultBoolean(PREF_ASCA_ENABLED)); + ossCheckbox.setSelection(store.getDefaultBoolean(PREF_OSS_ENABLED)); + secretsCheckbox.setSelection(store.getDefaultBoolean(PREF_SECRETS_ENABLED)); + containersCheckbox.setSelection(store.getDefaultBoolean(PREF_CONTAINERS_ENABLED)); + iacCheckbox.setSelection(store.getDefaultBoolean(PREF_IAC_ENABLED)); + super.performDefaults(); + } + + /** + * Helper to create a titled section with a horizontal line separator. + */ + private void createSectionHeader(Composite parent, String titleText) { + Composite headerComp = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + layout.marginWidth = 0; + layout.marginTop = 6; + layout.marginBottom = 0; + headerComp.setLayout(layout); + headerComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + int colonIndex = titleText.indexOf(":"); + + StyledText title = new StyledText(headerComp, SWT.READ_ONLY | SWT.WRAP); + title.setText(titleText); + title.setBackground(headerComp.getBackground()); // Match background color + title.setCaret(null); // Hide text cursor + + if (colonIndex != -1 && colonIndex + 1 < titleText.length()) { + int start = colonIndex + 1; // Start right after the colon + int length = titleText.length() - start; + + StyleRange boldStyle = new StyleRange(); + boldStyle.start = start; + boldStyle.length = length; + boldStyle.fontStyle = SWT.BOLD; + + title.setStyleRange(boldStyle); + + } + } + + @Override + public void init(IWorkbench workbench) { + // Initialization if needed + } + + @Override + public boolean performOk() { + // Save current UI control state into PreferenceStore + IPreferenceStore store = getPreferenceStore(); + store.setValue(PREF_ASCA_ENABLED, ascaCheckbox.getSelection()); + store.setValue(PREF_OSS_ENABLED, ossCheckbox.getSelection()); + store.setValue(PREF_SECRETS_ENABLED, secretsCheckbox.getSelection()); + store.setValue(PREF_CONTAINERS_ENABLED, containersCheckbox.getSelection()); + store.setValue(PREF_IAC_ENABLED, iacCheckbox.getSelection()); + + if (containersToolCombo.getText() != null) { + store.setValue(PREF_CONTAINERS_TOOL, containersToolCombo.getText()); + } + + // Trigger change event for listeners + store.firePropertyChangeEvent("scannerPreferencesChanged", null, null); + + return super.performOk(); + } + +} diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/AuthButtonFieldEditor.java b/common-lib/src/com/checkmarx/eclipse/common/properties/AuthButtonFieldEditor.java similarity index 91% rename from checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/AuthButtonFieldEditor.java rename to common-lib/src/com/checkmarx/eclipse/common/properties/AuthButtonFieldEditor.java index 9c680065..48dacf3f 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/AuthButtonFieldEditor.java +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/AuthButtonFieldEditor.java @@ -1,4 +1,4 @@ -package com.checkmarx.eclipse.properties; +package com.checkmarx.eclipse.common.properties; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -9,9 +9,9 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; -import com.checkmarx.eclipse.runner.Authenticator; +import com.checkmarx.eclipse.common.runner.Authenticator; import com.checkmarx.eclipse.common.utils.CxLogger; -import com.checkmarx.eclipse.utils.PluginConstants; +import com.checkmarx.eclipse.common.utils.PluginConstants; public class AuthButtonFieldEditor extends StringButtonFieldEditor { diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/CxPreferencesDialogSizing.java b/common-lib/src/com/checkmarx/eclipse/common/properties/CxPreferencesDialogSizing.java new file mode 100644 index 00000000..ffec5f7d --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/CxPreferencesDialogSizing.java @@ -0,0 +1,50 @@ +package com.checkmarx.eclipse.common.properties; + +import org.eclipse.jface.preference.PreferenceDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Shell; + +import com.checkmarx.eclipse.common.preferences.CheckmarxPreferencePage; + + +/** + * Eclipse's shared Window > Preferences dialog (WorkbenchPreferenceDialog) remembers + * its shell size across sessions. Once that remembered size is smaller than what this + * plugin's own pages need, they get clipped behind an inner scrollbar on every later + * reopen, no matter how much content they actually have. + * + * Rather than changing that shared dialog's sizing/resizing behaviour - which would + * also affect every other plugin's preference pages - this only grows the dialog + * (never shrinks it) while one of this plugin's own pages is the one actually being + * shown, right when it's first shown and again on every later switch back to it. + */ +public final class CxPreferencesDialogSizing { + + private CxPreferencesDialogSizing() { + } + + public static void applyTo(PreferenceDialog dialog) { + growIfOwnPage(dialog, dialog.getSelectedPage()); + dialog.addPageChangedListener(event -> growIfOwnPage(dialog, event.getSelectedPage())); + } + + private static void growIfOwnPage(PreferenceDialog dialog, Object page) { + if (!(page instanceof PreferencesPage) && !(page instanceof CheckmarxPreferencePage)) { + return; + } + + Shell shell = dialog.getShell(); + if (shell == null || shell.isDisposed()) { + return; + } + + Point required = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); + Point current = shell.getSize(); + int width = Math.max(required.x, current.x); + int height = Math.max(required.y, current.y); + if (width != current.x || height != current.y) { + shell.setSize(width, height); + } + } +} diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/LabelFieldEditor.java b/common-lib/src/com/checkmarx/eclipse/common/properties/LabelFieldEditor.java similarity index 96% rename from checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/LabelFieldEditor.java rename to common-lib/src/com/checkmarx/eclipse/common/properties/LabelFieldEditor.java index 7330a99d..40d9218b 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/properties/LabelFieldEditor.java +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/LabelFieldEditor.java @@ -1,4 +1,4 @@ -package com.checkmarx.eclipse.properties; +package com.checkmarx.eclipse.common.properties; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.swt.layout.GridData; diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java b/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java new file mode 100644 index 00000000..94cf7525 --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java @@ -0,0 +1,51 @@ +package com.checkmarx.eclipse.common.properties; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.ui.preferences.ScopedPreferenceStore; + +public class Preferences { + + public static final String QUALIFIER = "com.checkmarx.eclipse"; + public static final String API_KEY = "apiKey"; + public static final String ADDITIONAL_OPTIONS = "additionalOptions"; + + // Tracks whether the currently-stored API_KEY has actually been confirmed against + // the server (Authenticator.doAuthentication succeeded)... + public static final String CREDENTIALS_VALIDATED = "credentialsValidated"; + + public static final ScopedPreferenceStore STORE = new ScopedPreferenceStore(InstanceScope.INSTANCE, QUALIFIER); + + private Preferences() { + } + + public static String getPref(String key) { + return Platform.getPreferencesService().getString(Preferences.QUALIFIER, key, null, null); + } + + public static String getApiKey() { + return getPref(API_KEY); + } + + public static String getAdditionalOptions() { + return getPref(ADDITIONAL_OPTIONS); + } + + public static void store(String key, String value) { + // Replaced Activator call with the ScopedPreferenceStore instance + STORE.setValue(key, value); + } + + public static void clearApiKey() { + STORE.setValue(API_KEY, ""); + STORE.setValue(CREDENTIALS_VALIDATED, false); + } + + public static boolean isCredentialsValidated() { + return STORE.getBoolean(CREDENTIALS_VALIDATED); + } + + public static void setCredentialsValidated(boolean validated) { + STORE.setValue(CREDENTIALS_VALIDATED, validated); + } +} \ No newline at end of file diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java b/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java new file mode 100644 index 00000000..bf483119 --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java @@ -0,0 +1,357 @@ +package com.checkmarx.eclipse.common.properties; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.concurrent.CompletableFuture; + +import org.eclipse.jface.preference.FieldEditor; +import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.jface.preference.PreferenceDialog; +import org.eclipse.jface.preference.StringFieldEditor; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Link; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.browser.IWorkbenchBrowserSupport; +import org.eclipse.ui.dialogs.PreferencesUtil; + +import com.checkmarx.eclipse.common.utils.PluginConstants; +import com.checkmarx.eclipse.devassist.backend.listener.ProjectLifecycleListener; +import com.checkmarx.eclipse.devassist.configuration.McpInstallService; +import com.checkmarx.eclipse.runner.Authenticator; +import com.checkmarx.eclipse.common.runner.TenantSettingsProvider; +import com.checkmarx.eclipse.startup.PluginStartup; +import com.checkmarx.eclipse.utils.PluginUtils; +import com.checkmarx.eclipse.utils.common.CxLogger; +import com.checkmarx.eclipse.views.ui.WelcomeDialog; + +public class PreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { + + // Captured once the fields are loaded, so performOk() can tell whether THIS + // page's own settings actually changed. Needed because Eclipse's shared + // Preferences dialog calls performOk() on every page the user visited during + // the session - not just the one they edited - so simply opening/looking at + // "Checkmarx One" while really only changing "Checkmarx Scanner Configuration" + // (Realtime Scanners) would otherwise still unconditionally fire + // TOPIC_APPLY_SETTINGS below and refresh the unrelated Checkmarx One scan view. + private StringFieldEditor apiKeyField; + private StringFieldEditor additionalParamsField; + private String initialApiKey; + private String initialAdditionalOptions; + + public PreferencesPage() { + super(GRID); + // Replaced Activator preference store listener with Preferences.STORE + Preferences.STORE.addPropertyChangeListener(this::handlePropertyChange); + } + + private void handlePropertyChange(PropertyChangeEvent event) { + + } + + @Override + public void init(IWorkbench workbench) { + setPreferenceStore(Preferences.STORE); + setMessage("Checkmarx One preferences"); + } + + @Override + protected void createFieldEditors() { + Composite topComposite = new Composite(getFieldEditorParent(), SWT.NONE); + GridData topGridData = new GridData(); + topGridData.horizontalAlignment = GridData.FILL; + topGridData.verticalAlignment = GridData.FILL; + topGridData.grabExcessHorizontalSpace = true; + topComposite.setLayoutData(topGridData); + + getFieldEditorParent().setLayoutData(topGridData); + + GridLayout parentLayout = new GridLayout(); + parentLayout.numColumns = 1; + parentLayout.horizontalSpacing = 0; + parentLayout.verticalSpacing = 0; + parentLayout.marginHeight = 0; + parentLayout.marginWidth = 0; + topComposite.setLayout(parentLayout); + + StringFieldEditor apiKey = new StringFieldEditor(Preferences.API_KEY, PluginConstants.PREFERENCES_API_KEY, topComposite); + apiKeyField = apiKey; + addField(apiKey); + Text textControl = apiKey.getTextControl(topComposite); + textControl.setEchoChar('*'); + + StringFieldEditor additionalParams = new StringFieldEditor(Preferences.ADDITIONAL_OPTIONS, + PluginConstants.PREFERENCES_ADDITIONAL_OPTIONS, StringFieldEditor.UNLIMITED, StringFieldEditor.VALIDATE_ON_KEY_STROKE, topComposite); + additionalParamsField = additionalParams; + addField(additionalParams); + + // Baseline for the change-detection guard in performOk() - captured now that + // both fields have loaded their values from the preference store. + initialApiKey = apiKey.getStringValue(); + initialAdditionalOptions = additionalParams.getStringValue(); + + //set the width for API Key text field + GridData gridData = new GridData(SWT.BEGINNING, SWT.CENTER, true, false); + gridData.widthHint = 500; // Some width + gridData.grabExcessHorizontalSpace = false; + gridData.horizontalAlignment = GridData.FILL; + textControl.setLayoutData(gridData); + + addField(space()); + + + Link cliHelp = new Link(getFieldEditorParent(), SWT.NONE); + cliHelp.setText("CLI command that supports a set of global flags"); + cliHelp.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false)); + GridData linkGridData = new GridData(SWT.END, SWT.CENTER, true, false); + cliHelp.setLayoutData(linkGridData); + cliHelp.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport(); + try { + browserSupport.getExternalBrowser().openURL(new URL(e.text)); + } catch (PartInitException | MalformedURLException e1) { + CxLogger.error("Failed to open CLI help documentation link.", e1); + e1.printStackTrace(); + } + } + }); + + addField(space()); + + Label connectionLabel = new Label(getFieldEditorParent(), SWT.WRAP); + connectionLabel.setLayoutData( + new GridData(SWT.FILL, SWT.CENTER, true, false) + ); + + // Holds the Logout button reference so the Connect handler (defined before the + // Logout button is created below) can disable/enable it during the connect flow. + final Button[] logoutButtonHolder = new Button[1]; + + Button connectionButton = new Button(topComposite, SWT.PUSH); + connectionButton.setText(PluginConstants.PREFERENCES_TEST_CONNECTION); + connectionButton.setEnabled(!apiKey.getStringValue().trim().isEmpty()); + textControl.addModifyListener(e -> { + connectionButton.setEnabled(!textControl.getText().trim().isEmpty()); + + // Any edit means whatever gets saved next (even via Apply/OK without ever + // clicking Test Connection) hasn't been checked against the server, so it must + // not keep looking "connected" on the strength of a previous, different key's + // validation. + Preferences.setCredentialsValidated(false); + }); + connectionButton.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent e) { + + String apiKey_str = apiKey.getStringValue(); + + String additionalParams_str = additionalParams.getStringValue(); + connectionButton.setEnabled(false); + connectionLabel.setText(PluginConstants.PREFERENCES_VALIDATING_STATE); + getFieldEditorParent().layout(); + + // Disable Logout for the duration of the connect/validate flow so a user can't + // interrupt it mid-flight (e.g. closing the dialog or logging out) in a way that + // leaves the flow half-finished and the welcome dialog never shown. + if (logoutButtonHolder[0] != null && !logoutButtonHolder[0].isDisposed()) { + logoutButtonHolder[0].setEnabled(false); + } + + CompletableFuture.supplyAsync(() -> { + try { + return Authenticator.INSTANCE.doAuthentication( + apiKey_str, additionalParams_str); + } catch (Throwable t) { + CxLogger.error(PluginConstants.ERROR_AUTHENTICATING_AST, new Exception(t)); + return t.getMessage(); + } + }).thenAccept((result) -> Display.getDefault().syncExec(() -> { + // Guard every widget touch below: if the preferences dialog was closed + // while this connect/validate call was in flight, these are disposed. + // Previously an unguarded call here threw and aborted this whole runnable, + // which is why the welcome dialog never appeared after closing the dialog. + if (!connectionButton.isDisposed()) { + connectionButton.setEnabled(true); + } + + // Show welcome dialog on successful authentication. The "Validating..." + // message is left on screen (not switched to "Connected") until the + // welcome dialog is actually about to appear, so the label never claims + // success before the user sees the welcome page. + if (result != null && result.contains(PluginConstants.AUTH_SUCCESS_PATTERN)) { + // Trigger MCP auto-installation after successful authentication + CxLogger.info("[PREFS] Authentication successful, triggering MCP auto-install..."); + McpInstallService.attemptAutoInstall(apiKey_str, additionalParams_str); + + // Fetch MCP enabled status from server asynchronously + CompletableFuture.supplyAsync(() -> { + try { + return TenantSettingsProvider.INSTANCE.isAiMcpServerEnabled( + apiKey_str, additionalParams_str); + } catch (Exception ex) { + CxLogger.error("Failed to fetch MCP status", ex); + return false; + } + }).thenAccept((mcpEnabled) -> Display.getDefault().syncExec(() -> { + if (!connectionLabel.isDisposed()) { + connectionLabel.setText(mapAuthResult(result)); + } + if (!getFieldEditorParent().isDisposed()) { + getFieldEditorParent().layout(); + } + showWelcomeDialog(mcpEnabled, logoutButtonHolder[0], apiKey_str, additionalParams_str); + })); + } else { + // Authentication failed - the flow ends here with no welcome dialog, + // so show the failure message right away and restore Logout. + if (!connectionLabel.isDisposed()) { + connectionLabel.setText(mapAuthResult(result)); + } + if (!getFieldEditorParent().isDisposed()) { + getFieldEditorParent().layout(); + } + if (logoutButtonHolder[0] != null && !logoutButtonHolder[0].isDisposed()) { + logoutButtonHolder[0].setEnabled(true); + } + } + })); + } + }); + + addField(space()); + + Button logoutButton = new Button(topComposite, SWT.PUSH); + logoutButtonHolder[0] = logoutButton; + logoutButton.setText("Logout"); + logoutButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + Preferences.clearApiKey(); + apiKey.setStringValue(""); +// textControl.setText(""); +// connectionLabel.setText(""); + getFieldEditorParent().layout(); + + // Redraws the missing-credentials panel in CheckmarxView/CxFindingsView right + // away. Without this, they only learn credentials are gone once performOk() + // runs (i.e. the user clicks OK/Apply) - if they instead Cancel or just close + // the dialog after Logout, both views kept showing stale "connected" content. + PluginUtils.getEventBroker().post(PluginConstants.TOPIC_APPLY_SETTINGS, PluginConstants.EMPTY_STRING); + } + }); + + addField(space()); + + Link realtimeScannersLink = new Link(getFieldEditorParent(), SWT.NONE); + realtimeScannersLink.setText("Go to Realtime Scanners"); + realtimeScannersLink.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false)); + realtimeScannersLink.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn( + getShell(), + "com.checkmarx.eclipse.devassist.prefs.checkmarxpreferencepage", + null, + null + ); + if (dialog != null) { + CxPreferencesDialogSizing.applyTo(dialog); + dialog.open(); + } + } + }); + } + + private static String mapAuthResult(String result) { + if (result != null && result.contains(PluginConstants.AUTH_SUCCESS_PATTERN)) { + return PluginConstants.AUTH_SUCCESS_DISPLAY; + } + return result; + } + + private void showWelcomeDialog(boolean mcpEnabled, Button logoutButton, String apiKey_str, String additionalParams_str) { + try { + // The key was only just validated by "Test Connection" - it isn't persisted + // to the store until the user clicks OK/Apply on this dialog, which they may + // never do once they see the Welcome page. Persist it now so + // isUserAuthenticated() (checked by ProjectLifecycleListener below, and by + // anything else gated on login) actually sees it. + Preferences.STORE.setValue(Preferences.API_KEY, apiKey_str); + Preferences.STORE.setValue(Preferences.ADDITIONAL_OPTIONS, additionalParams_str); + Preferences.setCredentialsValidated(true); + + // Trigger the same initial OSS/IaC/container workspace scan that runs for + // already-open projects at plugin launch (PluginStartup.initializeBackendScanners()). + // A project that was already open before this login never gets that scan + // otherwise, since ProjectLifecycleListener only scans a project when it + // *opens* while the user is authenticated - re-run it now that login succeeded. + ProjectLifecycleListener projectListener = PluginStartup.getProjectListener(); + if (projectListener != null) { + CxLogger.info("[PREFS] Login succeeded - triggering workspace OSS/IaC/container scan..."); + projectListener.scanAlreadyOpenProjects(); + } + + WelcomeDialog dlg = new WelcomeDialog( + Display.getDefault().getActiveShell(), + mcpEnabled); + + // Re-enable Logout right as the welcome dialog is about to appear, so it stays + // disabled for the entire connect/validate flow and only becomes usable once + // that flow has visibly completed. + if (logoutButton != null && !logoutButton.isDisposed()) { + logoutButton.setEnabled(true); + } + + dlg.open(); + } catch (Exception ex) { + CxLogger.error("Failed to show welcome dialog", ex); + if (logoutButton != null && !logoutButton.isDisposed()) { + logoutButton.setEnabled(true); + } + } + } + + private FieldEditor space() { + return new LabelFieldEditor("", getFieldEditorParent()); + } + + @Override + public boolean performOk() { + boolean ok = super.performOk(); + + if (ok) { + // Only notify listeners (e.g. the Checkmarx One scan view refresh) if this + // page's own settings actually changed in this session. Without this guard, + // merely having visited this page in the same Preferences dialog session as + // the unrelated "Checkmarx Scanner Configuration" (Realtime Scanners) page - + // a sibling top-level page in the same tree - is enough for Eclipse to call + // this performOk() too when the user only meant to save realtime scanner + // settings, spuriously refreshing the Checkmarx One scan window. + String currentApiKey = apiKeyField != null ? apiKeyField.getStringValue() : null; + String currentAdditionalOptions = additionalParamsField != null ? additionalParamsField.getStringValue() : null; + boolean settingsActuallyChanged = + !java.util.Objects.equals(currentApiKey, initialApiKey) + || !java.util.Objects.equals(currentAdditionalOptions, initialAdditionalOptions); + + if (settingsActuallyChanged) { + PluginUtils.getEventBroker().post(PluginConstants.TOPIC_APPLY_SETTINGS, PluginConstants.EMPTY_STRING); + } + } + + return ok; + } +} \ No newline at end of file diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/SharedPreferences.java b/common-lib/src/com/checkmarx/eclipse/common/properties/SharedPreferences.java deleted file mode 100644 index d928e87e..00000000 --- a/common-lib/src/com/checkmarx/eclipse/common/properties/SharedPreferences.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.checkmarx.eclipse.common.properties; - -import org.eclipse.core.runtime.Platform; - -/** - * Read-only access to the Checkmarx preference store, for bundles that only - * need to read values (never store them). The store itself is owned by the - * main plugin's Activator; reads go through the platform preferences - * service, which is not bundle-specific. - */ -public class SharedPreferences { - - public static final String QUALIFIER = "com.checkmarx.eclipse"; - public static final String API_KEY = "apiKey"; - public static final String ADDITIONAL_OPTIONS = "additionalOptions"; - - private SharedPreferences() { - } - - public static String getPref(String key) { - return Platform.getPreferencesService().getString(QUALIFIER, key, null, null); - } - - public static String getApiKey() { - return getPref(API_KEY); - } - - public static String getAdditionalOptions() { - return getPref(ADDITIONAL_OPTIONS); - } -} diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/runner/Authenticator.java b/common-lib/src/com/checkmarx/eclipse/common/runner/Authenticator.java similarity index 93% rename from checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/runner/Authenticator.java rename to common-lib/src/com/checkmarx/eclipse/common/runner/Authenticator.java index 4311f7ad..61c497ce 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/runner/Authenticator.java +++ b/common-lib/src/com/checkmarx/eclipse/common/runner/Authenticator.java @@ -1,4 +1,4 @@ -package com.checkmarx.eclipse.runner; +package com.checkmarx.eclipse.common.runner; import java.io.IOException; import org.slf4j.Logger; @@ -8,7 +8,7 @@ import com.checkmarx.ast.wrapper.CxException; import com.checkmarx.ast.wrapper.CxWrapper; import com.checkmarx.eclipse.common.utils.CxLogger; -import com.checkmarx.eclipse.utils.PluginConstants; +import com.checkmarx.eclipse.common.utils.PluginConstants; public class Authenticator { private final Logger log; diff --git a/common-lib/src/com/checkmarx/eclipse/common/runner/TenantSettingsProvider.java b/common-lib/src/com/checkmarx/eclipse/common/runner/TenantSettingsProvider.java new file mode 100644 index 00000000..f4ed02e8 --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/runner/TenantSettingsProvider.java @@ -0,0 +1,52 @@ +package com.checkmarx.eclipse.common.runner; + +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.checkmarx.ast.wrapper.CxConfig; +import com.checkmarx.ast.wrapper.CxException; +import com.checkmarx.ast.wrapper.CxWrapper; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Provides tenant-specific settings from the Checkmarx API. + * Fetches configuration details like MCP enablement status. + */ +public class TenantSettingsProvider { + private static final Logger log = LoggerFactory.getLogger(TenantSettingsProvider.class); + public static final TenantSettingsProvider INSTANCE = new TenantSettingsProvider(); + + private TenantSettingsProvider() { + } + + /** + * Check if AI MCP (Checkmarx One Assist) is enabled for the current tenant + * + * @param apiKey API key for authentication + * @param additionalParams Additional parameters for the CxWrapper + * @return true if MCP is enabled, false otherwise + */ + public boolean isAiMcpServerEnabled(String apiKey, String additionalParams) { + if (apiKey == null || apiKey.trim().isEmpty()) { + return false; + } + + try { + CxConfig config = CxConfig.builder() + .apiKey(apiKey) + .additionalParameters(additionalParams) + .build(); + + CxWrapper wrapper = new CxWrapper(config, log); + boolean mcpEnabled = wrapper.aiMcpServerEnabled(); + CxLogger.info(String.format("MCP Server Status: %s", mcpEnabled ? "ENABLED" : "DISABLED")); + return mcpEnabled; + } catch (IOException | InterruptedException | CxException e) { + CxLogger.error("Failed to check MCP server status: " + e.getMessage(), e); + // Default to false on error to be conservative + return false; + } + } +} diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginConstants.java b/common-lib/src/com/checkmarx/eclipse/common/utils/PluginConstants.java similarity index 99% rename from checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginConstants.java rename to common-lib/src/com/checkmarx/eclipse/common/utils/PluginConstants.java index f39bc5bc..d36f3756 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/utils/PluginConstants.java +++ b/common-lib/src/com/checkmarx/eclipse/common/utils/PluginConstants.java @@ -1,4 +1,4 @@ -package com.checkmarx.eclipse.utils; +package com.checkmarx.eclipse.common.utils; public class PluginConstants { public static final String EMPTY_STRING = ""; diff --git a/devassist-lib/.settings/org.eclipse.core.resources.prefs b/devassist-lib/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/devassist-lib/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/devassist-lib/META-INF/MANIFEST.MF b/devassist-lib/META-INF/MANIFEST.MF index 09d88bdb..69adbe38 100644 --- a/devassist-lib/META-INF/MANIFEST.MF +++ b/devassist-lib/META-INF/MANIFEST.MF @@ -30,4 +30,4 @@ Require-Bundle: com.checkmarx.eclipse.common, Import-Package: org.osgi.service.event;version="1.4.1" Export-Package: com.checkmarx.eclipse.devassist.backend, com.checkmarx.eclipse.devassist.backend.listener, - com.checkmarx.eclipse.devassist.ui.findings.realtime \ No newline at end of file + com.checkmarx.eclipse.devassist.ui.findings.realtime diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java index 3dec907e..5c43d90e 100644 --- a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java @@ -152,7 +152,7 @@ private void onProjectOpen(IProject project) { } private boolean isUserAuthenticated() { - String apiKey = com.checkmarx.eclipse.common.properties.SharedPreferences.getApiKey(); + String apiKey = com.checkmarx.eclipse.common.properties.Preferences.getApiKey(); return apiKey != null && !apiKey.trim().isEmpty(); } diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java new file mode 100644 index 00000000..8b520696 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java @@ -0,0 +1,157 @@ +package com.checkmarx.eclipse.devassist.configuration; + +import java.util.concurrent.CompletableFuture; + +import com.checkmarx.eclipse.common.properties.Preferences; +import com.checkmarx.eclipse.common.runner.TenantSettingsProvider; +import com.checkmarx.eclipse.common.utils.CxLogger; + + +/** + * MCP Installation Service for Eclipse plugin. + * + * Responsible for: + * - Auto-installing MCP configuration on plugin startup + * - Validating authentication and MCP tenant settings + * - Asynchronous background MCP setup + * - Comprehensive logging + * + * Follows the JetBrains implementation pattern for consistency. + */ +public final class McpInstallService { + + private static final String LOG_TAG = "[MCP-INSTALL]"; + + private McpInstallService() { + // Utility class + } + + /** + * Conditionally installs MCP configuration if user is authenticated + * and MCP is enabled for their tenant. + * + * Conditions checked: + * - User is authenticated (API key configured) + * - AI MCP server flag is enabled in tenant settings + * - A credential token is available + * + * If any condition fails, installation is silently skipped. + */ + public static void attemptAutoInstall() { + CxLogger.info(LOG_TAG + " Attempting auto-install of MCP configuration..."); + + try { + String apiKey = Preferences.getApiKey(); + String additionalParams = Preferences.getAdditionalOptions(); + + if (apiKey == null || apiKey.isBlank()) { + CxLogger.info(LOG_TAG + " Skipping MCP auto-install: user not authenticated (no API key)"); + return; + } + + attemptAutoInstall(apiKey, additionalParams); + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Unexpected error during auto-install attempt: " + e.getMessage(), e); + } + } + + /** + * Conditionally installs MCP configuration with provided credentials. + * + * Used when API key is freshly authenticated but not yet persisted to preferences. + * Same conditions as attemptAutoInstall() but accepts credentials as parameters. + * + * @param apiKey API key from authentication (may not be persisted yet) + * @param additionalParams Additional params for Checkmarx API + */ + public static void attemptAutoInstall(String apiKey, String additionalParams) { + CxLogger.info(LOG_TAG + " Attempting auto-install of MCP configuration..."); + + try { + if (apiKey == null || apiKey.isBlank()) { + CxLogger.info(LOG_TAG + " Skipping MCP auto-install: user not authenticated (no API key)"); + return; + } + + CxLogger.info(LOG_TAG + " User is authenticated, checking MCP server flag..."); + + // Check if MCP is enabled for tenant + boolean aiMcpEnabled; + try { + aiMcpEnabled = TenantSettingsProvider.INSTANCE.isAiMcpServerEnabled(apiKey, additionalParams); + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to check MCP server status, skipping: " + e.getMessage()); + return; + } + + if (!aiMcpEnabled) { + CxLogger.info(LOG_TAG + " Skipping MCP auto-install: AI MCP server disabled for tenant"); + return; + } + + CxLogger.info(LOG_TAG + " ✓ All conditions met, installing MCP asynchronously..."); + + // Install in background without blocking + installSilentlyAsync(apiKey); + + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Unexpected error during auto-install attempt: " + e.getMessage(), e); + } +} + + /** + * Asynchronously installs MCP configuration without user notifications. + * Failures are logged but do not interrupt plugin startup. + * + * @param credential API key for Copilot MCP Authorization header + * @return future resolving to Boolean (true=changed, false=unchanged, null=error) + */ + public static CompletableFuture installSilentlyAsync(String credential) { + if (credential == null || credential.isBlank()) { + CxLogger.info(LOG_TAG + " Cannot install: credential is null or empty"); + return CompletableFuture.completedFuture(false); + } + + return CompletableFuture.supplyAsync(() -> { + try { + CxLogger.info(LOG_TAG + " Background thread started, installing MCP..."); + boolean changed = McpSettingsInjector.installForCopilot(credential); + + if (changed) { + CxLogger.info(LOG_TAG + " ✓ MCP installation completed successfully (config modified)"); + } else { + CxLogger.info(LOG_TAG + " MCP installation completed (config unchanged)"); + } + + return changed; + } catch (Exception ex) { + CxLogger.error(LOG_TAG + " Background MCP installation failed: " + ex.getMessage(), ex); + return null; // null signals failure + } + }); + } + + /** + * Uninstalls MCP configuration. Called during plugin cleanup. + * + * @return true if MCP entry was removed, false if not found + */ + public static boolean uninstall() { + CxLogger.info(LOG_TAG + " Uninstalling MCP configuration..."); + + try { + boolean removed = McpSettingsInjector.uninstallFromCopilot(); + + if (removed) { + CxLogger.info(LOG_TAG + " ✓ MCP configuration uninstalled successfully"); + } else { + CxLogger.info(LOG_TAG + " No MCP configuration found to uninstall"); + } + + return removed; + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Failed to uninstall MCP: " + e.getMessage(), e); + return false; + } + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpSettingsInjector.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpSettingsInjector.java new file mode 100644 index 00000000..c80d75b4 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpSettingsInjector.java @@ -0,0 +1,352 @@ +package com.checkmarx.eclipse.devassist.configuration; + +import java.io.IOException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Base64; +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +import com.checkmarx.eclipse.utils.CxLogger; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Injects Checkmarx MCP server configuration into GitHub Copilot's MCP settings file. + * + * Responsible for: + * - Reading/writing the Copilot MCP config file (~/github-copilot/intellij/mcp.json) + * - Merging/removing Checkmarx MCP server entry + * - Token validation and URL derivation + * - Logging all operations with aggressive debug info + */ +public final class McpSettingsInjector { + + private static final String LOG_TAG = "[MCP-INJECTOR]"; + private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final String FALLBACK_BASE = "https://ast-master-components.dev.cxast.net"; + private static final String SERVER_KEY = "checkmarx-mcp"; + + private McpSettingsInjector() { + // Utility class + } + + /** + * Installs/updates Checkmarx MCP configuration for Copilot. + * + * @param token API key or JWT token with issuer claim + * @return true if config was modified, false if already up-to-date + * @throws Exception if installation fails + */ + public static boolean installForCopilot(String token) throws Exception { + CxLogger.info(LOG_TAG + " Starting MCP installation for Copilot..."); + + if (token == null || token.isBlank()) { + CxLogger.warning(LOG_TAG + " Cannot install MCP: token is null or empty"); + return false; + } + + try { + String issuer = tryExtractIssuer(token); + CxLogger.info(LOG_TAG + " Token issuer extracted: " + (issuer != null ? issuer : "null (using fallback)")); + + String baseUrl = deriveBaseUrlFromIssuer(issuer); + CxLogger.info(LOG_TAG + " Derived base URL: " + baseUrl); + + String mcpUrl = baseUrl + "/api/security-mcp/mcp"; + CxLogger.info(LOG_TAG + " MCP URL: " + mcpUrl); + + Path cfg = resolveCopilotMcpConfigPath(); + CxLogger.info(LOG_TAG + " Copilot MCP config path: " + cfg.toAbsolutePath()); + + boolean changed = mergeCheckmarxServer(cfg, mcpUrl, token); + + if (changed) { + CxLogger.info(LOG_TAG + " ✓ MCP configuration installed/updated successfully"); + } else { + CxLogger.info(LOG_TAG + " MCP configuration unchanged (already up-to-date)"); + } + + return changed; + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Failed to install MCP configuration: " + e.getMessage(), e); + throw e; + } + } + + /** + * Uninstalls Checkmarx MCP server entry from Copilot configuration. + * + * @return true if entry was removed, false if not found + * @throws Exception if uninstallation fails + */ + public static boolean uninstallFromCopilot() throws Exception { + CxLogger.info(LOG_TAG + " Starting MCP uninstallation..."); + + try { + Path cfg = resolveCopilotMcpConfigPath(); + CxLogger.info(LOG_TAG + " Copilot MCP config path: " + cfg.toAbsolutePath()); + + boolean removed = removeCheckmarxServer(cfg); + + if (removed) { + CxLogger.info(LOG_TAG + " ✓ Checkmarx MCP entry removed successfully"); + } else { + CxLogger.info(LOG_TAG + " No Checkmarx MCP entry found to remove"); + } + + return removed; + } catch (Exception e) { + CxLogger.error(LOG_TAG + " Failed to uninstall MCP configuration: " + e.getMessage(), e); + throw e; + } + } + + /** + * Resolves the platform-specific Copilot MCP configuration file path. + * + * Uses Eclipse-specific subdirectory to avoid conflicts with JetBrains IDEs: + * Windows: %LOCALAPPDATA%/github-copilot/eclipse/mcp.json + * macOS/Linux: ~/.config/github-copilot/eclipse/mcp.json + */ + private static Path resolveCopilotMcpConfigPath() { + String os = System.getProperty("os.name").toLowerCase(Locale.ENGLISH); + String home = System.getProperty("user.home"); + + CxLogger.info(LOG_TAG + " Resolving MCP config path for OS: " + os); + CxLogger.info(LOG_TAG + " Using Eclipse-specific path (not JetBrains 'intellij' folder)"); + + if (os.contains("win")) { + String localAppData = System.getenv("LOCALAPPDATA"); + if (localAppData == null || localAppData.isBlank()) { + throw new IllegalStateException("%LOCALAPPDATA% environment variable not set on Windows"); + } + Path path = Paths.get(localAppData, "github-copilot", "eclipse", "mcp.json"); + CxLogger.info(LOG_TAG + " Windows config path: " + path.toAbsolutePath()); + return path; + } + + // macOS and Linux + String xdgConfig = System.getenv("XDG_CONFIG_HOME"); + if (xdgConfig != null && !xdgConfig.isBlank()) { + Path path = Paths.get(xdgConfig, "github-copilot", "eclipse", "mcp.json"); + CxLogger.info(LOG_TAG + " XDG_CONFIG_HOME path: " + path.toAbsolutePath()); + return path; + } + + // Fallback to ~/.config + Path path = Paths.get(home, ".config", "github-copilot", "eclipse", "mcp.json"); + CxLogger.info(LOG_TAG + " Fallback config path: " + path.toAbsolutePath()); + return path; + } + + /** + * Merges Checkmarx server entry into MCP config file. + * Returns true if file was modified, false if content unchanged. + */ + @SuppressWarnings("unchecked") + private static boolean mergeCheckmarxServer(Path configPath, String url, String token) throws Exception { + CxLogger.info(LOG_TAG + " Reading existing MCP config..."); + Map root = readJson(configPath); + + Map servers = (Map) root + .getOrDefault("servers", new LinkedHashMap<>()); + + Map headers = new LinkedHashMap<>(); + headers.put("cx-origin", "eclipse-plugin"); + headers.put("Authorization", token); + + Map serverEntry = new LinkedHashMap<>(); + serverEntry.put("url", url); + + Map requestInit = new LinkedHashMap<>(); + requestInit.put("headers", headers); + serverEntry.put("requestInit", requestInit); + + String mcpServerKey = SERVER_KEY; + Map existing = (Map) servers.get(mcpServerKey); + + boolean changed = !Objects.equals(existing, serverEntry); + CxLogger.info(LOG_TAG + " Config changed: " + changed); + + if (!changed) { + CxLogger.info(LOG_TAG + " Existing MCP entry matches new entry exactly"); + return false; + } + + CxLogger.info(LOG_TAG + " Updating MCP server entry in config"); + servers.put(mcpServerKey, serverEntry); + root.put("servers", servers); + + // Create parent directories and write file + Files.createDirectories(configPath.getParent()); + Files.writeString(configPath, + MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(root), + StandardCharsets.UTF_8); + + CxLogger.info(LOG_TAG + " ✓ MCP config written to: " + configPath.toAbsolutePath()); + return true; + } + + /** + * Removes Checkmarx server entry from MCP config file. + * Returns true if entry was removed, false if not found. + */ + @SuppressWarnings("unchecked") + private static boolean removeCheckmarxServer(Path configPath) throws Exception { + if (!Files.exists(configPath)) { + CxLogger.info(LOG_TAG + " Config file does not exist: " + configPath.toAbsolutePath()); + return false; + } + + CxLogger.info(LOG_TAG + " Reading MCP config for removal..."); + Map root = readJson(configPath); + Object serversObj = root.get("servers"); + + if (!(serversObj instanceof Map)) { + CxLogger.info(LOG_TAG + " 'servers' field not found or is not a map"); + return false; + } + + String mcpServerKey = SERVER_KEY; + Map servers = (Map) serversObj; + + boolean removed = servers.remove(mcpServerKey) != null; + + if (!removed) { + CxLogger.info(LOG_TAG + " Checkmarx MCP entry not found in config"); + return false; + } + + CxLogger.info(LOG_TAG + " Checkmarx MCP entry found and removed"); + root.put("servers", servers); + Files.writeString(configPath, + MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(root), + StandardCharsets.UTF_8); + + CxLogger.info(LOG_TAG + " ✓ MCP entry removed from: " + configPath.toAbsolutePath()); + return true; + } + + /** + * Reads JSON from config file, returns empty root if file doesn't exist. + */ + @SuppressWarnings("unchecked") + private static Map readJson(Path path) throws Exception { + if (!Files.exists(path)) { + CxLogger.info(LOG_TAG + " Config file does not exist, creating new"); + return emptyServersRoot(); + } + + try { + String content = stripLineComments(Files.readString(path, StandardCharsets.UTF_8)); + Map map = MAPPER.readValue(content, new TypeReference>() { + }); + if (map == null || map.isEmpty()) { + CxLogger.info(LOG_TAG + " Config file is empty or null, using empty root"); + return emptyServersRoot(); + } + CxLogger.info(LOG_TAG + " ✓ Config file read successfully"); + return map; + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to read existing config, starting fresh: " + e.getMessage()); + return emptyServersRoot(); + } + } + + /** + * Returns a new root map with empty servers. + */ + private static Map emptyServersRoot() { + Map root = new LinkedHashMap<>(); + root.put("servers", new LinkedHashMap<>()); + return root; + } + + /** + * Strips single-line comments from JSON content. + */ + private static String stripLineComments(String s) { + return s.replaceAll("(?m)^\\s*//.*$", ""); + } + + /** + * Extracts the issuer claim from a JWT token. + * Token format: header.payload.signature + * Payload is base64url encoded JSON containing "iss" claim. + */ + private static String tryExtractIssuer(String rawToken) { + if (rawToken == null || rawToken.isBlank()) { + CxLogger.info(LOG_TAG + " Token is null or empty"); + return null; + } + + try { + String[] parts = rawToken.split("\\."); + if (parts.length < 2) { + CxLogger.info(LOG_TAG + " Token does not have expected JWT format (parts=" + parts.length + ")"); + return null; + } + + CxLogger.info(LOG_TAG + " Decoding JWT payload..."); + byte[] payload = Base64.getUrlDecoder().decode(parts[1]); + String json = new String(payload, StandardCharsets.UTF_8); + + Map map = MAPPER.readValue(json, new TypeReference>() { + }); + Object iss = map.get("iss"); + + if (iss != null) { + CxLogger.info(LOG_TAG + " ✓ Issuer extracted: " + iss.toString()); + return iss.toString(); + } + + CxLogger.info(LOG_TAG + " No 'iss' claim found in JWT payload"); + return null; + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to parse JWT token: " + e.getMessage()); + return null; + } + } + + /** + * Derives AST base URL from issuer claim. + * If issuer is like https://iam.checkmarx.com, converts to https://ast.checkmarx.com + */ + private static String deriveBaseUrlFromIssuer(String issuer) { + if (issuer == null || issuer.isBlank()) { + CxLogger.info(LOG_TAG + " Issuer is null/empty, using fallback base URL"); + return FALLBACK_BASE; + } + + try { + CxLogger.info(LOG_TAG + " Deriving base URL from issuer: " + issuer); + String host = URI.create(issuer).getHost(); + + if (host != null && host.contains("iam.checkmarx")) { + String newHost = host.replace("iam", "ast"); + String baseUrl = "https://" + newHost; + CxLogger.info(LOG_TAG + " ✓ Derived base URL: " + baseUrl); + return baseUrl; + } + + CxLogger.info(LOG_TAG + " Host does not match iam.checkmarx pattern, using fallback"); + return FALLBACK_BASE; + } catch (Exception e) { + CxLogger.warning(LOG_TAG + " Failed to derive base URL from issuer: " + e.getMessage()); + return FALLBACK_BASE; + } + } + + /** + * Public accessor for the MCP config path (used by UI). + */ + public static Path getMcpJsonPath() { + return resolveCopilotMcpConfigPath(); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScanFrequency.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScanFrequency.java new file mode 100644 index 00000000..b32d517a --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScanFrequency.java @@ -0,0 +1,36 @@ +package com.checkmarx.eclipse.devassist.state; + +/** + * Enumeration of scan frequency options. + * Determines when scans are triggered automatically. + */ +public enum ScanFrequency { + ON_FILE_SAVE("on_save", "On File Save"), + ON_DOCUMENT_CHANGE("on_change", "On Document Change (1s debounce)"), + MANUAL_ONLY("manual", "Manual Only"); + + private final String key; + private final String label; + + ScanFrequency(String key, String label) { + this.key = key; + this.label = label; + } + + public String getKey() { + return key; + } + + public String getLabel() { + return label; + } + + public static ScanFrequency fromKey(String key) { + for (ScanFrequency freq : ScanFrequency.values()) { + if (freq.key.equals(key)) { + return freq; + } + } + return ON_DOCUMENT_CHANGE; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScannerState.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScannerState.java new file mode 100644 index 00000000..74cbd7ea --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScannerState.java @@ -0,0 +1,46 @@ +package com.checkmarx.eclipse.devassist.state; + +import com.checkmarx.eclipse.devassist.model.ScanEngine; +import java.util.HashMap; +import java.util.Map; + +/** + * Represents the current state of scanner enable/disable settings. + * Holds which scanners are enabled and scan frequency preference. + */ +public class ScannerState { + + private final Map scannerStates = new HashMap<>(); + private ScanFrequency frequency; + + public ScannerState() { + initializeDefaults(); + } + + private void initializeDefaults() { + for (ScanEngine engine : ScanEngine.values()) { + scannerStates.put(engine, true); + } + this.frequency = ScanFrequency.ON_DOCUMENT_CHANGE; + } + + public boolean isEnabled(ScanEngine engine) { + return scannerStates.getOrDefault(engine, true); + } + + public void setEnabled(ScanEngine engine, boolean enabled) { + scannerStates.put(engine, enabled); + } + + public ScanFrequency getFrequency() { + return frequency; + } + + public void setFrequency(ScanFrequency frequency) { + this.frequency = frequency; + } + + public Map getAllStates() { + return new HashMap<>(scannerStates); + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScannerStateManager.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScannerStateManager.java new file mode 100644 index 00000000..f3493161 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/state/ScannerStateManager.java @@ -0,0 +1,73 @@ +package com.checkmarx.eclipse.devassist.state; + +import org.eclipse.jface.preference.IPreferenceStore; + +import com.checkmarx.eclipse.Activator; +import com.checkmarx.eclipse.devassist.model.ScanEngine; + +/** + * Manages scanner state persistence using Eclipse preferences. + * Loads and saves which scanners are enabled/disabled and scan frequency preference. + */ +public class ScannerStateManager { + + private static final String KEY_PREFIX = "scanner."; + private static final String KEY_ENABLED_SUFFIX = ".enabled"; + private static final String KEY_FREQUENCY = "scan.frequency"; + + private final IPreferenceStore prefs; + + public ScannerStateManager() { + this.prefs = Activator.getDefault().getPreferenceStore(); + } + + public ScannerStateManager(IPreferenceStore prefs) { + this.prefs = prefs; + } + + public ScannerState loadState() { + ScannerState state = new ScannerState(); + + for (ScanEngine engine : ScanEngine.values()) { + String key = getEnabledKey(engine); + boolean enabled = prefs.getBoolean(key); + state.setEnabled(engine, enabled); + } + + String freqKey = prefs.getString(KEY_FREQUENCY); + state.setFrequency(ScanFrequency.fromKey(freqKey)); + + return state; + } + + public void saveState(ScannerState state) { + for (ScanEngine engine : ScanEngine.values()) { + String key = getEnabledKey(engine); + boolean enabled = state.isEnabled(engine); + prefs.setValue(key, enabled); + } + + prefs.setValue(KEY_FREQUENCY, state.getFrequency().getKey()); + } + + public boolean isScannerEnabled(ScanEngine engine) { + return prefs.getBoolean(getEnabledKey(engine)); + } + + public void setScannerEnabled(ScanEngine engine, boolean enabled) { + prefs.setValue(getEnabledKey(engine), enabled); + } + + public ScanFrequency getScanFrequency() { + String key = prefs.getString(KEY_FREQUENCY); + return ScanFrequency.fromKey(key); + } + + public void setScanFrequency(ScanFrequency frequency) { + prefs.setValue(KEY_FREQUENCY, frequency.getKey()); + } + + private String getEnabledKey(ScanEngine engine) { + return KEY_PREFIX + engine.name().toLowerCase() + KEY_ENABLED_SUFFIX; + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/RealTimeScanJob.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/RealTimeScanJob.java index f1ee83ae..63fd7448 100644 --- a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/RealTimeScanJob.java +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/findings/realtime/RealTimeScanJob.java @@ -209,7 +209,7 @@ protected IStatus run(IProgressMonitor monitor) { * Check if user is authenticated by checking if API key is configured. */ private boolean isUserAuthenticated() { - String apiKey = com.checkmarx.eclipse.common.properties.SharedPreferences.getApiKey(); + String apiKey = com.checkmarx.eclipse.common.properties.Preferences.getApiKey(); return apiKey != null && !apiKey.trim().isEmpty(); } diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/preferences/WelcomeDialog.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/preferences/WelcomeDialog.java new file mode 100644 index 00000000..34768d52 --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/ui/preferences/WelcomeDialog.java @@ -0,0 +1,460 @@ +package com.checkmarx.eclipse.devassist.ui.preferences; + +import org.eclipse.e4.core.services.events.IEventBroker; +import com.checkmarx.eclipse.devassist.utils.DevAssistConstants; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.service.event.EventHandler; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Welcome dialog for Checkmarx Eclipse plugin. + * Displayed after successful authentication to inform users about key features. + */ +public class WelcomeDialog extends TitleAreaDialog { + + private static final int DIALOG_WIDTH = 800; + private static final int DIALOG_HEIGHT = 530; + private static final int WRAP_WIDTH = 250; + private static final int BULLET_INDENT = 20; + private static final int CONTENT_MARGIN = 20; + private static final int IMAGE_PANEL_WIDTH = 380; + private static final String SCANNER_IMAGE_PATH = "icons/welcomePageScanner.svg"; + private static final String SCANNER_IMAGE_PATH_DARK = "icons/welcomePageScanner_dark.svg"; + // Key the e4 CSS theme engine itself is registered under on the Display; + // this is the same lookup org.eclipse.e4.ui.css.swt.internal.theme.ThemeEngineManager + // uses internally, so it reflects Eclipse's actual active theme (not a guess). + private static final String THEME_ENGINE_DISPLAY_KEY = "org.eclipse.e4.ui.css.swt.theme"; + private static final String DARK_THEME_ID_FRAGMENT = "dark"; + + private final boolean mcpEnabled; + private Button realTimeScannersCheckbox; + private final RealTimeSettingsManager settingsManager; + private Image scannerImage; + private Label scannerImageLabel; + private IEventBroker themeEventBroker; + private EventHandler themeChangeHandler; + + /** + * Constructor + * @param parentShell the parent shell + * @param mcpEnabled whether MCP is enabled for the tenant + */ + public WelcomeDialog(Shell parentShell, boolean mcpEnabled) { + this(parentShell, mcpEnabled, new DefaultRealTimeSettingsManager()); + } + + /** + * Constructor with dependency injection for testability + * @param parentShell the parent shell + * @param mcpEnabled whether MCP is enabled for the tenant + * @param settingsManager manager for real-time settings + */ + public WelcomeDialog(Shell parentShell, boolean mcpEnabled, RealTimeSettingsManager settingsManager) { + super(parentShell); + this.mcpEnabled = mcpEnabled; + this.settingsManager = settingsManager; + // Deliberately not adding SWT.RESIZE: the dialog is sized to show every + // section at once, so resizing (which could clip content again) is disabled. + + // Log MCP status for debugging + String mcpStatus = mcpEnabled ? "ENABLED" : "DISABLED"; + CxLogger.info("[WELCOME] MCP status: " + mcpStatus); + } + + @Override + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText("Checkmarx"); + shell.setSize(DIALOG_WIDTH, DIALOG_HEIGHT); + } + + @Override + protected Control createDialogArea(Composite parent) { + setTitle(DevAssistConstants.WELCOME_TITLE); + setMessage(DevAssistConstants.WELCOME_SUBTITLE); + setTitleImage(null); // Remove title image for cleaner look + + Composite container = (Composite) super.createDialogArea(parent); + container.setLayout(new GridLayout(1, false)); + + createContentArea(container); + + return container; + } + + @Override + protected void createButtonsForButtonBar(Composite parent) { + createButton(parent, OK, DevAssistConstants.WELCOME_CLOSE_BUTTON, true); + } + + private void createContentArea(Composite container) { + + // Everything below is laid out directly (no scrolled composite) so that, + // combined with the fixed, non-resizable dialog size, all content is + // visible at once without scrolling or clipping. + Composite mainRow = new Composite(container, SWT.NONE); + GridLayout rowLayout = new GridLayout(2, false); + rowLayout.marginLeft = CONTENT_MARGIN; + rowLayout.marginRight = CONTENT_MARGIN; + rowLayout.marginTop = CONTENT_MARGIN; + rowLayout.marginBottom = CONTENT_MARGIN; + rowLayout.horizontalSpacing = 20; + mainRow.setLayout(rowLayout); + mainRow.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + // Left column - Feature card + main bullets, stacked + Composite leftColumn = new Composite(mainRow, SWT.NONE); + GridLayout leftLayout = new GridLayout(1, false); + leftLayout.marginWidth = 0; + leftLayout.marginHeight = 0; + leftLayout.verticalSpacing = 8; + leftColumn.setLayout(leftLayout); + leftColumn.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + if (mcpEnabled) { + addFeatureCard(leftColumn); + } + + addBullet(leftColumn, DevAssistConstants.WELCOME_MAIN_FEATURE_1); + addBullet(leftColumn, DevAssistConstants.WELCOME_MAIN_FEATURE_2); + addBullet(leftColumn, DevAssistConstants.WELCOME_MAIN_FEATURE_3); + addBullet(leftColumn, DevAssistConstants.WELCOME_MAIN_FEATURE_4); + + // Right column - scanner image + createScannerImage(mainRow); + } + + private void createScannerImage(Composite container) { + Composite rightPanel = new Composite(container, SWT.NONE); + GridLayout layout = new GridLayout(1, false); + layout.marginWidth = 0; + layout.marginHeight = 0; + rightPanel.setLayout(layout); + GridData gd = new GridData(SWT.CENTER, SWT.TOP, true, false); + gd.widthHint = IMAGE_PANEL_WIDTH; + rightPanel.setLayoutData(gd); + + scannerImageLabel = new Label(rightPanel, SWT.CENTER); + scannerImageLabel.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false)); + + scannerImage = loadScannerImage(); + if (scannerImage != null) { + scannerImageLabel.setImage(scannerImage); + } + scannerImageLabel.addDisposeListener(e -> { + unsubscribeThemeChangeListener(); + if (scannerImage != null && !scannerImage.isDisposed()) { + scannerImage.dispose(); + } + }); + + registerThemeChangeListener(); + } + + private Image loadScannerImage() { + String path = isDarkTheme() ? SCANNER_IMAGE_PATH_DARK : SCANNER_IMAGE_PATH; + try { + ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, path); + if (descriptor != null) { + return descriptor.createImage(); + } + } catch (Exception e) { + CxLogger.error("Failed to load welcome scanner image", e); + } + return null; + } + + /** + * Reads Eclipse's own e4 CSS theme engine - the same mechanism the Platform + * uses to decide dark vs. light styling - so the scanner image always matches + * whatever theme Eclipse is actually rendering with, instead of guessing from + * a color sample (which broke down in practice, e.g. custom/high-contrast themes). + */ + private boolean isDarkTheme() { + ITheme activeTheme = getActiveTheme(); + if (activeTheme != null && activeTheme.getId() != null) { + return activeTheme.getId().toLowerCase().contains(DARK_THEME_ID_FRAGMENT); + } + return isDarkByBackgroundLuminance(); + } + + private ITheme getActiveTheme() { + try { + Display display = Display.getCurrent(); + Object engineData = display != null ? display.getData(THEME_ENGINE_DISPLAY_KEY) : null; + if (engineData instanceof IThemeEngine) { + return ((IThemeEngine) engineData).getActiveTheme(); + } + } catch (Throwable t) { + // e4 CSS theming bundle not present/active in this runtime; caller falls back. + CxLogger.error("Eclipse e4 theme engine unavailable, falling back to color heuristic", + t instanceof Exception ? (Exception) t : new Exception(t)); + } + return null; + } + + /** + * Fallback for the rare runtime where the e4 CSS theme engine isn't registered + * on the Display: approximate dark mode from the widget background luminance. + */ + private boolean isDarkByBackgroundLuminance() { + Color background = Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND); + double luminance = (0.299 * background.getRed() + 0.587 * background.getGreen() + 0.114 * background.getBlue()) / 255.0; + return luminance < 0.5; + } + + /** + * Keeps the scanner image correct if the user flips Eclipse's theme (Preferences > + * General > Appearance) while this dialog happens to be open, instead of only + * checking the theme once at open time. + */ + private void registerThemeChangeListener() { + try { + themeEventBroker = PluginUtils.getEventBroker(); + if (themeEventBroker != null) { + themeChangeHandler = event -> Display.getDefault().asyncExec(this::refreshScannerImageForThemeChange); + themeEventBroker.subscribe(IThemeEngine.Events.THEME_CHANGED, themeChangeHandler); + } + } catch (Exception e) { + CxLogger.error("Failed to subscribe to Eclipse theme change events", e); + } + } + + private void unsubscribeThemeChangeListener() { + if (themeEventBroker != null && themeChangeHandler != null) { + themeEventBroker.unsubscribe(themeChangeHandler); + } + themeEventBroker = null; + themeChangeHandler = null; + } + + private void refreshScannerImageForThemeChange() { + if (scannerImageLabel == null || scannerImageLabel.isDisposed()) { + return; + } + Image newImage = loadScannerImage(); + Image oldImage = scannerImage; + scannerImage = newImage; + scannerImageLabel.setImage(newImage); + scannerImageLabel.getParent().layout(); + if (oldImage != null && !oldImage.isDisposed()) { + oldImage.dispose(); + } + } + + private void addFeatureCard(Composite parent) { + Composite card = new Composite(parent, SWT.BORDER); + GridLayout layout = new GridLayout(1, false); + layout.marginLeft = 10; + layout.marginRight = 10; + layout.marginTop = 10; + layout.marginBottom = 10; + layout.verticalSpacing = 4; + card.setLayout(layout); + card.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + + // Set subtle background color + Color bgColor = Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND); + card.setBackground(bgColor); + + // Card header with checkbox + createCardHeader(card); + + // Card features + addBullet(card, DevAssistConstants.WELCOME_ASSIST_FEATURE_1); + addBullet(card, DevAssistConstants.WELCOME_ASSIST_FEATURE_2); + addBullet(card, DevAssistConstants.WELCOME_ASSIST_FEATURE_3); + + if (mcpEnabled) { + addBullet(card, DevAssistConstants.WELCOME_MCP_INSTALLED_INFO); + } + } + + private void createCardHeader(Composite parent) { + Composite header = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + layout.marginLeft = 0; + layout.marginRight = 0; + layout.horizontalSpacing = 6; + header.setLayout(layout); + header.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + header.setBackground(parent.getBackground()); + + realTimeScannersCheckbox = new Button(header, SWT.CHECK); + realTimeScannersCheckbox.setEnabled(mcpEnabled); + realTimeScannersCheckbox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); + + Label titleLabel = new Label(header, SWT.NONE); + titleLabel.setText(DevAssistConstants.WELCOME_ASSIST_TITLE); + titleLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + + FontData fontData = titleLabel.getFont().getFontData()[0]; + fontData.setStyle(SWT.BOLD); + Font boldFont = new Font(Display.getCurrent(), fontData); + titleLabel.setFont(boldFont); + titleLabel.setBackground(parent.getBackground()); + titleLabel.addDisposeListener(e -> boldFont.dispose()); + + header.setBackground(parent.getBackground()); + + // Configure checkbox behavior + configureCheckboxBehavior(); + refreshCheckboxState(); + } + + private void addBullet(Composite parent, String text) { + Composite bulletPanel = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + layout.marginLeft = BULLET_INDENT; + layout.marginRight = 0; + layout.marginTop = 0; + layout.marginBottom = 0; + layout.horizontalSpacing = 6; + bulletPanel.setLayout(layout); + bulletPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + + // Bullet point + Label bulletLabel = new Label(bulletPanel, SWT.NONE); + bulletLabel.setText("•"); + bulletLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false)); + + FontData fontData = bulletLabel.getFont().getFontData()[0]; + fontData.setStyle(SWT.BOLD); + Font boldFont = new Font(Display.getCurrent(), fontData); + bulletLabel.setFont(boldFont); + bulletLabel.addDisposeListener(e -> boldFont.dispose()); + + // Text with wrapping + Label textLabel = new Label(bulletPanel, SWT.WRAP); + textLabel.setText(text); + GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false); + gd.widthHint = WRAP_WIDTH; + textLabel.setLayoutData(gd); + } + + private void configureCheckboxBehavior() { + if (realTimeScannersCheckbox == null) return; + + realTimeScannersCheckbox.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() { + @Override + public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { + boolean anyCurrentlyEnabled = settingsManager.areAnyEnabled(); + settingsManager.setAll(!anyCurrentlyEnabled); + refreshCheckboxState(); + } + }); + } + + private void refreshCheckboxState() { + if (realTimeScannersCheckbox == null) return; + + boolean anyEnabled = settingsManager.areAnyEnabled(); + realTimeScannersCheckbox.setSelection(anyEnabled); + updateCheckboxTooltip(); + } + + private void updateCheckboxTooltip() { + if (realTimeScannersCheckbox == null) return; + + if (!mcpEnabled) { + realTimeScannersCheckbox.setToolTipText("Checkmarx MCP is not enabled for this tenant."); + return; + } + + boolean allEnabled = settingsManager.areAllEnabled(); + boolean anyEnabled = settingsManager.areAnyEnabled(); + + String tooltipText; + if (allEnabled) { + tooltipText = "Disable all real-time scanners"; + } else if (anyEnabled) { + tooltipText = "Some scanners are enabled. Click to enable all real-time scanners"; + } else { + tooltipText = "Enable all real-time scanners"; + } + realTimeScannersCheckbox.setToolTipText(tooltipText); + } + + @Override + protected void okPressed() { + super.okPressed(); + } + + @Override + protected Point getInitialSize() { + return new Point(DIALOG_WIDTH, DIALOG_HEIGHT); + } + + /** + * Get the real-time scanners checkbox (for testing purposes) + */ + public Button getRealTimeScannersCheckbox() { + return realTimeScannersCheckbox; + } + + /** + * Manager interface for real-time settings + */ + public interface RealTimeSettingsManager { + boolean areAllEnabled(); + boolean areAnyEnabled(); + void setAll(boolean enable); + } + + /** + * Default implementation using ScannerStateManager for persistence + */ + private static class DefaultRealTimeSettingsManager implements RealTimeSettingsManager { + private final com.checkmarx.eclipse.devassist.state.ScannerStateManager stateManager; + private com.checkmarx.eclipse.devassist.state.ScannerState currentState; + + DefaultRealTimeSettingsManager() { + this.stateManager = new com.checkmarx.eclipse.devassist.state.ScannerStateManager(); + this.currentState = stateManager.loadState(); + } + + @Override + public boolean areAllEnabled() { + for (com.checkmarx.eclipse.devassist.model.ScanEngine engine : com.checkmarx.eclipse.devassist.model.ScanEngine.values()) { + if (!currentState.isEnabled(engine)) { + return false; + } + } + return true; + } + + @Override + public boolean areAnyEnabled() { + for (com.checkmarx.eclipse.devassist.model.ScanEngine engine : com.checkmarx.eclipse.devassist.model.ScanEngine.values()) { + if (currentState.isEnabled(engine)) { + return true; + } + } + return false; + } + + @Override + public void setAll(boolean enable) { + for (com.checkmarx.eclipse.devassist.model.ScanEngine engine : com.checkmarx.eclipse.devassist.model.ScanEngine.values()) { + currentState.setEnabled(engine, enable); + } + stateManager.saveState(currentState); + } + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistConstants.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistConstants.java index 30ca3d16..6381aa30 100644 --- a/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistConstants.java +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/utils/DevAssistConstants.java @@ -156,4 +156,19 @@ private DevAssistConstants() { public static final String SEPARATOR = ":"; public static final String QUICK_FIX = "QUICK_FIX"; public static final String UNDO = "Undo"; + + /******************************** WELCOME DIALOG ********************************/ + public static final String WELCOME_TITLE = "Welcome to Checkmarx"; + public static final String WELCOME_SUBTITLE = "Checkmarx offers immediate threat detection and assists you in preventing vulnerabilities before they arise."; + public static final String WELCOME_ASSIST_TITLE = "Code Smarter with Checkmarx One Assist"; + public static final String WELCOME_ASSIST_FEATURE_1 = "Get instant security feedback as you code."; + public static final String WELCOME_ASSIST_FEATURE_2 = "See suggested fixes for vulnerabilities across open source, config, and code."; + public static final String WELCOME_ASSIST_FEATURE_3 = "Fix faster with intelligent, context-aware remediation inside your IDE."; + public static final String WELCOME_MAIN_FEATURE_1 = "Run SAST, SCA, IaC, Containers and Secrets scans."; + public static final String WELCOME_MAIN_FEATURE_2 = "Create a new Checkmarx branch from your local workspace."; + public static final String WELCOME_MAIN_FEATURE_3 = "Preview or rescan before committing."; + public static final String WELCOME_MAIN_FEATURE_4 = "Triage & fix issues directly in the editor."; + public static final String WELCOME_CLOSE_BUTTON = "Close"; + public static final String WELCOME_MCP_INSTALLED_INFO = "Checkmarx MCP Installed automatically - no need for manual integration"; + } From 27f6b8a5ce8f57575ce4d61c2050c0bbea53259b Mon Sep 17 00:00:00 2001 From: Aniket Shinde Date: Sun, 9 Aug 2026 07:32:38 +0530 Subject: [PATCH 05/19] feat: settings integration - remove circular dependencies - Remove McpInstallService from PreferencesPage (common-lib) - Create AuthenticationListener in devassist-lib configuration - Register listener in McpInstallService static block - Create IProjectLifecycleListener interface in common-lib - ProjectLifecycleListener implements interface - Update PluginStartup.getProjectListener() to return interface - MCP auto-install now triggered by authentication event (devassist-lib) - Workspace scan triggered after login via interface Architecture: common-lib has no devassist imports, clean separation. --- .../eclipse/startup/PluginStartup.java | 12 +++++- .../listener/IProjectLifecycleListener.java | 16 ++++++++ .../common/properties/PreferencesPage.java | 11 ++---- .../listener/ProjectLifecycleListener.java | 3 +- .../configuration/AuthenticationListener.java | 38 +++++++++++++++++++ .../configuration/McpInstallService.java | 14 +++++++ .../configuration/McpSettingsInjector.java | 2 +- .../devassist/factory/CxWrapperFactory.java | 6 +-- 8 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 common-lib/src/com/checkmarx/eclipse/common/listener/IProjectLifecycleListener.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/AuthenticationListener.java diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java index f5ea672a..a9f47b13 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java @@ -7,6 +7,7 @@ import org.eclipse.ui.PlatformUI; import com.checkmarx.eclipse.common.utils.CxLogger; +import com.checkmarx.eclipse.common.listener.IProjectLifecycleListener; import com.checkmarx.eclipse.devassist.ui.findings.realtime.CheckmarxEditorListener; import com.checkmarx.eclipse.devassist.backend.GlobalScannerController; import com.checkmarx.eclipse.devassist.backend.listener.ProjectLifecycleListener; @@ -16,7 +17,7 @@ public class PluginStartup implements IStartup { private static final String VIEW_ID = "com.checkmarx.eclipse.views.CheckmarxView"; private static final String FINDINGS_VIEW_ID = "com.checkmarx.eclipse.devassist.ui.findings.CxFindingsView"; private static CheckmarxEditorListener realtimeScanListener; // Keep strong reference to prevent GC - private static ProjectLifecycleListener projectListener; // Keep strong reference to prevent GC + private static IProjectLifecycleListener projectListener; // Keep strong reference to prevent GC @Override public void earlyStartup() { @@ -51,6 +52,15 @@ public void earlyStartup() { }); } + /** + * Get the project lifecycle listener. + * + * @return the registered ProjectLifecycleListener, or null if not yet initialized + */ + public static IProjectLifecycleListener getProjectListener() { + return projectListener; + } + /** * Initialize backend scanner infrastructure. * diff --git a/common-lib/src/com/checkmarx/eclipse/common/listener/IProjectLifecycleListener.java b/common-lib/src/com/checkmarx/eclipse/common/listener/IProjectLifecycleListener.java new file mode 100644 index 00000000..d3e84991 --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/listener/IProjectLifecycleListener.java @@ -0,0 +1,16 @@ +package com.checkmarx.eclipse.common.listener; + +/** + * Interface for handling project lifecycle and post-authentication scanning. + * + * Implemented by DevAssist module to trigger workspace scans after successful authentication. + */ +public interface IProjectLifecycleListener { + + /** + * Initiates scans for all projects already open in the workspace. + * Called after successful user authentication to ensure all open projects + * are scanned with the newly authenticated credentials. + */ + void scanAlreadyOpenProjects(); +} diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java b/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java index bf483119..f1101da9 100644 --- a/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java @@ -28,13 +28,12 @@ import org.eclipse.ui.dialogs.PreferencesUtil; import com.checkmarx.eclipse.common.utils.PluginConstants; -import com.checkmarx.eclipse.devassist.backend.listener.ProjectLifecycleListener; -import com.checkmarx.eclipse.devassist.configuration.McpInstallService; +import com.checkmarx.eclipse.common.listener.IProjectLifecycleListener; import com.checkmarx.eclipse.runner.Authenticator; import com.checkmarx.eclipse.common.runner.TenantSettingsProvider; import com.checkmarx.eclipse.startup.PluginStartup; import com.checkmarx.eclipse.utils.PluginUtils; -import com.checkmarx.eclipse.utils.common.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.views.ui.WelcomeDialog; public class PreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { @@ -193,10 +192,6 @@ public void widgetSelected(SelectionEvent e) { // welcome dialog is actually about to appear, so the label never claims // success before the user sees the welcome page. if (result != null && result.contains(PluginConstants.AUTH_SUCCESS_PATTERN)) { - // Trigger MCP auto-installation after successful authentication - CxLogger.info("[PREFS] Authentication successful, triggering MCP auto-install..."); - McpInstallService.attemptAutoInstall(apiKey_str, additionalParams_str); - // Fetch MCP enabled status from server asynchronously CompletableFuture.supplyAsync(() -> { try { @@ -299,7 +294,7 @@ private void showWelcomeDialog(boolean mcpEnabled, Button logoutButton, String a // A project that was already open before this login never gets that scan // otherwise, since ProjectLifecycleListener only scans a project when it // *opens* while the user is authenticated - re-run it now that login succeeded. - ProjectLifecycleListener projectListener = PluginStartup.getProjectListener(); + IProjectLifecycleListener projectListener = PluginStartup.getProjectListener(); if (projectListener != null) { CxLogger.info("[PREFS] Login succeeded - triggering workspace OSS/IaC/container scan..."); projectListener.scanAlreadyOpenProjects(); diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java index 5c43d90e..e7e956c7 100644 --- a/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/backend/listener/ProjectLifecycleListener.java @@ -18,12 +18,13 @@ import com.checkmarx.eclipse.devassist.common.ScanManager; import com.checkmarx.eclipse.devassist.model.ScanIssue; import com.checkmarx.eclipse.common.utils.CxLogger; +import com.checkmarx.eclipse.common.listener.IProjectLifecycleListener; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; -public class ProjectLifecycleListener implements IResourceChangeListener { +public class ProjectLifecycleListener implements IResourceChangeListener, IProjectLifecycleListener { private static final String LOG_TAG = "[PROJECT-LISTENER]"; private static final String PLUGIN_ID = "com.checkmarx.eclipse.plugin"; diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/AuthenticationListener.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/AuthenticationListener.java new file mode 100644 index 00000000..802d702d --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/AuthenticationListener.java @@ -0,0 +1,38 @@ +package com.checkmarx.eclipse.devassist.configuration; + +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; + +import com.checkmarx.eclipse.common.properties.Preferences; +import com.checkmarx.eclipse.common.utils.CxLogger; + +/** + * Listens for authentication events and triggers MCP auto-installation. + * + * Registered globally to respond to successful authentication by: + * - Detecting API_KEY changes in preferences + * - Triggering MCP configuration installation + * - Logging success/failure for debugging + */ +public class AuthenticationListener implements IPropertyChangeListener { + + private static final String LOG_TAG = "[AUTH-LISTENER]"; + + @Override + public void propertyChange(PropertyChangeEvent event) { + if (event == null || event.getProperty() == null) { + return; + } + + // Trigger MCP auto-install when API key is successfully set + if (Preferences.API_KEY.equals(event.getProperty())) { + String newApiKey = (String) event.getNewValue(); + + // Only proceed if a key was set (not cleared) + if (newApiKey != null && !newApiKey.isBlank()) { + CxLogger.info(LOG_TAG + " API key updated, attempting MCP auto-install..."); + McpInstallService.attemptAutoInstall(); + } + } + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java index 8b520696..914adeb9 100644 --- a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java @@ -21,11 +21,25 @@ public final class McpInstallService { private static final String LOG_TAG = "[MCP-INSTALL]"; + private static boolean authListenerRegistered = false; private McpInstallService() { // Utility class } + static { + // Register authentication listener on class load + registerAuthenticationListener(); + } + + private static void registerAuthenticationListener() { + if (!authListenerRegistered) { + Preferences.STORE.addPropertyChangeListener(new AuthenticationListener()); + authListenerRegistered = true; + CxLogger.info(LOG_TAG + " Authentication listener registered"); + } + } + /** * Conditionally installs MCP configuration if user is authenticated * and MCP is enabled for their tenant. diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpSettingsInjector.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpSettingsInjector.java index c80d75b4..cd2e1966 100644 --- a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpSettingsInjector.java +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpSettingsInjector.java @@ -12,7 +12,7 @@ import java.util.Map; import java.util.Objects; -import com.checkmarx.eclipse.utils.CxLogger; +import com.checkmarx.eclipse.common.utils.CxLogger; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/factory/CxWrapperFactory.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/factory/CxWrapperFactory.java index 9ea8c324..f8433b89 100644 --- a/devassist-lib/src/com/checkmarx/eclipse/devassist/factory/CxWrapperFactory.java +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/factory/CxWrapperFactory.java @@ -3,7 +3,7 @@ import com.checkmarx.ast.wrapper.CxConfig; import com.checkmarx.ast.wrapper.CxException; import com.checkmarx.ast.wrapper.CxWrapper; -import com.checkmarx.eclipse.common.properties.SharedPreferences; +import com.checkmarx.eclipse.common.properties.Preferences; import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.devassist.backend.Constants; import org.slf4j.Logger; @@ -32,8 +32,8 @@ private static CxWrapper getWrapper() throws Exception { Logger log = LoggerFactory.getLogger(CxWrapperFactory.class.getName()); CxConfig.CxConfigBuilder builder = CxConfig.builder() - .apiKey(SharedPreferences.getApiKey()) - .additionalParameters(SharedPreferences.getAdditionalOptions()); + .apiKey(Preferences.getApiKey()) + .additionalParameters(Preferences.getAdditionalOptions()); CxConfig config = builder.build(); From 8f33df3bfc0fae274e369b711aee03c27a6afb63 Mon Sep 17 00:00:00 2001 From: Aniket Shinde Date: Sun, 9 Aug 2026 07:51:42 +0530 Subject: [PATCH 06/19] refactor: extract authentication success handler to interface - Create IAuthenticationSuccessHandler interface in common-lib - Move welcome dialog logic to AuthenticationSuccessHandler in devassist-lib - PreferencesPage delegates to handler via Preferences registry - Removes WelcomeDialog import from common-lib PreferencesPage - Handlers registered in McpInstallService static block Architecture: common-lib has NO devassist imports, clean separation. --- common-lib/META-INF/MANIFEST.MF | 1 + .../IAuthenticationSuccessHandler.java | 20 ++++++ .../common/properties/Preferences.java | 13 ++++ .../common/properties/PreferencesPage.java | 66 ++++++------------- .../AuthenticationSuccessHandler.java | 63 ++++++++++++++++++ .../configuration/McpInstallService.java | 13 ++-- 6 files changed, 127 insertions(+), 49 deletions(-) create mode 100644 common-lib/src/com/checkmarx/eclipse/common/listener/IAuthenticationSuccessHandler.java create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/AuthenticationSuccessHandler.java diff --git a/common-lib/META-INF/MANIFEST.MF b/common-lib/META-INF/MANIFEST.MF index b7b88f2b..71bdee1d 100644 --- a/common-lib/META-INF/MANIFEST.MF +++ b/common-lib/META-INF/MANIFEST.MF @@ -25,6 +25,7 @@ Require-Bundle: org.eclipse.core.runtime, Bundle-RequiredExecutionEnvironment: JavaSE-17 Export-Package: com.checkmarx.eclipse.common.enums, com.checkmarx.eclipse.common.events, + com.checkmarx.eclipse.common.listener, com.checkmarx.eclipse.common.properties, com.checkmarx.eclipse.common.runner, com.checkmarx.eclipse.common.utils diff --git a/common-lib/src/com/checkmarx/eclipse/common/listener/IAuthenticationSuccessHandler.java b/common-lib/src/com/checkmarx/eclipse/common/listener/IAuthenticationSuccessHandler.java new file mode 100644 index 00000000..92606af9 --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/listener/IAuthenticationSuccessHandler.java @@ -0,0 +1,20 @@ +package com.checkmarx.eclipse.common.listener; + +/** + * Handler for successful authentication events. + * + * Allows devassist-lib to respond to successful authentication in PreferencesPage + * without creating a reverse dependency from common-lib to devassist-lib. + */ +public interface IAuthenticationSuccessHandler { + + /** + * Called after successful authentication and credential validation. + * + * @param mcpEnabled whether AI MCP server is enabled for the tenant + * @param logoutButton the logout button (may be disabled during flow) + * @param apiKey the newly authenticated API key + * @param additionalParams additional parameters for Checkmarx API + */ + void onAuthenticationSuccess(boolean mcpEnabled, Object logoutButton, String apiKey, String additionalParams); +} diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java b/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java index 94cf7525..8be4d3c2 100644 --- a/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java @@ -4,6 +4,8 @@ import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.ui.preferences.ScopedPreferenceStore; +import com.checkmarx.eclipse.common.listener.IAuthenticationSuccessHandler; + public class Preferences { public static final String QUALIFIER = "com.checkmarx.eclipse"; @@ -16,6 +18,9 @@ public class Preferences { public static final ScopedPreferenceStore STORE = new ScopedPreferenceStore(InstanceScope.INSTANCE, QUALIFIER); + // Handler for post-authentication UI setup (registered by devassist-lib) + private static IAuthenticationSuccessHandler authSuccessHandler; + private Preferences() { } @@ -48,4 +53,12 @@ public static boolean isCredentialsValidated() { public static void setCredentialsValidated(boolean validated) { STORE.setValue(CREDENTIALS_VALIDATED, validated); } + + public static void setAuthenticationSuccessHandler(IAuthenticationSuccessHandler handler) { + authSuccessHandler = handler; + } + + public static IAuthenticationSuccessHandler getAuthenticationSuccessHandler() { + return authSuccessHandler; + } } \ No newline at end of file diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java b/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java index f1101da9..6602f685 100644 --- a/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java @@ -29,12 +29,12 @@ import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.common.listener.IProjectLifecycleListener; -import com.checkmarx.eclipse.runner.Authenticator; +import com.checkmarx.eclipse.common.listener.IAuthenticationSuccessHandler; +import com.checkmarx.eclipse.common.runner.Authenticator; import com.checkmarx.eclipse.common.runner.TenantSettingsProvider; import com.checkmarx.eclipse.startup.PluginStartup; import com.checkmarx.eclipse.utils.PluginUtils; import com.checkmarx.eclipse.common.utils.CxLogger; -import com.checkmarx.eclipse.views.ui.WelcomeDialog; public class PreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { @@ -192,6 +192,15 @@ public void widgetSelected(SelectionEvent e) { // welcome dialog is actually about to appear, so the label never claims // success before the user sees the welcome page. if (result != null && result.contains(PluginConstants.AUTH_SUCCESS_PATTERN)) { + // The key was only just validated by "Test Connection" - it isn't persisted + // to the store until the user clicks OK/Apply on this dialog, which they may + // never do once they see the Welcome page. Persist it now so + // isUserAuthenticated() (checked by ProjectLifecycleListener, and by + // anything else gated on login) actually sees it. + Preferences.STORE.setValue(Preferences.API_KEY, apiKey_str); + Preferences.STORE.setValue(Preferences.ADDITIONAL_OPTIONS, additionalParams_str); + Preferences.setCredentialsValidated(true); + // Fetch MCP enabled status from server asynchronously CompletableFuture.supplyAsync(() -> { try { @@ -208,7 +217,16 @@ public void widgetSelected(SelectionEvent e) { if (!getFieldEditorParent().isDisposed()) { getFieldEditorParent().layout(); } - showWelcomeDialog(mcpEnabled, logoutButtonHolder[0], apiKey_str, additionalParams_str); + // Delegate to handler registered by devassist-lib (if available) + IAuthenticationSuccessHandler handler = Preferences.getAuthenticationSuccessHandler(); + if (handler != null) { + handler.onAuthenticationSuccess(mcpEnabled, logoutButtonHolder[0], apiKey_str, additionalParams_str); + } else { + CxLogger.warning("[PREFS] No authentication success handler registered - welcome dialog skipped"); + if (logoutButtonHolder[0] != null && !logoutButtonHolder[0].isDisposed()) { + logoutButtonHolder[0].setEnabled(true); + } + } })); } else { // Authentication failed - the flow ends here with no welcome dialog, @@ -278,48 +296,6 @@ private static String mapAuthResult(String result) { return result; } - private void showWelcomeDialog(boolean mcpEnabled, Button logoutButton, String apiKey_str, String additionalParams_str) { - try { - // The key was only just validated by "Test Connection" - it isn't persisted - // to the store until the user clicks OK/Apply on this dialog, which they may - // never do once they see the Welcome page. Persist it now so - // isUserAuthenticated() (checked by ProjectLifecycleListener below, and by - // anything else gated on login) actually sees it. - Preferences.STORE.setValue(Preferences.API_KEY, apiKey_str); - Preferences.STORE.setValue(Preferences.ADDITIONAL_OPTIONS, additionalParams_str); - Preferences.setCredentialsValidated(true); - - // Trigger the same initial OSS/IaC/container workspace scan that runs for - // already-open projects at plugin launch (PluginStartup.initializeBackendScanners()). - // A project that was already open before this login never gets that scan - // otherwise, since ProjectLifecycleListener only scans a project when it - // *opens* while the user is authenticated - re-run it now that login succeeded. - IProjectLifecycleListener projectListener = PluginStartup.getProjectListener(); - if (projectListener != null) { - CxLogger.info("[PREFS] Login succeeded - triggering workspace OSS/IaC/container scan..."); - projectListener.scanAlreadyOpenProjects(); - } - - WelcomeDialog dlg = new WelcomeDialog( - Display.getDefault().getActiveShell(), - mcpEnabled); - - // Re-enable Logout right as the welcome dialog is about to appear, so it stays - // disabled for the entire connect/validate flow and only becomes usable once - // that flow has visibly completed. - if (logoutButton != null && !logoutButton.isDisposed()) { - logoutButton.setEnabled(true); - } - - dlg.open(); - } catch (Exception ex) { - CxLogger.error("Failed to show welcome dialog", ex); - if (logoutButton != null && !logoutButton.isDisposed()) { - logoutButton.setEnabled(true); - } - } - } - private FieldEditor space() { return new LabelFieldEditor("", getFieldEditorParent()); } diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/AuthenticationSuccessHandler.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/AuthenticationSuccessHandler.java new file mode 100644 index 00000000..467c2ebf --- /dev/null +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/AuthenticationSuccessHandler.java @@ -0,0 +1,63 @@ +package com.checkmarx.eclipse.devassist.configuration; + +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Display; + +import com.checkmarx.eclipse.common.listener.IAuthenticationSuccessHandler; +import com.checkmarx.eclipse.common.utils.CxLogger; +import com.checkmarx.eclipse.devassist.backend.listener.ProjectLifecycleListener; +import com.checkmarx.eclipse.devassist.ui.preferences.WelcomeDialog; +import com.checkmarx.eclipse.startup.PluginStartup; + +/** + * Handles post-authentication UI and backend setup in devassist-lib. + * + * Triggered when authentication succeeds in PreferencesPage, this handler: + * - Shows the welcome dialog + * - Re-enables the logout button + * - Ensures workspace scans are triggered for open projects + */ +public class AuthenticationSuccessHandler implements IAuthenticationSuccessHandler { + + private static final String LOG_TAG = "[AUTH-SUCCESS]"; + + @Override + public void onAuthenticationSuccess(boolean mcpEnabled, Object logoutButton, String apiKey, String additionalParams) { + try { + Button logout = (Button) logoutButton; + + // Trigger the same initial OSS/IaC/container workspace scan that runs for + // already-open projects at plugin launch (PluginStartup.initializeBackendScanners()). + // A project that was already open before this login never gets that scan + // otherwise, since ProjectLifecycleListener only scans a project when it + // *opens* while the user is authenticated - re-run it now that login succeeded. + ProjectLifecycleListener projectListener = (ProjectLifecycleListener) PluginStartup.getProjectListener(); + if (projectListener != null) { + CxLogger.info(LOG_TAG + " Triggering workspace OSS/IaC/container scan..."); + projectListener.scanAlreadyOpenProjects(); + } + + // Show welcome dialog with MCP status + WelcomeDialog dlg = new WelcomeDialog( + Display.getDefault().getActiveShell(), + mcpEnabled); + + // Re-enable Logout right as the welcome dialog is about to appear, so it stays + // disabled for the entire connect/validate flow and only becomes usable once + // that flow has visibly completed. + if (logout != null && !logout.isDisposed()) { + logout.setEnabled(true); + } + + dlg.open(); + } catch (Exception ex) { + CxLogger.error(LOG_TAG + " Failed to show welcome dialog", ex); + if (logoutButton != null && logoutButton instanceof Button) { + Button btn = (Button) logoutButton; + if (!btn.isDisposed()) { + btn.setEnabled(true); + } + } + } + } +} diff --git a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java index 914adeb9..ca1c324b 100644 --- a/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java +++ b/devassist-lib/src/com/checkmarx/eclipse/devassist/configuration/McpInstallService.java @@ -28,15 +28,20 @@ private McpInstallService() { } static { - // Register authentication listener on class load - registerAuthenticationListener(); + // Register authentication handlers on class load + registerAuthenticationHandlers(); } - private static void registerAuthenticationListener() { + private static void registerAuthenticationHandlers() { if (!authListenerRegistered) { + // Register listener for MCP auto-install on API key change Preferences.STORE.addPropertyChangeListener(new AuthenticationListener()); + + // Register handler for post-authentication UI (welcome dialog, workspace scan) + Preferences.setAuthenticationSuccessHandler(new AuthenticationSuccessHandler()); + authListenerRegistered = true; - CxLogger.info(LOG_TAG + " Authentication listener registered"); + CxLogger.info(LOG_TAG + " Authentication handlers registered"); } } From 220e66b935f5c17153fda53634067dede8a2d621 Mon Sep 17 00:00:00 2001 From: Aniket Shinde Date: Sun, 9 Aug 2026 07:54:43 +0530 Subject: [PATCH 07/19] refactor: extract settings change notifier to interface - Create ISettingsChangeNotifier interface in common-lib - Create SettingsChangeNotifier implementation in main plugin - Register notifier in PluginStartup static block - Remove PluginStartup and PluginUtils imports from common-lib PreferencesPage - Use notifier instead of direct event broker calls Architecture: common-lib has NO main plugin imports, clean separation. --- .../eclipse/startup/PluginStartup.java | 6 ++++++ .../startup/SettingsChangeNotifier.java | 19 +++++++++++++++++++ common-lib/META-INF/MANIFEST.MF | 3 +-- .../listener/ISettingsChangeNotifier.java | 16 ++++++++++++++++ .../common/properties/Preferences.java | 12 ++++++++++++ .../common/properties/PreferencesPage.java | 15 +++++++++++---- 6 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/SettingsChangeNotifier.java create mode 100644 common-lib/src/com/checkmarx/eclipse/common/listener/ISettingsChangeNotifier.java diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java index a9f47b13..0433c506 100644 --- a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/PluginStartup.java @@ -8,12 +8,18 @@ import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.common.listener.IProjectLifecycleListener; +import com.checkmarx.eclipse.common.properties.Preferences; import com.checkmarx.eclipse.devassist.ui.findings.realtime.CheckmarxEditorListener; import com.checkmarx.eclipse.devassist.backend.GlobalScannerController; import com.checkmarx.eclipse.devassist.backend.listener.ProjectLifecycleListener; public class PluginStartup implements IStartup { + static { + // Register settings change notifier for PreferencesPage + Preferences.setSettingsChangeNotifier(new SettingsChangeNotifier()); + } + private static final String VIEW_ID = "com.checkmarx.eclipse.views.CheckmarxView"; private static final String FINDINGS_VIEW_ID = "com.checkmarx.eclipse.devassist.ui.findings.CxFindingsView"; private static CheckmarxEditorListener realtimeScanListener; // Keep strong reference to prevent GC diff --git a/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/SettingsChangeNotifier.java b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/SettingsChangeNotifier.java new file mode 100644 index 00000000..4bde6ceb --- /dev/null +++ b/checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/SettingsChangeNotifier.java @@ -0,0 +1,19 @@ +package com.checkmarx.eclipse.startup; + +import com.checkmarx.eclipse.common.listener.ISettingsChangeNotifier; +import com.checkmarx.eclipse.common.utils.PluginConstants; +import com.checkmarx.eclipse.utils.PluginUtils; + +/** + * Notifies views and components when preferences have been applied. + * + * Triggers UI updates in CheckmarxView/CxFindingsView when settings change, + * allowing them to respond to credential or configuration updates. + */ +public class SettingsChangeNotifier implements ISettingsChangeNotifier { + + @Override + public void notifySettingsApplied() { + PluginUtils.getEventBroker().post(PluginConstants.TOPIC_APPLY_SETTINGS, PluginConstants.EMPTY_STRING); + } +} diff --git a/common-lib/META-INF/MANIFEST.MF b/common-lib/META-INF/MANIFEST.MF index 71bdee1d..46ffffc6 100644 --- a/common-lib/META-INF/MANIFEST.MF +++ b/common-lib/META-INF/MANIFEST.MF @@ -20,8 +20,7 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.jdt.ui, org.eclipse.ui, org.eclipse.ui.workbench.texteditor, - org.eclipse.ui.editors, - lib/ast-cli-java-wrapper-2.4.24.jar + org.eclipse.ui.editors Bundle-RequiredExecutionEnvironment: JavaSE-17 Export-Package: com.checkmarx.eclipse.common.enums, com.checkmarx.eclipse.common.events, diff --git a/common-lib/src/com/checkmarx/eclipse/common/listener/ISettingsChangeNotifier.java b/common-lib/src/com/checkmarx/eclipse/common/listener/ISettingsChangeNotifier.java new file mode 100644 index 00000000..5659bbe0 --- /dev/null +++ b/common-lib/src/com/checkmarx/eclipse/common/listener/ISettingsChangeNotifier.java @@ -0,0 +1,16 @@ +package com.checkmarx.eclipse.common.listener; + +/** + * Notifies listeners when settings have been applied or changed. + * + * Allows PreferencesPage (common-lib) to notify the main plugin about settings + * changes without creating a reverse dependency. + */ +public interface ISettingsChangeNotifier { + + /** + * Notify that settings have been applied/changed. + * This triggers UI updates in views and components. + */ + void notifySettingsApplied(); +} diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java b/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java index 8be4d3c2..b75d1d62 100644 --- a/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/Preferences.java @@ -5,6 +5,7 @@ import org.eclipse.ui.preferences.ScopedPreferenceStore; import com.checkmarx.eclipse.common.listener.IAuthenticationSuccessHandler; +import com.checkmarx.eclipse.common.listener.ISettingsChangeNotifier; public class Preferences { @@ -21,6 +22,9 @@ public class Preferences { // Handler for post-authentication UI setup (registered by devassist-lib) private static IAuthenticationSuccessHandler authSuccessHandler; + // Notifier for settings changes (registered by main plugin) + private static ISettingsChangeNotifier settingsChangeNotifier; + private Preferences() { } @@ -61,4 +65,12 @@ public static void setAuthenticationSuccessHandler(IAuthenticationSuccessHandler public static IAuthenticationSuccessHandler getAuthenticationSuccessHandler() { return authSuccessHandler; } + + public static void setSettingsChangeNotifier(ISettingsChangeNotifier notifier) { + settingsChangeNotifier = notifier; + } + + public static ISettingsChangeNotifier getSettingsChangeNotifier() { + return settingsChangeNotifier; + } } \ No newline at end of file diff --git a/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java b/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java index 6602f685..b563210e 100644 --- a/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java +++ b/common-lib/src/com/checkmarx/eclipse/common/properties/PreferencesPage.java @@ -30,10 +30,9 @@ import com.checkmarx.eclipse.common.utils.PluginConstants; import com.checkmarx.eclipse.common.listener.IProjectLifecycleListener; import com.checkmarx.eclipse.common.listener.IAuthenticationSuccessHandler; +import com.checkmarx.eclipse.common.listener.ISettingsChangeNotifier; import com.checkmarx.eclipse.common.runner.Authenticator; import com.checkmarx.eclipse.common.runner.TenantSettingsProvider; -import com.checkmarx.eclipse.startup.PluginStartup; -import com.checkmarx.eclipse.utils.PluginUtils; import com.checkmarx.eclipse.common.utils.CxLogger; public class PreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { @@ -263,7 +262,11 @@ public void widgetSelected(SelectionEvent e) { // away. Without this, they only learn credentials are gone once performOk() // runs (i.e. the user clicks OK/Apply) - if they instead Cancel or just close // the dialog after Logout, both views kept showing stale "connected" content. - PluginUtils.getEventBroker().post(PluginConstants.TOPIC_APPLY_SETTINGS, PluginConstants.EMPTY_STRING); + // Notify main plugin that settings have changed + ISettingsChangeNotifier notifier = Preferences.getSettingsChangeNotifier(); + if (notifier != null) { + notifier.notifySettingsApplied(); + } } }); @@ -319,7 +322,11 @@ public boolean performOk() { || !java.util.Objects.equals(currentAdditionalOptions, initialAdditionalOptions); if (settingsActuallyChanged) { - PluginUtils.getEventBroker().post(PluginConstants.TOPIC_APPLY_SETTINGS, PluginConstants.EMPTY_STRING); + // Notify main plugin that settings have changed + ISettingsChangeNotifier notifier = Preferences.getSettingsChangeNotifier(); + if (notifier != null) { + notifier.notifySettingsApplied(); + } } } From d0e8a40b1c895414ae40b74a2589b9d56366a191 Mon Sep 17 00:00:00 2001 From: Aniket Shinde Date: Sun, 9 Aug 2026 20:14:17 +0530 Subject: [PATCH 08/19] fix: remove duplicate JARs from devassist-lib devassist-lib should depend on common-lib for JAR access, not duplicate them. - Remove lib/ references from devassist-lib MANIFEST.MF and build.properties - Remove lib/ references from devassist-lib .classpath - devassist-lib Require-Bundle: common-lib provides JAR access - Revert .gitignore to only track main plugin lib/ --- .../META-INF/MANIFEST.MF | 1 + .../AuthenticatorIntegrationTest.java | 2 +- .../integration/BaseIntegrationTest.java | 2 +- .../unit/properties/PreferencesTest.java | 2 +- .../tests/unit/runner/AuthenticatorTest.java | 2 +- .../tests/unit/utils/PluginUtilsTest.java | 2 +- checkmarx-ast-eclipse-plugin/.classpath | 16 ++++----- .../META-INF/MANIFEST.MF | 13 +------ .../lib/ast-cli-java-wrapper-2.4.24.jar | 3 -- .../lib/commons-lang3-3.18.0.jar | Bin 702952 -> 0 bytes .../lib/jackson-annotations-2.21.jar | Bin 82104 -> 0 bytes .../lib/jackson-core-2.21.4.jar | Bin 594183 -> 0 bytes .../lib/jackson-databind-2.21.5.jar | Bin 1705906 -> 0 bytes .../lib/slf4j-api-2.0.17.jar | Bin 69908 -> 0 bytes .../lib/slf4j-reload4j-2.0.17.jar | Bin 10734 -> 0 bytes .../lib/slf4j-simple-2.0.17.jar | Bin 15716 -> 0 bytes checkmarx-ast-eclipse-plugin/plugin.xml | 8 ++++- .../eclipse/startup/PluginStartup.java | 3 +- .../eclipse/startup/WorkspaceScanService.java | 31 +++++++++++++++++ common-lib/.classpath | 6 ++++ .../.settings/org.eclipse.m2e.core.prefs | 4 +++ common-lib/META-INF/MANIFEST.MF | 32 +++++++++++++++++- common-lib/build.properties | 11 +++++- .../listener/IProjectLifecycleListener.java | 6 ++++ .../listener/IWorkspaceScanService.java | 17 ++++++++++ .../common/properties/Preferences.java | 12 +++++++ .../eclipse/common/utils/PluginConstants.java | 3 ++ devassist-lib/.classpath | 16 ++++----- .../.settings/org.eclipse.m2e.core.prefs | 4 +++ devassist-lib/META-INF/MANIFEST.MF | 15 +++----- devassist-lib/build.properties | 8 ----- .../lib/ast-cli-java-wrapper-2.4.24.jar | 3 -- devassist-lib/lib/commons-lang3-3.18.0.jar | 3 -- .../lib/jackson-annotations-2.21.jar | 3 -- devassist-lib/lib/jackson-core-2.21.4.jar | 3 -- devassist-lib/lib/jackson-databind-2.21.5.jar | 3 -- devassist-lib/lib/slf4j-api-2.0.17.jar | 3 -- devassist-lib/lib/slf4j-reload4j-2.0.17.jar | 3 -- devassist-lib/lib/slf4j-simple-2.0.17.jar | 3 -- .../eclipse/devassist/Activator.java | 31 +++++++++++++++++ .../AuthenticationSuccessHandler.java | 19 +++++------ .../devassist/state/ScannerStateManager.java | 8 +++-- .../devassist/ui/findings/CxFindingsView.java | 4 +-- .../ui/preferences/WelcomeDialog.java | 14 ++++++-- 44 files changed, 219 insertions(+), 100 deletions(-) delete mode 100644 checkmarx-ast-eclipse-plugin/lib/ast-cli-java-wrapper-2.4.24.jar delete mode 100644 checkmarx-ast-eclipse-plugin/lib/commons-lang3-3.18.0.jar delete mode 100644 checkmarx-ast-eclipse-plugin/lib/jackson-annotations-2.21.jar delete mode 100644 checkmarx-ast-eclipse-plugin/lib/jackson-core-2.21.4.jar delete mode 100644 checkmarx-ast-eclipse-plugin/lib/jackson-databind-2.21.5.jar delete mode 100644 checkmarx-ast-eclipse-plugin/lib/slf4j-api-2.0.17.jar delete mode 100644 checkmarx-ast-eclipse-plugin/lib/slf4j-reload4j-2.0.17.jar delete mode 100644 checkmarx-ast-eclipse-plugin/lib/slf4j-simple-2.0.17.jar create mode 100644 checkmarx-ast-eclipse-plugin/src/com/checkmarx/eclipse/startup/WorkspaceScanService.java create mode 100644 common-lib/.settings/org.eclipse.m2e.core.prefs create mode 100644 common-lib/src/com/checkmarx/eclipse/common/listener/IWorkspaceScanService.java create mode 100644 devassist-lib/.settings/org.eclipse.m2e.core.prefs delete mode 100644 devassist-lib/lib/ast-cli-java-wrapper-2.4.24.jar delete mode 100644 devassist-lib/lib/commons-lang3-3.18.0.jar delete mode 100644 devassist-lib/lib/jackson-annotations-2.21.jar delete mode 100644 devassist-lib/lib/jackson-core-2.21.4.jar delete mode 100644 devassist-lib/lib/jackson-databind-2.21.5.jar delete mode 100644 devassist-lib/lib/slf4j-api-2.0.17.jar delete mode 100644 devassist-lib/lib/slf4j-reload4j-2.0.17.jar delete mode 100644 devassist-lib/lib/slf4j-simple-2.0.17.jar create mode 100644 devassist-lib/src/com/checkmarx/eclipse/devassist/Activator.java diff --git a/checkmarx-ast-eclipse-plugin-tests/META-INF/MANIFEST.MF b/checkmarx-ast-eclipse-plugin-tests/META-INF/MANIFEST.MF index 8bf051b2..2700f967 100644 --- a/checkmarx-ast-eclipse-plugin-tests/META-INF/MANIFEST.MF +++ b/checkmarx-ast-eclipse-plugin-tests/META-INF/MANIFEST.MF @@ -14,3 +14,4 @@ Require-Bundle: Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ClassPath: .,lib/mockito-core-5.14.2.jar,lib/powermock-core-*.jar, lib/byte-buddy-1.17.8.jar, lib/byte-buddy-agent-1.17.8.jar Automatic-Module-Name: com.checkmarx.ast.eclipse.tests +Import-Package: com.checkmarx.eclipse.common.runner diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/integration/AuthenticatorIntegrationTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/integration/AuthenticatorIntegrationTest.java index b4028ab6..455e0dff 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/integration/AuthenticatorIntegrationTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/integration/AuthenticatorIntegrationTest.java @@ -5,7 +5,7 @@ import org.mockito.Mock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.checkmarx.eclipse.runner.Authenticator; +import com.checkmarx.eclipse.common.runner.Authenticator; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/integration/BaseIntegrationTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/integration/BaseIntegrationTest.java index 9e0b0839..75994dbd 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/integration/BaseIntegrationTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/integration/BaseIntegrationTest.java @@ -12,7 +12,7 @@ import com.checkmarx.ast.wrapper.CxConfig; import com.checkmarx.ast.wrapper.CxWrapper; -import com.checkmarx.eclipse.runner.Authenticator; +import com.checkmarx.eclipse.common.runner.Authenticator; import checkmarx.ast.eclipse.plugin.tests.common.Environment; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/properties/PreferencesTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/properties/PreferencesTest.java index 387b5c3f..b346b573 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/properties/PreferencesTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/properties/PreferencesTest.java @@ -14,7 +14,7 @@ import org.mockito.MockitoAnnotations; import com.checkmarx.eclipse.Activator; -import com.checkmarx.eclipse.properties.Preferences; +import com.checkmarx.eclipse.common.properties.Preferences; class PreferencesTest { diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java index 365a06d5..3069ade6 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/runner/AuthenticatorTest.java @@ -13,7 +13,7 @@ import com.checkmarx.ast.wrapper.CxException; import com.checkmarx.ast.wrapper.CxWrapper; -import com.checkmarx.eclipse.runner.Authenticator; +import com.checkmarx.eclipse.common.runner.Authenticator; import com.checkmarx.eclipse.common.utils.CxLogger; import com.checkmarx.eclipse.common.utils.PluginConstants; diff --git a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java index 3906d7f5..b39e577d 100644 --- a/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java +++ b/checkmarx-ast-eclipse-plugin-tests/src/test/java/checkmarx/ast/eclipse/plugin/tests/unit/utils/PluginUtilsTest.java @@ -34,7 +34,7 @@ import com.checkmarx.ast.results.result.Result; import com.checkmarx.eclipse.common.enums.Severity; import com.checkmarx.eclipse.common.utils.PluginConstants; -import com.checkmarx.eclipse.properties.Preferences; +import com.checkmarx.eclipse.common.properties.Preferences; import com.checkmarx.eclipse.utils.PluginUtils; import com.checkmarx.eclipse.views.DataProvider; import com.checkmarx.eclipse.views.DisplayModel; diff --git a/checkmarx-ast-eclipse-plugin/.classpath b/checkmarx-ast-eclipse-plugin/.classpath index 19a4d9ec..fbfce51f 100644 --- a/checkmarx-ast-eclipse-plugin/.classpath +++ b/checkmarx-ast-eclipse-plugin/.classpath @@ -12,14 +12,14 @@ - - - - - - - - + + + + + + + + diff --git a/checkmarx-ast-eclipse-plugin/META-INF/MANIFEST.MF b/checkmarx-ast-eclipse-plugin/META-INF/MANIFEST.MF index 02e5d705..b52c8be5 100644 --- a/checkmarx-ast-eclipse-plugin/META-INF/MANIFEST.MF +++ b/checkmarx-ast-eclipse-plugin/META-INF/MANIFEST.MF @@ -17,7 +17,6 @@ Require-Bundle: org.eclipse.ui, org.eclipse.e4.core.services, com.google.guava, org.eclipse.e4.ui.di, - org.apache.commons.lang3, org.eclipse.mylyn.commons.ui, org.eclipse.mylyn.commons.core, jakarta.inject.jakarta.inject-api;bundle-version="2.0.1", @@ -29,20 +28,10 @@ Import-Package: org.eclipse.core.resources, org.osgi.service.event;version="1.4.1" Bundle-ActivationPolicy: lazy Bundle-Activator: com.checkmarx.eclipse.Activator -Export-Package: com.checkmarx.ast.asca, - com.checkmarx.ast.wrapper, - com.checkmarx.eclipse.enums, +Export-Package: com.checkmarx.eclipse.enums, com.checkmarx.eclipse.properties, com.checkmarx.eclipse.utils Bundle-ClassPath: ., - lib/slf4j-simple-2.0.17.jar, - lib/slf4j-reload4j-2.0.17.jar, - lib/slf4j-api-2.0.17.jar, - lib/jackson-annotations-2.21.jar, - lib/jackson-core-2.21.4.jar, - lib/jackson-databind-2.21.5.jar, - lib/commons-lang3-3.18.0.jar, - lib/ast-cli-java-wrapper-2.4.24.jar, lib/org.eclipse.mylyn.commons.ui_4.9.0.v20251121-0615.jar, lib/org-eclipse-mylyn-commons-core.jar \ No newline at end of file diff --git a/checkmarx-ast-eclipse-plugin/lib/ast-cli-java-wrapper-2.4.24.jar b/checkmarx-ast-eclipse-plugin/lib/ast-cli-java-wrapper-2.4.24.jar deleted file mode 100644 index b4e1e934..00000000 --- a/checkmarx-ast-eclipse-plugin/lib/ast-cli-java-wrapper-2.4.24.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e664771fd767accd5bd47057c5a6d4cc86d292c93191200d061ded6e3e527bdf -size 135732567 diff --git a/checkmarx-ast-eclipse-plugin/lib/commons-lang3-3.18.0.jar b/checkmarx-ast-eclipse-plugin/lib/commons-lang3-3.18.0.jar deleted file mode 100644 index 9359e524af3832d16fa50a11e6bddd6b5657a7e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 702952 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�VcIXhCioC0KammW*4`!*NL33 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 i8L^koZWJlO}Bge*gQp&5Ca)av)US8o{Yh0u8 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⋙3w>_8rL@{#L1s!vUnT|t?jFR2(|HIhEg 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 ~Rn3Q6T) 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 BDx`a@yDcIWM7g!S& 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

6Y8)Lv9`+-=;h0ElzZMp1d{jd;Tg~L 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 AO#lD@ diff --git a/checkmarx-ast-eclipse-plugin/lib/jackson-annotations-2.21.jar b/checkmarx-ast-eclipse-plugin/lib/jackson-annotations-2.21.jar deleted file mode 100644 index 8bcca189d5f2602cddda2face9e83062a3c6d499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82104 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

S_ouj3S2^<7xf74c3)vCz;;%;c8lHkcHDulPm9E z9)6t0)EU%|k`)_&S+YX%|A{7MV`pt+Xy;&RXiqA%%<>{EA#cTE3<=eH?5QK<#r z&rCdyq#v-&$H5I9mL78n6P0l`zP~+DrUwy5jnHd%cGfh_En7z=ulQ z@eh@_;}4a%;}4a1{Dn&w#7Gzfg^-(2AXv|{SqraBm-$`4HCJ8q_LO44g9w4ND zBm3p?`3I>KpR|~;kb)wOl<Fe;zm0+Xu?qj!CY66R+(+N@f4Pi4hWp17{%)cC6*0xXkbe49@L!4l z!o2ybaew8y{_}eO|1|C&Yxr+w(|^uYU%wM*`SIjmKS0rN|D5RKFUyYu@s9LHB|5JO7v}%P5ZDG+dUgL>7(^QZd;g7$yvtffo?DD^bubo$HTl z_X4+FE_i>4R5+Kjuw--nnwc$=)fij4epp1tnk8UqQ4HH4feMQ4rp--j)NFlUg!`WJ zywANn@7v>;_pkGL&vVXmp7(uzoFh{H_C0fF7eucDMH?1+t4*{*A&D16)JVtP_&b34 z6MqFd2fvOkw1Nsad;yPZ>fVqDTiAPbP6al03Q&bYD@v@lN!>3&grnR9&PU@8f zWtxRH!}YYxBYL~A*epkGp|%}Ie%J_t9Zsa>ztG#*QWXN~&f2{m=hS6=@%cwij$K#> z={bn3Yx$)CS5xwX9TFrEdwIzFu4DX6L$1}3oh_z+jV;T zBVCmc3f308gPO6k)M0Ejt^R)TO~k|syAJhjKBIdBCWfCsXj z2m?xpLIkr4cct5}U89my)&vIK8$fY_!tIk`SELkqoq>R%s`ftWI)o z8!c1?`Q4LQ2G-X`3tta*&KhZiHa58R3TBpmtPLvlS-R&jc>;Qk+x;`2DTv(eZ-#f>nh&>HZg8s)cPNUFH8Y043m1nW{wiFH zcTssjQM|+D_5~5#9g)2aaSYaFHO$!#h#NYr)*TnW-U^w7%n*S;4yU|U22!4(w`%HD zNmV{p7STA<=OUL$n3T;-wI6QV$K5G#t z*Q@Wvw5A+@QqXOD27bQD6i7=nC`V-Ok6&~N;>R&%@xZbK`%p?_(cydC8*;hRrv8_6 zN{{X?%7lr2OciJP`eu`y7=u3dK#%hmt-}z)_}qBgVRIC@79#~&-@kx>5|1!k$Q-Tg zh&lOcp4M}`|I|L{(+dmn5$b5M%9CsM*l;*W%j1>`QYOkX3eFigv9^n?xBPcaa^!%H(%h|DuD9m^;j1LSoiGWQ@s*fX zvgdF3o$r}sZScFIy@k4#+>L3Sbr9#W6xFSLf;$$FDK0 zeJaIaLv3=ALCbIQmx{i2WrkQ0TZGWcj{LpL|G6oM+;?g1LhesbpH>xbEEXv$L5t;a zb5DF>k|I}wR)FKZboq=TU@{T*RDxRZ`Du|X?oCg2n-Nco%83kGs)sW^!iu|+$4=++ zMov9>H_@^)+}baHW0s-kFc3AN8Or%LTt=^1N{kpnlSgx>sv0nfk@pr&g3JLATr>gD zGg6BkMKkg86~S{uiU1+AvPhumWcduZk{y(RFMI=2af(2{RlCV4<*@w1_tcx6P5y|vu i$9%%Y8WG5bV<{USj>E!>&9)W){#}f_&nftVwfzUyO>PSS diff --git a/checkmarx-ast-eclipse-plugin/lib/jackson-core-2.21.4.jar b/checkmarx-ast-eclipse-plugin/lib/jackson-core-2.21.4.jar deleted file mode 100644 index e2817baf8be81009ad3233e5b93a255b2c780ce5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 594183 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όMJ^ts-BL*H35u51 ze0`zSL0K{EgTDEAJMKMNd9!*MPB|t%%BU%UTA=Ri^a;-rb?l@8s0(_a_UAa)M_mMr z*mRW$aDZDk``X1+ z>0sEbK@EclSHH$PkHuC>)AjJwX4dS7>9yQqk|vtxTdP#Q8P+r9xr9xmr{Y0Dj&t{d z6U3Y(vB&`sVNNir2$&D2I~1{cH z2d7j=1}{wzTQ%=GZu-UX9)Lh>y!Zu3>y15xR`y9RrGHVr?%kJUhGZ-k^f59tvM@$c_mUQ6xikt%gz zJP}N{_@SpHw(G&AR@fD#7JHV^TQbd^ST86?pq*YHcPK=CNQG_br*`}UMsZcw1@)lp zK@l??LyT&90zrb|ltb8jQ-b1O$_*8xh#46=GOY+~8#1l3iAUVpLM#~kg0rx@+!BUo z+|^5UVPDX1z}v%McMQs2X(%7036ow7OZSE29Rw_0QuXa<1bVg2)la~!r#-qZP)E;Y z>V{Sx$<}fCU?a({0!}?u5pkp)f)@Kq+!Aa?Wo$!do>59aGeQQGD;g>BpTJyTW}Qj(A1K0G?=9Q<4ue=H1B z5MZ?F?%1pQgr^ISARGtSOe%-(F%ywSX7yJ6a4lX>;`;Q(UX zp(Nu<^-ehk(3)@_B

0fU3;2Ip~4SFTop`4FAK#!yfd?z!Ej6si=bmj~` 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%0D<1C+jaGJjSF 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

mB}5yz3?AFh8m52* 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

-@alg({r&;1_6Z^Rs#qIWpx5Md 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 qx%AVkr_~PiKvbbQlCd%sXL|<^5@9Om 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≈aeu!<P(Qd$J`%fEfId}@p_ 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