From 77b1d404e55953d9c6d68f04a05689810c86ccf2 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 15 Nov 2022 11:58:53 +0100 Subject: [PATCH 1/2] Fix corrupted UUID on Motorola devices --- sentry/api/sentry.api | 1 + sentry/src/main/java/io/sentry/SpanId.java | 5 +++-- .../main/java/io/sentry/protocol/SentryId.java | 5 +++-- .../main/java/io/sentry/util/StringUtils.java | 18 ++++++++++++++++++ .../java/io/sentry/protocol/SentryIdTest.kt | 13 +++++++++++++ .../java/io/sentry/util/StringUtilsTest.kt | 14 ++++++++++++++ 6 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 sentry/src/test/java/io/sentry/protocol/SentryIdTest.kt diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 55af4a3b1d..857fa457af 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -3376,6 +3376,7 @@ public final class io/sentry/util/StringUtils { public static fun capitalize (Ljava/lang/String;)Ljava/lang/String; public static fun countOf (Ljava/lang/String;C)I public static fun getStringAfterDot (Ljava/lang/String;)Ljava/lang/String; + public static fun normalizeUUID (Ljava/lang/String;)Ljava/lang/String; public static fun removeSurrounding (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; } diff --git a/sentry/src/main/java/io/sentry/SpanId.java b/sentry/src/main/java/io/sentry/SpanId.java index d0b78a5e89..8764578887 100644 --- a/sentry/src/main/java/io/sentry/SpanId.java +++ b/sentry/src/main/java/io/sentry/SpanId.java @@ -1,12 +1,13 @@ package io.sentry; import io.sentry.util.Objects; +import io.sentry.util.StringUtils; import java.io.IOException; import java.util.UUID; import org.jetbrains.annotations.NotNull; public final class SpanId implements JsonSerializable { - public static final SpanId EMPTY_ID = new SpanId(new UUID(0, 0).toString()); + public static final SpanId EMPTY_ID = new SpanId(new UUID(0, 0)); private final @NotNull String value; @@ -19,7 +20,7 @@ public SpanId() { } private SpanId(final @NotNull UUID uuid) { - this(uuid.toString().replace("-", "").substring(0, 16)); + this(StringUtils.normalizeUUID(uuid.toString()).replace("-", "").substring(0, 16)); } @Override diff --git a/sentry/src/main/java/io/sentry/protocol/SentryId.java b/sentry/src/main/java/io/sentry/protocol/SentryId.java index a2140747cf..3e4450536f 100644 --- a/sentry/src/main/java/io/sentry/protocol/SentryId.java +++ b/sentry/src/main/java/io/sentry/protocol/SentryId.java @@ -5,6 +5,7 @@ import io.sentry.JsonObjectReader; import io.sentry.JsonObjectWriter; import io.sentry.JsonSerializable; +import io.sentry.util.StringUtils; import java.io.IOException; import java.util.UUID; import org.jetbrains.annotations.NotNull; @@ -27,12 +28,12 @@ public SentryId(@Nullable UUID uuid) { } public SentryId(final @NotNull String sentryIdString) { - this.uuid = fromStringSentryId(sentryIdString); + this.uuid = fromStringSentryId(StringUtils.normalizeUUID(sentryIdString)); } @Override public String toString() { - return uuid.toString().replace("-", ""); + return StringUtils.normalizeUUID(uuid.toString()).replace("-", ""); } @Override diff --git a/sentry/src/main/java/io/sentry/util/StringUtils.java b/sentry/src/main/java/io/sentry/util/StringUtils.java index 6a487a6e32..2146014e8e 100644 --- a/sentry/src/main/java/io/sentry/util/StringUtils.java +++ b/sentry/src/main/java/io/sentry/util/StringUtils.java @@ -18,6 +18,9 @@ public final class StringUtils { private static final Charset UTF_8 = Charset.forName("UTF-8"); + private static final String CORRUPTED_NIL_UUID = "0000-0000"; + private static final String PROPER_NIL_UUID = "00000000-0000-0000-0000-000000000000"; + private StringUtils() {} public static @Nullable String getStringAfterDot(final @Nullable String str) { @@ -138,4 +141,19 @@ public static int countOf(@NotNull String str, char character) { } return count; } + + /** + * Normalizes UUID string representation to adhere to the actual UUID standard + * + *

Because Motorola decided that nil UUIDs should look like this: "0000-0000" ;) + * + * @param uuidString the original UUID string representation + * @return proper UUID string, in case it's a corrupted one + */ + public static String normalizeUUID(final @NotNull String uuidString) { + if (uuidString.equals(CORRUPTED_NIL_UUID)) { + return PROPER_NIL_UUID; + } + return uuidString; + } } diff --git a/sentry/src/test/java/io/sentry/protocol/SentryIdTest.kt b/sentry/src/test/java/io/sentry/protocol/SentryIdTest.kt new file mode 100644 index 0000000000..2aa24ec859 --- /dev/null +++ b/sentry/src/test/java/io/sentry/protocol/SentryIdTest.kt @@ -0,0 +1,13 @@ +package io.sentry.protocol + +import kotlin.test.Test +import kotlin.test.assertEquals + +class SentryIdTest { + + @Test + fun `does not throw when instantiated with corrupted UUID`() { + val id = SentryId("0000-0000") + assertEquals("00000000000000000000000000000000", id.toString()) + } +} diff --git a/sentry/src/test/java/io/sentry/util/StringUtilsTest.kt b/sentry/src/test/java/io/sentry/util/StringUtilsTest.kt index eecc51beb6..07c7c259ca 100644 --- a/sentry/src/test/java/io/sentry/util/StringUtilsTest.kt +++ b/sentry/src/test/java/io/sentry/util/StringUtilsTest.kt @@ -1,6 +1,7 @@ package io.sentry.util import org.mockito.kotlin.mock +import java.util.UUID import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNull @@ -115,4 +116,17 @@ class StringUtilsTest { assertNull(hashEmpty) } + + @Test + fun `returns proper nil UUID if the given string is corrupted`() { + val normalized = StringUtils.normalizeUUID("0000-0000") + assertEquals("00000000-0000-0000-0000-000000000000", normalized) + } + + @Test + fun `returns the unchanged UUID if it was not corrupted`() { + val original = UUID.randomUUID().toString() + val normalized = StringUtils.normalizeUUID(original) + assertEquals(original, normalized) + } } From b00e86b60ee1908105cdb4a171f219506f52b2f8 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 15 Nov 2022 12:09:19 +0100 Subject: [PATCH 2/2] Changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78d682c40d..af924736a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,12 @@ # Changelog -## 6.7.0 +## Unreleased ### Fixes - Fix `Gpu.vendorId` should be a String ([#2343](https://github.com/getsentry/sentry-java/pull/2343)) - Don't set device name on Android if `sendDefaultPii` is disabled ([#2354](https://github.com/getsentry/sentry-java/pull/2354)) +- Fix corrupted UUID on Motorola devices ([#2363](https://github.com/getsentry/sentry-java/pull/2363)) ### Features