summaryrefslogtreecommitdiffstats
path: root/app/user_agent.go
blob: d731fd2a8f7150643022043f2143b4e9f7d4dfe0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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]
	}
}