Skip to content

Commit 6554b9e

Browse files
authored
Security scans: Removing repository truncation for project scans (#4499)
* Removing project truncation for project scans
1 parent 5497ddc commit 6554b9e

File tree

7 files changed

+14
-61
lines changed

7 files changed

+14
-61
lines changed

plugins/toolkit/jetbrains-core/it/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererIntegrationTestBase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ open class CodeWhispererIntegrationTestBase(val projectRule: CodeInsightTestFixt
208208
verify(
209209
scanManager,
210210
timeout(60000).atLeastOnce()
211-
).renderResponseOnUIThread(issuesCaptor.capture(), any(), any(), CodeWhispererConstants.CodeAnalysisScope.PROJECT)
211+
).renderResponseOnUIThread(issuesCaptor.capture(), any(), CodeWhispererConstants.CodeAnalysisScope.PROJECT)
212212
issues = issuesCaptor.lastValue
213213
}
214214
verify(telemetryServiceSpy, timeout(60000).atLeastOnce()).sendSecurityScanEvent(codeScanEventCaptor.capture(), anyOrNull())

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanManager.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,6 @@ class CodeWhispererCodeScanManager(val project: Project) {
252252
renderResponseOnUIThread(
253253
issues,
254254
codeScanResponse.responseContext.payloadContext.scannedFiles,
255-
codeScanSessionConfig.isProjectTruncated(),
256255
scope
257256
)
258257
codeScanStatus = Result.Succeeded
@@ -631,7 +630,6 @@ class CodeWhispererCodeScanManager(val project: Project) {
631630
suspend fun renderResponseOnUIThread(
632631
issues: List<CodeWhispererCodeScanIssue>,
633632
scannedFiles: List<VirtualFile>,
634-
isProjectTruncated: Boolean,
635633
scope: CodeWhispererConstants.CodeAnalysisScope
636634
) {
637635
withContext(getCoroutineUiContext()) {
@@ -650,14 +648,14 @@ class CodeWhispererCodeScanManager(val project: Project) {
650648
codeScanIssuesContent.displayName =
651649
message("codewhisperer.codescan.scan_display_with_issues", totalIssuesCount, INACTIVE_TEXT_COLOR)
652650
}
653-
codeScanResultsPanel.updateAndDisplayScanResults(codeScanTreeModel, scannedFiles, isProjectTruncated, scope)
651+
codeScanResultsPanel.updateAndDisplayScanResults(codeScanTreeModel, scannedFiles, scope)
654652
}
655653
}
656654

657655
@TestOnly
658-
suspend fun testRenderResponseOnUIThread(issues: List<CodeWhispererCodeScanIssue>, scannedFiles: List<VirtualFile>, isProjectTruncated: Boolean) {
656+
suspend fun testRenderResponseOnUIThread(issues: List<CodeWhispererCodeScanIssue>, scannedFiles: List<VirtualFile>) {
659657
assert(ApplicationManager.getApplication().isUnitTestMode)
660-
renderResponseOnUIThread(issues, scannedFiles, isProjectTruncated, CodeWhispererConstants.CodeAnalysisScope.PROJECT)
658+
renderResponseOnUIThread(issues, scannedFiles, CodeWhispererConstants.CodeAnalysisScope.PROJECT)
661659
}
662660

663661
companion object {

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanResultsView.kt

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
package software.aws.toolkits.jetbrains.services.codewhisperer.codescan
55

66
import com.intellij.icons.AllIcons
7-
import com.intellij.ide.BrowserUtil
87
import com.intellij.openapi.actionSystem.ActionGroup
98
import com.intellij.openapi.actionSystem.ActionManager
109
import com.intellij.openapi.actionSystem.ActionToolbar
@@ -27,7 +26,6 @@ import java.awt.BorderLayout
2726
import java.awt.Component
2827
import java.awt.GridBagConstraints
2928
import java.awt.GridBagLayout
30-
import java.net.URI
3129
import java.time.Instant
3230
import java.time.format.DateTimeFormatter
3331
import javax.swing.BorderFactory
@@ -122,7 +120,6 @@ internal class CodeWhispererCodeScanResultsView(private val project: Project) :
122120
fun updateAndDisplayScanResults(
123121
scanTreeModel: CodeWhispererCodeScanTreeModel,
124122
scannedFiles: List<VirtualFile>,
125-
isProjectTruncated: Boolean,
126123
scope: CodeWhispererConstants.CodeAnalysisScope
127124
) {
128125
codeScanTree.apply {
@@ -134,13 +131,6 @@ internal class CodeWhispererCodeScanResultsView(private val project: Project) :
134131
this.scannedFiles = scannedFiles
135132
}
136133

137-
if (isProjectTruncated) {
138-
learnMoreLabelLink.addActionListener {
139-
// TODO: Change this URL to point to updated security scan documentation
140-
BrowserUtil.browse(URI("https://docs.aws.amazon.com/codewhisperer/latest/userguide/security-scans.html"))
141-
}
142-
}
143-
144134
resultsPanel.apply {
145135
if (components.contains(progressIndicator)) remove(progressIndicator)
146136
add(BorderLayout.CENTER, splitter)
@@ -151,7 +141,7 @@ internal class CodeWhispererCodeScanResultsView(private val project: Project) :
151141
}
152142

153143
if (scope == CodeWhispererConstants.CodeAnalysisScope.PROJECT) {
154-
changeInfoLabelToDisplayScanCompleted(scannedFiles.size, isProjectTruncated)
144+
changeInfoLabelToDisplayScanCompleted(scannedFiles.size)
155145
}
156146
}
157147

@@ -244,28 +234,21 @@ internal class CodeWhispererCodeScanResultsView(private val project: Project) :
244234
}
245235
}
246236

247-
private fun changeInfoLabelToDisplayScanCompleted(numScannedFiles: Int, isProjectTruncated: Boolean) {
237+
private fun changeInfoLabelToDisplayScanCompleted(numScannedFiles: Int) {
248238
completeInfoLabel.isVisible = true
249239
infoLabelPrefix.icon = AllIcons.Actions.Commit
250240
infoLabelPrefix.text = message(
251241
"codewhisperer.codescan.run_scan_complete",
252242
numScannedFiles,
253243
(codeScanTree.model as CodeWhispererCodeScanTreeModel).getTotalIssuesCount(),
254244
project.name,
255-
if (isProjectTruncated) 1 else 0,
256245
INACTIVE_TEXT_COLOR,
257246
DateTimeFormatter.ISO_INSTANT.format(Instant.now())
258247
)
259248
infoLabelPrefix.repaint()
260249
infoLabelPrefix.isVisible = true
261250
scannedFilesLabelLink.text = message("codewhisperer.codescan.view_scanned_files", numScannedFiles)
262251
scannedFilesLabelLink.isVisible = true
263-
if (isProjectTruncated) {
264-
learnMoreLabelLink.apply {
265-
text = message("aws.settings.learn_more")
266-
isVisible = true
267-
}
268-
}
269252
}
270253

271254
private fun createToolbar(): ActionToolbar {

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/sessionconfig/CodeScanSessionConfig.kt

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ class CodeScanSessionConfig(
4545
}
4646
private set
4747

48-
private var isProjectTruncated = false
49-
5048
/**
5149
* Timeout for the overall job - "Run Security Scan".
5250
*/
@@ -60,11 +58,8 @@ class CodeScanSessionConfig(
6058
else -> (DEFAULT_PAYLOAD_LIMIT_IN_BYTES)
6159
}
6260

63-
private fun willExceedPayloadLimit(currentTotalFileSize: Long, currentFileSize: Long): Boolean {
64-
val exceedsLimit = currentTotalFileSize > getPayloadLimitInBytes() - currentFileSize
65-
isProjectTruncated = isProjectTruncated || exceedsLimit
66-
return exceedsLimit
67-
}
61+
private fun willExceedPayloadLimit(currentTotalFileSize: Long, currentFileSize: Long): Boolean =
62+
currentTotalFileSize.let { totalSize -> totalSize > (getPayloadLimitInBytes() - currentFileSize) }
6863

6964
private var programmingLanguage: CodeWhispererProgrammingLanguage = selectedFile?.programmingLanguage() ?: CodeWhispererUnknownLanguage.INSTANCE
7065

@@ -159,7 +154,7 @@ class CodeScanSessionConfig(
159154
if (!changeListManager.isIgnoredFile(current) && !files.contains(current.path)
160155
) {
161156
if (willExceedPayloadLimit(currentTotalFileSize, current.length)) {
162-
break@moduleLoop
157+
fileTooLarge()
163158
} else {
164159
val language = current.programmingLanguage()
165160
if (language != CodeWhispererPlainText.INSTANCE && language != CodeWhispererUnknownLanguage.INSTANCE) {
@@ -196,8 +191,6 @@ class CodeScanSessionConfig(
196191
return PayloadMetadata(files, currentTotalFileSize, currentTotalLines, maxCountLanguage.toTelemetryType())
197192
}
198193

199-
fun isProjectTruncated() = isProjectTruncated
200-
201194
fun getPath(root: String, relativePath: String = ""): Path? = try {
202195
Path.of(root, relativePath).normalize()
203196
} catch (e: Exception) {

plugins/toolkit/jetbrains-core/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanTestBase.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@ open class CodeWhispererCodeScanTestBase(projectRule: CodeInsightTestFixtureRule
251251
assertThat(includedSourceFiles.size).isEqualTo(includedSourceFilesSize)
252252
assertThat(srcPayloadSize).isEqualTo(totalSize)
253253
assertThat(totalLines).isEqualTo(expectedTotalLines)
254-
assertThat(sessionConfigSpy.isProjectTruncated()).isFalse
255254
assertThat(maxCountLanguage).isEqualTo(payloadLanguage)
256255
}
257256

@@ -286,7 +285,6 @@ open class CodeWhispererCodeScanTestBase(projectRule: CodeInsightTestFixtureRule
286285
scanManagerSpy.testRenderResponseOnUIThread(
287286
codeScanResponse.issues,
288287
codeScanResponse.responseContext.payloadContext.scannedFiles,
289-
sessionConfigSpy.isProjectTruncated()
290288
)
291289
assertNotNull(scanManagerSpy.getScanTree().model)
292290
val treeModel = scanManagerSpy.getScanTree().model as? CodeWhispererCodeScanTreeModel

plugins/toolkit/jetbrains-core/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererProjectCodeScanTest.kt

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.intellij.openapi.vfs.VirtualFile
77
import org.assertj.core.api.Assertions.assertThat
88
import org.junit.Before
99
import org.junit.Test
10+
import org.junit.jupiter.api.assertThrows
1011
import org.mockito.kotlin.any
1112
import org.mockito.kotlin.spy
1213
import org.mockito.kotlin.stub
@@ -92,33 +93,13 @@ class CodeWhispererProjectCodeScanTest : CodeWhispererCodeScanTestBase(PythonCod
9293
}
9394

9495
@Test
95-
fun `test createPayload with custom payload limit`() {
96+
fun `test createPayload should throw CodeWhispererCodeScanException if project size is more than Payload Limit`() {
9697
sessionConfigSpy.stub {
9798
onGeneric { getPayloadLimitInBytes() }.thenReturn(900)
9899
}
99-
val payload = sessionConfigSpy.createPayload()
100-
assertNotNull(payload)
101-
assertThat(sessionConfigSpy.isProjectTruncated()).isTrue
102-
103-
assertThat(payload.context.totalFiles).isEqualTo(3)
104-
105-
assertThat(payload.context.scannedFiles.size).isEqualTo(3)
106-
assertThat(payload.context.scannedFiles).containsExactly(testYaml, testTf, readMeMd)
107-
108-
// Adding 16 Bytes for read me Markdown file across all tests.
109-
assertThat(payload.context.srcPayloadSize).isEqualTo(651)
110-
assertThat(payload.context.language).isEqualTo(CodewhispererLanguage.Yaml)
111-
assertThat(payload.context.totalLines).isEqualTo(29)
112-
assertNotNull(payload.srcZip)
113-
114-
val bufferedInputStream = BufferedInputStream(payload.srcZip.inputStream())
115-
val zis = ZipInputStream(bufferedInputStream)
116-
var filesInZip = 0
117-
while (zis.nextEntry != null) {
118-
filesInZip += 1
100+
assertThrows<CodeWhispererCodeScanException> {
101+
sessionConfigSpy.createPayload()
119102
}
120-
121-
assertThat(filesInZip).isEqualTo(3)
122103
}
123104

124105
@Test

plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ codewhisperer.codescan.no_file_open=Amazon Q: No file is open in an active edito
750750
codewhisperer.codescan.no_file_open_telemetry=Open a valid file to scan.
751751
codewhisperer.codescan.problems_window_not_found=Unable to display Security Scan results as the Problems View tool window cannot be fetched.
752752
codewhisperer.codescan.run_scan=Run Project Scan
753-
codewhisperer.codescan.run_scan_complete=<html><body> Security Scan completed for {0, choice, 1#1 file|2#{0,number} files}. {1, choice, 0#No issues|1#1 issue|2#{1,number} issues} found in {2}. {3, choice, 0# |1# File size limit reached.} <font color="{4}"> Last Run {5} </font></body></html>
753+
codewhisperer.codescan.run_scan_complete=<html><body> Security Scan completed for {0, choice, 1#1 file|2#{0,number} files}. {1, choice, 0#No issues|1#1 issue|2#{1,number} issues} found in {2}. <font color="{3}"> Last Run {4} </font></body></html>
754754
codewhisperer.codescan.run_scan_error=Amazon Q encountered an error while scanning for security issues. Please try again later.
755755
codewhisperer.codescan.run_scan_error_telemetry=Security scan failed.
756756
codewhisperer.codescan.run_scan_info=Select 'Run' in toolbar to scan this package for security issues.

0 commit comments

Comments
 (0)