diff --git a/i18n/en.json b/i18n/en.json
index ef839b4fd1..7503ca8e84 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -3971,30 +3971,6 @@
"id": "ent.saml.update_saml_user.unable_error",
"translation": "Unable to update existing SAML user. Allowing login anyway. err=%v"
},
- {
- "id": "error.generic.link_message",
- "translation": "Back to Mattermost"
- },
- {
- "id": "error.generic.message",
- "translation": "An error has occurred."
- },
- {
- "id": "error.generic.title",
- "translation": "Error"
- },
- {
- "id": "error.not_found.link_message",
- "translation": "Back to Mattermost"
- },
- {
- "id": "error.not_found.message",
- "translation": "The page you were trying to reach does not exist."
- },
- {
- "id": "error.not_found.title",
- "translation": "Page not found"
- },
{
"id": "jobs.request_cancellation.status.error",
"translation": "Could not request cancellation for job that is not in a cancelable state."
@@ -6667,10 +6643,6 @@
"id": "web.authorize_oauth.title",
"translation": "Authorize Application"
},
- {
- "id": "web.check_browser_compatibility.app_error",
- "translation": "Your current browser is not supported, please upgrade to one of the following browsers: Google Chrome 21 or higher, Internet Explorer 11 or higher, Firefox 14 or higher, Safari 9 or higher"
- },
{
"id": "web.claim_account.team.error",
"translation": "Couldn't find team name=%v, err=%v"
@@ -6715,6 +6687,34 @@
"id": "web.email_verified.title",
"translation": "Email Verified"
},
+ {
+ "id": "web.error.unsupported_browser.title",
+ "translation": "Unsupported Browser"
+ },
+ {
+ "id": "web.error.unsupported_browser.message",
+ "translation": "Your current browser is not supported. Please upgrade to one of the following browsers:"
+ },
+ {
+ "id": "web.error.unsupported_browser.help1",
+ "translation": "Google Chrome 43+"
+ },
+ {
+ "id": "web.error.unsupported_browser.help2",
+ "translation": "Mozzilla Firefox 52+"
+ },
+ {
+ "id": "web.error.unsupported_browser.help3",
+ "translation": "Microsoft Internet Explorer 11+"
+ },
+ {
+ "id": "web.error.unsupported_browser.help4",
+ "translation": "Microsoft Edge 40+"
+ },
+ {
+ "id": "web.error.unsupported_browser.help5",
+ "translation": "Apple Safari 9+"
+ },
{
"id": "web.find_team.title",
"translation": "Find Team"
diff --git a/templates/unsupported_browser.html b/templates/unsupported_browser.html
new file mode 100644
index 0000000000..79656e10c3
--- /dev/null
+++ b/templates/unsupported_browser.html
@@ -0,0 +1,178 @@
+{{define "unsupported_browser"}}
+
+
+
+
+
+
+
+

+
+
+ {{.Props.Title}}
+
+
+
+
+
+
+{{end}}
diff --git a/web/web.go b/web/web.go
index e701292218..221e1dc1c9 100644
--- a/web/web.go
+++ b/web/web.go
@@ -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
}
diff --git a/web/web_test.go b/web/web_test.go
index e1cdb07140..4ea7cd8ee5 100644
--- a/web/web_test.go
+++ b/web/web_test.go
@@ -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!")
+ }
+}
diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json
index 91ebd13c69..62f50e39f7 100755
--- a/webapp/i18n/en.json
+++ b/webapp/i18n/en.json
@@ -1455,11 +1455,14 @@
"emoji_picker.recent": "Recently Used",
"emoji_picker.search": "Search",
"emoji_picker.symbols": "Symbols",
+ "error.generic.title": "Error",
+ "error.generic.message": "An error has occurred.",
+ "error.generic.link_message": "Back to Mattermost",
"error.generic.link": "Back to Mattermost",
"error.generic.message": "An error has occurred.",
"error.local_storage.help1": "Enable cookies",
"error.local_storage.help2": "Turn off private browsing",
- "error.local_storage.help3": "Use a supported browser (IE 11, Chrome 43+, Firefox 38+, Safari 9, Edge)",
+ "error.local_storage.help3": "Use a supported browser (IE 11, Chrome 43+, Firefox 52+, Safari 9, Edge 40+)",
"error.local_storage.message": "Mattermost was unable to load because a setting in your browser prevents the use of its local storage features. To allow Mattermost to load, try the following actions:",
"error.not_found.link_message": "Back to Mattermost",
"error.not_found.message": "The page you were trying to reach does not exist",
diff --git a/webapp/images/warning.png b/webapp/images/warning.png
new file mode 100644
index 0000000000..19e13399ba
Binary files /dev/null and b/webapp/images/warning.png differ
diff --git a/webapp/webpack.config.js b/webapp/webpack.config.js
index e9de8dd82a..b779e5d85e 100644
--- a/webapp/webpack.config.js
+++ b/webapp/webpack.config.js
@@ -322,7 +322,8 @@ if (TEST) {
{from: 'images/logo-email.png', to: 'images'},
{from: 'images/circles.png', to: 'images'},
{from: 'images/favicon', to: 'images/favicon'},
- {from: 'images/appIcons.png', to: 'images'}
+ {from: 'images/appIcons.png', to: 'images'},
+ {from: 'images/warning.png', to: 'images'}
])
);
}