2015-10-08 12:27:09 -04:00
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
2015-09-22 12:12:50 -07:00
// See License.txt for license information.
var Client = require ( '../../utils/client.jsx' ) ;
var AsyncClient = require ( '../../utils/async_client.jsx' ) ;
export default class ServiceSettings extends React . Component {
constructor ( props ) {
super ( props ) ;
this . handleChange = this . handleChange . bind ( this ) ;
this . handleSubmit = this . handleSubmit . bind ( this ) ;
this . state = {
saveNeeded : false ,
serverError : null
} ;
}
handleChange ( ) {
var s = { saveNeeded : true , serverError : this . state . serverError } ;
this . setState ( s ) ;
}
handleSubmit ( e ) {
e . preventDefault ( ) ;
$ ( '#save-button' ) . button ( 'loading' ) ;
var config = this . props . config ;
2015-10-15 12:07:06 -04:00
config . ServiceSettings . ListenAddress = ReactDOM . findDOMNode ( this . refs . ListenAddress ) . value . trim ( ) ;
2015-09-22 12:12:50 -07:00
if ( config . ServiceSettings . ListenAddress === '' ) {
config . ServiceSettings . ListenAddress = ':8065' ;
2015-10-15 12:07:06 -04:00
ReactDOM . findDOMNode ( this . refs . ListenAddress ) . value = config . ServiceSettings . ListenAddress ;
2015-09-22 12:12:50 -07:00
}
2015-10-15 12:07:06 -04:00
config . ServiceSettings . SegmentDeveloperKey = ReactDOM . findDOMNode ( this . refs . SegmentDeveloperKey ) . value . trim ( ) ;
config . ServiceSettings . GoogleDeveloperKey = ReactDOM . findDOMNode ( this . refs . GoogleDeveloperKey ) . value . trim ( ) ;
config . ServiceSettings . EnableIncomingWebhooks = ReactDOM . findDOMNode ( this . refs . EnableIncomingWebhooks ) . checked ;
config . ServiceSettings . EnablePostUsernameOverride = ReactDOM . findDOMNode ( this . refs . EnablePostUsernameOverride ) . checked ;
config . ServiceSettings . EnablePostIconOverride = ReactDOM . findDOMNode ( this . refs . EnablePostIconOverride ) . checked ;
config . ServiceSettings . EnableTesting = ReactDOM . findDOMNode ( this . refs . EnableTesting ) . checked ;
config . ServiceSettings . EnableSecurityFixAlert = ReactDOM . findDOMNode ( this . refs . EnableSecurityFixAlert ) . checked ;
2015-10-09 12:24:39 -07:00
2015-10-15 12:07:06 -04:00
//config.ServiceSettings.EnableOAuthServiceProvider = ReactDOM.findDOMNode(this.refs.EnableOAuthServiceProvider).checked;
2015-09-22 12:12:50 -07:00
var MaximumLoginAttempts = 10 ;
2015-10-15 12:07:06 -04:00
if ( ! isNaN ( parseInt ( ReactDOM . findDOMNode ( this . refs . MaximumLoginAttempts ) . value , 10 ) ) ) {
MaximumLoginAttempts = parseInt ( ReactDOM . findDOMNode ( this . refs . MaximumLoginAttempts ) . value , 10 ) ;
2015-09-22 12:12:50 -07:00
}
config . ServiceSettings . MaximumLoginAttempts = MaximumLoginAttempts ;
2015-10-15 12:07:06 -04:00
ReactDOM . findDOMNode ( this . refs . MaximumLoginAttempts ) . value = MaximumLoginAttempts ;
2015-09-22 12:12:50 -07:00
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 ( ) {
var serverError = '' ;
if ( this . state . serverError ) {
serverError = < div className = 'form-group has-error' > < label className = 'control-label' > { this . state . serverError } < / label > < / div > ;
}
var saveClass = 'btn' ;
if ( this . state . saveNeeded ) {
saveClass = 'btn btn-primary' ;
}
return (
< div className = 'wrapper--fixed' >
< h3 > { 'Service Settings' } < / h3 >
< form
className = 'form-horizontal'
role = 'form'
>
< div className = 'form-group' >
< label
className = 'control-label col-sm-4'
htmlFor = 'ListenAddress'
>
{ 'Listen Address:' }
< / label >
< div className = 'col-sm-8' >
< input
type = 'text'
className = 'form-control'
id = 'ListenAddress'
ref = 'ListenAddress'
placeholder = 'Ex ":8065"'
defaultValue = { this . props . config . ServiceSettings . ListenAddress }
onChange = { this . handleChange }
/ >
2015-09-25 08:09:50 -07:00
< p className = 'help-text' > { 'The address to which to bind and listen. Entering ":8065" will bind to all interfaces or you can choose one like "127.0.0.1:8065". Changing this will require a server restart before taking effect.' } < / p >
2015-09-22 12:12:50 -07:00
< / div >
< / div >
< div className = 'form-group' >
< label
className = 'control-label col-sm-4'
htmlFor = 'MaximumLoginAttempts'
>
{ 'Maximum Login Attempts:' }
< / label >
< div className = 'col-sm-8' >
< input
type = 'text'
className = 'form-control'
id = 'MaximumLoginAttempts'
ref = 'MaximumLoginAttempts'
placeholder = 'Ex "10"'
defaultValue = { this . props . config . ServiceSettings . MaximumLoginAttempts }
onChange = { this . handleChange }
/ >
< p className = 'help-text' > { 'Login attempts allowed before user is locked out and required to reset password via email.' } < / p >
< / div >
< / div >
< div className = 'form-group' >
< label
className = 'control-label col-sm-4'
htmlFor = 'SegmentDeveloperKey'
>
{ 'Segment Developer Key:' }
< / label >
< div className = 'col-sm-8' >
< input
type = 'text'
className = 'form-control'
id = 'SegmentDeveloperKey'
ref = 'SegmentDeveloperKey'
placeholder = 'Ex "g3fgGOXJAQ43QV7rAh6iwQCkV4cA1Gs"'
defaultValue = { this . props . config . ServiceSettings . SegmentDeveloperKey }
onChange = { this . handleChange }
/ >
< p className = 'help-text' > { 'For users running a SaaS services, sign up for a key at Segment.com to track metrics.' } < / p >
< / div >
< / div >
< div className = 'form-group' >
< label
className = 'control-label col-sm-4'
htmlFor = 'GoogleDeveloperKey'
>
{ 'Google Developer Key:' }
< / label >
< div className = 'col-sm-8' >
< input
type = 'text'
className = 'form-control'
id = 'GoogleDeveloperKey'
ref = 'GoogleDeveloperKey'
placeholder = 'Ex "7rAh6iwQCkV4cA1Gsg3fgGOXJAQ43QV"'
defaultValue = { this . props . config . ServiceSettings . GoogleDeveloperKey }
onChange = { this . handleChange }
/ >
< p className = 'help-text' > { 'Set this key to enable embedding of YouTube video previews based on hyperlinks appearing in messages or comments. Instructions to obtain a key available at ' } < a href = 'https://www.youtube.com/watch?v=Im69kzhpR3I' > { 'https://www.youtube.com/watch?v=Im69kzhpR3I' } < / a > { '. Leaving field blank disables the automatic generation of YouTube video previews from links.' } < / p >
< / div >
< / div >
2015-09-22 13:28:03 -07:00
< div className = 'form-group' >
< label
className = 'control-label col-sm-4'
htmlFor = 'EnableIncomingWebhooks'
>
2015-09-24 11:06:00 -07:00
{ 'Enable Incoming Webhooks: ' }
2015-09-22 13:28:03 -07:00
< / label >
< div className = 'col-sm-8' >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnableIncomingWebhooks'
value = 'true'
ref = 'EnableIncomingWebhooks'
defaultChecked = { this . props . config . ServiceSettings . EnableIncomingWebhooks }
onChange = { this . handleChange }
/ >
{ 'true' }
< / label >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnableIncomingWebhooks'
value = 'false'
defaultChecked = { ! this . props . config . ServiceSettings . EnableIncomingWebhooks }
onChange = { this . handleChange }
/ >
{ 'false' }
< / label >
2015-10-05 11:25:12 -04:00
< p className = 'help-text' > { 'When true, incoming webhooks will be allowed. To help combat phishing attacks, all posts from webhooks will be labelled by a BOT tag.' } < / p >
2015-09-22 13:28:03 -07:00
< / div >
< / div >
2015-10-05 08:46:23 -04:00
< div className = 'form-group' >
< label
className = 'control-label col-sm-4'
htmlFor = 'EnablePostUsernameOverride'
>
{ 'Enable Overriding Usernames from Webhooks: ' }
< / label >
< div className = 'col-sm-8' >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnablePostUsernameOverride'
value = 'true'
ref = 'EnablePostUsernameOverride'
defaultChecked = { this . props . config . ServiceSettings . EnablePostUsernameOverride }
onChange = { this . handleChange }
/ >
{ 'true' }
< / label >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnablePostUsernameOverride'
value = 'false'
defaultChecked = { ! this . props . config . ServiceSettings . EnablePostUsernameOverride }
onChange = { this . handleChange }
/ >
{ 'false' }
< / label >
< p className = 'help-text' > { 'When true, webhooks will be allowed to change the username they are posting as. Note, combined with allowing icon overriding, this could open users up to phishing attacks.' } < / p >
< / div >
< / div >
< div className = 'form-group' >
< label
className = 'control-label col-sm-4'
htmlFor = 'EnablePostIconOverride'
>
{ 'Enable Overriding Icon from Webhooks: ' }
< / label >
< div className = 'col-sm-8' >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnablePostIconOverride'
value = 'true'
ref = 'EnablePostIconOverride'
defaultChecked = { this . props . config . ServiceSettings . EnablePostIconOverride }
onChange = { this . handleChange }
/ >
{ 'true' }
< / label >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnablePostIconOverride'
value = 'false'
defaultChecked = { ! this . props . config . ServiceSettings . EnablePostIconOverride }
onChange = { this . handleChange }
/ >
{ 'false' }
< / label >
< p className = 'help-text' > { 'When true, webhooks will be allowed to change the icon they post with. Note, combined with allowing username overriding, this could open users up to phishing attacks.' } < / p >
< / div >
< / div >
2015-09-22 12:12:50 -07:00
< div className = 'form-group' >
< label
className = 'control-label col-sm-4'
htmlFor = 'EnableTesting'
>
{ 'Enable Testing: ' }
< / label >
< div className = 'col-sm-8' >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnableTesting'
value = 'true'
ref = 'EnableTesting'
defaultChecked = { this . props . config . ServiceSettings . EnableTesting }
onChange = { this . handleChange }
/ >
{ 'true' }
< / label >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnableTesting'
value = 'false'
defaultChecked = { ! this . props . config . ServiceSettings . EnableTesting }
onChange = { this . handleChange }
/ >
{ 'false' }
< / label >
2015-09-25 20:56:32 -07:00
< p className = 'help-text' > { '(Developer Option) When true, /loadtest slash command is enabled to load test accounts and test data. Changing this will require a server restart before taking effect.' } < / p >
2015-09-22 12:12:50 -07:00
< / div >
< / div >
2015-10-09 12:24:39 -07:00
< div className = 'form-group' >
< label
className = 'control-label col-sm-4'
htmlFor = 'EnableSecurityFixAlert'
>
{ 'Enable Security Alerts: ' }
< / label >
< div className = 'col-sm-8' >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnableSecurityFixAlert'
value = 'true'
ref = 'EnableSecurityFixAlert'
defaultChecked = { this . props . config . ServiceSettings . EnableSecurityFixAlert }
onChange = { this . handleChange }
/ >
{ 'true' }
< / label >
< label className = 'radio-inline' >
< input
type = 'radio'
name = 'EnableSecurityFixAlert'
value = 'false'
defaultChecked = { ! this . props . config . ServiceSettings . EnableSecurityFixAlert }
onChange = { this . handleChange }
/ >
{ 'false' }
< / label >
< p className = 'help-text' > { 'When true, System Administrators are notified by email if a relevant security fix alert has been announced in the last 12 hours. Requires email to be enabled.' } < / p >
< / div >
< / div >
2015-09-22 12:12:50 -07:00
< div className = 'form-group' >
< div className = 'col-sm-12' >
{ serverError }
< button
disabled = { ! this . state . saveNeeded }
type = 'submit'
className = { saveClass }
onClick = { this . handleSubmit }
id = 'save-button'
data - loading - text = { '<span class=\'glyphicon glyphicon-refresh glyphicon-refresh-animate\'></span> Saving Config...' }
>
{ 'Save' }
< / button >
< / div >
< / div >
< / form >
< / div >
) ;
}
}
2015-09-24 11:06:00 -07:00
// <div className='form-group'>
// <label
// className='control-label col-sm-4'
// htmlFor='EnableOAuthServiceProvider'
// >
// {'Enable OAuth Service Provider: '}
// </label>
// <div className='col-sm-8'>
// <label className='radio-inline'>
// <input
// type='radio'
// name='EnableOAuthServiceProvider'
// value='true'
// ref='EnableOAuthServiceProvider'
// defaultChecked={this.props.config.ServiceSettings.EnableOAuthServiceProvider}
// onChange={this.handleChange}
// />
// {'true'}
// </label>
// <label className='radio-inline'>
// <input
// type='radio'
// name='EnableOAuthServiceProvider'
// value='false'
// defaultChecked={!this.props.config.ServiceSettings.EnableOAuthServiceProvider}
// onChange={this.handleChange}
// />
// {'false'}
// </label>
2015-09-25 07:57:51 -07:00
// <p className='help-text'>{'When enabled Mattermost will act as an OAuth2 Provider. Changing this will require a server restart before taking effect.'}</p>
2015-09-24 11:06:00 -07:00
// </div>
// </div>
2015-09-22 12:12:50 -07:00
ServiceSettings . propTypes = {
config : React . PropTypes . object
} ;