From 8ec8948c84e946fde736add0c4e6dd55f6efd1ab Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Tue, 4 Jul 2017 16:12:02 -0400 Subject: [PATCH] PLT-6554 Add config setting to control enabling API version 3 (#6835) * Add config setting to control enabling API version 3 * Update help text for APIv3 config setting (#6843) * Update configuration_settings.jsx * Update en.json --- api/admin_test.go | 22 ++++++++++++++++++ api/api.go | 5 ++++ api/context.go | 4 ++++ app/diagnostics.go | 1 + config/config.json | 1 + i18n/en.json | 4 ++++ model/config.go | 6 +++++ .../admin_console/configuration_settings.jsx | 23 +++++++++++++++++-- webapp/i18n/en.json | 2 ++ 9 files changed, 66 insertions(+), 2 deletions(-) diff --git a/api/admin_test.go b/api/admin_test.go index a93257626b..d5f24b7155 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 c9c876b026..7e902c1598 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 6d1e758e8d..09cb1e5830 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 97f4df0dad..04e48088ed 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 348467e98c..57f4ef2638 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 308374ad47..640ed93ea8 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 9dedaf2fce..25b4d86324 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 72bd0e3305..6ac68a3bb7 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:",