diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/util/ua/UserAgentUtil.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/ua/UserAgentUtil.java index a0e718942..afbedf122 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/util/ua/UserAgentUtil.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/util/ua/UserAgentUtil.java @@ -7,25 +7,14 @@ package org.whispersystems.textsecuregcm.util.ua; import com.google.common.annotations.VisibleForTesting; import com.vdurmont.semver4j.Semver; -import org.apache.commons.lang3.StringUtils; - -import java.util.EnumMap; -import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.lang3.StringUtils; public class UserAgentUtil { private static final Pattern STANDARD_UA_PATTERN = Pattern.compile("^Signal-(Android|Desktop|iOS)/([^ ]+)( (.+))?$", Pattern.CASE_INSENSITIVE); - private static final Map LEGACY_PATTERNS_BY_PLATFORM = new EnumMap<>(ClientPlatform.class); - - static { - LEGACY_PATTERNS_BY_PLATFORM.put(ClientPlatform.ANDROID, Pattern.compile("^Signal-Android ([^ ]+)( (.+))?$", Pattern.CASE_INSENSITIVE)); - LEGACY_PATTERNS_BY_PLATFORM.put(ClientPlatform.DESKTOP, Pattern.compile("^Signal Desktop (.+)$", Pattern.CASE_INSENSITIVE)); - LEGACY_PATTERNS_BY_PLATFORM.put(ClientPlatform.IOS, Pattern.compile("^Signal/([^ ]+)( (.+))?$", Pattern.CASE_INSENSITIVE)); - } - public static UserAgent parseUserAgentString(final String userAgentString) throws UnrecognizedUserAgentException { if (StringUtils.isBlank(userAgentString)) { throw new UnrecognizedUserAgentException("User-Agent string is blank"); @@ -37,12 +26,6 @@ public class UserAgentUtil { if (standardUserAgent != null) { return standardUserAgent; } - - final UserAgent legacyUserAgent = parseLegacyUserAgentString(userAgentString); - - if (legacyUserAgent != null) { - return legacyUserAgent; - } } catch (final Exception e) { throw new UnrecognizedUserAgentException(e); } @@ -60,27 +43,4 @@ public class UserAgentUtil { return null; } - - @VisibleForTesting - static UserAgent parseLegacyUserAgentString(final String userAgentString) { - for (final Map.Entry entry : LEGACY_PATTERNS_BY_PLATFORM.entrySet()) { - final ClientPlatform platform = entry.getKey(); - final Pattern pattern = entry.getValue(); - final Matcher matcher = pattern.matcher(userAgentString); - - if (matcher.matches()) { - final UserAgent userAgent; - - if (matcher.groupCount() > 1) { - userAgent = new UserAgent(platform, new Semver(matcher.group(1)), StringUtils.stripToNull(matcher.group(matcher.groupCount()))); - } else { - userAgent = new UserAgent(platform, new Semver(matcher.group(1))); - } - - return userAgent; - } - } - - return null; - } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListenerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListenerTest.java index b7608e1de..aa916249d 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListenerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MetricsRequestEventListenerTest.java @@ -86,7 +86,7 @@ class MetricsRequestEventListenerTest { when(uriInfo.getMatchedTemplates()).thenReturn(Collections.singletonList(new UriTemplate(path))); final ContainerRequest request = mock(ContainerRequest.class); - when(request.getRequestHeader(HttpHeaders.USER_AGENT)).thenReturn(Collections.singletonList("Signal-Android 4.53.7 (Android 8.1)")); + when(request.getRequestHeader(HttpHeaders.USER_AGENT)).thenReturn(Collections.singletonList("Signal-Android/4.53.7 (Android 8.1)")); final ContainerResponse response = mock(ContainerResponse.class); when(response.getStatus()).thenReturn(statusCode); @@ -143,8 +143,8 @@ class MetricsRequestEventListenerTest { when(session.getUpgradeRequest()).thenReturn(request); when(session.getRemote()).thenReturn(remoteEndpoint); - when(request.getHeader(HttpHeaders.USER_AGENT)).thenReturn("Signal-Android 4.53.7 (Android 8.1)"); - when(request.getHeaders()).thenReturn(Map.of(HttpHeaders.USER_AGENT, List.of("Signal-Android 4.53.7 (Android 8.1)"))); + when(request.getHeader(HttpHeaders.USER_AGENT)).thenReturn("Signal-Android/4.53.7 (Android 8.1)"); + when(request.getHeaders()).thenReturn(Map.of(HttpHeaders.USER_AGENT, List.of("Signal-Android/4.53.7 (Android 8.1)"))); final ArgumentCaptor> tagCaptor = ArgumentCaptor.forClass(Iterable.class); when(meterRegistry.counter(eq(MetricsRequestEventListener.REQUEST_COUNTER_NAME), any(Iterable.class))).thenReturn(counter); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/UserAgentTagUtilTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/UserAgentTagUtilTest.java index 2ded09012..e324eaeb0 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/UserAgentTagUtilTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/UserAgentTagUtilTest.java @@ -35,31 +35,31 @@ class UserAgentTagUtilTest { return Stream.of( Arguments.of("This is obviously not a reasonable User-Agent string.", UserAgentTagUtil.UNRECOGNIZED_TAGS), Arguments.of(null, UserAgentTagUtil.UNRECOGNIZED_TAGS), - Arguments.of("Signal-Android 4.53.7 (Android 8.1)", platformVersionTags("android", "4.53.7")), - Arguments.of("Signal Desktop 1.2.3", platformVersionTags("desktop", "1.2.3")), - Arguments.of("Signal/3.9.0 (iPhone; iOS 12.2; Scale/3.00)", platformVersionTags("ios", "3.9.0")), - Arguments.of("Signal-Android 1.2.3 (Android 8.1)", UserAgentTagUtil.UNRECOGNIZED_TAGS), - Arguments.of("Signal Desktop 3.9.0", platformVersionTags("desktop", "3.9.0")), - Arguments.of("Signal/4.53.7 (iPhone; iOS 12.2; Scale/3.00)", platformVersionTags("ios", "4.53.7")), - Arguments.of("Signal-Android 4.68.3 (Android 9)", platformVersionTags("android", "4.68.3")), - Arguments.of("Signal-Android 1.2.3 (Android 4.3)", UserAgentTagUtil.UNRECOGNIZED_TAGS), - Arguments.of("Signal-Android 4.68.3.0-bobsbootlegclient", UserAgentTagUtil.UNRECOGNIZED_TAGS), - Arguments.of("Signal Desktop 1.22.45-foo-0", UserAgentTagUtil.UNRECOGNIZED_TAGS), - Arguments.of("Signal Desktop 1.34.5-beta.1-fakeclientemporium", UserAgentTagUtil.UNRECOGNIZED_TAGS), - Arguments.of("Signal Desktop 1.32.0-beta.3", UserAgentTagUtil.UNRECOGNIZED_TAGS) + Arguments.of("Signal-Android/4.53.7 (Android 8.1)", platformVersionTags("android", "4.53.7")), + Arguments.of("Signal-Desktop/1.2.3", platformVersionTags("desktop", "1.2.3")), + Arguments.of("Signal-iOS/3.9.0 (iPhone; iOS 12.2; Scale/3.00)", platformVersionTags("ios", "3.9.0")), + Arguments.of("Signal-Android/1.2.3 (Android 8.1)", UserAgentTagUtil.UNRECOGNIZED_TAGS), + Arguments.of("Signal-Desktop/3.9.0", platformVersionTags("desktop", "3.9.0")), + Arguments.of("Signal-iOS/4.53.7 (iPhone; iOS 12.2; Scale/3.00)", platformVersionTags("ios", "4.53.7")), + Arguments.of("Signal-Android/4.68.3 (Android 9)", platformVersionTags("android", "4.68.3")), + Arguments.of("Signal-Android/1.2.3 (Android 4.3)", UserAgentTagUtil.UNRECOGNIZED_TAGS), + Arguments.of("Signal-Android/4.68.3.0-bobsbootlegclient", UserAgentTagUtil.UNRECOGNIZED_TAGS), + Arguments.of("Signal-Desktop/1.22.45-foo-0", UserAgentTagUtil.UNRECOGNIZED_TAGS), + Arguments.of("Signal-Desktop/1.34.5-beta.1-fakeclientemporium", UserAgentTagUtil.UNRECOGNIZED_TAGS), + Arguments.of("Signal-Desktop/1.32.0-beta.3", UserAgentTagUtil.UNRECOGNIZED_TAGS) ); } @Test void testGetUserAgentTagsFlooded() { for (int i = 0; i < UserAgentTagUtil.MAX_VERSIONS; i++) { - UserAgentTagUtil.getUserAgentTags(String.format("Signal-Android 4.0.%d (Android 8.1)", i)); + UserAgentTagUtil.getUserAgentTags(String.format("Signal-Android/4.0.%d (Android 8.1)", i)); } assertEquals(UserAgentTagUtil.OVERFLOW_TAGS, - UserAgentTagUtil.getUserAgentTags("Signal-Android 4.1.0 (Android 8.1)")); + UserAgentTagUtil.getUserAgentTags("Signal-Android/4.1.0 (Android 8.1)")); - final List tags = UserAgentTagUtil.getUserAgentTags("Signal-Android 4.0.0 (Android 8.1)"); + final List tags = UserAgentTagUtil.getUserAgentTags("Signal-Android/4.0.0 (Android 8.1)"); assertEquals(2, tags.size()); assertTrue(tags.contains(Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android"))); @@ -77,19 +77,19 @@ class UserAgentTagUtilTest { Arguments.of("This is obviously not a reasonable User-Agent string.", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "unrecognized")), Arguments.of(null, Tag.of(UserAgentTagUtil.PLATFORM_TAG, "unrecognized")), - Arguments.of("Signal-Android 4.53.7 (Android 8.1)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), - Arguments.of("Signal Desktop 1.2.3", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop")), - Arguments.of("Signal/3.9.0 (iPhone; iOS 12.2; Scale/3.00)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "ios")), - Arguments.of("Signal-Android 1.2.3 (Android 8.1)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), - Arguments.of("Signal Desktop 3.9.0", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop")), - Arguments.of("Signal/4.53.7 (iPhone; iOS 12.2; Scale/3.00)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "ios")), - Arguments.of("Signal-Android 4.68.3 (Android 9)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), - Arguments.of("Signal-Android 1.2.3 (Android 4.3)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), - Arguments.of("Signal-Android 4.68.3.0-bobsbootlegclient", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), - Arguments.of("Signal Desktop 1.22.45-foo-0", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop")), - Arguments.of("Signal Desktop 1.34.5-beta.1-fakeclientemporium", + Arguments.of("Signal-Android/4.53.7 (Android 8.1)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), + Arguments.of("Signal-Desktop/1.2.3", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop")), + Arguments.of("Signal-iOS/3.9.0 (iPhone; iOS 12.2; Scale/3.00)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "ios")), + Arguments.of("Signal-Android/1.2.3 (Android 8.1)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), + Arguments.of("Signal-Desktop/3.9.0", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop")), + Arguments.of("Signal-iOS/4.53.7 (iPhone; iOS 12.2; Scale/3.00)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "ios")), + Arguments.of("Signal-Android/4.68.3 (Android 9)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), + Arguments.of("Signal-Android/1.2.3 (Android 4.3)", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), + Arguments.of("Signal-Android/4.68.3.0-bobsbootlegclient", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android")), + Arguments.of("Signal-Desktop/1.22.45-foo-0", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop")), + Arguments.of("Signal-Desktop/1.34.5-beta.1-fakeclientemporium", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop")), - Arguments.of("Signal Desktop 1.32.0-beta.3", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop")) + Arguments.of("Signal-Desktop/1.32.0-beta.3", Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop")) ); } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/util/ua/UserAgentUtilTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/util/ua/UserAgentUtilTest.java index 019677cce..5017bd2f8 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/util/ua/UserAgentUtilTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/util/ua/UserAgentUtilTest.java @@ -16,23 +16,6 @@ import org.junit.jupiter.params.provider.MethodSource; class UserAgentUtilTest { - @ParameterizedTest - @MethodSource - void testParseUserAgentString(final String userAgentString, final UserAgent expectedUserAgent) - throws UnrecognizedUserAgentException { - assertEquals(expectedUserAgent, UserAgentUtil.parseUserAgentString(userAgentString)); - } - - @SuppressWarnings("unused") - private static Stream testParseUserAgentString() { - return Stream.of( - Arguments.of("Signal-Android/4.68.3 Android/25", - new UserAgent(ClientPlatform.ANDROID, new Semver("4.68.3"), "Android/25")), - Arguments.of("Signal-Android 4.53.7 (Android 8.1)", - new UserAgent(ClientPlatform.ANDROID, new Semver("4.53.7"), "(Android 8.1)")) - ); - } - @ParameterizedTest @MethodSource void testParseBogusUserAgentString(final String userAgentString) { @@ -73,24 +56,4 @@ class UserAgentUtilTest { Arguments.of("Signal-iOS/3.9.0", new UserAgent(ClientPlatform.IOS, new Semver("3.9.0"))) ); } - - @ParameterizedTest - @MethodSource - void testParseLegacyUserAgentString(final String userAgentString, final UserAgent expectedUserAgent) { - assertEquals(expectedUserAgent, UserAgentUtil.parseLegacyUserAgentString(userAgentString)); - } - - @SuppressWarnings("unused") - private static Stream testParseLegacyUserAgentString() { - return Stream.of( - Arguments.of("This is obviously not a reasonable User-Agent string.", null), - Arguments.of("Signal-Android 4.53.7 (Android 8.1)", - new UserAgent(ClientPlatform.ANDROID, new Semver("4.53.7"), "(Android 8.1)")), - Arguments.of("Signal Desktop 1.2.3", new UserAgent(ClientPlatform.DESKTOP, new Semver("1.2.3"))), - Arguments.of("Signal Desktop 1.32.0-beta.3", - new UserAgent(ClientPlatform.DESKTOP, new Semver("1.32.0-beta.3"))), - Arguments.of("Signal/3.9.0 (iPhone; iOS 12.2; Scale/3.00)", - new UserAgent(ClientPlatform.IOS, new Semver("3.9.0"), "(iPhone; iOS 12.2; Scale/3.00)")) - ); - } }