diff options
Diffstat (limited to 'webapp/components/mfa')
-rw-r--r-- | webapp/components/mfa/components/confirm.jsx | 79 | ||||
-rw-r--r-- | webapp/components/mfa/components/setup.jsx | 156 | ||||
-rw-r--r-- | webapp/components/mfa/mfa_controller.jsx | 89 |
3 files changed, 0 insertions, 324 deletions
diff --git a/webapp/components/mfa/components/confirm.jsx b/webapp/components/mfa/components/confirm.jsx deleted file mode 100644 index 718632382..000000000 --- a/webapp/components/mfa/components/confirm.jsx +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import Constants from 'utils/constants.jsx'; -const KeyCodes = Constants.KeyCodes; - -import React from 'react'; -import {FormattedMessage, FormattedHTMLMessage} from 'react-intl'; -import {browserHistory} from 'react-router/es6'; - -import {loadMe} from 'actions/user_actions.jsx'; - -export default class Confirm extends React.Component { - constructor(props) { - super(props); - - this.onKeyPress = this.onKeyPress.bind(this); - } - - componentDidMount() { - document.body.addEventListener('keydown', this.onKeyPress); - } - - componentWillUnmount() { - document.body.removeEventListener('keydown', this.onKeyPress); - } - - submit(e) { - e.preventDefault(); - loadMe().then(() => { - browserHistory.push('/'); - }); - } - - onKeyPress(e) { - if (e.which === KeyCodes.ENTER) { - this.submit(e); - } - } - - render() { - return ( - <div> - <form - onSubmit={this.submit} - onKeyPress={this.onKeyPress} - className='form-group' - > - <p> - <FormattedHTMLMessage - id='mfa.confirm.complete' - defaultMessage='<strong>Set up complete!</strong>' - /> - </p> - <p> - <FormattedMessage - id='mfa.confirm.secure' - defaultMessage='Your account is now secure. Next time you sign in, you will be asked to enter a code from the Google Authenticator app on your phone.' - /> - </p> - <button - type='submit' - className='btn btn-primary' - > - <FormattedMessage - id='mfa.confirm.okay' - defaultMessage='Okay' - /> - </button> - </form> - </div> - ); - } -} - -Confirm.defaultProps = { -}; -Confirm.propTypes = { -}; diff --git a/webapp/components/mfa/components/setup.jsx b/webapp/components/mfa/components/setup.jsx deleted file mode 100644 index caec1571a..000000000 --- a/webapp/components/mfa/components/setup.jsx +++ /dev/null @@ -1,156 +0,0 @@ -// 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 = { -}; diff --git a/webapp/components/mfa/mfa_controller.jsx b/webapp/components/mfa/mfa_controller.jsx deleted file mode 100644 index a3d098abd..000000000 --- a/webapp/components/mfa/mfa_controller.jsx +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import {emitUserLoggedOutEvent} from 'actions/global_actions.jsx'; - -import PropTypes from 'prop-types'; - -import React from 'react'; -import {FormattedMessage} from 'react-intl'; -import {browserHistory, Link} from 'react-router/es6'; - -import logoImage from 'images/logo.png'; - -export default class MFAController extends React.Component { - componentDidMount() { - if (window.mm_license.MFA !== 'true' || window.mm_config.EnableMultifactorAuthentication !== 'true') { - browserHistory.push('/'); - } - } - - render() { - let backButton; - if (window.mm_config.EnforceMultifactorAuthentication === 'true') { - backButton = ( - <div className='signup-header'> - <a - href='#' - onClick={(e) => { - e.preventDefault(); - emitUserLoggedOutEvent('/login'); - }} - > - <span className='fa fa-chevron-left'/> - <FormattedMessage - id='web.header.logout' - defaultMessage='Logout' - /> - </a> - </div> - ); - } else { - backButton = ( - <div className='signup-header'> - <Link to='/'> - <span className='fa fa-chevron-left'/> - <FormattedMessage - id='web.header.back' - defaultMessage='Back' - /> - </Link> - </div> - ); - } - - return ( - <div className='inner-wrap sticky'> - <div className='content'> - <div> - {backButton} - <div className='col-sm-12'> - <div className='signup-team__container'> - <h3> - <FormattedMessage - id='mfa.setupTitle' - defaultMessage='Multi-factor Authentication Setup' - /> - </h3> - <img - className='signup-team-logo' - src={logoImage} - /> - <div id='mfa'> - {React.cloneElement(this.props.children, {})} - </div> - </div> - </div> - </div> - </div> - </div> - ); - } -} - -MFAController.defaultProps = { -}; -MFAController.propTypes = { - location: PropTypes.object.isRequired, - children: PropTypes.node -}; |