From 762322a4fdaf5b402a45a30fce3cc0111b3ea578 Mon Sep 17 00:00:00 2001 From: Guy Marriott Date: Thu, 25 Jul 2019 14:33:53 +1200 Subject: [PATCH] NEW Add a prop to disallow registration screens from showing in the modal You can indicate which registration screens should not be accessible in the modal. Right now this is used to toggle away the modal if the user manages to navigate to the given screens. RegisteredMFAMethodListField has been updated to use this prop instead of it's own handling for this instance, and the Reset component now uses this prop to avoid showing invalid screens --- client/dist/js/bundle-cms.js | 2 +- .../MethodListItem/Reset.js | 7 +- .../RegisteredMFAMethodListField.js | 16 +-- client/src/components/RegisterModal.js | 100 +++++++++++------- 4 files changed, 71 insertions(+), 54 deletions(-) diff --git a/client/dist/js/bundle-cms.js b/client/dist/js/bundle-cms.js index b2f3e7d3..df095564 100644 --- a/client/dist/js/bundle-cms.js +++ b/client/dist/js/bundle-cms.js @@ -1 +1 @@ -!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s="./client/src/bundles/bundle-cms.js")}({"./client/lang/src/en.json":function(e,t){e.exports={"MultiFactorAuthentication.HOW_MFA_WORKS":"How multi-factor authentication works","MultiFactorAuthentication.TITLE":"Add extra security to your account","MultiFactorAuthentication.HOW_IT_WORKS":"How it works","MultiFactorAuthentication.EXTRA_LAYER_IMAGE_ALT":"Shields indicating additional protection","MultiFactorAuthentication.EXTRA_LAYER_TITLE":"Extra layer of protection","MultiFactorAuthentication.EXTRA_LAYER_DESCRIPTION":"Every time you log into your account, you'll need your password and an additional form of verification.","MultiFactorAuthentication.UNIQUE_IMAGE_ALT":"Person with tick indicating uniqueness","MultiFactorAuthentication.UNIQUE_TITLE":"Unique to you","MultiFactorAuthentication.UNIQUE_DESCRIPTION":"This verification is only available to you. Even if someone gets your password, they will not be able to access your account.","MultiFactorAuthentication.GET_STARTED":"Get started","MultiFactorAuthentication.SETUP_LATER":"Setup later","MultiFactorAuthentication.ADD_ANOTHER_METHOD":"Add another MFA method","MultiFactorAuthentication.ADD_FIRST_METHOD":"Add an MFA method","MultiFactorAuthentication.REGISTERED":"{method}: Registered","MultiFactorAuthentication.DEFAULT_REGISTERED":"{method} (default): Registered","MultiFactorAuthentication.BACKUP_REGISTERED":"{method}: Created {date}","MultiFactorAuthentication.RESET_METHOD":"Reset","MultiFactorAuthentication.REMOVE_METHOD":"Remove","MultiFactorAuthentication.SET_AS_DEFAULT":"Set as default method","MultiFactorAuthentication.NO_METHODS_REGISTERED":"No MFA methods have been registered. Add one using the button below","MultiFactorAuthentication.NO_METHODS_REGISTERED_READONLY":"This member has not registered any MFA methods yet","MultiFactorAuthentication.SELECT_METHOD":"Select a verification method","MultiFactorAuthentication.SETUP_COMPLETE_TITLE":"Multi-factor authentication is now set up","MultiFactorAuthentication.ACCOUNT_RESET_TITLE":"Help user reset account","MultiFactorAuthentication.ACCOUNT_RESET_DESCRIPTION":"Ensure that the person requesting a reset is the real person associated with this account before proceeding. An email will be sent to the member's address with a link to reset both their password and multi-factor authentication methods.","MultiFactorAuthentication.ACCOUNT_RESET_ACTION":"Send account reset email","MultiFactorAuthentication.ACCOUNT_RESET_SENDING":"Sending...","MultiFactorAuthentication.ACCOUNT_RESET_SENDING_SUCCESS":"An email has been sent.","MultiFactorAuthentication.ACCOUNT_RESET_SENDING_FAILURE":"We were unable to send an email, please try again later.","MultiFactorAuthentication.ACCOUNT_RESET_CONFIRMATION":"You are about to reset this account. Their password and multi-factor authentication will be reset. Continue?","MultiFactorAuthentication.ACCOUNT_RESET_CONFIRMATION_BUTTON":"Yes, send reset email","MultiFactorAuthentication.DEFAULT_CONFIRM_BUTTON":"Confirm","MultiFactorAuthentication.DEFAULT_CONFIRM_DISMISS_BUTTON":"Cancel","MultiFactorAuthentication.DELETE_CONFIRMATION":"Are you sure you want to remove this method","MultiFactorAuthentication.CONFIRMATION_TITLE":"Are you sure?","MultiFactorAuthentication.DELETE_CONFIRMATION_BUTTON":"Remove method","MultiFactorAuthentication.RESET_BACKUP_CONFIRMATION":"All existing codes will be made invalid and new codes will be created","MultiFactorAuthentication.RESET_BACKUP_CONFIRMATION_BUTTON":"Reset codes","MultiFactorAuthentication.ADMIN_SETUP_COMPLETE_CONTINUE":"Your settings have been updated"}},"./client/src/boot/cms/index.js":function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}var o=n("./client/src/boot/cms/registerComponents.js"),i=r(o),a=n("./client/src/boot/cms/registerReducers.js"),s=r(a);window.document.addEventListener("DOMContentLoaded",function(){(0,i.default)(),(0,s.default)()})},"./client/src/boot/cms/registerComponents.js":function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),i=r(o),a=n("./client/src/boot/registerComponents.js"),s=r(a),l=n("./client/src/components/Register.js"),u=r(l),c=n("./client/src/components/FormField/RegisteredMFAMethodListField/RegisteredMFAMethodListField.js"),d=r(c);t.default=function(){(0,s.default)(),i.default.component.registerMany({MFARegister:u.default,RegisteredMFAMethodListField:d.default})}},"./client/src/boot/cms/registerReducers.js":function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),i=r(o),a=n("./client/src/boot/registerReducers.js"),s=r(a),l=n("./client/src/state/mfaAdministration/reducer.js"),u=r(l);t.default=function(){(0,s.default)(),i.default.reducer.register("mfaAdministration",u.default)}},"./client/src/boot/registerComponents.js":function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n("./client/src/components/BackupCodes/Register.js"),i=r(o),a=n("./client/src/components/BackupCodes/Verify.js"),s=r(a),l=n(3),u=r(l);t.default=function(){u.default.component.registerMany({BackupCodeRegister:i.default,BackupCodeVerify:s.default})}},"./client/src/boot/registerReducers.js":function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),i=r(o),a=n("./client/src/state/mfaRegister/reducer.js"),s=r(a),l=n("./client/src/state/mfaVerify/reducer.js"),u=r(l);t.default=function(){i.default.reducer.register("mfaRegister",s.default),i.default.reducer.register("mfaVerify",u.default)}},"./client/src/bundles/bundle-cms.js":function(e,t,n){"use strict";n("./client/src/legacy/index.js"),n("./client/src/boot/cms/index.js")},"./client/src/components/BackupCodes/Register.js":function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.Component=t.SCREEN_COMPLETE=t.SCREEN_CHOOSE_METHOD=t.SCREEN_REGISTER_METHOD=t.SCREEN_INTRODUCTION=void 0;var l=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"GET",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return fetch(e,{body:n,credentials:"same-origin",headers:r,method:t})};t.default=r},"./client/src/lib/formatCode.js":function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:" ";if(e.length<6)return e;if(e.length%4==0)return e.split(/(.{4})/g).filter(function(e){return e}).join(t).trim();if(e.length%3==0)return e.split(/(.{3})/g).filter(function(e){return e}).join(t).trim();var n=4-e.length%4,o=(e.length-3*n)/4,i=[].concat(r([].concat(r(Array(o).keys())).map(function(){return 4})),r([].concat(r(Array(n).keys())).map(function(){return 3}))),a=0;return i.map(function(t){return e.substring(a,a+=t)}).join(t).trim()};t.formatCode=o},"./client/src/state/methodAvailability/withMethodAvailability.js":function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:null,t=this.props.availableMethodOverrides,n=e||this.props.method,r=n.urlSegment;return void 0!==t[r]?t[r]:{}}},{key:"getUnavailableMessage",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=e||this.props.method;return this.getAvailabilityOverride(t).unavailableMessage||t.unavailableMessage}},{key:"isAvailable",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=e||this.props.method,n=this.getAvailabilityOverride(t),r=t.isAvailable;return void 0!==n.isAvailable&&(r=n.isAvailable),r}},{key:"render",value:function(){return c.default.createElement(e,s({},this.props,{isAvailable:this.isAvailable,getUnavailableMessage:this.getUnavailableMessage}))}}]),n}(u.Component),n=p(e);return t.displayName="WithMethodAvailability("+n+")",t},m=function(e){var t=[].concat(r(e.mfaRegister.availableMethods),r(e.mfaVerify.allMethods)),n={};return Object.values(t).forEach(function(t){var r=t.urlSegment,o=r+"Availability";void 0!==e[o]&&(n[r]=e[o])}),{availableMethodOverrides:n}};t.hoc=h;var _=(0,f.compose)((0,d.connect)(m),h);t.default=_},"./client/src/state/mfaAdministration/actionTypes.js":function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.default=["ADD_REGISTERED_METHOD","REMOVE_REGISTERED_METHOD","SET_DEFAULT_METHOD","SET_REGISTERED_METHODS"].reduce(function(e,t){return Object.assign(e,r({},t,"MFA_ADMINISTRATION."+t))},{})},"./client/src/state/mfaAdministration/actions.js":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setRegisteredMethods=t.setDefaultMethod=t.deregisterMethod=t.registerMethod=void 0;var r=n("./client/src/state/mfaAdministration/actionTypes.js"),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.registerMethod=function(e){return{type:o.default.ADD_REGISTERED_METHOD,payload:{method:e}}},t.deregisterMethod=function(e){return{type:o.default.REMOVE_REGISTERED_METHOD,payload:{method:e}}},t.setDefaultMethod=function(e){return{type:o.default.SET_DEFAULT_METHOD,payload:{defaultMethod:e}}},t.setRegisteredMethods=function(e){return{type:o.default.SET_REGISTERED_METHODS,payload:{methods:e}}}},"./client/src/state/mfaAdministration/reducer.js":function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:l,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.type,o=t.payload,a=function(e){return function(t){return t.urlSegment===e.urlSegment}},u=e.registeredMethods;switch(n){case s.default.ADD_REGISTERED_METHOD:var c=o.method;return Array.isArray(u)?u.find(a(c))?e:(u.push(c),i({},e,{registeredMethods:u})):i({},e,{registeredMethods:[c]});case s.default.REMOVE_REGISTERED_METHOD:var d=o.method,f=u.findIndex(a(d));if(f<0)return e;u.splice(f,1);var p=2===u.length?{defaultMethod:u.find(function(){return!0}).urlSegment}:{};return i({},e,p,{registeredMethods:[].concat(r(u))});case s.default.SET_DEFAULT_METHOD:return i({},e,{defaultMethod:o.defaultMethod});case s.default.SET_REGISTERED_METHODS:return i({},e,{registeredMethods:o.methods});default:return e}}Object.defineProperty(t,"__esModule",{value:!0});var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:u,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.type,o=t.payload;switch(n){case s.default.SET_SCREEN:var a=o.screen;return null===e.method&&a===l.SCREEN_REGISTER_METHOD?i({},e,{screen:l.SCREEN_CHOOSE_METHOD}):i({},e,{screen:a});case s.default.SET_METHOD:return i({},e,{method:o.method});case s.default.SET_AVAILABLE_METHODS:return i({},e,{availableMethods:o.availableMethods});case s.default.ADD_AVAILABLE_METHOD:return i({},e,{availableMethods:[].concat(r(e.availableMethods),[o.method])});case s.default.REMOVE_AVAILABLE_METHOD:return i({},e,{availableMethods:e.availableMethods.filter(function(e){return e.urlSegment!==o.method.urlSegment})});default:return e}}Object.defineProperty(t,"__esModule",{value:!0});var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:s,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.type,r=t.payload;switch(n){case a.default.SET_ALL_METHODS:return o({},e,{allMethods:r.allMethods});default:return e}}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t'),this.addEvents();var d=this.opts,f=d.headElements,p=d.bodyElements;Array.isArray(f)&&f.forEach(function(e){return c.head.appendChild(e)}),Array.isArray(p)&&p.forEach(function(e){return c.body.appendChild(e)}),Array.isArray(t)&&t.forEach(function(e){e&&(l(e)?c.head.appendChild(o(c,e)):c.head.appendChild(r(c,e)))}),c.body.appendChild(this.elCopy),Array.isArray(n)&&n.forEach(function(e){if(e){var t=c.createElement("script");l(e)?t.src=e:t.innerText=e,c.body.appendChild(t)}}),c.close()}}},e.prototype.printURL=function(e,t){this.isLoading||(this.addEvents(),this.isLoading=!0,this.callback=t,this.iframe.src=e)},e.prototype.launchPrint=function(e){e.document.execCommand("print",!1,null)||e.print()},e.prototype.addEvents=function(){var e=this;this.hasEvents||(this.hasEvents=!0,this.iframe.addEventListener("load",function(){return e.onLoad()},!1))},e.prototype.onLoad=function(){var e=this;if(this.iframe){this.isLoading=!1;var t=this.iframe,n=t.contentDocument,r=t.contentWindow;if(!n||!r)return;this.callback?this.callback({iframe:this.iframe,element:this.elCopy,launchPrint:function(){return e.launchPrint(r)}}):this.launchPrint(r)}},e}();t.Printd=c,t.default=c},"./node_modules/react-copy-to-clipboard/lib/Component.js":function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.CopyToClipboard=void 0;var l=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.Component=t.SCREEN_COMPLETE=t.SCREEN_CHOOSE_METHOD=t.SCREEN_REGISTER_METHOD=t.SCREEN_INTRODUCTION=void 0;var l=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"GET",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return fetch(e,{body:n,credentials:"same-origin",headers:r,method:t})};t.default=r},"./client/src/lib/formatCode.js":function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:" ";if(e.length<6)return e;if(e.length%4==0)return e.split(/(.{4})/g).filter(function(e){return e}).join(t).trim();if(e.length%3==0)return e.split(/(.{3})/g).filter(function(e){return e}).join(t).trim();var n=4-e.length%4,o=(e.length-3*n)/4,i=[].concat(r([].concat(r(Array(o).keys())).map(function(){return 4})),r([].concat(r(Array(n).keys())).map(function(){return 3}))),a=0;return i.map(function(t){return e.substring(a,a+=t)}).join(t).trim()};t.formatCode=o},"./client/src/state/methodAvailability/withMethodAvailability.js":function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:null,t=this.props.availableMethodOverrides,n=e||this.props.method,r=n.urlSegment;return void 0!==t[r]?t[r]:{}}},{key:"getUnavailableMessage",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=e||this.props.method;return this.getAvailabilityOverride(t).unavailableMessage||t.unavailableMessage}},{key:"isAvailable",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=e||this.props.method,n=this.getAvailabilityOverride(t),r=t.isAvailable;return void 0!==n.isAvailable&&(r=n.isAvailable),r}},{key:"render",value:function(){return c.default.createElement(e,s({},this.props,{isAvailable:this.isAvailable,getUnavailableMessage:this.getUnavailableMessage}))}}]),n}(u.Component),n=p(e);return t.displayName="WithMethodAvailability("+n+")",t},m=function(e){var t=[].concat(r(e.mfaRegister.availableMethods),r(e.mfaVerify.allMethods)),n={};return Object.values(t).forEach(function(t){var r=t.urlSegment,o=r+"Availability";void 0!==e[o]&&(n[r]=e[o])}),{availableMethodOverrides:n}};t.hoc=h;var _=(0,f.compose)((0,d.connect)(m),h);t.default=_},"./client/src/state/mfaAdministration/actionTypes.js":function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.default=["ADD_REGISTERED_METHOD","REMOVE_REGISTERED_METHOD","SET_DEFAULT_METHOD","SET_REGISTERED_METHODS"].reduce(function(e,t){return Object.assign(e,r({},t,"MFA_ADMINISTRATION."+t))},{})},"./client/src/state/mfaAdministration/actions.js":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setRegisteredMethods=t.setDefaultMethod=t.deregisterMethod=t.registerMethod=void 0;var r=n("./client/src/state/mfaAdministration/actionTypes.js"),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.registerMethod=function(e){return{type:o.default.ADD_REGISTERED_METHOD,payload:{method:e}}},t.deregisterMethod=function(e){return{type:o.default.REMOVE_REGISTERED_METHOD,payload:{method:e}}},t.setDefaultMethod=function(e){return{type:o.default.SET_DEFAULT_METHOD,payload:{defaultMethod:e}}},t.setRegisteredMethods=function(e){return{type:o.default.SET_REGISTERED_METHODS,payload:{methods:e}}}},"./client/src/state/mfaAdministration/reducer.js":function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:l,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.type,o=t.payload,a=function(e){return function(t){return t.urlSegment===e.urlSegment}},u=e.registeredMethods;switch(n){case s.default.ADD_REGISTERED_METHOD:var c=o.method;return Array.isArray(u)?u.find(a(c))?e:(u.push(c),i({},e,{registeredMethods:u})):i({},e,{registeredMethods:[c]});case s.default.REMOVE_REGISTERED_METHOD:var d=o.method,f=u.findIndex(a(d));if(f<0)return e;u.splice(f,1);var p=2===u.length?{defaultMethod:u.find(function(){return!0}).urlSegment}:{};return i({},e,p,{registeredMethods:[].concat(r(u))});case s.default.SET_DEFAULT_METHOD:return i({},e,{defaultMethod:o.defaultMethod});case s.default.SET_REGISTERED_METHODS:return i({},e,{registeredMethods:o.methods});default:return e}}Object.defineProperty(t,"__esModule",{value:!0});var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:u,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.type,o=t.payload;switch(n){case s.default.SET_SCREEN:var a=o.screen;return null===e.method&&a===l.SCREEN_REGISTER_METHOD?i({},e,{screen:l.SCREEN_CHOOSE_METHOD}):i({},e,{screen:a});case s.default.SET_METHOD:return i({},e,{method:o.method});case s.default.SET_AVAILABLE_METHODS:return i({},e,{availableMethods:o.availableMethods});case s.default.ADD_AVAILABLE_METHOD:return i({},e,{availableMethods:[].concat(r(e.availableMethods),[o.method])});case s.default.REMOVE_AVAILABLE_METHOD:return i({},e,{availableMethods:e.availableMethods.filter(function(e){return e.urlSegment!==o.method.urlSegment})});default:return e}}Object.defineProperty(t,"__esModule",{value:!0});var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:s,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.type,r=t.payload;switch(n){case a.default.SET_ALL_METHODS:return o({},e,{allMethods:r.allMethods});default:return e}}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t'),this.addEvents();var d=this.opts,f=d.headElements,p=d.bodyElements;Array.isArray(f)&&f.forEach(function(e){return c.head.appendChild(e)}),Array.isArray(p)&&p.forEach(function(e){return c.body.appendChild(e)}),Array.isArray(t)&&t.forEach(function(e){e&&(l(e)?c.head.appendChild(o(c,e)):c.head.appendChild(r(c,e)))}),c.body.appendChild(this.elCopy),Array.isArray(n)&&n.forEach(function(e){if(e){var t=c.createElement("script");l(e)?t.src=e:t.innerText=e,c.body.appendChild(t)}}),c.close()}}},e.prototype.printURL=function(e,t){this.isLoading||(this.addEvents(),this.isLoading=!0,this.callback=t,this.iframe.src=e)},e.prototype.launchPrint=function(e){e.document.execCommand("print",!1,null)||e.print()},e.prototype.addEvents=function(){var e=this;this.hasEvents||(this.hasEvents=!0,this.iframe.addEventListener("load",function(){return e.onLoad()},!1))},e.prototype.onLoad=function(){var e=this;if(this.iframe){this.isLoading=!1;var t=this.iframe,n=t.contentDocument,r=t.contentWindow;if(!n||!r)return;this.callback?this.callback({iframe:this.iframe,element:this.elCopy,launchPrint:function(){return e.launchPrint(r)}}):this.launchPrint(r)}},e}();t.Printd=c,t.default=c},"./node_modules/react-copy-to-clipboard/lib/Component.js":function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.CopyToClipboard=void 0;var l=Object.assign||function(e){for(var t=1;t ); diff --git a/client/src/components/FormField/RegisteredMFAMethodListField/RegisteredMFAMethodListField.js b/client/src/components/FormField/RegisteredMFAMethodListField/RegisteredMFAMethodListField.js index 398b5391..c483c1f3 100644 --- a/client/src/components/FormField/RegisteredMFAMethodListField/RegisteredMFAMethodListField.js +++ b/client/src/components/FormField/RegisteredMFAMethodListField/RegisteredMFAMethodListField.js @@ -52,21 +52,6 @@ class RegisteredMFAMethodListField extends Component { onSetDefaultMethod(initialDefaultMethod); } - componentDidUpdate(prevProps, prevState) { - const { registrationScreen } = this.props; - const { modalOpen } = this.state; - - // Toggle the modal if the modal is open and the register screen has changed back to "intro" - if ( - prevProps.registrationScreen !== registrationScreen - && registrationScreen === SCREEN_INTRODUCTION - && prevState.modalOpen - && modalOpen - ) { - this.handleToggleModal(); - } - } - /** * The backup method is rendered separately * @@ -201,6 +186,7 @@ class RegisteredMFAMethodListField extends Component { toggle={this.handleToggleModal} resources={resources} endpoints={endpoints} + disallowedScreens={[SCREEN_INTRODUCTION]} /> ); } diff --git a/client/src/components/RegisterModal.js b/client/src/components/RegisterModal.js index 826beca0..a5cdefba 100644 --- a/client/src/components/RegisterModal.js +++ b/client/src/components/RegisterModal.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { Modal, ModalBody, ModalHeader } from 'reactstrap'; import { inject } from 'lib/Injector'; // eslint-disable-line @@ -15,47 +15,72 @@ const fallbacks = require('../../lang/src/en.json'); * Renders a modal that contains a register component. Given endpoints it will register MFA methods * and update redux state accordingly */ -const RegisterModal = ({ - backupMethod, - endpoints, - isOpen, - toggle, - onAddRegisteredMethod, - registeredMethods, - registrationScreen, - resources, - RegisterComponent -}) => ( - - </ModalHeader> - <ModalBody className="registered-mfa-method-list-field-register-modal__content"> - {registrationScreen !== SCREEN_INTRODUCTION && (<RegisterComponent - backupMethod={backupMethod} - registeredMethods={registeredMethods} - onCompleteRegistration={toggle} - onRegister={onAddRegisteredMethod} - resources={resources} - endpoints={endpoints} - showTitle={false} - showSubTitle={false} - completeMessage={window.ss.i18n._t( - 'MultiFactorAuthentication.ADMIN_SETUP_COMPLETE_CONTINUE', - fallbacks['MultiFactorAuthentication.ADMIN_SETUP_COMPLETE_CONTINUE'] - )} - />)} - </ModalBody> - </Modal> -); +class RegisterModal extends Component { + componentDidUpdate() { + const { disallowedScreens, isOpen, registrationScreen, toggle } = this.props; + + if (!isOpen || !disallowedScreens.length) { + return; + } + + if (disallowedScreens.includes(registrationScreen)) { + toggle(); + } + } + + render() { + const { + backupMethod, + endpoints, + isOpen, + toggle, + onAddRegisteredMethod, + registeredMethods, + registrationScreen, + resources, + RegisterComponent + } = this.props; + + return ( + <Modal + isOpen={isOpen} + toggle={toggle} + className="registered-mfa-method-list-field-register-modal" + > + <ModalHeader toggle={toggle}><Title Tag={null} /></ModalHeader> + <ModalBody className="registered-mfa-method-list-field-register-modal__content"> + {registrationScreen !== SCREEN_INTRODUCTION && (<RegisterComponent + backupMethod={backupMethod} + registeredMethods={registeredMethods} + onCompleteRegistration={toggle} + onRegister={onAddRegisteredMethod} + resources={resources} + endpoints={endpoints} + showTitle={false} + showSubTitle={false} + completeMessage={window.ss.i18n._t( + 'MultiFactorAuthentication.ADMIN_SETUP_COMPLETE_CONTINUE', + fallbacks['MultiFactorAuthentication.ADMIN_SETUP_COMPLETE_CONTINUE'] + )} + />)} + </ModalBody> + </Modal> + ); + } +} RegisterModal.propTypes = { - backupMethod: registeredMethodShape, + // Boolean for if the modal is open isOpen: PropTypes.bool, + // A function that is used to toggle the modal. This should affect the `isOpen` prop toggle: PropTypes.func, + // Screens of the RegisterComponent that should not show. If they are shown while the modal is + // open then the toggle function will be called + disallowedScreens: PropTypes.arrayOf(PropTypes.number), + + // RegisterComponent props + backupMethod: registeredMethodShape, resources: PropTypes.object, endpoints: PropTypes.shape({ register: PropTypes.string, @@ -72,6 +97,7 @@ RegisterModal.propTypes = { RegisterModal.defaultProps = { isOpen: false, + disallowedScreens: [], }; const mapStateToProps = state => ({