From 23235b938a317fd3c5d96ca1af6e5d8d63f69cc5 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 20 Jan 2025 15:25:06 +0100 Subject: [PATCH] Only send {{auto}} ip-adress if sendDefaultPii is enabled (8.x.x) (#4072) * Only provide {{auto}} ip-address if sendDefaultPii is enabled * Update Changelog * Fix PR number * Fix test --- CHANGELOG.md | 5 +++++ .../android/core/AnrV2EventProcessor.java | 2 +- .../core/DefaultAndroidEventProcessor.java | 2 +- .../android/core/AnrV2EventProcessorTest.kt | 18 ++++++++++++--- .../core/DefaultAndroidEventProcessorTest.kt | 22 ++++++++++++++++--- .../java/io/sentry/MainEventProcessor.java | 2 +- .../java/io/sentry/MainEventProcessorTest.kt | 10 +++++++++ 7 files changed, 52 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc8410f7a4..93c0e14b38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +### Behavioural Changes + +- The user ip-address is now only set to `"{{auto}}"` if sendDefaultPii is enabled ([#4072](https://github.com/getsentry/sentry-java/pull/4072)) + - This change gives you control over IP address collection directly on the client + ### Fixes - Do not set the exception group marker when there is a suppressed exception ([#4056](https://github.com/getsentry/sentry-java/pull/4056)) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java index 7295671e44..76beb87840 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java @@ -580,7 +580,7 @@ private void mergeUser(final @NotNull SentryBaseEvent event) { if (user.getId() == null) { user.setId(getDeviceId()); } - if (user.getIpAddress() == null) { + if (user.getIpAddress() == null && options.isSendDefaultPii()) { user.setIpAddress(IpAddressUtils.DEFAULT_IP_ADDRESS); } } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/DefaultAndroidEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/DefaultAndroidEventProcessor.java index ff85162a38..9125c66da2 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/DefaultAndroidEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/DefaultAndroidEventProcessor.java @@ -156,7 +156,7 @@ private void mergeUser(final @NotNull SentryBaseEvent event) { if (user.getId() == null) { user.setId(Installation.id(context)); } - if (user.getIpAddress() == null) { + if (user.getIpAddress() == null && options.isSendDefaultPii()) { user.setIpAddress(IpAddressUtils.DEFAULT_IP_ADDRESS); } } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt index d930333f4c..02044c81bf 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt @@ -85,7 +85,6 @@ class AnrV2EventProcessorTest { lateinit var context: Context val options = SentryAndroidOptions().apply { setLogger(NoOpLogger.getInstance()) - isSendDefaultPii = true } fun getSut( @@ -93,10 +92,13 @@ class AnrV2EventProcessorTest { currentSdk: Int = Build.VERSION_CODES.LOLLIPOP, populateScopeCache: Boolean = false, populateOptionsCache: Boolean = false, - replayErrorSampleRate: Double? = null + replayErrorSampleRate: Double? = null, + isSendDefaultPii: Boolean = true ): AnrV2EventProcessor { options.cacheDirPath = dir.newFolder().absolutePath options.environment = "release" + options.isSendDefaultPii = isSendDefaultPii + whenever(buildInfo.sdkInfoVersion).thenReturn(currentSdk) whenever(buildInfo.isEmulator).thenReturn(true) @@ -278,6 +280,7 @@ class AnrV2EventProcessorTest { // user assertEquals("bot", processed.user!!.username) assertEquals("bot@me.com", processed.user!!.id) + assertEquals("{{auto}}", processed.user!!.ipAddress) // trace assertEquals("ui.load", processed.contexts.trace!!.operation) // tags @@ -304,6 +307,13 @@ class AnrV2EventProcessorTest { assertEquals("Google Chrome", processed.contexts.browser!!.name) } + @Test + fun `when backfillable event is enrichable, does not backfill user ip`() { + val hint = HintUtils.createWithTypeCheckHint(BackfillableHint()) + val processed = processEvent(hint, isSendDefaultPii = false, populateScopeCache = true) + assertNull(processed.user!!.ipAddress) + } + @Test fun `when backfillable event is enrichable, backfills serialized options data`() { val hint = HintUtils.createWithTypeCheckHint(BackfillableHint()) @@ -617,6 +627,7 @@ class AnrV2EventProcessorTest { hint: Hint, populateScopeCache: Boolean = false, populateOptionsCache: Boolean = false, + isSendDefaultPii: Boolean = true, configureEvent: SentryEvent.() -> Unit = {} ): SentryEvent { val original = SentryEvent().apply(configureEvent) @@ -624,7 +635,8 @@ class AnrV2EventProcessorTest { val processor = fixture.getSut( tmpDir, populateScopeCache = populateScopeCache, - populateOptionsCache = populateOptionsCache + populateOptionsCache = populateOptionsCache, + isSendDefaultPii = isSendDefaultPii ) return processor.process(original, hint)!! } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/DefaultAndroidEventProcessorTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/DefaultAndroidEventProcessorTest.kt index 9aac83ebad..d3523dd1b5 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/DefaultAndroidEventProcessorTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/DefaultAndroidEventProcessorTest.kt @@ -66,7 +66,11 @@ class DefaultAndroidEventProcessorTest { lateinit var sentryTracer: SentryTracer - fun getSut(context: Context): DefaultAndroidEventProcessor { + fun getSut( + context: Context, + isSendDefaultPii: Boolean = false + ): DefaultAndroidEventProcessor { + options.isSendDefaultPii = isSendDefaultPii whenever(scopes.options).thenReturn(options) sentryTracer = SentryTracer(TransactionContext("", ""), scopes) return DefaultAndroidEventProcessor(context, buildInfo, options) @@ -284,8 +288,20 @@ class DefaultAndroidEventProcessorTest { } @Test - fun `when event user data does not have ip address set, sets {{auto}} as the ip address`() { - val sut = fixture.getSut(context) + fun `when event user data does not have ip address set, sets no ip address if sendDefaultPii is false`() { + val sut = fixture.getSut(context, isSendDefaultPii = false) + val event = SentryEvent().apply { + user = User() + } + sut.process(event, Hint()) + assertNotNull(event.user) { + assertNull(it.ipAddress) + } + } + + @Test + fun `when event user data does not have ip address set, sets {{auto}} if sendDefaultPii is true`() { + val sut = fixture.getSut(context, isSendDefaultPii = true) val event = SentryEvent().apply { user = User() } diff --git a/sentry/src/main/java/io/sentry/MainEventProcessor.java b/sentry/src/main/java/io/sentry/MainEventProcessor.java index 50f11cba27..0e319845d6 100644 --- a/sentry/src/main/java/io/sentry/MainEventProcessor.java +++ b/sentry/src/main/java/io/sentry/MainEventProcessor.java @@ -248,7 +248,7 @@ private void mergeUser(final @NotNull SentryBaseEvent event) { user = new User(); event.setUser(user); } - if (user.getIpAddress() == null) { + if (user.getIpAddress() == null && options.isSendDefaultPii()) { user.setIpAddress(IpAddressUtils.DEFAULT_IP_ADDRESS); } } diff --git a/sentry/src/test/java/io/sentry/MainEventProcessorTest.kt b/sentry/src/test/java/io/sentry/MainEventProcessorTest.kt index 3cb624d380..6ee8f19fe5 100644 --- a/sentry/src/test/java/io/sentry/MainEventProcessorTest.kt +++ b/sentry/src/test/java/io/sentry/MainEventProcessorTest.kt @@ -306,6 +306,16 @@ class MainEventProcessorTest { } } + @Test + fun `when event does not have ip address set, do not enrich ip address if sendDefaultPii is false`() { + val sut = fixture.getSut(sendDefaultPii = false) + val event = SentryEvent() + sut.process(event, Hint()) + assertNotNull(event.user) { + assertNull(it.ipAddress) + } + } + @Test fun `when event has ip address set, keeps original ip address`() { val sut = fixture.getSut(sendDefaultPii = true)