diff --git a/api/admin_test.go b/api/admin_test.go
index a93257626b3..d5f24b71555 100644
--- a/api/admin_test.go
+++ b/api/admin_test.go
@@ -4,6 +4,7 @@
package api
import (
+ "net/http"
"strings"
"testing"
@@ -652,3 +653,24 @@ func TestGetRecentlyActiveUsers(t *testing.T) {
t.Fatal("should have been at least 2")
}
}
+
+func TestDisableAPIv3(t *testing.T) {
+ th := Setup().InitBasic()
+ Client := th.BasicClient
+
+ enableAPIv3 := *utils.Cfg.ServiceSettings.EnableAPIv3
+ defer func() {
+ *utils.Cfg.ServiceSettings.EnableAPIv3 = enableAPIv3
+ }()
+ *utils.Cfg.ServiceSettings.EnableAPIv3 = false
+
+ _, err := Client.GetUser(th.BasicUser.Id, "")
+
+ if err.StatusCode != http.StatusNotImplemented {
+ t.Fatal("wrong error code")
+ }
+
+ if err.Id != "api.context.v3_disabled.app_error" {
+ t.Fatal("wrong error message")
+ }
+}
diff --git a/api/api.go b/api/api.go
index c9c876b0263..7e902c15985 100644
--- a/api/api.go
+++ b/api/api.go
@@ -6,6 +6,7 @@ package api
import (
"net/http"
+ l4g "github.com/alecthomas/log4go"
"github.com/gorilla/mux"
"github.com/mattermost/platform/app"
"github.com/mattermost/platform/einterfaces"
@@ -115,6 +116,10 @@ func InitApi() {
utils.InitHTML()
app.InitEmailBatching()
+
+ if *utils.Cfg.ServiceSettings.EnableAPIv3 {
+ l4g.Info("API version 3 is scheduled for deprecation. Please see https://api.mattermost.com for details.")
+ }
}
func HandleEtag(etag string, routeName string, w http.ResponseWriter, r *http.Request) bool {
diff --git a/api/context.go b/api/context.go
index 6d1e758e8db..09cb1e58306 100644
--- a/api/context.go
+++ b/api/context.go
@@ -205,6 +205,10 @@ func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
c.Path = "/" + strings.Join(splitURL[2:], "/")
}
+ if h.isApi && !*utils.Cfg.ServiceSettings.EnableAPIv3 {
+ c.Err = model.NewAppError("ServeHTTP", "api.context.v3_disabled.app_error", nil, "", http.StatusNotImplemented)
+ }
+
if c.Err == nil && h.requireUser {
c.UserRequired()
}
diff --git a/app/diagnostics.go b/app/diagnostics.go
index 97f4df0dad9..04e48088edf 100644
--- a/app/diagnostics.go
+++ b/app/diagnostics.go
@@ -163,6 +163,7 @@ func trackConfig() {
"enable_only_admin_integrations": *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations,
"enable_post_username_override": utils.Cfg.ServiceSettings.EnablePostUsernameOverride,
"enable_post_icon_override": utils.Cfg.ServiceSettings.EnablePostIconOverride,
+ "enable_apiv3": *utils.Cfg.ServiceSettings.EnableAPIv3,
"enable_custom_emoji": *utils.Cfg.ServiceSettings.EnableCustomEmoji,
"restrict_custom_emoji_creation": *utils.Cfg.ServiceSettings.RestrictCustomEmojiCreation,
"enable_testing": utils.Cfg.ServiceSettings.EnableTesting,
diff --git a/config/config.json b/config/config.json
index 348467e98cd..57f4ef2638f 100644
--- a/config/config.json
+++ b/config/config.json
@@ -21,6 +21,7 @@
"EnableOnlyAdminIntegrations": true,
"EnablePostUsernameOverride": false,
"EnablePostIconOverride": false,
+ "EnableAPIv3": true,
"EnableLinkPreviews": false,
"EnableTesting": false,
"EnableDeveloper": false,
diff --git a/i18n/en.json b/i18n/en.json
index 308374ad47a..640ed93ea85 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -895,6 +895,10 @@
"id": "api.context.404.app_error",
"translation": "Sorry, we could not find the page."
},
+ {
+ "id": "api.context.v3_disabled.app_error",
+ "translation": "API version 3 has been disabled on this server. Please use API version 4. See https://api.mattermost.com for details."
+ },
{
"id": "api.context.invalid_body_param.app_error",
"translation": "Invalid or missing {{.Name}} in request body"
diff --git a/model/config.go b/model/config.go
index 9dedaf2fce3..25b4d863249 100644
--- a/model/config.go
+++ b/model/config.go
@@ -142,6 +142,7 @@ type ServiceSettings struct {
EnableOnlyAdminIntegrations *bool
EnablePostUsernameOverride bool
EnablePostIconOverride bool
+ EnableAPIv3 *bool
EnableLinkPreviews *bool
EnableTesting bool
EnableDeveloper *bool
@@ -563,6 +564,11 @@ func (o *Config) SetDefaults() {
o.ServiceSettings.LicenseFileLocation = new(string)
}
+ if o.ServiceSettings.EnableAPIv3 == nil {
+ o.ServiceSettings.EnableAPIv3 = new(bool)
+ *o.ServiceSettings.EnableAPIv3 = true
+ }
+
if o.ServiceSettings.EnableLinkPreviews == nil {
o.ServiceSettings.EnableLinkPreviews = new(bool)
*o.ServiceSettings.EnableLinkPreviews = false
diff --git a/webapp/components/admin_console/configuration_settings.jsx b/webapp/components/admin_console/configuration_settings.jsx
index 72bd0e33054..6ac68a3bb7f 100644
--- a/webapp/components/admin_console/configuration_settings.jsx
+++ b/webapp/components/admin_console/configuration_settings.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import React from 'react';
-import {FormattedMessage} from 'react-intl';
+import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
import ErrorStore from 'stores/error_store.jsx';
@@ -47,6 +47,7 @@ export default class ConfigurationSettings extends AdminSettings {
config.ServiceSettings.Forward80To443 = this.state.forward80To443;
config.ServiceSettings.ReadTimeout = this.parseIntNonZero(this.state.readTimeout);
config.ServiceSettings.WriteTimeout = this.parseIntNonZero(this.state.writeTimeout);
+ config.ServiceSettings.EnableAPIv3 = this.state.enableAPIv3;
return config;
}
@@ -63,7 +64,8 @@ export default class ConfigurationSettings extends AdminSettings {
letsEncryptCertificateCacheFile: config.ServiceSettings.LetsEncryptCertificateCacheFile,
forward80To443: config.ServiceSettings.Forward80To443,
readTimeout: config.ServiceSettings.ReadTimeout,
- writeTimeout: config.ServiceSettings.WriteTimeout
+ writeTimeout: config.ServiceSettings.WriteTimeout,
+ enableAPIv3: config.ServiceSettings.EnableAPIv3
};
}
@@ -304,6 +306,23 @@ export default class ConfigurationSettings extends AdminSettings {
value={this.state.writeTimeout}
onChange={this.handleChange}
/>
+
+ }
+ helpText={
+
+ }
+ value={this.state.enableAPIv3}
+ onChange={this.handleChange}
+ />
https://api.mattermost.com for details.",
"admin.service.enforceMfaDesc": "When true, multi-factor authentication is required for login. New users will be required to configure MFA on signup. Logged in users without MFA configured are redirected to the MFA setup page until configuration is complete.
If your system has users with login methods other than AD/LDAP and email, MFA must be enforced with the authentication provider outside of Mattermost.",
"admin.service.enforceMfaTitle": "Enforce Multi-factor Authentication:",
"admin.service.forward80To443": "Forward port 80 to 443:",