Files
mostlymatter/webapp/components/mfa/components/setup.jsx
Harrison Healey fb6f2a123c PLT-5860 Updated copyright date (#6058)
* PLT-5860 Updated copyright date in about modal

* PLT-5860 Updated copyright notice in JSX files

* PLT-5860 Updated copyright notice in go files

* Fixed misc copyright dates

* Fixed component snapshots
2017-04-12 08:27:57 -04:00

157 строки
5.6 KiB
JavaScript

// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import {generateMfaSecret, activateMfa} from 'actions/user_actions.jsx';
import UserStore from 'stores/user_store.jsx';
import * as Utils from 'utils/utils.jsx';
import React from 'react';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
import {browserHistory} from 'react-router/es6';
export default class Setup extends React.Component {
constructor(props) {
super(props);
this.submit = this.submit.bind(this);
this.state = {secret: '', qrCode: ''};
}
componentDidMount() {
const user = UserStore.getCurrentUser();
if (!user || user.mfa_active) {
browserHistory.push('/');
return;
}
generateMfaSecret(
(data) => this.setState({secret: data.secret, qrCode: data.qr_code}),
(err) => this.setState({serverError: err.message})
);
}
submit(e) {
e.preventDefault();
const code = this.refs.code.value.replace(/\s/g, '');
if (!code || code.length === 0) {
this.setState({error: Utils.localizeMessage('mfa.setup.codeError', 'Please enter the code from Google Authenticator.')});
return;
}
this.setState({error: null});
activateMfa(
code,
() => {
browserHistory.push('/mfa/confirm');
},
(err) => {
if (err.id === 'ent.mfa.activate.authenticate.app_error') {
this.setState({error: Utils.localizeMessage('mfa.setup.badCode', 'Invalid code. If this issue persists, contact your System Administrator.')});
return;
}
this.setState({error: err.message});
}
);
}
render() {
let formClass = 'form-group';
let errorContent;
if (this.state.error) {
errorContent = <div className='form-group has-error'><label className='control-label'>{this.state.error}</label></div>;
formClass += ' has-error';
}
let mfaRequired;
if (global.window.mm_config.EnforceMultifactorAuthentication === 'true') {
mfaRequired = (
<p>
<FormattedHTMLMessage
id='mfa.setup.required'
defaultMessage='<strong>Multi-factor authentication is required on {siteName}.</strong>'
values={{
siteName: global.window.mm_config.SiteName
}}
/>
</p>
);
}
return (
<div>
<form
onSubmit={this.submit}
className={formClass}
>
{mfaRequired}
<p>
<FormattedHTMLMessage
id='mfa.setup.step1'
defaultMessage="<strong>Step 1: </strong>On your phone, download Google Authenticator from <a target='_blank' href='https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8'>iTunes</a> or <a target='_blank' href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en'>Google Play</a>"
/>
</p>
<p>
<FormattedHTMLMessage
id='mfa.setup.step2'
defaultMessage='<strong>Step 2: </strong>Use Google Authenticator to scan this QR code, or manually type in the secret key'
/>
</p>
<div className='form-group'>
<div className='col-sm-12'>
<img
style={{maxHeight: 170}}
src={'data:image/png;base64,' + this.state.qrCode}
/>
</div>
</div>
<br/>
<div className='form-group'>
<p className='col-sm-12'>
<FormattedMessage
id='mfa.setup.secret'
defaultMessage='Secret: {secret}'
values={{
secret: this.state.secret
}}
/>
</p>
</div>
<p>
<FormattedHTMLMessage
id='mfa.setup.step3'
defaultMessage='<strong>Step 3: </strong>Enter the code generated by Google Authenticator'
/>
</p>
<p>
<input
ref='code'
className='form-control'
placeholder={Utils.localizeMessage('mfa.setup.code', 'MFA Code')}
autoFocus={true}
/>
</p>
{errorContent}
<button
type='submit'
className='btn btn-primary'
>
<FormattedMessage
id='mfa.setup.save'
defaultMessage='Save'
/>
</button>
</form>
</div>
);
}
}
Setup.defaultProps = {
};
Setup.propTypes = {
};