1// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2// See LICENSE.txt for license information.
3
4package app
5
6import (
7	"fmt"
8	"strings"
9
10	"github.com/avct/uasurfer"
11)
12
13var platformNames = map[uasurfer.Platform]string{
14	uasurfer.PlatformUnknown:      "Windows",
15	uasurfer.PlatformWindows:      "Windows",
16	uasurfer.PlatformMac:          "Macintosh",
17	uasurfer.PlatformLinux:        "Linux",
18	uasurfer.PlatformiPad:         "iPad",
19	uasurfer.PlatformiPhone:       "iPhone",
20	uasurfer.PlatformiPod:         "iPod",
21	uasurfer.PlatformBlackberry:   "BlackBerry",
22	uasurfer.PlatformWindowsPhone: "Windows Phone",
23}
24
25func getPlatformName(ua *uasurfer.UserAgent) string {
26	platform := ua.OS.Platform
27
28	name, ok := platformNames[platform]
29	if !ok {
30		return platformNames[uasurfer.PlatformUnknown]
31	}
32	return name
33}
34
35var osNames = map[uasurfer.OSName]string{
36	uasurfer.OSUnknown:      "",
37	uasurfer.OSWindowsPhone: "Windows Phone",
38	uasurfer.OSWindows:      "Windows",
39	uasurfer.OSMacOSX:       "Mac OS",
40	uasurfer.OSiOS:          "iOS",
41	uasurfer.OSAndroid:      "Android",
42	uasurfer.OSBlackberry:   "BlackBerry",
43	uasurfer.OSChromeOS:     "Chrome OS",
44	uasurfer.OSKindle:       "Kindle",
45	uasurfer.OSWebOS:        "webOS",
46	uasurfer.OSLinux:        "Linux",
47}
48
49func getOSName(ua *uasurfer.UserAgent) string {
50	os := ua.OS
51
52	if os.Name == uasurfer.OSWindows {
53		major := os.Version.Major
54		minor := os.Version.Minor
55
56		switch {
57		case major == 5 && minor == 0:
58			return "Windows 2000"
59		case major == 5 && minor == 1:
60			return "Windows XP"
61		case major == 5 && minor == 2:
62			return "Windows XP x64 Edition"
63		case major == 6 && minor == 0:
64			return "Windows Vista"
65		case major == 6 && minor == 1:
66			return "Windows 7"
67		case major == 6 && minor == 2:
68			return "Windows 8"
69		case major == 6 && minor == 3:
70			return "Windows 8.1"
71		case major == 10:
72			return "Windows 10"
73		default:
74			return "Windows"
75		}
76	}
77
78	name, ok := osNames[os.Name]
79	if ok {
80		return name
81	}
82
83	return osNames[uasurfer.OSUnknown]
84}
85
86func getBrowserVersion(ua *uasurfer.UserAgent, userAgentString string) string {
87	if index := strings.Index(userAgentString, "Mattermost/"); index != -1 {
88		afterVersion := userAgentString[index+len("Mattermost/"):]
89		return strings.Fields(afterVersion)[0]
90	}
91
92	if index := strings.Index(userAgentString, "mmctl/"); index != -1 {
93		afterVersion := userAgentString[index+len("mmctl/"):]
94		return strings.Fields(afterVersion)[0]
95	}
96
97	if index := strings.Index(userAgentString, "Franz/"); index != -1 {
98		afterVersion := userAgentString[index+len("Franz/"):]
99		return strings.Fields(afterVersion)[0]
100	}
101
102	return getUAVersion(ua.Browser.Version)
103}
104
105func getUAVersion(version uasurfer.Version) string {
106	if version.Patch == 0 {
107		return fmt.Sprintf("%v.%v", version.Major, version.Minor)
108	}
109	return fmt.Sprintf("%v.%v.%v", version.Major, version.Minor, version.Patch)
110}
111
112var browserNames = map[uasurfer.BrowserName]string{
113	uasurfer.BrowserUnknown:    "Unknown",
114	uasurfer.BrowserChrome:     "Chrome",
115	uasurfer.BrowserIE:         "Internet Explorer",
116	uasurfer.BrowserSafari:     "Safari",
117	uasurfer.BrowserFirefox:    "Firefox",
118	uasurfer.BrowserAndroid:    "Android",
119	uasurfer.BrowserOpera:      "Opera",
120	uasurfer.BrowserBlackberry: "BlackBerry",
121}
122
123func getBrowserName(ua *uasurfer.UserAgent, userAgentString string) string {
124	browser := ua.Browser.Name
125
126	if strings.Contains(userAgentString, "Mattermost") {
127		return "Desktop App"
128	}
129
130	if strings.Contains(userAgentString, "mmctl") {
131		return "mmctl"
132	}
133
134	if browser == uasurfer.BrowserIE && ua.Browser.Version.Major > 11 {
135		return "Edge"
136	}
137
138	if name, ok := browserNames[browser]; ok {
139		return name
140	}
141
142	return browserNames[uasurfer.BrowserUnknown]
143
144}
145