Adding LDAP test connection button. Reordering LDAP settings. (#3912)

Этот коммит содержится в:
Christopher Speller
2016-09-01 17:05:20 -04:00
коммит произвёл GitHub
родитель 949e57076a
Коммит 5d7f239962
11 изменённых файлов: 272 добавлений и 53 удалений

Просмотреть файл

@@ -21,6 +21,7 @@ export default class AdminSettings extends React.Component {
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.doSubmit = this.doSubmit.bind(this);
this.state = Object.assign(this.getStateFromConfig(props.config), {
saveNeeded: false,
@@ -39,6 +40,10 @@ export default class AdminSettings extends React.Component {
handleSubmit(e) {
e.preventDefault();
this.doSubmit();
}
doSubmit(callback) {
this.setState({
saving: true,
serverError: null
@@ -59,12 +64,20 @@ export default class AdminSettings extends React.Component {
saveNeeded: false,
saving: false
});
if (callback) {
callback();
}
},
(err) => {
this.setState({
saving: false,
serverError: err.message
});
if (callback) {
callback();
}
}
);
}

Просмотреть файл

@@ -207,7 +207,7 @@ export default class AdminSidebar extends React.Component {
title={
<FormattedMessage
id='admin.sidebar.ldap'
defaultMessage='LDAP'
defaultMessage='AD/LDAP'
/>
}
/>

Просмотреть файл

@@ -8,6 +8,7 @@ import SettingsGroup from './settings_group.jsx';
import TextSetting from './text_setting.jsx';
import SyncNowButton from './sync_now_button.jsx';
import LdapTestButton from './ldap_test_button.jsx';
import * as Utils from 'utils/utils.jsx';
@@ -76,7 +77,7 @@ export default class LdapSettings extends AdminSettings {
<h3>
<FormattedMessage
id='admin.authentication.ldap'
defaultMessage='LDAP'
defaultMessage='AD/LDAP'
/>
</h3>
);
@@ -150,6 +151,23 @@ export default class LdapSettings extends AdminSettings {
onChange={this.handleChange}
disabled={!this.state.enable}
/>
<BooleanSetting
id='skipCertificateVerification'
label={
<FormattedMessage
id='admin.ldap.skipCertificateVerification'
defaultMessage='Skip Certificate Verification:'
/>
}
helpText={
<FormattedMessage
id='admin.ldap.skipCertificateVerificationDesc'
defaultMessage='Skips the certificate verification step for TLS or STARTTLS connections. Not recommended for production environments where TLS is required. For testing only.'
/>
}
value={this.state.skipCertificateVerification}
onChange={this.handleChange}
/>
<TextSetting
id='baseDN'
label={
@@ -338,12 +356,31 @@ export default class LdapSettings extends AdminSettings {
onChange={this.handleChange}
disabled={!this.state.enable}
/>
<TextSetting
id='loginFieldName'
label={
<FormattedMessage
id='admin.ldap.loginNameTitle'
defaultMessage='Sign-in Field Default Text:'
/>
}
placeholder={Utils.localizeMessage('admin.ldap.loginNameEx', 'Ex "LDAP Username"')}
helpText={
<FormattedMessage
id='admin.ldap.loginNameDesc'
defaultMessage='The placeholder text that appears in the login field on the login page. Defaults to "LDAP Username".'
/>
}
value={this.state.loginFieldName}
onChange={this.handleChange}
disabled={!this.state.enable}
/>
<TextSetting
id='syncIntervalMinutes'
label={
<FormattedMessage
id='admin.ldap.syncIntervalTitle'
defaultMessage='Synchronization Interval (minutes)'
defaultMessage='Synchronization Interval (minutes):'
/>
}
helpText={
@@ -356,22 +393,24 @@ export default class LdapSettings extends AdminSettings {
onChange={this.handleChange}
disabled={!this.state.enable}
/>
<BooleanSetting
id='skipCertificateVerification'
<TextSetting
id='maxPageSize'
label={
<FormattedMessage
id='admin.ldap.skipCertificateVerification'
defaultMessage='Skip Certificate Verification'
id='admin.ldap.maxPageSizeTitle'
defaultMessage='Maximum Page Size:'
/>
}
placeholder={Utils.localizeMessage('admin.ldap.maxPageSizeEx', 'Ex "2000"')}
helpText={
<FormattedMessage
id='admin.ldap.skipCertificateVerificationDesc'
defaultMessage='Skips the certificate verification step for TLS or STARTTLS connections. Not recommended for production environments where TLS is required. For testing only.'
id='admin.ldap.maxPageSizeHelpText'
defaultMessage='The maximum number of users the Mattermost server will request from the LDAP server at one time. 0 is unlimited.'
/>
}
value={this.state.skipCertificateVerification}
value={this.state.maxPageSize}
onChange={this.handleChange}
disabled={!this.state.enable}
/>
<TextSetting
id='queryTimeout'
@@ -392,47 +431,14 @@ export default class LdapSettings extends AdminSettings {
onChange={this.handleChange}
disabled={!this.state.enable}
/>
<TextSetting
id='maxPageSize'
label={
<FormattedMessage
id='admin.ldap.maxPageSizeTitle'
defaultMessage='Maximum Page Size'
/>
}
placeholder={Utils.localizeMessage('admin.ldap.maxPageSizeEx', 'Ex "2000"')}
helpText={
<FormattedMessage
id='admin.ldap.maxPageSizeHelpText'
defaultMessage='The maximum number of users the Mattermost server will request from the LDAP server at one time. 0 is unlimited.'
/>
}
value={this.state.maxPageSize}
onChange={this.handleChange}
disabled={!this.state.enable}
/>
<TextSetting
id='loginFieldName'
label={
<FormattedMessage
id='admin.ldap.loginNameTitle'
defaultMessage='Sign-in Field Default Text:'
/>
}
placeholder={Utils.localizeMessage('admin.ldap.loginNameEx', 'Ex "LDAP Username"')}
helpText={
<FormattedMessage
id='admin.ldap.loginNameDesc'
defaultMessage='The placeholder text that appears in the login field on the login page. Defaults to "LDAP Username".'
/>
}
value={this.state.loginFieldName}
onChange={this.handleChange}
disabled={!this.state.enable}
/>
<SyncNowButton
disabled={!this.state.enable}
/>
<LdapTestButton
disabled={!this.state.enable}
submitFunction={this.doSubmit}
saveNeeded={this.state.saveNeeded}
/>
</SettingsGroup>
);
}

Просмотреть файл

@@ -0,0 +1,139 @@
// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import React from 'react';
import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
export default class LdapTestButton extends React.Component {
static get propTypes() {
return {
disabled: React.PropTypes.bool,
submitFunction: React.PropTypes.func,
saveNeeded: React.PropTypes.bool
};
}
constructor(props) {
super(props);
this.handleLdapTest = this.handleLdapTest.bind(this);
this.state = {
buisy: false,
fail: null,
success: false
};
}
handleLdapTest(e) {
e.preventDefault();
this.setState({
buisy: true,
fail: null,
success: false
});
const doRequest = () => { //eslint-disable-line func-style
Client.ldapTest(
() => {
this.setState({
buisy: false,
success: true
});
},
(err) => {
this.setState({
buisy: false,
fail: err.message
});
}
);
};
// If we need to run the save function then run it with our request function as callback
if (this.props.saveNeeded) {
this.props.submitFunction(doRequest);
} else {
doRequest();
}
}
render() {
let message = null;
if (this.state.fail) {
message = (
<div className='alert alert-warning'>
<i className='fa fa-warning'/>
<FormattedMessage
id='admin.ldap.testFailure'
defaultMessage='LDAP Test Failure: {error}'
values={{
error: this.state.fail
}}
/>
</div>
);
} else if (this.state.success) {
message = (
<div className='alert alert-success'>
<i className='fa fa-success'/>
<FormattedMessage
id='admin.ldap.testSuccess'
defaultMessage='LDAP Test Successful'
values={{
error: this.state.fail
}}
/>
</div>
);
}
let helpText = (
<FormattedHTMLMessage
id='admin.ldap.testHelpText'
defaultMessage='Tests if the Mattermost server can connect to the LDAP server specified. See log file for more detailed error messages.'
/>
);
let contents = null;
if (this.state.loading) {
contents = (
<span>
<span className='fa fa-refresh icon--rotate'/>
{Utils.localizeMessage('admin.reload.loading', ' Loading...')}
</span>
);
} else {
contents = (
<FormattedMessage
id='admin.ldap.ldap_test_button'
defaultMessage='LDAP Test'
/>
);
}
return (
<div className='form-group reload-config'>
<div className='col-sm-offset-4 col-sm-8'>
<div>
<button
className='btn btn-default'
onClick={this.handleLdapTest}
disabled={this.props.disabled}
>
{contents}
</button>
{message}
</div>
<div className='help-text'>
{helpText}
</div>
</div>
</div>
);
}
}