From 2d3ae1afee77b4bc4aee1726ee27a21a490886c1 Mon Sep 17 00:00:00 2001 From: Vladimir Parfinenko Date: Fri, 26 Jul 2024 13:53:08 +0200 Subject: [PATCH] [debugger] limit sensitive information spoiling during breakpoint variant information collection * Collect only in monorepo (isInternal is not safe) * All code goes as an optional attachment Inspired by feedback: https://jetbrains.slack.com/archives/C1L34V7H8/p1721978736350929 GitOrigin-RevId: 33a01a9f8231db0dded6830aeb3e51383eda750c --- .../BreakpointVariantPriorityTracker.kt | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/BreakpointVariantPriorityTracker.kt b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/BreakpointVariantPriorityTracker.kt index d16dffed1ef8..4f34377d793c 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/BreakpointVariantPriorityTracker.kt +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/BreakpointVariantPriorityTracker.kt @@ -3,9 +3,12 @@ package com.intellij.xdebugger.impl.breakpoints import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.readAction +import com.intellij.openapi.diagnostic.Attachment import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.Document import com.intellij.openapi.fileEditor.FileDocumentManager +import com.intellij.openapi.project.IntelliJProjectUtil +import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.registry.Registry import com.intellij.openapi.vfs.VirtualFileManager @@ -33,7 +36,7 @@ private data class Event(val breakpoint: XLineBreakpoint<*>, val fileUrl: String, val line: Int, val kind: EventKind, val time: Long) -internal class BreakpointVariantPriorityTracker(private val coroutineScope: CoroutineScope) +internal class BreakpointVariantPriorityTracker(private val project: Project, private val coroutineScope: CoroutineScope) : XBreakpointListener> { private val events = ArrayDeque() @@ -41,7 +44,8 @@ internal class BreakpointVariantPriorityTracker(private val coroutineScope: Coro private fun isEnabled(): Boolean = Registry.`is`("debugger.report.non.default.inline.breakpoint") && - ApplicationManager.getApplication().let { it.isInternal && !it.isUnitTestMode } + IntelliJProjectUtil.isIntelliJPlatformProject(project) && + !ApplicationManager.getApplication().isUnitTestMode init { coroutineScope.launch { @@ -153,15 +157,27 @@ internal class BreakpointVariantPriorityTracker(private val coroutineScope: Coro assert(isEnabled()) // Better to do a double check. - LOG.error(""" - |Non-default breakpoint variant was set. Not an error, but we are glad to collect them. Thank you for reporting! - | - |Default variant: ${getDescription(fileUrl, defaultBreakpoint)} - |Expected variant: ${getDescription(fileUrl, expectedBreakpoint)} - | - |Context at $fileUrl:${line + 1}: - |${getFileContext(fileUrl, line)} - |""".trimMargin()) + val safeDesc = """ + |Default variant: ${getDescription(defaultBreakpoint)} + |Expected variant: ${getDescription(expectedBreakpoint)} + """.trimMargin() + + val msg = """ + |Non-default breakpoint variant was set. Not an error, but we are glad to collect them. Thank you for reporting! + |If you don't ever want to report this, set registry debugger.report.non.default.inline.breakpoint=false. + | + |$safeDesc + """.trimMargin() + val context = """ + |$safeDesc + | + |Default variant text: ${getText(fileUrl, defaultBreakpoint)} + |Expected variant text: ${getText(fileUrl, expectedBreakpoint)} + | + |Context at $fileUrl:${line + 1}: + |${getFileContext(fileUrl, line)} + """.trimMargin() + LOG.error(msg, Attachment("context.txt", context)) } } @@ -176,14 +192,15 @@ internal class BreakpointVariantPriorityTracker(private val coroutineScope: Coro } @RequiresReadLock - private fun getDescription(fileUrl: String, b: XLineBreakpoint<*>): String { - val kind = b.generalDescription - val text = when (val range = b.highlightRange) { + private fun getDescription(b: XLineBreakpoint<*>): String = + "${b.type.id}, ${b.generalDescription}" + + @RequiresReadLock + private fun getText(fileUrl: String, b: XLineBreakpoint<*>): String = + when (val range = b.highlightRange) { null -> "" else -> readDocument(fileUrl) { it.getText(range) } } - return "${b.type.id}, $kind: $text" - } @RequiresReadLock private fun getFileContext(fileUrl: String, line: Int): String {