From a752d7de5a0a1aa1679790f76f2f8dc35e322c41 Mon Sep 17 00:00:00 2001 From: Harrison Healey Date: Wed, 9 May 2018 12:25:03 -0400 Subject: MM-10495 Updated user agent detection to match output of previous library (#8748) * MM-10495 Updated user agent detection to match output of previous library * Fixed missing license header --- app/user_agent.go | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 app/user_agent.go (limited to 'app/user_agent.go') diff --git a/app/user_agent.go b/app/user_agent.go new file mode 100644 index 000000000..d731fd2a8 --- /dev/null +++ b/app/user_agent.go @@ -0,0 +1,132 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +package app + +import ( + "fmt" + "strings" + + "github.com/avct/uasurfer" +) + +var platformNames = map[uasurfer.Platform]string{ + uasurfer.PlatformUnknown: "Windows", + uasurfer.PlatformWindows: "Windows", + uasurfer.PlatformMac: "Macintosh", + uasurfer.PlatformLinux: "Linux", + uasurfer.PlatformiPad: "iPad", + uasurfer.PlatformiPhone: "iPhone", + uasurfer.PlatformiPod: "iPod", + uasurfer.PlatformBlackberry: "BlackBerry", + uasurfer.PlatformWindowsPhone: "Windows Phone", +} + +func getPlatformName(ua *uasurfer.UserAgent) string { + platform := ua.OS.Platform + + if name, ok := platformNames[platform]; !ok { + return platformNames[uasurfer.PlatformUnknown] + } else { + return name + } +} + +var osNames = map[uasurfer.OSName]string{ + uasurfer.OSUnknown: "", + uasurfer.OSWindowsPhone: "Windows Phone", + uasurfer.OSWindows: "Windows", + uasurfer.OSMacOSX: "Mac OS", + uasurfer.OSiOS: "iOS", + uasurfer.OSAndroid: "Android", + uasurfer.OSBlackberry: "BlackBerry", + uasurfer.OSChromeOS: "Chrome OS", + uasurfer.OSKindle: "Kindle", + uasurfer.OSWebOS: "webOS", + uasurfer.OSLinux: "Linux", +} + +func getOSName(ua *uasurfer.UserAgent) string { + os := ua.OS + + if os.Name == uasurfer.OSWindows { + major := os.Version.Major + minor := os.Version.Minor + + name := "Windows" + + // Adapted from https://github.com/mssola/user_agent/blob/master/operating_systems.go#L26 + if major == 5 { + if minor == 0 { + name = "Windows 2000" + } else if minor == 1 { + name = "Windows XP" + } else if minor == 2 { + name = "Windows XP x64 Edition" + } + } else if major == 6 { + if minor == 0 { + name = "Windows Vista" + } else if minor == 1 { + name = "Windows 7" + } else if minor == 2 { + name = "Windows 8" + } else if minor == 3 { + name = "Windows 8.1" + } + } else if major == 10 { + name = "Windows 10" + } + + return name + } else if name, ok := osNames[os.Name]; ok { + return name + } else { + return osNames[uasurfer.OSUnknown] + } +} + +func getBrowserVersion(ua *uasurfer.UserAgent, userAgentString string) string { + if index := strings.Index(userAgentString, "Mattermost/"); index != -1 { + afterVersion := userAgentString[index+len("Mattermost/"):] + return strings.Fields(afterVersion)[0] + } else if index := strings.Index(userAgentString, "Franz/"); index != -1 { + afterVersion := userAgentString[index+len("Franz/"):] + return strings.Fields(afterVersion)[0] + } else { + return getUAVersion(ua.Browser.Version) + } +} + +func getUAVersion(version uasurfer.Version) string { + if version.Patch == 0 { + return fmt.Sprintf("%v.%v", version.Major, version.Minor) + } else { + return fmt.Sprintf("%v.%v.%v", version.Major, version.Minor, version.Patch) + } +} + +var browserNames = map[uasurfer.BrowserName]string{ + uasurfer.BrowserUnknown: "Unknown", + uasurfer.BrowserChrome: "Chrome", + uasurfer.BrowserIE: "Internet Explorer", + uasurfer.BrowserSafari: "Safari", + uasurfer.BrowserFirefox: "Firefox", + uasurfer.BrowserAndroid: "Android", + uasurfer.BrowserOpera: "Opera", + uasurfer.BrowserBlackberry: "BlackBerry", +} + +func getBrowserName(ua *uasurfer.UserAgent, userAgentString string) string { + browser := ua.Browser.Name + + if strings.Contains(userAgentString, "Mattermost") { + return "Desktop App" + } else if browser == uasurfer.BrowserIE && ua.Browser.Version.Major > 11 { + return "Edge" + } else if name, ok := browserNames[browser]; ok { + return name + } else { + return browserNames[uasurfer.BrowserUnknown] + } +} -- cgit v1.2.3-1-g7c22