[CLD-7029] Add a new system console page for configuring custom export FileSettings (#26034)
* Add a new system console page for configuring custom export FileSettings * Remove NONE option for ExportDriverName dropdown * Fix tests * Fix i18n * Update webapp/channels/src/components/admin_console/admin_definition.tsx Co-authored-by: Ben Schumacher <ben.schumacher@mattermost.com> * PR Feedback * Fix formatting * gofmt --------- Co-authored-by: Mattermost Build <build@mattermost.com> Co-authored-by: Ben Schumacher <ben.schumacher@mattermost.com>
Этот коммит содержится в:
@@ -535,11 +535,6 @@ func testS3(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
if *c.App.Config().ExperimentalSettings.RestrictSystemAdmin {
|
||||
c.Err = model.NewAppError("testS3", "api.restricted_system_admin", nil, "", http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
|
||||
appErr := c.App.CheckMandatoryS3Fields(&cfg.FileSettings)
|
||||
if appErr != nil {
|
||||
c.Err = appErr
|
||||
|
||||
@@ -589,15 +589,6 @@ func TestS3TestConnection(t *testing.T) {
|
||||
CheckErrorID(t, err, "api.file.test_connection_s3_auth.app_error")
|
||||
})
|
||||
|
||||
t.Run("as restricted system admin", func(t *testing.T) {
|
||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = true })
|
||||
defer th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ExperimentalSettings.RestrictSystemAdmin = false })
|
||||
|
||||
resp, err := th.SystemAdminClient.TestS3Connection(context.Background(), &config)
|
||||
require.Error(t, err)
|
||||
CheckForbiddenStatus(t, resp)
|
||||
})
|
||||
|
||||
t.Run("empty file settings", func(t *testing.T) {
|
||||
config.FileSettings = model.FileSettings{}
|
||||
resp, err := th.SystemAdminClient.TestS3Connection(context.Background(), &config)
|
||||
|
||||
@@ -57,7 +57,13 @@ func (a *App) ExportFileBackend() filestore.FileBackend {
|
||||
}
|
||||
|
||||
func (a *App) CheckMandatoryS3Fields(settings *model.FileSettings) *model.AppError {
|
||||
fileBackendSettings := filestore.NewFileBackendSettingsFromConfig(settings, false, false)
|
||||
var fileBackendSettings filestore.FileBackendSettings
|
||||
if a.License().IsCloud() && a.Config().FeatureFlags.CloudDedicatedExportUI && a.Config().FileSettings.DedicatedExportStore != nil && *a.Config().FileSettings.DedicatedExportStore {
|
||||
fileBackendSettings = filestore.NewExportFileBackendSettingsFromConfig(settings, false, false)
|
||||
} else {
|
||||
fileBackendSettings = filestore.NewFileBackendSettingsFromConfig(settings, false, false)
|
||||
}
|
||||
|
||||
err := fileBackendSettings.CheckMandatoryS3Fields()
|
||||
if err != nil {
|
||||
return model.NewAppError("CheckMandatoryS3Fields", "api.admin.test_s3.missing_s3_bucket", nil, "", http.StatusBadRequest).Wrap(err)
|
||||
@@ -87,7 +93,15 @@ func (a *App) TestFileStoreConnection() *model.AppError {
|
||||
func (a *App) TestFileStoreConnectionWithConfig(cfg *model.FileSettings) *model.AppError {
|
||||
license := a.Srv().License()
|
||||
insecure := a.Config().ServiceSettings.EnableInsecureOutgoingConnections
|
||||
backend, err := filestore.NewFileBackend(filestore.NewFileBackendSettingsFromConfig(cfg, license != nil && *license.Features.Compliance, insecure != nil && *insecure))
|
||||
var backend filestore.FileBackend
|
||||
var err error
|
||||
complianceEnabled := license != nil && *license.Features.Compliance
|
||||
if license.IsCloud() && a.Config().FeatureFlags.CloudDedicatedExportUI && a.Config().FileSettings.DedicatedExportStore != nil && *a.Config().FileSettings.DedicatedExportStore {
|
||||
allowInsecure := a.Config().ServiceSettings.EnableInsecureOutgoingConnections != nil && *a.Config().ServiceSettings.EnableInsecureOutgoingConnections
|
||||
backend, err = filestore.NewFileBackend(filestore.NewExportFileBackendSettingsFromConfig(cfg, complianceEnabled && license.IsCloud(), allowInsecure))
|
||||
} else {
|
||||
backend, err = filestore.NewFileBackend(filestore.NewFileBackendSettingsFromConfig(cfg, complianceEnabled, insecure != nil && *insecure))
|
||||
}
|
||||
if err != nil {
|
||||
return model.NewAppError("FileBackend", "api.file.no_driver.app_error", nil, "", http.StatusInternalServerError).Wrap(err)
|
||||
}
|
||||
|
||||
@@ -1600,21 +1600,21 @@ type FileSettings struct {
|
||||
AmazonS3Trace *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
AmazonS3RequestTimeoutMilliseconds *int64 `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
// Export store settings
|
||||
DedicatedExportStore *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
ExportDriverName *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
ExportDirectory *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
ExportAmazonS3AccessKeyId *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
ExportAmazonS3SecretAccessKey *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
ExportAmazonS3Bucket *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
ExportAmazonS3PathPrefix *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
ExportAmazonS3Region *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
ExportAmazonS3Endpoint *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
ExportAmazonS3SSL *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
ExportAmazonS3SignV2 *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
ExportAmazonS3SSE *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
ExportAmazonS3Trace *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
ExportAmazonS3RequestTimeoutMilliseconds *int64 `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
ExportAmazonS3PresignExpiresSeconds *int64 `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
DedicatedExportStore *bool `access:"environment_file_storage,write_restrictable"`
|
||||
ExportDriverName *string `access:"environment_file_storage,write_restrictable"`
|
||||
ExportDirectory *string `access:"environment_file_storage,write_restrictable"` // telemetry: none
|
||||
ExportAmazonS3AccessKeyId *string `access:"environment_file_storage,write_restrictable"` // telemetry: none
|
||||
ExportAmazonS3SecretAccessKey *string `access:"environment_file_storage,write_restrictable"` // telemetry: none
|
||||
ExportAmazonS3Bucket *string `access:"environment_file_storage,write_restrictable"` // telemetry: none
|
||||
ExportAmazonS3PathPrefix *string `access:"environment_file_storage,write_restrictable"` // telemetry: none
|
||||
ExportAmazonS3Region *string `access:"environment_file_storage,write_restrictable"` // telemetry: none
|
||||
ExportAmazonS3Endpoint *string `access:"environment_file_storage,write_restrictable"` // telemetry: none
|
||||
ExportAmazonS3SSL *bool `access:"environment_file_storage,write_restrictable"`
|
||||
ExportAmazonS3SignV2 *bool `access:"environment_file_storage,write_restrictable"`
|
||||
ExportAmazonS3SSE *bool `access:"environment_file_storage,write_restrictable"`
|
||||
ExportAmazonS3Trace *bool `access:"environment_file_storage,write_restrictable"`
|
||||
ExportAmazonS3RequestTimeoutMilliseconds *int64 `access:"environment_file_storage,write_restrictable"` // telemetry: none
|
||||
ExportAmazonS3PresignExpiresSeconds *int64 `access:"environment_file_storage,write_restrictable"` // telemetry: none
|
||||
}
|
||||
|
||||
func (s *FileSettings) SetDefaults(isUpdate bool) {
|
||||
|
||||
@@ -50,6 +50,9 @@ type FeatureFlags struct {
|
||||
ConsumePostHook bool
|
||||
|
||||
CloudAnnualRenewals bool
|
||||
|
||||
CloudDedicatedExportUI bool
|
||||
|
||||
WebSocketEventScope bool
|
||||
}
|
||||
|
||||
@@ -70,6 +73,7 @@ func (f *FeatureFlags) SetDefaults() {
|
||||
f.CloudIPFiltering = false
|
||||
f.ConsumePostHook = false
|
||||
f.CloudAnnualRenewals = false
|
||||
f.CloudDedicatedExportUI = false
|
||||
f.WebSocketEventScope = false
|
||||
}
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user