diff options
-rw-r--r-- | api/post.go | 5 | ||||
-rw-r--r-- | api/post_test.go | 11 | ||||
-rw-r--r-- | config/config.json | 1 | ||||
-rw-r--r-- | i18n/en.json | 4 | ||||
-rw-r--r-- | model/config.go | 6 | ||||
-rw-r--r-- | utils/config.go | 1 | ||||
-rw-r--r-- | webapp/actions/global_actions.jsx | 4 | ||||
-rw-r--r-- | webapp/components/admin_console/admin_sidebar.jsx | 10 | ||||
-rw-r--r-- | webapp/components/admin_console/link_previews_settings.jsx | 66 | ||||
-rw-r--r-- | webapp/components/user_settings/user_settings_advanced.jsx | 17 | ||||
-rw-r--r-- | webapp/i18n/en.json | 4 | ||||
-rw-r--r-- | webapp/routes/route_admin_console.jsx | 5 |
12 files changed, 128 insertions, 6 deletions
diff --git a/api/post.go b/api/post.go index 9c22dc5ee..4e7801e2b 100644 --- a/api/post.go +++ b/api/post.go @@ -452,6 +452,11 @@ func getFileInfosForPost(c *Context, w http.ResponseWriter, r *http.Request) { } func getOpenGraphMetadata(c *Context, w http.ResponseWriter, r *http.Request) { + if !*utils.Cfg.ServiceSettings.EnableLinkPreviews { + c.Err = model.NewAppError("getOpenGraphMetadata", "api.post.link_preview_disabled.app_error", nil, "", http.StatusNotImplemented) + return + } + props := model.StringInterfaceFromJson(r.Body) ogJSONGeneric, ok := openGraphDataCache.Get(props["url"]) diff --git a/api/post_test.go b/api/post_test.go index b93b5b6a6..39ef2f6c0 100644 --- a/api/post_test.go +++ b/api/post_test.go @@ -1307,6 +1307,12 @@ func TestGetOpenGraphMetadata(t *testing.T) { th := Setup().InitBasic() Client := th.BasicClient + enableLinkPreviews := *utils.Cfg.ServiceSettings.EnableLinkPreviews + defer func() { + *utils.Cfg.ServiceSettings.EnableLinkPreviews = enableLinkPreviews + }() + *utils.Cfg.ServiceSettings.EnableLinkPreviews = true + ogDataCacheMissCount := 0 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -1355,4 +1361,9 @@ func TestGetOpenGraphMetadata(t *testing.T) { )) } } + + *utils.Cfg.ServiceSettings.EnableLinkPreviews = false + if _, err := Client.DoApiPost("/get_opengraph_metadata", "{\"url\":\"/og-data/\"}"); err == nil || err.StatusCode != http.StatusNotImplemented { + t.Fatal("should have failed with 501 - disabled link previews") + } } diff --git a/config/config.json b/config/config.json index 3c4ed9bf3..18594f60d 100644 --- a/config/config.json +++ b/config/config.json @@ -19,6 +19,7 @@ "EnableOnlyAdminIntegrations": true, "EnablePostUsernameOverride": false, "EnablePostIconOverride": false, + "EnableLinkPreviews": false, "EnableTesting": false, "EnableDeveloper": false, "EnableSecurityFixAlert": true, diff --git a/i18n/en.json b/i18n/en.json index 156d6d8b2..14b8383da 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -4,6 +4,10 @@ "translation": "April" }, { + "id": "api.post.link_preview_disabled.app_error", + "translation": "Link previews have been disabled by the system administrator." + }, + { "id": "August", "translation": "August" }, diff --git a/model/config.go b/model/config.go index 37c1dae36..86693b57e 100644 --- a/model/config.go +++ b/model/config.go @@ -129,6 +129,7 @@ type ServiceSettings struct { EnableOnlyAdminIntegrations *bool EnablePostUsernameOverride bool EnablePostIconOverride bool + EnableLinkPreviews *bool EnableTesting bool EnableDeveloper *bool EnableSecurityFixAlert *bool @@ -495,6 +496,11 @@ func (o *Config) SetDefaults() { *o.ServiceSettings.SiteURL = SERVICE_SETTINGS_DEFAULT_SITE_URL } + if o.ServiceSettings.EnableLinkPreviews == nil { + o.ServiceSettings.EnableLinkPreviews = new(bool) + *o.ServiceSettings.EnableLinkPreviews = false + } + if o.ServiceSettings.EnableDeveloper == nil { o.ServiceSettings.EnableDeveloper = new(bool) *o.ServiceSettings.EnableDeveloper = false diff --git a/utils/config.go b/utils/config.go index fd1597132..2996c241c 100644 --- a/utils/config.go +++ b/utils/config.go @@ -267,6 +267,7 @@ func getClientConfig(c *model.Config) map[string]string { props["EnableOnlyAdminIntegrations"] = strconv.FormatBool(*c.ServiceSettings.EnableOnlyAdminIntegrations) props["EnablePostUsernameOverride"] = strconv.FormatBool(c.ServiceSettings.EnablePostUsernameOverride) props["EnablePostIconOverride"] = strconv.FormatBool(c.ServiceSettings.EnablePostIconOverride) + props["EnableLinkPreviews"] = strconv.FormatBool(*c.ServiceSettings.EnableLinkPreviews) props["EnableTesting"] = strconv.FormatBool(c.ServiceSettings.EnableTesting) props["EnableDeveloper"] = strconv.FormatBool(*c.ServiceSettings.EnableDeveloper) props["EnableDiagnostics"] = strconv.FormatBool(*c.LogSettings.EnableDiagnostics) diff --git a/webapp/actions/global_actions.jsx b/webapp/actions/global_actions.jsx index c4b29a231..e22c94294 100644 --- a/webapp/actions/global_actions.jsx +++ b/webapp/actions/global_actions.jsx @@ -623,6 +623,10 @@ export function redirectUserToDefaultTeam() { requestOpenGraphMetadata.openGraphMetadataOnGoingRequests = {}; // Format: {<url>: true} export function requestOpenGraphMetadata(url) { + if (global.mm_config.EnableLinkPreviews !== 'true') { + return; + } + const onself = requestOpenGraphMetadata; if (!onself.openGraphMetadataOnGoingRequests[url]) { diff --git a/webapp/components/admin_console/admin_sidebar.jsx b/webapp/components/admin_console/admin_sidebar.jsx index c53836ef6..2f299bdeb 100644 --- a/webapp/components/admin_console/admin_sidebar.jsx +++ b/webapp/components/admin_console/admin_sidebar.jsx @@ -690,6 +690,16 @@ export default class AdminSidebar extends React.Component { } /> <AdminSidebarSection + name='link_previews' + title={ + <FormattedMessage + id='admin.sidebar.linkPreviews' + defaultMessage='Link Previews' + /> + + } + /> + <AdminSidebarSection name='legal_and_support' title={ <FormattedMessage diff --git a/webapp/components/admin_console/link_previews_settings.jsx b/webapp/components/admin_console/link_previews_settings.jsx new file mode 100644 index 000000000..aea8a56f1 --- /dev/null +++ b/webapp/components/admin_console/link_previews_settings.jsx @@ -0,0 +1,66 @@ +// Copyright (c) 2017 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; + +import AdminSettings from './admin_settings.jsx'; +import BooleanSetting from './boolean_setting.jsx'; +import {FormattedMessage} from 'react-intl'; +import SettingsGroup from './settings_group.jsx'; + +export default class LinkPreviewsSettings extends AdminSettings { + constructor(props) { + super(props); + + this.getConfigFromState = this.getConfigFromState.bind(this); + + this.renderSettings = this.renderSettings.bind(this); + } + + getConfigFromState(config) { + config.ServiceSettings.EnableLinkPreviews = this.state.enableLinkPreviews; + + return config; + } + + getStateFromConfig(config) { + return { + enableLinkPreviews: config.ServiceSettings.EnableLinkPreviews + }; + } + + renderTitle() { + return ( + <h3> + <FormattedMessage + id='admin.customization.linkPreviews' + defaultMessage='Link Previews' + /> + </h3> + ); + } + + renderSettings() { + return ( + <SettingsGroup> + <BooleanSetting + id='enableLinkPreviews' + label={ + <FormattedMessage + id='admin.customization.enableLinkPreviewsTitle' + defaultMessage='Enable Link Previews:' + /> + } + helpText={ + <FormattedMessage + id='admin.customization.enableLinkPreviewsDesc' + defaultMessage='Enable users to display a preview of website content below the message, if available. When true, website previews can be enabled from Account Settings > Advanced > Preview pre-release features.' + /> + } + value={this.state.enableLinkPreviews} + onChange={this.handleChange} + /> + </SettingsGroup> + ); + } +} diff --git a/webapp/components/user_settings/user_settings_advanced.jsx b/webapp/components/user_settings/user_settings_advanced.jsx index 6e3d488e1..3459af8b3 100644 --- a/webapp/components/user_settings/user_settings_advanced.jsx +++ b/webapp/components/user_settings/user_settings_advanced.jsx @@ -53,14 +53,19 @@ export default class AdvancedSettingsDisplay extends React.Component { ) }; - let enabledFeatures = 0; - for (const [name, value] of advancedSettings) { - const webrtcEnabled = global.mm_config.EnableWebrtc === 'true'; + const webrtcEnabled = global.mm_config.EnableWebrtc === 'true'; + const linkPreviewsEnabled = global.mm_config.EnableLinkPreviews === 'true'; - if (!webrtcEnabled) { - preReleaseFeaturesKeys = preReleaseFeaturesKeys.filter((f) => f !== 'WEBRTC_PREVIEW'); - } + if (!webrtcEnabled) { + preReleaseFeaturesKeys = preReleaseFeaturesKeys.filter((f) => f !== 'WEBRTC_PREVIEW'); + } + if (!linkPreviewsEnabled) { + preReleaseFeaturesKeys = preReleaseFeaturesKeys.filter((f) => f !== 'EMBED_PREVIEW'); + } + + let enabledFeatures = 0; + for (const [name, value] of advancedSettings) { for (const key of preReleaseFeaturesKeys) { const feature = PreReleaseFeatures[key]; diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json index cf04ccc0e..53f7a7f3e 100644 --- a/webapp/i18n/en.json +++ b/webapp/i18n/en.json @@ -1,4 +1,8 @@ { + "admin.customization.enableLinkPreviewsDesc": "Enable users to display a preview of website content below the message, if available. When true, website previews can be enabled from Account Settings > Advanced > Preview pre-release features.", + "admin.customization.enableLinkPreviewsTitle": "Enable Link Previews:", + "admin.customization.linkPreviews": "Link Previews", + "admin.sidebar.linkPreviews": "Link Previews", "multiselect.go": "Go", "multiselect.instructions": "Use up/down arrows to navigate and enter to select", "multiselect.placeholder": "Search and add members", diff --git a/webapp/routes/route_admin_console.jsx b/webapp/routes/route_admin_console.jsx index 5b0f5d28e..f983af9f5 100644 --- a/webapp/routes/route_admin_console.jsx +++ b/webapp/routes/route_admin_console.jsx @@ -35,6 +35,7 @@ import StorageSettings from 'components/admin_console/storage_settings.jsx'; import ImageSettings from 'components/admin_console/image_settings.jsx'; import CustomBrandSettings from 'components/admin_console/custom_brand_settings.jsx'; import CustomEmojiSettings from 'components/admin_console/custom_emoji_settings.jsx'; +import LinkPreviewsSettings from 'components/admin_console/link_previews_settings.jsx'; import LegalAndSupportSettings from 'components/admin_console/legal_and_support_settings.jsx'; import NativeAppLinkSettings from 'components/admin_console/native_app_link_settings.jsx'; import ComplianceSettings from 'components/admin_console/compliance_settings.jsx'; @@ -181,6 +182,10 @@ export default ( component={CustomEmojiSettings} /> <Route + path='link_previews' + component={LinkPreviewsSettings} + /> + <Route path='legal_and_support' component={LegalAndSupportSettings} /> |