From 648f333850163efeac486c4b07eb47da415a9c98 Mon Sep 17 00:00:00 2001 From: Saturnino Abril Date: Thu, 29 Jun 2017 22:39:57 +0800 Subject: [PLT-6496] Remove System Console and config settings for image height and width (#6688) * remove System Console and config settings for image height and width * add constants and update config.json * updated as per review --- app/diagnostics.go | 6 - app/file.go | 23 ++- app/user.go | 20 +-- config/config.json | 6 - model/config.go | 30 ---- utils/config.go | 2 - webapp/components/admin_console/admin_sidebar.jsx | 10 +- .../admin_console/admin_sidebar_section.jsx | 4 +- webapp/components/admin_console/image_settings.jsx | 167 --------------------- webapp/components/setting_picture.jsx | 7 +- webapp/i18n/en.json | 19 --- webapp/routes/route_admin_console.jsx | 5 - webapp/utils/constants.jsx | 2 + 13 files changed, 30 insertions(+), 271 deletions(-) delete mode 100644 webapp/components/admin_console/image_settings.jsx diff --git a/app/diagnostics.go b/app/diagnostics.go index a80b747ef..14e207997 100644 --- a/app/diagnostics.go +++ b/app/diagnostics.go @@ -245,12 +245,6 @@ func trackConfig() { "driver_name": utils.Cfg.FileSettings.DriverName, "amazon_s3_ssl": *utils.Cfg.FileSettings.AmazonS3SSL, "amazon_s3_signv2": *utils.Cfg.FileSettings.AmazonS3SignV2, - "thumbnail_width": utils.Cfg.FileSettings.ThumbnailWidth, - "thumbnail_height": utils.Cfg.FileSettings.ThumbnailHeight, - "preview_width": utils.Cfg.FileSettings.PreviewWidth, - "preview_height": utils.Cfg.FileSettings.PreviewHeight, - "profile_width": utils.Cfg.FileSettings.ProfileWidth, - "profile_height": utils.Cfg.FileSettings.ProfileHeight, "max_file_size": *utils.Cfg.FileSettings.MaxFileSize, }) diff --git a/app/file.go b/app/file.go index f46dd50ec..9786ba961 100644 --- a/app/file.go +++ b/app/file.go @@ -53,7 +53,10 @@ const ( RotatedCCWMirrored = 7 RotatedCW = 8 - MaxImageSize = 6048 * 4032 // 24 megapixels, roughly 36MB as a raw image + MaxImageSize = 6048 * 4032 // 24 megapixels, roughly 36MB as a raw image + IMAGE_THUMBNAIL_PIXEL_WIDTH = 120 + IMAGE_THUMBNAIL_PIXEL_HEIGTH = 100 + IMAGE_PREVIEW_PIXEL_WIDTH = 1024 ) // Similar to s3.New() but allows initialization of signature v2 or signature v4 client. @@ -553,18 +556,13 @@ func getImageOrientation(input io.Reader) (int, error) { } func generateThumbnailImage(img image.Image, thumbnailPath string, width int, height int) { - thumbWidth := float64(utils.Cfg.FileSettings.ThumbnailWidth) - thumbHeight := float64(utils.Cfg.FileSettings.ThumbnailHeight) - imgWidth := float64(width) - imgHeight := float64(height) - var thumbnail image.Image - if imgHeight < thumbHeight && imgWidth < thumbWidth { + if height < IMAGE_THUMBNAIL_PIXEL_HEIGTH && width < IMAGE_THUMBNAIL_PIXEL_WIDTH { thumbnail = img - } else if imgHeight/imgWidth < thumbHeight/thumbWidth { - thumbnail = imaging.Resize(img, 0, utils.Cfg.FileSettings.ThumbnailHeight, imaging.Lanczos) + } else if height/width < IMAGE_THUMBNAIL_PIXEL_HEIGTH/IMAGE_THUMBNAIL_PIXEL_WIDTH { + thumbnail = imaging.Resize(img, 0, IMAGE_THUMBNAIL_PIXEL_HEIGTH, imaging.Lanczos) } else { - thumbnail = imaging.Resize(img, utils.Cfg.FileSettings.ThumbnailWidth, 0, imaging.Lanczos) + thumbnail = imaging.Resize(img, IMAGE_THUMBNAIL_PIXEL_WIDTH, 0, imaging.Lanczos) } buf := new(bytes.Buffer) @@ -581,8 +579,9 @@ func generateThumbnailImage(img image.Image, thumbnailPath string, width int, he func generatePreviewImage(img image.Image, previewPath string, width int) { var preview image.Image - if width > int(utils.Cfg.FileSettings.PreviewWidth) { - preview = imaging.Resize(img, utils.Cfg.FileSettings.PreviewWidth, utils.Cfg.FileSettings.PreviewHeight, imaging.Lanczos) + + if width > IMAGE_PREVIEW_PIXEL_WIDTH { + preview = imaging.Resize(img, IMAGE_PREVIEW_PIXEL_WIDTH, 0, imaging.Lanczos) } else { preview = img } diff --git a/app/user.go b/app/user.go index de5881d00..eaeed53a5 100644 --- a/app/user.go +++ b/app/user.go @@ -31,10 +31,11 @@ import ( ) const ( - TOKEN_TYPE_PASSWORD_RECOVERY = "password_recovery" - TOKEN_TYPE_VERIFY_EMAIL = "verify_email" - PASSWORD_RECOVER_EXPIRY_TIME = 1000 * 60 * 60 // 1 hour - VERIFY_EMAIL_EXPIRY_TIME = 1000 * 60 * 60 // 1 hour + TOKEN_TYPE_PASSWORD_RECOVERY = "password_recovery" + TOKEN_TYPE_VERIFY_EMAIL = "verify_email" + PASSWORD_RECOVER_EXPIRY_TIME = 1000 * 60 * 60 // 1 hour + VERIFY_EMAIL_EXPIRY_TIME = 1000 * 60 * 60 // 1 hour + IMAGE_PROFILE_PIXEL_DIMENSION = 128 ) func CreateUserWithHash(user *model.User, hash string, data string) (*model.User, *model.AppError) { @@ -717,13 +718,11 @@ func CreateProfileImage(username string, userId string) ([]byte, *model.AppError return nil, model.NewLocAppError("CreateProfileImage", "api.user.create_profile_image.default_font.app_error", nil, err.Error()) } - width := int(utils.Cfg.FileSettings.ProfileWidth) - height := int(utils.Cfg.FileSettings.ProfileHeight) color := colors[int64(seed)%int64(len(colors))] - dstImg := image.NewRGBA(image.Rect(0, 0, width, height)) + dstImg := image.NewRGBA(image.Rect(0, 0, IMAGE_PROFILE_PIXEL_DIMENSION, IMAGE_PROFILE_PIXEL_DIMENSION)) srcImg := image.White draw.Draw(dstImg, dstImg.Bounds(), &image.Uniform{color}, image.ZP, draw.Src) - size := float64((width + height) / 4) + size := float64(IMAGE_PROFILE_PIXEL_DIMENSION / 2) c := freetype.NewContext() c.SetFont(font) @@ -732,7 +731,7 @@ func CreateProfileImage(username string, userId string) ([]byte, *model.AppError c.SetDst(dstImg) c.SetSrc(srcImg) - pt := freetype.Pt(width/6, height*2/3) + pt := freetype.Pt(IMAGE_PROFILE_PIXEL_DIMENSION/6, IMAGE_PROFILE_PIXEL_DIMENSION*2/3) _, err = c.DrawString(initial, pt) if err != nil { return nil, model.NewLocAppError("CreateProfileImage", "api.user.create_profile_image.initial.app_error", nil, err.Error()) @@ -809,7 +808,8 @@ func SetProfileImage(userId string, imageData *multipart.FileHeader) *model.AppE img = makeImageUpright(img, orientation) // Scale profile image - img = imaging.Fill(img, utils.Cfg.FileSettings.ProfileWidth, utils.Cfg.FileSettings.ProfileHeight, imaging.Center, imaging.Lanczos) + profileWidthAndHeight := 128 + img = imaging.Fill(img, profileWidthAndHeight, profileWidthAndHeight, imaging.Center, imaging.Lanczos) buf := new(bytes.Buffer) err = png.Encode(buf, img) diff --git a/config/config.json b/config/config.json index 85e07bdce..928468ed0 100644 --- a/config/config.json +++ b/config/config.json @@ -113,12 +113,6 @@ "Directory": "./data/", "EnablePublicLink": false, "PublicLinkSalt": "", - "ThumbnailWidth": 120, - "ThumbnailHeight": 100, - "PreviewWidth": 1024, - "PreviewHeight": 0, - "ProfileWidth": 128, - "ProfileHeight": 128, "InitialFont": "luximbi.ttf", "AmazonS3AccessKeyId": "", "AmazonS3SecretAccessKey": "", diff --git a/model/config.go b/model/config.go index f2b17bced..90b3bd6c8 100644 --- a/model/config.go +++ b/model/config.go @@ -231,12 +231,6 @@ type FileSettings struct { Directory string EnablePublicLink bool PublicLinkSalt *string - ThumbnailWidth int - ThumbnailHeight int - PreviewWidth int - PreviewHeight int - ProfileWidth int - ProfileHeight int InitialFont string AmazonS3AccessKeyId string AmazonS3SecretAccessKey string @@ -1426,30 +1420,6 @@ func (o *Config) IsValid() *AppError { return NewLocAppError("Config.IsValid", "model.config.is_valid.file_driver.app_error", nil, "") } - if o.FileSettings.PreviewHeight < 0 { - return NewLocAppError("Config.IsValid", "model.config.is_valid.file_preview_height.app_error", nil, "") - } - - if o.FileSettings.PreviewWidth <= 0 { - return NewLocAppError("Config.IsValid", "model.config.is_valid.file_preview_width.app_error", nil, "") - } - - if o.FileSettings.ProfileHeight <= 0 { - return NewLocAppError("Config.IsValid", "model.config.is_valid.file_profile_height.app_error", nil, "") - } - - if o.FileSettings.ProfileWidth <= 0 { - return NewLocAppError("Config.IsValid", "model.config.is_valid.file_profile_width.app_error", nil, "") - } - - if o.FileSettings.ThumbnailHeight <= 0 { - return NewLocAppError("Config.IsValid", "model.config.is_valid.file_thumb_height.app_error", nil, "") - } - - if o.FileSettings.ThumbnailWidth <= 0 { - return NewLocAppError("Config.IsValid", "model.config.is_valid.file_thumb_width.app_error", nil, "") - } - if len(*o.FileSettings.PublicLinkSalt) < 32 { return NewLocAppError("Config.IsValid", "model.config.is_valid.file_salt.app_error", nil, "") } diff --git a/utils/config.go b/utils/config.go index b3506ec33..8b096b6ea 100644 --- a/utils/config.go +++ b/utils/config.go @@ -452,8 +452,6 @@ func getClientConfig(c *model.Config) map[string]string { props["EnableFileAttachments"] = strconv.FormatBool(*c.FileSettings.EnableFileAttachments) props["EnablePublicLink"] = strconv.FormatBool(c.FileSettings.EnablePublicLink) - props["ProfileHeight"] = fmt.Sprintf("%v", c.FileSettings.ProfileHeight) - props["ProfileWidth"] = fmt.Sprintf("%v", c.FileSettings.ProfileWidth) props["WebsocketPort"] = fmt.Sprintf("%v", *c.ServiceSettings.WebsocketPort) props["WebsocketSecurePort"] = fmt.Sprintf("%v", *c.ServiceSettings.WebsocketSecurePort) diff --git a/webapp/components/admin_console/admin_sidebar.jsx b/webapp/components/admin_console/admin_sidebar.jsx index 05924d02f..d64d5edee 100644 --- a/webapp/components/admin_console/admin_sidebar.jsx +++ b/webapp/components/admin_console/admin_sidebar.jsx @@ -529,6 +529,7 @@ export default class AdminSidebar extends React.Component { } > } /> - - } - /> 0) { + if (this.props.children) { clonedChildren = (
    { diff --git a/webapp/components/admin_console/image_settings.jsx b/webapp/components/admin_console/image_settings.jsx deleted file mode 100644 index 94f893ee2..000000000 --- a/webapp/components/admin_console/image_settings.jsx +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import React from 'react'; - -import * as Utils from 'utils/utils.jsx'; - -import AdminSettings from './admin_settings.jsx'; -import {FormattedMessage} from 'react-intl'; -import SettingsGroup from './settings_group.jsx'; -import TextSetting from './text_setting.jsx'; - -export default class ImageSettings extends AdminSettings { - constructor(props) { - super(props); - - this.getConfigFromState = this.getConfigFromState.bind(this); - - this.renderSettings = this.renderSettings.bind(this); - } - - getConfigFromState(config) { - config.FileSettings.ThumbnailWidth = this.parseInt(this.state.thumbnailWidth); - config.FileSettings.ThumbnailHeight = this.parseInt(this.state.thumbnailHeight); - config.FileSettings.ProfileWidth = this.parseInt(this.state.profileWidth); - config.FileSettings.ProfileHeight = this.parseInt(this.state.profileHeight); - config.FileSettings.PreviewWidth = this.parseInt(this.state.previewWidth); - config.FileSettings.PreviewHeight = this.parseInt(this.state.previewHeight); - - return config; - } - - getStateFromConfig(config) { - return { - thumbnailWidth: config.FileSettings.ThumbnailWidth, - thumbnailHeight: config.FileSettings.ThumbnailHeight, - profileWidth: config.FileSettings.ProfileWidth, - profileHeight: config.FileSettings.ProfileHeight, - previewWidth: config.FileSettings.PreviewWidth, - previewHeight: config.FileSettings.PreviewHeight - }; - } - - renderTitle() { - return ( - - ); - } - - renderSettings() { - return ( - - - } - placeholder={Utils.localizeMessage('admin.image.thumbWidthExample', 'Ex "120"')} - helpText={ - - } - value={this.state.thumbnailWidth} - onChange={this.handleChange} - /> - - } - placeholder={Utils.localizeMessage('admin.image.thumbHeightExample', 'Ex "100"')} - helpText={ - - } - value={this.state.thumbnailHeight} - onChange={this.handleChange} - /> - - } - placeholder={Utils.localizeMessage('admin.image.profileWidthExample', 'Ex "1024"')} - helpText={ - - } - value={this.state.profileWidth} - onChange={this.handleChange} - /> - - } - placeholder={Utils.localizeMessage('admin.image.profileHeightExample', 'Ex "0"')} - helpText={ - - } - value={this.state.profileHeight} - onChange={this.handleChange} - /> - - } - placeholder={Utils.localizeMessage('admin.image.previewWidthExample', 'Ex "1024"')} - helpText={ - - } - value={this.state.previewWidth} - onChange={this.handleChange} - /> - - } - placeholder={Utils.localizeMessage('admin.image.previewHeightExample', 'Ex "0"')} - helpText={ - - } - value={this.state.previewHeight} - onChange={this.handleChange} - /> - - ); - } -} diff --git a/webapp/components/setting_picture.jsx b/webapp/components/setting_picture.jsx index 2d389a902..faa463cc7 100644 --- a/webapp/components/setting_picture.jsx +++ b/webapp/components/setting_picture.jsx @@ -7,9 +7,10 @@ import React, {Component} from 'react'; import {FormattedMessage} from 'react-intl'; import FormError from 'components/form_error.jsx'; - import loadingGif from 'images/load.gif'; +import Constants from 'utils/constants.jsx'; + export default class SettingPicture extends Component { static propTypes = { clientError: PropTypes.string, @@ -114,8 +115,8 @@ export default class SettingPicture extends Component { id='setting_picture.help' defaultMessage='Upload a profile picture in BMP, JPG, JPEG or PNG format, at least {width}px in width and {height}px height.' values={{ - width: global.mm_config.ProfileWidth, - height: global.mm_config.ProfileHeight + width: Constants.PROFILE_WIDTH, + height: Constants.PROFILE_WIDTH }} /> diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json index b1f688e40..878c6cdea 100755 --- a/webapp/i18n/en.json +++ b/webapp/i18n/en.json @@ -415,18 +415,6 @@ "admin.image.maxFileSizeDescription": "Maximum file size for message attachments in megabytes. Caution: Verify server memory can support your setting choice. Large file sizes increase the risk of server crashes and failed uploads due to network interruptions.", "admin.image.maxFileSizeExample": "50", "admin.image.maxFileSizeTitle": "Maximum File Size:", - "admin.image.previewHeightDescription": "Maximum height of preview image (\"0\": Sets to auto-size). Updating this value changes how preview images render in future, but does not change images created in the past.", - "admin.image.previewHeightExample": "E.g.: \"0\"", - "admin.image.previewHeightTitle": "Image Preview Height:", - "admin.image.previewWidthDescription": "Maximum width of preview image. Updating this value changes how preview images render in future, but does not change images created in the past.", - "admin.image.previewWidthExample": "E.g.: \"1024\"", - "admin.image.previewWidthTitle": "Image Preview Width:", - "admin.image.profileHeightDescription": "Height of profile picture.", - "admin.image.profileHeightExample": "E.g.: \"0\"", - "admin.image.profileHeightTitle": "Profile Picture Height:", - "admin.image.profileWidthDescription": "Width of profile picture.", - "admin.image.profileWidthExample": "E.g.: \"1024\"", - "admin.image.profileWidthTitle": "Profile Picture Width:", "admin.image.publicLinkDescription": "32-character salt added to signing of public image links. Randomly generated on install. Click \"Regenerate\" to create new salt.", "admin.image.publicLinkExample": "E.g.: \"gxHVDcKUyP2y1eiyW8S8na1UYQAfq6J6\"", "admin.image.publicLinkTitle": "Public Link Salt:", @@ -436,12 +424,6 @@ "admin.image.storeDescription": "Storage system where files and image attachments are saved.

    Selecting \"Amazon S3\" enables fields to enter your Amazon credentials and bucket details.

    Selecting \"Local File System\" enables the field to specify a local file directory.", "admin.image.storeLocal": "Local File System", "admin.image.storeTitle": "File Storage System:", - "admin.image.thumbHeightDescription": "Height of thumbnails generated from uploaded images. Updating this value changes how thumbnail images render in future, but does not change images created in the past.", - "admin.image.thumbHeightExample": "E.g.: \"100\"", - "admin.image.thumbHeightTitle": "Attachment Thumbnail Height:", - "admin.image.thumbWidthDescription": "Width of thumbnails generated from uploaded images. Updating this value changes how thumbnail images render in future, but does not change images created in the past.", - "admin.image.thumbWidthExample": "E.g.: \"120\"", - "admin.image.thumbWidthTitle": "Attachment Thumbnail Width:", "admin.integrations.custom": "Custom Integrations", "admin.integrations.external": "External Services", "admin.integrations.webrtc": "Mattermost WebRTC", @@ -782,7 +764,6 @@ "admin.sidebar.files": "Files", "admin.sidebar.general": "General", "admin.sidebar.gitlab": "GitLab", - "admin.sidebar.images": "Images", "admin.sidebar.integrations": "Integrations", "admin.sidebar.ldap": "AD/LDAP", "admin.sidebar.legalAndSupport": "Legal and Support", diff --git a/webapp/routes/route_admin_console.jsx b/webapp/routes/route_admin_console.jsx index 2a01d4115..06fb2ac30 100644 --- a/webapp/routes/route_admin_console.jsx +++ b/webapp/routes/route_admin_console.jsx @@ -32,7 +32,6 @@ import ExternalServiceSettings from 'components/admin_console/external_service_s import WebrtcSettings from 'components/admin_console/webrtc_settings.jsx'; import DatabaseSettings from 'components/admin_console/database_settings.jsx'; 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'; @@ -166,10 +165,6 @@ export default ( path='storage' component={StorageSettings} /> - diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx index 46cb009fd..14ef62ebc 100644 --- a/webapp/utils/constants.jsx +++ b/webapp/utils/constants.jsx @@ -385,6 +385,8 @@ export const Constants = { MAX_UPLOAD_FILES: 5, THUMBNAIL_WIDTH: 128, THUMBNAIL_HEIGHT: 100, + PROFILE_WIDTH: 128, + PROFILE_HEIGHT: 128, WEB_VIDEO_WIDTH: 640, WEB_VIDEO_HEIGHT: 480, MOBILE_VIDEO_WIDTH: 480, -- cgit v1.2.3-1-g7c22