Skip to content

Commit 526eb4a

Browse files
Merge main into feature/q-lsp
2 parents e3aed6c + 1bd99f4 commit 526eb4a

File tree

4 files changed

+24
-6
lines changed

4 files changed

+24
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "/review: normalize relative file path before unzipping"
4+
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/sessionconfig/CodeScanSessionConfig.kt

+3-6
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.utils.Ama
3030
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
3131
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererUnknownLanguage
3232
import software.aws.toolkits.jetbrains.services.codewhisperer.language.programmingLanguage
33-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.CodeWhispererTelemetryService
3433
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.CODE_SCAN_CREATE_PAYLOAD_TIMEOUT_IN_SECONDS
3534
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.CodeAnalysisScope
3635
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.DEFAULT_CODE_SCAN_TIMEOUT_IN_SECONDS
3736
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.DEFAULT_PAYLOAD_LIMIT_IN_BYTES
3837
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.EXPRESS_SCAN_TIMEOUT_IN_SECONDS
3938
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.FILE_SCAN_PAYLOAD_SIZE_LIMIT_IN_BYTES
39+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getNormalizedRelativePath
4040
import software.aws.toolkits.jetbrains.services.codewhisperer.util.GitIgnoreFilteringUtil
4141
import software.aws.toolkits.jetbrains.services.codewhisperer.util.isWithin
4242
import software.aws.toolkits.resources.message
@@ -196,12 +196,9 @@ class CodeScanSessionConfig(
196196
private fun zipFiles(files: List<Path>, codeDiff: String? = null): File = createTemporaryZipFile {
197197
files.forEach { file ->
198198
try {
199-
val relativePath = "${project.name}/${file.relativeTo(projectRoot.toNioPath())}"
200-
if (relativePath.contains("../") || relativePath.contains("..\\")) {
201-
CodeWhispererTelemetryService.getInstance().sendInvalidZipEvent(file, projectRoot.toNioPath(), relativePath)
202-
}
199+
val relativePath = getNormalizedRelativePath(project.name, file.relativeTo(projectRoot.toNioPath()))
203200
LOG.debug { "Selected file for truncation: $file" }
204-
it.putNextEntry(relativePath.toString(), file)
201+
it.putNextEntry(relativePath, file)
205202
} catch (e: Exception) {
206203
cannotFindFile("Zipping error: ${e.message}", file.pathString)
207204
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererUtil.kt

+5
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ import software.aws.toolkits.resources.message
5656
import software.aws.toolkits.telemetry.CodewhispererCompletionType
5757
import software.aws.toolkits.telemetry.CodewhispererGettingStartedTask
5858
import software.aws.toolkits.telemetry.CredentialSourceId
59+
import java.nio.file.Path
60+
import java.nio.file.Paths
5961

6062
// Controls the condition to send telemetry event to CodeWhisperer service, currently:
6163
// 1. It will be sent for Builder ID users, only if they have optin telemetry sharing.
@@ -329,6 +331,9 @@ object CodeWhispererUtil {
329331
WindowManager.getInstance().setAlphaModeRatio(it, alpha)
330332
}
331333
}
334+
335+
fun getNormalizedRelativePath(projectName: String, relativePath: Path): String =
336+
Paths.get(projectName).resolve(relativePath).normalize().toString()
332337
}
333338

334339
enum class CaretMovement {

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererProjectCodeScanTest.kt

+12
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ import org.mockito.kotlin.spy
1414
import org.mockito.kotlin.stub
1515
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.CodeScanSessionConfig
1616
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
17+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getNormalizedRelativePath
1718
import software.aws.toolkits.jetbrains.utils.rules.PythonCodeInsightTestFixtureRule
1819
import software.aws.toolkits.jetbrains.utils.rules.addFileToModule
1920
import software.aws.toolkits.jetbrains.utils.rules.addModule
2021
import software.aws.toolkits.telemetry.CodewhispererLanguage
2122
import java.io.BufferedInputStream
23+
import java.nio.file.Paths
2224
import java.util.zip.ZipInputStream
2325
import kotlin.io.path.relativeTo
2426
import kotlin.test.assertNotNull
@@ -108,6 +110,16 @@ class CodeWhispererProjectCodeScanTest : CodeWhispererCodeScanTestBase(PythonCod
108110
assertE2ERunsSuccessfully(sessionConfigSpy, project, totalLines, 10, totalSize, 1)
109111
}
110112

113+
@Test
114+
fun `test getNormalizedRelativePath()`() {
115+
assertThat(
116+
listOf("projectName\\src\\PackageName", "projectName/src/PackageName")
117+
).contains(getNormalizedRelativePath("projectName", Paths.get("src/PackageName")))
118+
assertThat(
119+
listOf("projectName\\src\\Package2", "projectName/src/Package2")
120+
).contains(getNormalizedRelativePath("projectName", Paths.get("src/./Package1/../Package2")))
121+
}
122+
111123
private fun setupCsharpProject() {
112124
val testModule = projectRule.fixture.addModule("testModule")
113125
val testModule2 = projectRule.fixture.addModule("testModule2")

0 commit comments

Comments
 (0)