Skip to content

Commit 3cdb905

Browse files
authored
Only send {{auto}} ip-adress if sendDefaultPii is enabled (7.x.x) (#4071)
* Only provide {{auto}} ip-address if sendDefaultPii is enabled * Update changelog
1 parent 6381921 commit 3cdb905

File tree

7 files changed

+47
-9
lines changed

7 files changed

+47
-9
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ SentryAndroid.init(context) { options ->
2727

2828
If you would like to keep some of the default broadcast events as breadcrumbs, consider opening a [GitHub issue](https://github.com/getsentry/sentry-java/issues/new).
2929

30+
- The user ip-address is now only set to `"{{auto}}"` if sendDefaultPii is enabled ([#4071](https://github.com/getsentry/sentry-java/pull/4071))
31+
- This change gives you control over IP address collection directly on the client
32+
3033
## 7.20.0
3134

3235
### Features

sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ private void mergeUser(final @NotNull SentryBaseEvent event) {
574574
if (user.getId() == null) {
575575
user.setId(getDeviceId());
576576
}
577-
if (user.getIpAddress() == null) {
577+
if (user.getIpAddress() == null && options.isSendDefaultPii()) {
578578
user.setIpAddress(IpAddressUtils.DEFAULT_IP_ADDRESS);
579579
}
580580
}

sentry-android-core/src/main/java/io/sentry/android/core/DefaultAndroidEventProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ private void mergeUser(final @NotNull SentryBaseEvent event) {
156156
if (user.getId() == null) {
157157
user.setId(Installation.id(context));
158158
}
159-
if (user.getIpAddress() == null) {
159+
if (user.getIpAddress() == null && options.isSendDefaultPii()) {
160160
user.setIpAddress(IpAddressUtils.DEFAULT_IP_ADDRESS);
161161
}
162162
}

sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,20 @@ class AnrV2EventProcessorTest {
8585
lateinit var context: Context
8686
val options = SentryAndroidOptions().apply {
8787
setLogger(NoOpLogger.getInstance())
88-
isSendDefaultPii = true
8988
}
9089

9190
fun getSut(
9291
dir: TemporaryFolder,
9392
currentSdk: Int = Build.VERSION_CODES.LOLLIPOP,
9493
populateScopeCache: Boolean = false,
9594
populateOptionsCache: Boolean = false,
96-
replayErrorSampleRate: Double? = null
95+
replayErrorSampleRate: Double? = null,
96+
isSendDefaultPii: Boolean = true
9797
): AnrV2EventProcessor {
9898
options.cacheDirPath = dir.newFolder().absolutePath
9999
options.environment = "release"
100+
options.isSendDefaultPii = isSendDefaultPii
101+
100102
whenever(buildInfo.sdkInfoVersion).thenReturn(currentSdk)
101103
whenever(buildInfo.isEmulator).thenReturn(true)
102104

@@ -279,6 +281,7 @@ class AnrV2EventProcessorTest {
279281
// user
280282
assertEquals("bot", processed.user!!.username)
281283
assertEquals("bot@me.com", processed.user!!.id)
284+
assertEquals("{{auto}}", processed.user!!.ipAddress)
282285
// trace
283286
assertEquals("ui.load", processed.contexts.trace!!.operation)
284287
// tags
@@ -305,6 +308,13 @@ class AnrV2EventProcessorTest {
305308
assertEquals("Google Chrome", processed.contexts.browser!!.name)
306309
}
307310

311+
@Test
312+
fun `when backfillable event is enrichable, does not backfill user ip`() {
313+
val hint = HintUtils.createWithTypeCheckHint(BackfillableHint())
314+
val processed = processEvent(hint, isSendDefaultPii = false, populateScopeCache = true)
315+
assertNull(processed.user!!.ipAddress)
316+
}
317+
308318
@Test
309319
fun `when backfillable event is enrichable, backfills serialized options data`() {
310320
val hint = HintUtils.createWithTypeCheckHint(BackfillableHint())
@@ -618,14 +628,16 @@ class AnrV2EventProcessorTest {
618628
hint: Hint,
619629
populateScopeCache: Boolean = false,
620630
populateOptionsCache: Boolean = false,
631+
isSendDefaultPii: Boolean = true,
621632
configureEvent: SentryEvent.() -> Unit = {}
622633
): SentryEvent {
623634
val original = SentryEvent().apply(configureEvent)
624635

625636
val processor = fixture.getSut(
626637
tmpDir,
627638
populateScopeCache = populateScopeCache,
628-
populateOptionsCache = populateOptionsCache
639+
populateOptionsCache = populateOptionsCache,
640+
isSendDefaultPii = isSendDefaultPii
629641
)
630642
return processor.process(original, hint)!!
631643
}

sentry-android-core/src/test/java/io/sentry/android/core/DefaultAndroidEventProcessorTest.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ class DefaultAndroidEventProcessorTest {
6666

6767
lateinit var sentryTracer: SentryTracer
6868

69-
fun getSut(context: Context): DefaultAndroidEventProcessor {
69+
fun getSut(context: Context, isSendDefaultPii: Boolean = false): DefaultAndroidEventProcessor {
70+
options.isSendDefaultPii = isSendDefaultPii
7071
whenever(hub.options).thenReturn(options)
7172
sentryTracer = SentryTracer(TransactionContext("", ""), hub)
7273
return DefaultAndroidEventProcessor(context, buildInfo, options)
@@ -284,8 +285,20 @@ class DefaultAndroidEventProcessorTest {
284285
}
285286

286287
@Test
287-
fun `when event user data does not have ip address set, sets {{auto}} as the ip address`() {
288-
val sut = fixture.getSut(context)
288+
fun `when event user data does not have ip address set, sets no ip address if sendDefaultPii is false`() {
289+
val sut = fixture.getSut(context, isSendDefaultPii = false)
290+
val event = SentryEvent().apply {
291+
user = User()
292+
}
293+
sut.process(event, Hint())
294+
assertNotNull(event.user) {
295+
assertNull(it.ipAddress)
296+
}
297+
}
298+
299+
@Test
300+
fun `when event user data does not have ip address set, sets {{auto}} if sendDefaultPii is true`() {
301+
val sut = fixture.getSut(context, isSendDefaultPii = true)
289302
val event = SentryEvent().apply {
290303
user = User()
291304
}

sentry/src/main/java/io/sentry/MainEventProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ private void mergeUser(final @NotNull SentryBaseEvent event) {
245245
user = new User();
246246
event.setUser(user);
247247
}
248-
if (user.getIpAddress() == null) {
248+
if (user.getIpAddress() == null && options.isSendDefaultPii()) {
249249
user.setIpAddress(IpAddressUtils.DEFAULT_IP_ADDRESS);
250250
}
251251
}

sentry/src/test/java/io/sentry/MainEventProcessorTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,16 @@ class MainEventProcessorTest {
306306
}
307307
}
308308

309+
@Test
310+
fun `when event does not have ip address set, do not enrich ip address if sendDefaultPii is false`() {
311+
val sut = fixture.getSut(sendDefaultPii = false)
312+
val event = SentryEvent()
313+
sut.process(event, Hint())
314+
assertNotNull(event.user) {
315+
assertNull(it.ipAddress)
316+
}
317+
}
318+
309319
@Test
310320
fun `when event has ip address set, keeps original ip address`() {
311321
val sut = fixture.getSut(sendDefaultPii = true)

0 commit comments

Comments
 (0)