// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import $ from 'jquery'; import ReactDOM from 'react-dom'; import * as Client from 'utils/client.jsx'; import * as AsyncClient from 'utils/async_client.jsx'; import crypto from 'crypto'; import {injectIntl, intlShape, defineMessages, FormattedMessage} from 'react-intl'; const holders = defineMessages({ storeLocal: { id: 'admin.image.storeLocal', defaultMessage: 'Local File System' }, storeAmazonS3: { id: 'admin.image.storeAmazonS3', defaultMessage: 'Amazon S3' }, localExample: { id: 'admin.image.localExample', defaultMessage: 'Ex "./data/"' }, amazonS3IdExample: { id: 'admin.image.amazonS3IdExample', defaultMessage: 'Ex "AKIADTOVBGERKLCBV"' }, amazonS3SecretExample: { id: 'admin.image.amazonS3SecretExample', defaultMessage: 'Ex "jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY"' }, amazonS3BucketExample: { id: 'admin.image.amazonS3BucketExample', defaultMessage: 'Ex "mattermost-media"' }, amazonS3RegionExample: { id: 'admin.image.amazonS3RegionExample', defaultMessage: 'Ex "us-east-1"' }, thumbWidthExample: { id: 'admin.image.thumbWidthExample', defaultMessage: 'Ex "120"' }, thumbHeightExample: { id: 'admin.image.thumbHeightExample', defaultMessage: 'Ex "100"' }, previewWidthExample: { id: 'admin.image.previewWidthExample', defaultMessage: 'Ex "1024"' }, previewHeightExample: { id: 'admin.image.previewHeightExample', defaultMessage: 'Ex "0"' }, profileWidthExample: { id: 'admin.image.profileWidthExample', defaultMessage: 'Ex "1024"' }, profileHeightExample: { id: 'admin.image.profileHeightExample', defaultMessage: 'Ex "0"' }, publicLinkExample: { id: 'admin.image.publicLinkExample', defaultMessage: 'Ex "gxHVDcKUyP2y1eiyW8S8na1UYQAfq6J6"' }, saving: { id: 'admin.image.saving', defaultMessage: 'Saving Config...' } }); import React from 'react'; class FileSettings extends React.Component { constructor(props) { super(props); this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); this.handleGenerate = this.handleGenerate.bind(this); this.state = { saveNeeded: false, serverError: null, DriverName: this.props.config.FileSettings.DriverName }; } handleChange(action) { var s = {saveNeeded: true, serverError: this.state.serverError}; if (action === 'DriverName') { s.DriverName = ReactDOM.findDOMNode(this.refs.DriverName).value; } this.setState(s); } handleGenerate(e) { e.preventDefault(); ReactDOM.findDOMNode(this.refs.PublicLinkSalt).value = crypto.randomBytes(256).toString('base64').substring(0, 32); var s = {saveNeeded: true, serverError: this.state.serverError}; this.setState(s); } handleSubmit(e) { e.preventDefault(); $('#save-button').button('loading'); var config = this.props.config; config.FileSettings.DriverName = ReactDOM.findDOMNode(this.refs.DriverName).value; config.FileSettings.Directory = ReactDOM.findDOMNode(this.refs.Directory).value; config.FileSettings.AmazonS3AccessKeyId = ReactDOM.findDOMNode(this.refs.AmazonS3AccessKeyId).value; config.FileSettings.AmazonS3SecretAccessKey = ReactDOM.findDOMNode(this.refs.AmazonS3SecretAccessKey).value; config.FileSettings.AmazonS3Bucket = ReactDOM.findDOMNode(this.refs.AmazonS3Bucket).value; config.FileSettings.AmazonS3Region = ReactDOM.findDOMNode(this.refs.AmazonS3Region).value; config.FileSettings.EnablePublicLink = ReactDOM.findDOMNode(this.refs.EnablePublicLink).checked; config.FileSettings.PublicLinkSalt = ReactDOM.findDOMNode(this.refs.PublicLinkSalt).value.trim(); if (config.FileSettings.PublicLinkSalt === '') { config.FileSettings.PublicLinkSalt = crypto.randomBytes(256).toString('base64').substring(0, 32); ReactDOM.findDOMNode(this.refs.PublicLinkSalt).value = config.FileSettings.PublicLinkSalt; } var thumbnailWidth = 120; if (!isNaN(parseInt(ReactDOM.findDOMNode(this.refs.ThumbnailWidth).value, 10))) { thumbnailWidth = parseInt(ReactDOM.findDOMNode(this.refs.ThumbnailWidth).value, 10); } config.FileSettings.ThumbnailWidth = thumbnailWidth; ReactDOM.findDOMNode(this.refs.ThumbnailWidth).value = thumbnailWidth; var thumbnailHeight = 100; if (!isNaN(parseInt(ReactDOM.findDOMNode(this.refs.ThumbnailHeight).value, 10))) { thumbnailHeight = parseInt(ReactDOM.findDOMNode(this.refs.ThumbnailHeight).value, 10); } config.FileSettings.ThumbnailHeight = thumbnailHeight; ReactDOM.findDOMNode(this.refs.ThumbnailHeight).value = thumbnailHeight; var previewWidth = 1024; if (!isNaN(parseInt(ReactDOM.findDOMNode(this.refs.PreviewWidth).value, 10))) { previewWidth = parseInt(ReactDOM.findDOMNode(this.refs.PreviewWidth).value, 10); } config.FileSettings.PreviewWidth = previewWidth; ReactDOM.findDOMNode(this.refs.PreviewWidth).value = previewWidth; var previewHeight = 0; if (!isNaN(parseInt(ReactDOM.findDOMNode(this.refs.PreviewHeight).value, 10))) { previewHeight = parseInt(ReactDOM.findDOMNode(this.refs.PreviewHeight).value, 10); } config.FileSettings.PreviewHeight = previewHeight; ReactDOM.findDOMNode(this.refs.PreviewHeight).value = previewHeight; var profileWidth = 128; if (!isNaN(parseInt(ReactDOM.findDOMNode(this.refs.ProfileWidth).value, 10))) { profileWidth = parseInt(ReactDOM.findDOMNode(this.refs.ProfileWidth).value, 10); } config.FileSettings.ProfileWidth = profileWidth; ReactDOM.findDOMNode(this.refs.ProfileWidth).value = profileWidth; var profileHeight = 128; if (!isNaN(parseInt(ReactDOM.findDOMNode(this.refs.ProfileHeight).value, 10))) { profileHeight = parseInt(ReactDOM.findDOMNode(this.refs.ProfileHeight).value, 10); } config.FileSettings.ProfileHeight = profileHeight; ReactDOM.findDOMNode(this.refs.ProfileHeight).value = profileHeight; Client.saveConfig( config, () => { AsyncClient.getConfig(); this.setState({ serverError: null, saveNeeded: false }); $('#save-button').button('reset'); }, (err) => { this.setState({ serverError: err.message, saveNeeded: true }); $('#save-button').button('reset'); } ); } render() { const {formatMessage} = this.props.intl; var serverError = ''; if (this.state.serverError) { serverError =
; } var saveClass = 'btn'; if (this.state.saveNeeded) { saveClass = 'btn btn-primary'; } var enableFile = false; var enableS3 = false; if (this.state.DriverName === 'local') { enableFile = true; } if (this.state.DriverName === 'amazons3') { enableS3 = true; } return (

{serverError}
); } } FileSettings.propTypes = { intl: intlShape.isRequired, config: React.PropTypes.object }; export default injectIntl(FileSettings);