From 4a98e26c4a1f4294e52c7135bb99f5aa51095326 Mon Sep 17 00:00:00 2001 From: Kerry Date: Tue, 11 Oct 2022 09:29:19 +0200 Subject: [PATCH] Device manager - UA parsing tweaks (#9382) * parseUA - use full client version * dont check for custom element model and os when device type is unknown * ignore OS version in browser based sessions --- src/utils/device/parseUserAgent.ts | 29 ++++++++++++++++-------- test/utils/device/parseUserAgent-test.ts | 25 +++++++++++--------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/utils/device/parseUserAgent.ts b/src/utils/device/parseUserAgent.ts index 9d9d71e6f7..3eee617765 100644 --- a/src/utils/device/parseUserAgent.ts +++ b/src/utils/device/parseUserAgent.ts @@ -58,15 +58,16 @@ const getDeviceType = ( return DeviceType.Unknown; }; +interface CustomValues { + customDeviceModel?: string; + customDeviceOS?: string; +} /** * Some mobile model and OS strings are not recognised * by the UA parsing library * check they exist by hand */ -const checkForCustomValues = (userAgent: string): { - customDeviceModel?: string; - customDeviceOS?: string; -} => { +const checkForCustomValues = (userAgent: string): CustomValues => { if (userAgent.includes(BROWSER_KEYWORD)) { return {}; } @@ -97,13 +98,23 @@ export const parseUserAgent = (userAgent?: string): ExtendedDeviceInformation => const device = parser.getDevice(); const operatingSystem = parser.getOS(); - const deviceOperatingSystem = concatenateNameAndVersion(operatingSystem.name, operatingSystem.version); - const deviceModel = concatenateNameAndVersion(device.vendor, device.model); - const client = concatenateNameAndVersion(browser.name, browser.major || browser.version); - - const { customDeviceModel, customDeviceOS } = checkForCustomValues(userAgent); const deviceType = getDeviceType(userAgent, device, browser, operatingSystem); + // OSX versions are frozen at 10.15.17 in UA strings https://chromestatus.com/feature/5452592194781184 + // ignore OS version in browser based sessions + const shouldIgnoreOSVersion = deviceType === DeviceType.Web || deviceType === DeviceType.Desktop; + const deviceOperatingSystem = concatenateNameAndVersion( + operatingSystem.name, + shouldIgnoreOSVersion ? undefined : operatingSystem.version, + ); + const deviceModel = concatenateNameAndVersion(device.vendor, device.model); + const client = concatenateNameAndVersion(browser.name, browser.version); + + // only try to parse custom model and OS when device type is known + const { customDeviceModel, customDeviceOS } = deviceType !== DeviceType.Unknown + ? checkForCustomValues(userAgent) + : {} as CustomValues; + return { deviceType, deviceModel: deviceModel || customDeviceModel, diff --git a/test/utils/device/parseUserAgent-test.ts b/test/utils/device/parseUserAgent-test.ts index 9171a2a755..e4ae89d2e0 100644 --- a/test/utils/device/parseUserAgent-test.ts +++ b/test/utils/device/parseUserAgent-test.ts @@ -70,8 +70,8 @@ const DESKTOP_UA = [ "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) ElementNightly/2022091301 Chrome/104.0.5112.102 Electron/20.1.1 Safari/537.36", ]; const DESKTOP_EXPECTED_RESULT = [ - makeDeviceExtendedInfo(DeviceType.Desktop, undefined, "Mac OS 10.15.7", "Electron", "20"), - makeDeviceExtendedInfo(DeviceType.Desktop, undefined, "Windows 10", "Electron", "20"), + makeDeviceExtendedInfo(DeviceType.Desktop, undefined, "Mac OS", "Electron", "20.1.1"), + makeDeviceExtendedInfo(DeviceType.Desktop, undefined, "Windows", "Electron", "20.1.1"), ]; const WEB_UA = [ @@ -88,16 +88,16 @@ const WEB_UA = [ ]; const WEB_EXPECTED_RESULT = [ - makeDeviceExtendedInfo(DeviceType.Web, undefined, "Mac OS 10.15.7", "Chrome", "104"), - makeDeviceExtendedInfo(DeviceType.Web, undefined, "Windows 10", "Chrome", "104"), - makeDeviceExtendedInfo(DeviceType.Web, undefined, "Mac OS 10.10", "Firefox", "39"), - makeDeviceExtendedInfo(DeviceType.Web, undefined, "Mac OS 10.10.2", "Safari", "8"), - makeDeviceExtendedInfo(DeviceType.Web, undefined, "Windows Vista", "Firefox", "40"), - makeDeviceExtendedInfo(DeviceType.Web, undefined, "Windows 10", "Edge", "12"), + makeDeviceExtendedInfo(DeviceType.Web, undefined, "Mac OS", "Chrome", "104.0.5112.102"), + makeDeviceExtendedInfo(DeviceType.Web, undefined, "Windows", "Chrome", "104.0.5112.102"), + makeDeviceExtendedInfo(DeviceType.Web, undefined, "Mac OS", "Firefox", "39.0"), + makeDeviceExtendedInfo(DeviceType.Web, undefined, "Mac OS", "Safari", "8.0.3"), + makeDeviceExtendedInfo(DeviceType.Web, undefined, "Windows", "Firefox", "40.0"), + makeDeviceExtendedInfo(DeviceType.Web, undefined, "Windows", "Edge", "12.246"), // using mobile browser - makeDeviceExtendedInfo(DeviceType.Web, "Apple iPad", "iOS 8.4.1", "Mobile Safari", "8"), - makeDeviceExtendedInfo(DeviceType.Web, "Apple iPhone", "iOS 8.4.1", "Mobile Safari", "8"), - makeDeviceExtendedInfo(DeviceType.Web, "Samsung SM-G973U", "Android 9", "Chrome", "69"), + makeDeviceExtendedInfo(DeviceType.Web, "Apple iPad", "iOS", "Mobile Safari", "8.0"), + makeDeviceExtendedInfo(DeviceType.Web, "Apple iPhone", "iOS", "Mobile Safari", "8.0"), + makeDeviceExtendedInfo(DeviceType.Web, "Samsung SM-G973U", "Android", "Chrome", "69.0.3497.100"), ]; @@ -106,6 +106,8 @@ const MISC_UA = [ "Curl Client/1.0", "banana", "", + // fluffy chat ios + "Dart/2.18 (dart:io)", ]; const MISC_EXPECTED_RESULT = [ @@ -113,6 +115,7 @@ const MISC_EXPECTED_RESULT = [ makeDeviceExtendedInfo(DeviceType.Unknown, undefined, undefined, undefined, undefined), makeDeviceExtendedInfo(DeviceType.Unknown, undefined, undefined, undefined, undefined), makeDeviceExtendedInfo(DeviceType.Unknown, undefined, undefined, undefined, undefined), + makeDeviceExtendedInfo(DeviceType.Unknown, undefined, undefined, undefined, undefined), ]; /* eslint-disable max-len */