Skip to content

Commit cffdb5d

Browse files
committed
fix / cleanup
1 parent 6e63a5c commit cffdb5d

File tree

3 files changed

+10
-81
lines changed

3 files changed

+10
-81
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,12 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryp
6060
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.createExtendedClientMetadata
6161
import software.aws.toolkits.jetbrains.services.amazonq.project.EncoderServer
6262
import software.aws.toolkits.jetbrains.services.amazonq.project.IndexRequest
63-
import software.aws.toolkits.jetbrains.services.amazonq.project.IndexUpdateMode
6463
import software.aws.toolkits.jetbrains.services.amazonq.project.InlineBm25Chunk
65-
import software.aws.toolkits.jetbrains.services.amazonq.project.LspMessage
64+
import software.aws.toolkits.jetbrains.services.amazonq.project.LspRequest
6665
import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextProvider
6766
import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextProvider.Usage
6867
import software.aws.toolkits.jetbrains.services.amazonq.project.QueryChatRequest
6968
import software.aws.toolkits.jetbrains.services.amazonq.project.QueryInlineCompletionRequest
70-
import software.aws.toolkits.jetbrains.services.amazonq.project.RelevantDocument
7169
import software.aws.toolkits.jetbrains.services.amazonq.project.UpdateIndexRequest
7270
import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata
7371
import java.io.IOException
@@ -350,6 +348,8 @@ private class AmazonQServerInstance(private val project: Project, private val cs
350348

351349

352350
class EncoderServer2(private val encoderServer: EncoderServer, private val commandLine: GeneralCommandLine, private val project: Project, private val cs: CoroutineScope) : Disposable {
351+
private val encryptionManager = JwtEncryptionManager()
352+
353353
private val launcher: Launcher<EncoderServerLspInterface>
354354

355355
val languageServer: EncoderServerLspInterface
@@ -465,8 +465,9 @@ class EncoderServer2(private val encoderServer: EncoderServer, private val comma
465465
)
466466
.wrapMessages { consumer ->
467467
MessageConsumer { message ->
468-
if (message is RequestMessage && message.params is LspMessage) {
469-
message.params = encoderServer.encrypt(jacksonObjectMapper().writeValueAsString(message))
468+
if (message is RequestMessage && message.params is LspRequest) {
469+
println(message.params)
470+
message.params = encryptionManager.encrypt(jacksonObjectMapper().writeValueAsString(message.params))
470471
}
471472
consumer.consume(message)
472473
}
@@ -479,7 +480,7 @@ class EncoderServer2(private val encoderServer: EncoderServer, private val comma
479480

480481
initializer = cs.launch {
481482
// encryption info must be sent within 5s or Flare process will exit
482-
launcherHandler.process.outputStream.write(encoderServer.getEncryptionRequest().toByteArray())
483+
encryptionManager.writeInitializationPayload(launcherHandler.process.outputStream)
483484

484485
val initializeResult = try {
485486
withTimeout(5.seconds) {

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/EncoderServer.kt

Lines changed: 3 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,18 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.project
55

6-
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
76
import com.intellij.execution.configurations.GeneralCommandLine
8-
import com.intellij.execution.process.KillableProcessHandler
97
import com.intellij.openapi.Disposable
108
import com.intellij.openapi.application.ApplicationManager
119
import com.intellij.openapi.project.Project
12-
import com.intellij.openapi.util.process.ProcessCloseUtil
10+
import com.intellij.openapi.util.Disposer
1311
import com.intellij.util.io.HttpRequests
1412
import com.intellij.util.io.createDirectories
1513
import com.intellij.util.net.NetUtils
16-
import com.nimbusds.jose.JOSEObjectType
17-
import com.nimbusds.jose.JWSAlgorithm
18-
import com.nimbusds.jose.JWSHeader
19-
import com.nimbusds.jose.crypto.MACSigner
20-
import com.nimbusds.jwt.JWTClaimsSet
21-
import com.nimbusds.jwt.SignedJWT
2214
import kotlinx.coroutines.CoroutineScope
2315
import org.apache.commons.codec.digest.DigestUtils
2416
import software.amazon.awssdk.utils.UserHomeDirectoryUtils
2517
import software.aws.toolkits.core.utils.getLogger
26-
import software.aws.toolkits.core.utils.info
2718
import software.aws.toolkits.core.utils.tryDirOp
2819
import software.aws.toolkits.core.utils.warn
2920
import software.aws.toolkits.jetbrains.services.amazonq.lsp.EncoderServer2
@@ -35,11 +26,6 @@ import java.nio.file.Files
3526
import java.nio.file.Path
3627
import java.nio.file.Paths
3728
import java.nio.file.attribute.PosixFilePermission
38-
import java.security.Key
39-
import java.security.SecureRandom
40-
import java.util.Base64
41-
import java.util.concurrent.atomic.AtomicInteger
42-
import javax.crypto.spec.SecretKeySpec
4329

4430
class EncoderServer(val project: Project, private val cs: CoroutineScope) : Disposable {
4531
val cachePath = Paths.get(
@@ -49,9 +35,6 @@ class EncoderServer(val project: Project, private val cs: CoroutineScope) : Disp
4935
private val serverDirectoryName = "qserver-${manifestManager.currentVersion}.zip"
5036
val port by lazy { NetUtils.findAvailableSocketPort() }
5137
private val nodeRunnableName = if (manifestManager.getOs() == "windows") "node.exe" else "node"
52-
private val key = generateHmacKey()
53-
private var processHandler: KillableProcessHandler? = null
54-
private val mapper = jacksonObjectMapper()
5538
lateinit var encoderServer2: EncoderServer2
5639

5740
fun downloadArtifactsAndStartServer() {
@@ -62,39 +45,7 @@ class EncoderServer(val project: Project, private val cs: CoroutineScope) : Disp
6245
start()
6346
}
6447

65-
fun isNodeProcessRunning() = processHandler != null && processHandler?.process?.isAlive == true
66-
67-
private fun generateHmacKey(): Key {
68-
val keyBytes = ByteArray(32)
69-
SecureRandom().nextBytes(keyBytes)
70-
return SecretKeySpec(keyBytes, "HmacSHA256")
71-
}
72-
73-
fun encrypt(data: String): String {
74-
val header = JWSHeader.Builder(JWSAlgorithm.HS256)
75-
.type(JOSEObjectType.JWT)
76-
.build()
77-
78-
val claimsSet = JWTClaimsSet.Builder()
79-
.subject(Base64.getUrlEncoder().withoutPadding().encodeToString(data.toByteArray()))
80-
.build()
81-
82-
val signedJWT = SignedJWT(header, claimsSet)
83-
signedJWT.sign(MACSigner(key.encoded))
84-
85-
return signedJWT.serialize()
86-
}
87-
88-
data class EncryptionRequest(
89-
val version: String = "1.0",
90-
val mode: String = "JWT",
91-
val key: String,
92-
)
93-
94-
fun getEncryptionRequest(): String {
95-
val request = EncryptionRequest(key = Base64.getUrlEncoder().withoutPadding().encodeToString(key.encoded))
96-
return mapper.writeValueAsString(request) + "\n"
97-
}
48+
fun isNodeProcessRunning() = encoderServer2.initializer.isCompleted
9849

9950
private fun getCommand(): GeneralCommandLine {
10051
val threadCount = CodeWhispererSettings.getInstance().getProjectContextIndexThreadCount()
@@ -123,7 +74,7 @@ class EncoderServer(val project: Project, private val cs: CoroutineScope) : Disp
12374
}
12475

12576
private fun close() {
126-
processHandler?.process?.let { ProcessCloseUtil.close(it) }
77+
Disposer.dispose(encoderServer2)
12778
}
12879

12980
private fun downloadArtifactsIfNeeded() {

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextProvider.kt

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package software.aws.toolkits.jetbrains.services.amazonq.project
66
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
77
import com.fasterxml.jackson.annotation.JsonProperty
88
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
9-
import com.fasterxml.jackson.module.kotlin.readValue
109
import com.intellij.openapi.Disposable
1110
import com.intellij.openapi.application.ApplicationManager
1211
import com.intellij.openapi.project.BaseProjectDirectories.Companion.getBaseDirectories
@@ -31,8 +30,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.SUPPLEMENTAL_CONTEXT_TIM
3130
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.getStartUrl
3231
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
3332
import software.aws.toolkits.telemetry.AmazonqTelemetry
34-
import java.io.OutputStreamWriter
35-
import java.net.HttpURLConnection
3633
import java.util.concurrent.atomic.AtomicBoolean
3734
import java.util.concurrent.atomic.AtomicInteger
3835
import kotlin.time.measureTimedValue
@@ -212,26 +209,6 @@ class ProjectContextProvider(val project: Project, private val encoderServer: En
212209
)
213210
}
214211

215-
private fun setConnectionTimeout(connection: HttpURLConnection, timeout: Int) {
216-
connection.connectTimeout = timeout
217-
connection.readTimeout = timeout
218-
}
219-
220-
private fun setConnectionProperties(connection: HttpURLConnection) {
221-
connection.requestMethod = "POST"
222-
connection.setRequestProperty("Content-Type", "text/plain")
223-
connection.setRequestProperty("Accept", "text/plain")
224-
}
225-
226-
private fun setConnectionRequest(connection: HttpURLConnection, payload: String) {
227-
connection.doOutput = true
228-
connection.outputStream.use { outputStream ->
229-
OutputStreamWriter(outputStream).use { writer ->
230-
writer.write(payload)
231-
}
232-
}
233-
}
234-
235212
private fun willExceedPayloadLimit(currentTotalFileSize: Long, currentFileSize: Long): Boolean {
236213
val maxSize = CodeWhispererSettings.getInstance().getProjectContextIndexMaxSize()
237214
return currentTotalFileSize.let { totalSize -> totalSize > (maxSize * 1024 * 1024 - currentFileSize) }

0 commit comments

Comments
 (0)