summaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2018-03-13 13:36:23 +0000
committerGeorge Goldberg <george@gberg.me>2018-03-13 13:36:23 +0000
commitfadcdd271a68b38571b75d1d38ab023f940ac83a (patch)
tree7f413edd35401b54b2f4eb4a687da1ac273bcd4b /web
parentb66e4bc932ed76c1cfd2b5f4ec0cfce70cd9fbb4 (diff)
parentf2d26801b9647715fb43af873354d8def753868b (diff)
downloadchat-fadcdd271a68b38571b75d1d38ab023f940ac83a.tar.gz
chat-fadcdd271a68b38571b75d1d38ab023f940ac83a.tar.bz2
chat-fadcdd271a68b38571b75d1d38ab023f940ac83a.zip
Merge branch 'master' into advanced-permissions-phase-1
Diffstat (limited to 'web')
-rw-r--r--web/web.go25
-rw-r--r--web/web_test.go31
2 files changed, 44 insertions, 12 deletions
diff --git a/web/web.go b/web/web.go
index e0edd1b7a..22fe43923 100644
--- a/web/web.go
+++ b/web/web.go
@@ -8,12 +8,12 @@ import (
"strings"
"github.com/NYTimes/gziphandler"
+ "github.com/avct/uasurfer"
l4g "github.com/alecthomas/log4go"
"github.com/mattermost/mattermost-server/api"
"github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/utils"
- "github.com/mssola/user_agent"
)
func Init(api3 *api.API) {
@@ -65,26 +65,27 @@ func pluginHandler(config model.ConfigFunc, handler http.Handler) http.Handler {
})
}
-var browsersNotSupported string = "MSIE/8;MSIE/9;MSIE/10;Internet Explorer/8;Internet Explorer/9;Internet Explorer/10;Safari/7;Safari/8"
+// Due to the complexities of UA detection and the ramifications of a misdetection only older Safari and IE browsers throw incompatibility errors.
-func CheckBrowserCompatability(c *api.Context, r *http.Request) bool {
- ua := user_agent.New(r.UserAgent())
- bname, bversion := ua.Browser()
+// Map should be of minimum required browser version.
+var browserMinimumSupported = map[string]int{
+ "BrowserIE": 11,
+ "BrowserSafari": 9,
+}
- browsers := strings.Split(browsersNotSupported, ";")
- for _, browser := range browsers {
- version := strings.Split(browser, "/")
+func CheckClientCompatability(agentString string) bool {
+ ua := uasurfer.Parse(agentString)
- if strings.HasPrefix(bname, version[0]) && strings.HasPrefix(bversion, version[1]) {
- return false
- }
+ if version, exist := browserMinimumSupported[ua.Browser.Name.String()]; exist && ua.Browser.Version.Major < version {
+ return false
}
return true
}
func root(c *api.Context, w http.ResponseWriter, r *http.Request) {
- if !CheckBrowserCompatability(c, r) {
+
+ if !CheckClientCompatability(r.UserAgent()) {
w.Header().Set("Cache-Control", "no-store")
page := utils.NewHTMLTemplate(c.App.HTMLTemplates(), "unsupported_browser")
page.Props["Title"] = c.T("web.error.unsupported_browser.title")
diff --git a/web/web_test.go b/web/web_test.go
index 20c42245a..60122f049 100644
--- a/web/web_test.go
+++ b/web/web_test.go
@@ -168,4 +168,35 @@ func TestMain(m *testing.M) {
}()
status = m.Run()
+
+}
+
+func TestCheckClientCompatability(t *testing.T) {
+ //Browser Name, UA String, expected result (if the browser should fail the test false and if it should pass the true)
+ type uaTest struct {
+ Name string // Name of Browser
+ UserAgent string // Useragent of Browser
+ Result bool // Expected result (true if browser should be compatible, false if browser shouldn't be compatible)
+ }
+ var uaTestParameters = []uaTest{
+ {"Mozilla 40.1", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1", true},
+ {"Chrome 60", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36", true},
+ {"Chrome Mobile", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Mobile Safari/537.36", true},
+ {"MM Classic App", "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.81 Mobile Safari/537.36 Web-Atoms-Mobile-WebView", true},
+ {"MM App 3.7.1", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/3.7.1 Chrome/56.0.2924.87 Electron/1.6.11 Safari/537.36", true},
+ {"Franz 4.0.4", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Franz/4.0.4 Chrome/52.0.2743.82 Electron/1.3.1 Safari/537.36", true},
+ {"Edge 14", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393", true},
+ {"Internet Explorer 11", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko", true},
+ {"Internet Explorer 9", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0", false},
+ {"Safari 9", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Safari/604.1.38", true},
+ {"Safari 8", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12", false},
+ {"Safari Mobile", "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B137 Safari/601.1", true},
+ }
+ for _, browser := range uaTestParameters {
+ t.Run(browser.Name, func(t *testing.T) {
+ if result := CheckClientCompatability(browser.UserAgent); result != browser.Result {
+ t.Fatalf("%s User Agent Test failed!", browser.Name)
+ }
+ })
+ }
}