-
+
diff --git a/api/templates/find_teams_body.html b/api/templates/find_teams_body.html
index 6eaaf56e07e..a73ed0ad4a7 100644
--- a/api/templates/find_teams_body.html
+++ b/api/templates/find_teams_body.html
@@ -8,7 +8,7 @@
-
+
@@ -40,7 +40,7 @@
-
+
diff --git a/api/templates/invite_body.html b/api/templates/invite_body.html
index 46189fae57a..ad0658e3d19 100644
--- a/api/templates/invite_body.html
+++ b/api/templates/invite_body.html
@@ -8,7 +8,7 @@
-
+
@@ -35,7 +35,7 @@
-
+
diff --git a/api/templates/password_change_body.html b/api/templates/password_change_body.html
index 515c0a7d9df..1d4a6e1c86e 100644
--- a/api/templates/password_change_body.html
+++ b/api/templates/password_change_body.html
@@ -8,7 +8,7 @@
-
+
@@ -32,7 +32,7 @@
-
+
diff --git a/api/templates/post_body.html b/api/templates/post_body.html
index c0f4375d8e1..0aa913db56b 100644
--- a/api/templates/post_body.html
+++ b/api/templates/post_body.html
@@ -8,7 +8,7 @@
-
+
@@ -35,7 +35,7 @@
-
+
diff --git a/api/templates/reset_body.html b/api/templates/reset_body.html
index af9f6b4e8b5..4c2fec1e741 100644
--- a/api/templates/reset_body.html
+++ b/api/templates/reset_body.html
@@ -8,7 +8,7 @@
-
+
@@ -35,7 +35,7 @@
-
+
diff --git a/api/templates/signup_team_body.html b/api/templates/signup_team_body.html
index 5a5ae4d4774..5e60a042bcf 100644
--- a/api/templates/signup_team_body.html
+++ b/api/templates/signup_team_body.html
@@ -8,7 +8,7 @@
-
+
@@ -38,7 +38,7 @@
-
+
diff --git a/api/templates/verify_body.html b/api/templates/verify_body.html
index 67ded9c20ea..1a68c16f50b 100644
--- a/api/templates/verify_body.html
+++ b/api/templates/verify_body.html
@@ -8,7 +8,7 @@
-
+
@@ -35,7 +35,7 @@
-
+
diff --git a/api/templates/welcome_body.html b/api/templates/welcome_body.html
index 7107bc2e066..cc4d95fb113 100644
--- a/api/templates/welcome_body.html
+++ b/api/templates/welcome_body.html
@@ -8,7 +8,7 @@
-
+
@@ -32,7 +32,7 @@
-
+
diff --git a/model/utils.go b/model/utils.go
index 093a54e38c2..c7f991da200 100644
--- a/model/utils.go
+++ b/model/utils.go
@@ -319,6 +319,6 @@ func ClearMentionTags(post string) string {
}
var UrlRegex = regexp.MustCompile(`^((?:[a-z]+:\/\/)?(?:(?:[a-z0-9\-]+\.)+(?:[a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(?:\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(?:\?[a-z0-9+_~\-\.%=&]*)?)?(?:#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(?:\s+|$)$`)
-var PartialUrlRegex = regexp.MustCompile(`/([A-Za-z0-9]{26})/([A-Za-z0-9]{26})/((?:[A-Za-z0-9]{26})?.+\.[A-Za-z0-9]{3,})`)
+var PartialUrlRegex = regexp.MustCompile(`/([A-Za-z0-9]{26})/([A-Za-z0-9]{26})/((?:[A-Za-z0-9]{26})?.+(?:\.[A-Za-z0-9]{3,})?)`)
var SplitRunes = map[rune]bool{',': true, ' ': true, '.': true, '!': true, '?': true, ':': true, ';': true, '\n': true, '<': true, '>': true, '(': true, ')': true, '{': true, '}': true, '[': true, ']': true, '+': true, '/': true, '\\': true}
diff --git a/store/sql_store.go b/store/sql_store.go
index 606b2cbc165..0d4f76a7226 100644
--- a/store/sql_store.go
+++ b/store/sql_store.go
@@ -224,7 +224,7 @@ func (ss SqlStore) CreateFullTextIndexIfNotExists(indexName string, tableName st
func (ss SqlStore) createIndexIfNotExists(indexName string, tableName string, columnName string, fullText bool) {
if utils.Cfg.SqlSettings.DriverName == "postgres" {
- _, err := ss.GetMaster().SelectStr("SELECT to_regclass($1)", indexName)
+ _, err := ss.GetMaster().SelectStr("SELECT $1::regclass", indexName)
// It should fail if the index does not exist
if err == nil {
return
diff --git a/web/react/.eslintrc b/web/react/.eslintrc
new file mode 100644
index 00000000000..d8b36f6ca7d
--- /dev/null
+++ b/web/react/.eslintrc
@@ -0,0 +1,139 @@
+{
+ "ecmaFeatures": {
+ "jsx": true,
+ "blockBindings": true,
+ "modules": true
+ },
+ "plugins": [
+ "react"
+ ],
+ "env": {
+ "browser": true,
+ "node": true,
+ "jquery": true,
+ "es6": true
+ },
+ "globals": {
+ "React": false
+ },
+ "rules": {
+ "comma-dangle": [2, "never"],
+ "no-cond-assign": [2, "except-parens"],
+ "no-console": 1,
+ "no-constant-condition": 1,
+ "no-debugger": 1,
+ "no-dupe-args": 2,
+ "no-dupe-keys": 2,
+ "no-duplicate-case": 2,
+ "no-empty": 1,
+ "no-ex-assign": 1,
+ "no-extra-semi": 2,
+ "no-func-assign": 1,
+ "no-inner-declarations": 0,
+ "no-invalid-regexp": 2,
+ "no-irregular-whitespace": 2,
+ "no-unreachable": 2,
+ "valid-typeof": 2,
+ "no-unexpected-multiline": 2,
+
+ "block-scoped-var": 1,
+ "complexity": [1, 8],
+ "consistent-return": 2,
+ "curly": [2, "all"],
+ "dot-notation": 2,
+ "dot-location": [2, "object"],
+ "eqeqeq": [2, "smart"],
+ "guard-for-in": 1,
+ "no-alert": 1,
+ "no-caller": 2,
+ "no-div-regex": 1,
+ "no-else-return": 1,
+ "no-eval": 2,
+ "no-extend-native": 2,
+ "no-floating-decimal": 2,
+ "no-labels": 2,
+ "no-lone-blocks": 1,
+ "no-multi-spaces": [2, { "exceptions": { "Property": false } }],
+ "no-multi-str": 0,
+ "no-param-reassign": 2,
+ "no-process-env": 2,
+ "no-redeclare": 2,
+ "no-return-assign": [2, "always"],
+ "no-script-url": 2,
+ "no-self-compare": 2,
+ "no-sequences": 2,
+ "no-throw-literal": 2,
+ "no-unused-expressions": 2,
+ "no-void": 2,
+ "no-warning-comments": 0,
+ "no-with": 2,
+ "radix": 2,
+ "vars-on-top": 0,
+ "wrap-iife": [2, "outside"],
+ "yoda": [2, "never", {"exceptRange": false, "onlyEquality": false}],
+
+ "no-undefined": 2,
+ "no-shadow": [2, {"hoist": "functions"}],
+ "no-unused-vars": [2, {"vars": "all", "args": "all"}],
+ "no-use-before-define": [2, "nofunc"],
+
+ // Style
+ "array-bracket-spacing": [2, "never"],
+ "brace-style": [2, "1tbs", { "allowSingleLine": false }],
+ "camelcase": [2, {"properties": "always"}],
+ "comma-spacing": [2, {"before": false, "after": true}],
+ "comma-style": [2, "last"],
+ "computed-property-spacing": [2, "never"],
+ "consistent-this": [2, "self"],
+ "func-names": 2,
+ "func-style": [2, "declaration"],
+ "indent": [2, 4, {"indentSwitchCase": false}],
+ "key-spacing": [2, {"beforeColon": false, "afterColon": true}],
+ "lines-around-comment": [2, { "beforeBlockComment": true, "beforeLineComment": true, "allowBlockStart": true, "allowBlockEnd": true }],
+ "linebreak-style": 2,
+ "new-cap": 2,
+ "new-parens": 2,
+ "no-lonely-if": 2,
+ "no-mixed-spaces-and-tabs": 2,
+ "no-multiple-empty-lines": [2, {"max": 1}],
+ "no-spaced-func": 2,
+ "no-ternary": 2,
+ "no-trailing-spaces": [2, { "skipBlankLines": false }],
+ "no-underscore-dangle": 2,
+ "no-unneeded-ternary": 2,
+ "object-curly-spacing": [2, "never"],
+ "one-var": [2, "never"],
+ "operator-linebreak": [2, "after"],
+ "padded-blocks": [2, "never"],
+ "quote-props": [2, "as-needed"],
+ "quotes": [2, "single", "avoid-escape"],
+ "semi-spacing": [2, {"before": false, "after": true}],
+ "semi": [2, "always"],
+ "space-after-keywords": [2, "always"],
+ "space-before-blocks": [2, "always"],
+ "space-before-function-paren": [2, "never"],
+ "space-in-parens": [2, "never"],
+ "space-infix-ops": 2,
+ "space-return-throw-case": 2,
+ "space-unary-ops": [2, { "words": true, "nonwords": false }],
+ "wrap-regex": 2,
+
+ // React Specific
+ "react/display-name": [2, { "acceptTranspilerName": true }],
+ "react/jsx-boolean-value": [2, "always"],
+ "react/jsx-curly-spacing": [2, "never"],
+ "react/jsx-no-duplicate-props": [2, { "ignoreCase": false }],
+ "react/jsx-no-undef": 2,
+ "react/jsx-quotes": [2, "single", "avoid-escape"],
+ "react/jsx-uses-react": 2,
+ "react/jsx-uses-vars": 2,
+ "react/no-danger": 0,
+ "react/no-did-mount-set-state": 2,
+ "react/no-did-update-set-state": 2,
+ "react/no-multi-comp": 2,
+ "react/no-unknown-property": 2,
+ "react/prop-types": 2,
+ "react/sort-comp": 0,
+ "react/wrap-multilines": 2
+ }
+}
diff --git a/web/react/components/activity_log_modal.jsx b/web/react/components/activity_log_modal.jsx
index 7cce807a935..90f139e8b18 100644
--- a/web/react/components/activity_log_modal.jsx
+++ b/web/react/components/activity_log_modal.jsx
@@ -102,8 +102,9 @@ module.exports = React.createClass({
×
-
Active Devices
+ Active Sessions
+
Sessions are created when you log in with your email and password to a new browser on a device. Sessions let you use Mattermost for up to 30 days without having to log in again. If you want to log out sooner, use the "Logout" button below to end a session.
- Close
+ Cancel
Delete
diff --git a/web/react/components/file_preview.jsx b/web/react/components/file_preview.jsx
index fdd12feec43..7c1db3e10a5 100644
--- a/web/react/components/file_preview.jsx
+++ b/web/react/components/file_preview.jsx
@@ -24,7 +24,7 @@ module.exports = React.createClass({
if (filename.indexOf("/api/v1/files/get") != -1) {
filename = filename.split("/api/v1/files/get")[1];
}
- filename = window.location.origin + "/api/v1/files/get" + filename;
+ filename = utils.getWindowLocationOrigin() + "/api/v1/files/get" + filename;
if (type === "image") {
previews.push(
diff --git a/web/react/components/login.jsx b/web/react/components/login.jsx
index 05918650b10..fe0a47777b6 100644
--- a/web/react/components/login.jsx
+++ b/web/react/components/login.jsx
@@ -103,13 +103,9 @@ module.exports = React.createClass({
return (
-
- { teamDisplayName }
-
- /{ teamName }/
-
-
-
+
Sign in to:
+
{ teamDisplayName }
+
on { config.SiteName }