[PLT-959] Browser Compatibility (#6945)

* Error page implimentation

* Update Browser Compatibility check to check Chrome, FF, IE, Edge, and Safai

* Update strings with proper edge version

* undo uneeded changes and move to go template.

* more unneeded additions

* eliminate js and add local triangle

* fix typo

* Correct debug logging of browser version

* Modify Browser Check to pass user_agent object only and write test.

* Fix chrome version typo and correct testing change that broke chrome UA chack

* simplity browser version detection by using maps instead of string splitting
Этот коммит содержится в:
Alex Moon
2017-09-06 13:23:14 -07:00
коммит произвёл Christopher Speller
родитель 66a4d01125
Коммит cb266eb942
7 изменённых файлов: 265 добавлений и 42 удалений

Просмотреть файл

@@ -5,6 +5,7 @@ package web
import (
"net/http"
"strconv"
"strings"
"github.com/NYTimes/gziphandler"
@@ -46,19 +47,28 @@ func staticHandler(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"
//map should be of minimum required browser version.
//var browsersNotSupported string = "MSIE/11;Internet Explorer/11;Safari/9;Chrome/43;Edge/15;Firefox/52"
//var browserMinimumSupported = [6]string{"MSIE/11", "Internet Explorer/11", "Safari/9", "Chrome/43", "Edge/15", "Firefox/52"}
var browserMinimumSupported = map[string]int{
"MSIE": 11,
"Internet Explorer": 11,
"Safari": 9,
"Chrome": 43,
"Edge": 15,
"Firefox": 52,
}
func CheckBrowserCompatability(c *api.Context, r *http.Request) bool {
ua := user_agent.New(r.UserAgent())
func CheckBrowserCompatability(ua *user_agent.UserAgent) bool {
bname, bversion := ua.Browser()
browsers := strings.Split(browsersNotSupported, ";")
for _, browser := range browsers {
version := strings.Split(browser, "/")
l4g.Debug("Detected Browser: %v %v", bname, bversion)
if strings.HasPrefix(bname, version[0]) && strings.HasPrefix(bversion, version[1]) {
return false
}
curVersion := strings.Split(bversion, ".")
intCurVersion, _ := strconv.Atoi(curVersion[0])
if version, exist := browserMinimumSupported[bname]; exist && intCurVersion < version {
return false
}
return true
@@ -66,10 +76,12 @@ func CheckBrowserCompatability(c *api.Context, r *http.Request) bool {
}
func root(c *api.Context, w http.ResponseWriter, r *http.Request) {
if !CheckBrowserCompatability(c, r) {
if !CheckBrowserCompatability(user_agent.New(r.UserAgent())) {
w.Header().Set("Cache-Control", "no-store")
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(c.T("web.check_browser_compatibility.app_error")))
page := utils.NewHTMLTemplate("unsupported_browser", c.Locale)
page.Props["Title"] = c.T("web.error.unsupported_browser.title")
page.Props["Message"] = c.T("web.error.unsupported_browser.message")
page.RenderToWriter(w)
return
}

Просмотреть файл

@@ -13,6 +13,7 @@ import (
"github.com/mattermost/platform/model"
"github.com/mattermost/platform/store"
"github.com/mattermost/platform/utils"
"github.com/mssola/user_agent"
)
var ApiClient *model.Client
@@ -120,3 +121,31 @@ func TestZZWebTearDown(t *testing.T) {
time.Sleep(2 * time.Second)
TearDown()
}
func TestCheckBrowserCompatability(t *testing.T) {
//test should fail browser compatibility check with Mozilla FF 40.1
ua := "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
t.Logf("Checking Mozzila 40.1 with U.A. String: \n%v", ua)
if result := CheckBrowserCompatability(user_agent.New(ua)); result == true {
t.Error("Fail: should have failed browser compatibility")
} else {
t.Log("Pass: User Agent correctly failed!")
}
ua = "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"
t.Logf("Checking Chrome 60 with U.A. String: \n%v", ua)
if result := CheckBrowserCompatability(user_agent.New(ua)); result == false {
t.Error("Fail: should have passed browser compatibility")
} else {
t.Log("Pass: User Agent correctly passed!")
}
ua = "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"
t.Logf("Checking Edge 14.14393 with U.A. String: \n%v", ua)
if result := CheckBrowserCompatability(user_agent.New(ua)); result == true {
t.Log("Warning: Edge should have failed browser compatibility. It is probably still detecting as Chrome.")
} else {
t.Log("Pass: User Agent correctly failed!")
}
}