summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoram Wilander <jwawilander@gmail.com>2017-03-06 21:13:12 -0500
committerChristopher Speller <crspeller@gmail.com>2017-03-06 21:13:12 -0500
commite87f5c6cf912a4f650a056ee042f19268963177d (patch)
tree5bd573a645e8a3931ca2ee7131cac75d58871a5f
parentf99658152ac2e188d8196758ef5c635eaa3b3ae7 (diff)
downloadchat-e87f5c6cf912a4f650a056ee042f19268963177d.tar.gz
chat-e87f5c6cf912a4f650a056ee042f19268963177d.tar.bz2
chat-e87f5c6cf912a4f650a056ee042f19268963177d.zip
Add system console switch for enabling link previews (#5663)
-rw-r--r--api/post.go5
-rw-r--r--api/post_test.go11
-rw-r--r--config/config.json1
-rw-r--r--i18n/en.json4
-rw-r--r--model/config.go6
-rw-r--r--utils/config.go1
-rw-r--r--webapp/actions/global_actions.jsx4
-rw-r--r--webapp/components/admin_console/admin_sidebar.jsx10
-rw-r--r--webapp/components/admin_console/link_previews_settings.jsx66
-rw-r--r--webapp/components/user_settings/user_settings_advanced.jsx17
-rw-r--r--webapp/i18n/en.json4
-rw-r--r--webapp/routes/route_admin_console.jsx5
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}
/>