From 2dd96b1395357ea29674d392b6800af78c909dac Mon Sep 17 00:00:00 2001 From: Todd Underwood Date: Mon, 5 Oct 2020 10:06:25 -0700 Subject: [PATCH] Feat/enable okta push notification (#273) * feat(websecurity): Enables push notifications for the Okta Verify factor. --- .../cerberus-auth-connector-okta.gradle | 6 +- .../connector/okta/OktaAuthConnector.java | 49 + .../AbstractOktaStateHandler.java | 20 +- .../InitialLoginStateHandler.java | 10 +- .../okta/statehandlers/PushStateHandler.java | 54 + .../okta/AbstractOktaStateHandlerTest.java | 31 +- .../okta/InitialLoginStateHandlerTest.java | 42 +- .../connector/okta/OktaAuthConnectorTest.java | 4 +- .../onelogin/OneLoginAuthConnector.java | 44 +- .../auth/connector/AuthConnector.java | 2 + .../cerberus/auth/connector/AuthData.java | 11 + .../auth/connector/AuthMfaDevice.java | 11 + .../nike/cerberus/error/DefaultApiError.java | 19 + cerberus-dashboard/package-lock.json | 886 ++++---- cerberus-dashboard/package.json | 9 +- .../src/actions/authenticationActions.js | 37 + .../components/LoginMfaForm/LoginMfaForm.js | 74 +- .../src/reducers/authenticationReducer.js | 4 +- cerberus-dashboard/src/utils/cmsUtils.js | 7 +- cerberus-domain/cerberus-domain.gradle | 1 + .../nike/cerberus/domain/MfaCheckRequest.java | 11 + .../UserAuthenticationController.java | 4 +- .../cerberus/error/DefaultApiErrorsImpl.java | 22 + .../service/AuthenticationService.java | 22 + gradle.properties | 4 +- gradle/verification-metadata.xml | 1952 +++++++++++++++++ 26 files changed, 2804 insertions(+), 532 deletions(-) create mode 100644 cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/PushStateHandler.java diff --git a/cerberus-auth-connector-okta/cerberus-auth-connector-okta.gradle b/cerberus-auth-connector-okta/cerberus-auth-connector-okta.gradle index 1b926ecd2..7ff1cc8cb 100644 --- a/cerberus-auth-connector-okta/cerberus-auth-connector-okta.gradle +++ b/cerberus-auth-connector-okta/cerberus-auth-connector-okta.gradle @@ -19,9 +19,9 @@ dependencies { // Okta implementation "com.okta:okta-sdk:0.0.4" - implementation "com.okta.authn.sdk:okta-authn-sdk-api:0.1.0" - implementation "com.okta.sdk:okta-sdk-httpclient:1.2.0" - implementation "com.okta.authn.sdk:okta-authn-sdk-impl:0.1.0" + implementation "com.okta.authn.sdk:okta-authn-sdk-api:2.0.0" + implementation "com.okta.sdk:okta-sdk-httpclient:2.0.0" + implementation "com.okta.authn.sdk:okta-authn-sdk-impl:2.0.0" // The Okta SDKs pull in an outdated version of guava that the OWASP Dep checker doesn't like implementation group: 'com.google.guava', name: 'guava', version: "${versions.guava}" diff --git a/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/OktaAuthConnector.java b/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/OktaAuthConnector.java index c057f12c2..da21f2725 100644 --- a/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/OktaAuthConnector.java +++ b/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/OktaAuthConnector.java @@ -16,6 +16,8 @@ package com.nike.cerberus.auth.connector.okta; +import static java.lang.Thread.sleep; + import com.google.common.base.Preconditions; import com.nike.backstopper.exception.ApiException; import com.nike.cerberus.auth.connector.AuthConnector; @@ -23,6 +25,7 @@ import com.nike.cerberus.auth.connector.AuthResponse; import com.nike.cerberus.auth.connector.okta.statehandlers.InitialLoginStateHandler; import com.nike.cerberus.auth.connector.okta.statehandlers.MfaStateHandler; +import com.nike.cerberus.auth.connector.okta.statehandlers.PushStateHandler; import com.nike.cerberus.error.DefaultApiError; import com.okta.authn.sdk.FactorValidationException; import com.okta.authn.sdk.client.AuthenticationClient; @@ -96,6 +99,52 @@ public AuthResponse triggerChallenge(String stateToken, String deviceId) { } } + /** Triggers challenge for SMS or Call factors using Okta Auth SDK. */ + public AuthResponse triggerPush(String stateToken, String deviceId) { + + CompletableFuture authResponseFuture = new CompletableFuture<>(); + PushStateHandler stateHandler = + new PushStateHandler(oktaAuthenticationClient, authResponseFuture); + + try { + oktaAuthenticationClient.verifyFactor(deviceId, stateToken, stateHandler); + + AuthResponse authResponse = authResponseFuture.get(45, TimeUnit.SECONDS); + long startTime = System.currentTimeMillis(); + while (authResponse.getData().getFactorResult().equals("WAITING") + && System.currentTimeMillis() - startTime <= 55000) { + sleep(100); + authResponseFuture = new CompletableFuture<>(); + stateHandler = new PushStateHandler(oktaAuthenticationClient, authResponseFuture); + oktaAuthenticationClient.verifyFactor(deviceId, stateToken, stateHandler); + authResponse = authResponseFuture.get(45, TimeUnit.SECONDS); + } + String factorResult = authResponse.getData().getFactorResult(); + if (!factorResult.equals("SUCCESS")) { + if (factorResult.equals("TIMEOUT") || factorResult.equals("WAITING")) { + throw ApiException.newBuilder() + .withApiErrors(DefaultApiError.OKTA_PUSH_MFA_TIMEOUT) + .withExceptionMessage(DefaultApiError.OKTA_PUSH_MFA_TIMEOUT.getMessage()) + .build(); + } else if (factorResult.equals("REJECTED")) { + throw ApiException.newBuilder() + .withApiErrors(DefaultApiError.OKTA_PUSH_MFA_REJECTED) + .withExceptionMessage(DefaultApiError.OKTA_PUSH_MFA_REJECTED.getMessage()) + .build(); + } + } + return authResponseFuture.get(45, TimeUnit.SECONDS); + } catch (ApiException e) { + throw e; + } catch (Exception e) { + throw ApiException.newBuilder() + .withExceptionCause(e) + .withApiErrors(DefaultApiError.AUTH_RESPONSE_WAIT_FAILED) + .withExceptionMessage("Failed to trigger challenge due to timeout. Please try again.") + .build(); + } + } + /** Verifies user's MFA factor using Okta Auth SDK. */ @Override public AuthResponse mfaCheck(String stateToken, String deviceId, String otpToken) { diff --git a/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/AbstractOktaStateHandler.java b/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/AbstractOktaStateHandler.java index 5134ec574..c58f35b95 100644 --- a/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/AbstractOktaStateHandler.java +++ b/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/AbstractOktaStateHandler.java @@ -18,7 +18,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.nike.backstopper.exception.ApiException; import com.nike.cerberus.auth.connector.AuthData; import com.nike.cerberus.auth.connector.AuthResponse; @@ -29,13 +28,13 @@ import com.okta.authn.sdk.client.AuthenticationClient; import com.okta.authn.sdk.resource.AuthenticationResponse; import com.okta.authn.sdk.resource.Factor; -import com.okta.sdk.resource.user.factor.FactorProvider; -import com.okta.sdk.resource.user.factor.FactorType; +import com.okta.authn.sdk.resource.FactorProvider; +import com.okta.authn.sdk.resource.FactorType; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.text.WordUtils; +import org.apache.commons.text.WordUtils; /** * Abstract state handler to provide helper methods for authentication and MFA validation. Also @@ -57,7 +56,7 @@ public abstract class AbstractOktaStateHandler extends AuthenticationStateHandle ImmutableMap.of( "google-token:software:totp", false, "okta-token:software:totp", false, - "okta-push", true, + "okta-push", false, "okta-call", true, "okta-sms", true); @@ -75,9 +74,6 @@ public abstract class AbstractOktaStateHandler extends AuthenticationStateHandle .put("MFA_ENROLL_ACTIVATE", "Please activate your factor to complete enrollment.") .build(); - // We currently do not support push notifications for Okta MFA verification. - private static final ImmutableSet UNSUPPORTED_OKTA_MFA_TYPES = ImmutableSet.of(FactorType.PUSH); - public final AuthenticationClient client; public final CompletableFuture authenticationResponseFuture; @@ -138,17 +134,17 @@ public boolean isTriggerRequired(Factor factor) { } /** - * Determines if a MFA factor is currently supported by Cerberus or not + * Determines whether a trigger is required for a provided MFA factor * * @param factor Okta MFA factor - * @return boolean + * @return boolean trigger required */ - public boolean isSupportedFactor(Factor factor) { + public boolean isPush(Factor factor) { final FactorType type = factor.getType(); final FactorProvider provider = factor.getProvider(); - return !(provider.equals(FactorProvider.OKTA) && UNSUPPORTED_OKTA_MFA_TYPES.contains(type)); + return (provider.equals(FactorProvider.OKTA) && type == FactorType.PUSH); } /** diff --git a/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/InitialLoginStateHandler.java b/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/InitialLoginStateHandler.java index 6d07c996f..31964698e 100644 --- a/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/InitialLoginStateHandler.java +++ b/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/InitialLoginStateHandler.java @@ -23,9 +23,9 @@ import com.okta.authn.sdk.client.AuthenticationClient; import com.okta.authn.sdk.resource.AuthenticationResponse; import com.okta.authn.sdk.resource.Factor; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; /** Initial state handler to handle relevant states during authentication. */ public class InitialLoginStateHandler extends AbstractOktaStateHandler { @@ -70,10 +70,7 @@ private void handleMfaResponse(AuthenticationResponse mfaResponse) { authData.setStateToken(mfaResponse.getStateToken()); authResponse.setStatus(AuthStatus.MFA_REQUIRED); - final List factors = - mfaResponse.getFactors().stream() - .filter(this::isSupportedFactor) - .collect(Collectors.toList()); + final List factors = new ArrayList<>(mfaResponse.getFactors()); validateUserFactors(factors); @@ -85,7 +82,8 @@ private void handleMfaResponse(AuthenticationResponse mfaResponse) { new AuthMfaDevice() .setId(factor.getId()) .setName(getDeviceName(factor)) - .setRequiresTrigger(isTriggerRequired(factor)))); + .setRequiresTrigger(isTriggerRequired(factor)) + .setIsPush(isPush(factor)))); authenticationResponseFuture.complete(authResponse); } diff --git a/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/PushStateHandler.java b/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/PushStateHandler.java new file mode 100644 index 000000000..ccc149303 --- /dev/null +++ b/cerberus-auth-connector-okta/src/main/java/com/nike/cerberus/auth/connector/okta/statehandlers/PushStateHandler.java @@ -0,0 +1,54 @@ +package com.nike.cerberus.auth.connector.okta.statehandlers; + +import com.nike.cerberus.auth.connector.AuthData; +import com.nike.cerberus.auth.connector.AuthResponse; +import com.nike.cerberus.auth.connector.AuthStatus; +import com.okta.authn.sdk.client.AuthenticationClient; +import com.okta.authn.sdk.resource.AuthenticationResponse; +import java.util.concurrent.CompletableFuture; + +public class PushStateHandler extends AbstractOktaStateHandler { + public PushStateHandler( + AuthenticationClient client, CompletableFuture authenticationResponseFuture) { + super(client, authenticationResponseFuture); + } + + /** + * Handles MFA Challenge, when a MFA challenge has been initiated for call or sms. + * + * @param mfaChallengeResponse - Authentication response from the Completable Future + */ + @Override + public void handleMfaChallenge(AuthenticationResponse mfaChallengeResponse) { + + final String userId = mfaChallengeResponse.getUser().getId(); + final String userLogin = mfaChallengeResponse.getUser().getLogin(); + final String factorResult = mfaChallengeResponse.getFactorResult(); + + final AuthData authData = + new AuthData().setUserId(userId).setUsername(userLogin).setFactorResult(factorResult); + AuthResponse authResponse = + new AuthResponse().setData(authData).setStatus(AuthStatus.MFA_CHALLENGE); + + authenticationResponseFuture.complete(authResponse); + } + + /** + * Handles MFA Challenge, when a MFA challenge has been initiated for call or sms. + * + * @param mfaChallengeResponse - Authentication response from the Completable Future + */ + @Override + public void handleSuccess(AuthenticationResponse mfaChallengeResponse) { + + final String userId = mfaChallengeResponse.getUser().getId(); + final String userLogin = mfaChallengeResponse.getUser().getLogin(); + final String factorResult = mfaChallengeResponse.getStatus().toString(); + + final AuthData authData = + new AuthData().setUserId(userId).setUsername(userLogin).setFactorResult(factorResult); + AuthResponse authResponse = new AuthResponse().setData(authData).setStatus(AuthStatus.SUCCESS); + + authenticationResponseFuture.complete(authResponse); + } +} diff --git a/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/AbstractOktaStateHandlerTest.java b/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/AbstractOktaStateHandlerTest.java index f19f96f90..7d05c8a56 100644 --- a/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/AbstractOktaStateHandlerTest.java +++ b/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/AbstractOktaStateHandlerTest.java @@ -29,12 +29,11 @@ import com.okta.authn.sdk.client.AuthenticationClient; import com.okta.authn.sdk.impl.resource.DefaultFactor; import com.okta.authn.sdk.resource.AuthenticationResponse; +import com.okta.authn.sdk.resource.FactorProvider; +import com.okta.authn.sdk.resource.FactorType; import com.okta.authn.sdk.resource.User; -import com.okta.sdk.resource.user.factor.FactorProvider; -import com.okta.sdk.resource.user.factor.FactorType; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import junit.framework.TestCase; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -160,32 +159,6 @@ public void getDeviceNameFailsNullFactor() { this.abstractOktaStateHandler.getDeviceName(null); } - @Test - public void isSupportedFactorFalse() { - - DefaultFactor factor = mock(DefaultFactor.class); - when(factor.getType()).thenReturn(FactorType.PUSH); - when(factor.getProvider()).thenReturn(FactorProvider.OKTA); - - boolean expected = false; - boolean actual = abstractOktaStateHandler.isSupportedFactor(factor); - - TestCase.assertEquals(expected, actual); - } - - @Test - public void isSupportedFactorTrue() { - - DefaultFactor factor = mock(DefaultFactor.class); - when(factor.getType()).thenReturn(FactorType.TOKEN_SOFTWARE_TOTP); - when(factor.getProvider()).thenReturn(FactorProvider.OKTA); - - boolean expected = true; - boolean actual = abstractOktaStateHandler.isSupportedFactor(factor); - - TestCase.assertEquals(expected, actual); - } - @Test public void validateUserFactorsSuccess() { diff --git a/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/InitialLoginStateHandlerTest.java b/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/InitialLoginStateHandlerTest.java index 529eb4562..e6b5de7af 100644 --- a/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/InitialLoginStateHandlerTest.java +++ b/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/InitialLoginStateHandlerTest.java @@ -28,9 +28,9 @@ import com.okta.authn.sdk.client.AuthenticationClient; import com.okta.authn.sdk.impl.resource.DefaultFactor; import com.okta.authn.sdk.resource.AuthenticationResponse; +import com.okta.authn.sdk.resource.FactorProvider; +import com.okta.authn.sdk.resource.FactorType; import com.okta.authn.sdk.resource.User; -import com.okta.sdk.resource.user.factor.FactorProvider; -import com.okta.sdk.resource.user.factor.FactorType; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import org.junit.Before; @@ -100,44 +100,6 @@ public void handleMfaRequired() throws Exception { assertEquals(expectedStatus, actualResponse.getStatus()); } - @Test(expected = ApiException.class) - public void handleMfaRequiredFailNoSupportedDevicesEnrolled() throws Exception { - - String email = "email"; - String id = "id"; - AuthStatus expectedStatus = AuthStatus.MFA_REQUIRED; - - FactorProvider provider = FactorProvider.OKTA; - FactorType type = FactorType.PUSH; - String deviceId = "device id"; - String status = "status"; - - AuthenticationResponse expectedResponse = mock(AuthenticationResponse.class); - - User user = mock(User.class); - when(user.getId()).thenReturn(id); - when(user.getLogin()).thenReturn(email); - when(expectedResponse.getUser()).thenReturn(user); - - DefaultFactor factor = mock(DefaultFactor.class); - - when(factor.getType()).thenReturn(type); - when(factor.getProvider()).thenReturn(provider); - when(factor.getStatus()).thenReturn(status); - when(factor.getId()).thenReturn(deviceId); - when(expectedResponse.getFactors()).thenReturn(Lists.newArrayList(factor)); - - // do the call - initialLoginStateHandler.handleMfaRequired(expectedResponse); - - AuthResponse actualResponse = authenticationResponseFuture.get(1, TimeUnit.SECONDS); - - // verify results - assertEquals(id, actualResponse.getData().getUserId()); - assertEquals(email, actualResponse.getData().getUsername()); - assertEquals(expectedStatus, actualResponse.getStatus()); - } - @Test public void handleMfaEnroll() throws Exception { diff --git a/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/OktaAuthConnectorTest.java b/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/OktaAuthConnectorTest.java index 93c4cfe87..a84cd2b1b 100644 --- a/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/OktaAuthConnectorTest.java +++ b/cerberus-auth-connector-okta/src/test/java/com/nike/cerberus/auth/connector/okta/OktaAuthConnectorTest.java @@ -202,7 +202,7 @@ public void mfaCheckSuccess() throws Exception { return null; }) .when(client) - .verifyFactor(any(), any(), any()); + .verifyFactor(anyString(), isA(DefaultVerifyPassCodeFactorRequest.class), any()); // do the call AuthResponse actualResponse = this.oktaAuthConnector.mfaCheck(stateToken, deviceId, otpToken); @@ -238,7 +238,7 @@ public void mfaCheckFails() throws Exception { return null; }) .when(client) - .verifyFactor(any(), any(), any()); + .verifyFactor(any(), isA(DefaultVerifyPassCodeFactorRequest.class), any()); // do the call AuthResponse actualResponse = this.oktaAuthConnector.mfaCheck(stateToken, deviceId, otpToken); diff --git a/cerberus-auth-connector-onelogin/src/main/java/com/nike/cerberus/auth/connector/onelogin/OneLoginAuthConnector.java b/cerberus-auth-connector-onelogin/src/main/java/com/nike/cerberus/auth/connector/onelogin/OneLoginAuthConnector.java index d163e1e5a..10786d2f2 100644 --- a/cerberus-auth-connector-onelogin/src/main/java/com/nike/cerberus/auth/connector/onelogin/OneLoginAuthConnector.java +++ b/cerberus-auth-connector-onelogin/src/main/java/com/nike/cerberus/auth/connector/onelogin/OneLoginAuthConnector.java @@ -18,12 +18,10 @@ import com.google.common.base.Splitter; import com.google.common.collect.Iterables; -import com.nike.backstopper.apierror.ApiError; import com.nike.backstopper.exception.ApiException; import com.nike.cerberus.auth.connector.*; import com.nike.cerberus.error.DefaultApiError; import java.util.HashSet; -import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; @@ -77,35 +75,19 @@ public AuthResponse triggerChallenge(String stateToken, String deviceId) { // TODO Convert to Default API Error once bug in Backstopper that doesn't allow 501 status codes // is fixed. throw ApiException.newBuilder() - .withApiErrors( - new ApiError() { - @Override - public String getName() { - return "TRIGGER_CHALLENGE_NOT_IMPLEMENTED"; - } - - @Override - public String getErrorCode() { - return "99244"; - } - - @Override - public String getMessage() { - return "Call to trigger sms or call challenge for OneLogin is not implemented."; - } - - @Override - public Map getMetadata() { - return null; - } - - @Override - public int getHttpStatusCode() { - return 501; - } - }) - .withExceptionMessage( - "Call to trigger sms or call challenge for OneLogin is not implemented.") + .withApiErrors(DefaultApiError.TRIGGER_CHALLENGE_NOT_IMPLEMENTED) + .withExceptionMessage(DefaultApiError.TRIGGER_CHALLENGE_NOT_IMPLEMENTED.getMessage()) + .build(); + } + + @Override + public AuthResponse triggerPush(String stateToken, String deviceId) { + + // TODO Convert to Default API Error once bug in Backstopper that doesn't allow 501 status codes + // is fixed. + throw ApiException.newBuilder() + .withApiErrors(DefaultApiError.TRIGGER_PUSH_NOT_IMPLEMENTED) + .withExceptionMessage(DefaultApiError.TRIGGER_PUSH_NOT_IMPLEMENTED.getMessage()) .build(); } diff --git a/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthConnector.java b/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthConnector.java index e8fe4323c..365a03550 100644 --- a/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthConnector.java +++ b/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthConnector.java @@ -24,6 +24,8 @@ public interface AuthConnector { AuthResponse triggerChallenge(final String stateToken, final String deviceId); + AuthResponse triggerPush(final String stateToken, final String deviceId); + AuthResponse mfaCheck(final String stateToken, final String deviceId, final String otpToken); Set getGroups(final AuthData data); diff --git a/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthData.java b/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthData.java index 8b8d70570..bc737ae30 100644 --- a/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthData.java +++ b/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthData.java @@ -29,6 +29,8 @@ public class AuthData { private String stateToken; + private String factorResult; + private List devices = new LinkedList<>(); private AuthTokenResponse clientToken; @@ -77,4 +79,13 @@ public AuthData setClientToken(AuthTokenResponse clientToken) { this.clientToken = clientToken; return this; } + + public String getFactorResult() { + return factorResult; + } + + public AuthData setFactorResult(String factorResult) { + this.factorResult = factorResult; + return this; + } } diff --git a/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthMfaDevice.java b/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthMfaDevice.java index f1601392a..2e7f0885c 100644 --- a/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthMfaDevice.java +++ b/cerberus-core/src/main/java/com/nike/cerberus/auth/connector/AuthMfaDevice.java @@ -25,6 +25,8 @@ public class AuthMfaDevice { private boolean requiresTrigger; + private boolean isPush; + public String getId() { return id; } @@ -51,4 +53,13 @@ public AuthMfaDevice setRequiresTrigger(boolean requiresTrigger) { this.requiresTrigger = requiresTrigger; return this; } + + public boolean getIsPush() { + return isPush; + } + + public AuthMfaDevice setIsPush(boolean isPush) { + this.isPush = isPush; + return this; + } } diff --git a/cerberus-core/src/main/java/com/nike/cerberus/error/DefaultApiError.java b/cerberus-core/src/main/java/com/nike/cerberus/error/DefaultApiError.java index 36970d08c..83f1f44f0 100644 --- a/cerberus-core/src/main/java/com/nike/cerberus/error/DefaultApiError.java +++ b/cerberus-core/src/main/java/com/nike/cerberus/error/DefaultApiError.java @@ -16,6 +16,7 @@ package com.nike.cerberus.error; +import static com.nike.backstopper.apierror.ApiErrorConstants.*; import static javax.servlet.http.HttpServletResponse.*; import com.nike.backstopper.apierror.ApiError; @@ -245,6 +246,24 @@ public enum DefaultApiError implements ApiError { "The AWS Global partition is disabled by the admin. If you're creating or updating an SDB, please remove IAM principal ARNs that start with \"arn:aws:\"", SC_UNAUTHORIZED), + /** SMS and call challenges have not been implemented for OneLogin MFA */ + TRIGGER_CHALLENGE_NOT_IMPLEMENTED( + 99246, + "Call to trigger sms or call challenge for OneLogin is not implemented.", + SC_NOT_IMPLEMENTED), + + /** Push notification challenges have not been implemented for OneLogin MFA */ + TRIGGER_PUSH_NOT_IMPLEMENTED( + 99247, + "Call to trigger push notification challenge for OneLogin is not implemented.", + SC_NOT_IMPLEMENTED), + + /** Push notification challenges have not been implemented for OneLogin MFA */ + OKTA_PUSH_MFA_TIMEOUT( + 99248, "User did not respond to push notification before timeout expired", SC_UNAUTHORIZED), + /** Push notification challenges have not been implemented for OneLogin MFA */ + OKTA_PUSH_MFA_REJECTED(99249, "Push notification request was rejected by user", SC_UNAUTHORIZED), + /** Generic not found error. */ ENTITY_NOT_FOUND(99996, "Not found", SC_NOT_FOUND), diff --git a/cerberus-dashboard/package-lock.json b/cerberus-dashboard/package-lock.json index 7e6898604..06f27509e 100644 --- a/cerberus-dashboard/package-lock.json +++ b/cerberus-dashboard/package-lock.json @@ -48,12 +48,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "json5": { @@ -80,12 +80,12 @@ } }, "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", "dev": true, "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -134,14 +134,14 @@ } }, "@babel/helper-builder-react-jsx-experimental": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", - "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", + "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.10.5" + "@babel/types": "^7.11.5" } }, "@babel/helper-compilation-targets": { @@ -194,12 +194,11 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", - "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", "dev": true, "requires": { - "@babel/traverse": "^7.10.4", "@babel/types": "^7.10.4" } }, @@ -290,15 +289,14 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", - "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", "@babel/types": "^7.10.4" } }, @@ -414,9 +412,9 @@ } }, "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -986,12 +984,12 @@ } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", - "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz", + "integrity": "sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw==", "dev": true, "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.11.5", "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-jsx": "^7.10.4" } @@ -1135,9 +1133,9 @@ } }, "@babel/preset-env": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", - "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", + "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", "dev": true, "requires": { "@babel/compat-data": "^7.11.0", @@ -1202,7 +1200,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.10.4", "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -1211,9 +1209,9 @@ } }, "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1278,29 +1276,29 @@ } }, "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", + "@babel/generator": "^7.11.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "globals": { @@ -1318,9 +1316,9 @@ } }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1942,9 +1940,9 @@ } }, "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", + "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1955,18 +1953,18 @@ } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1974,9 +1972,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", - "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -2030,9 +2028,9 @@ } }, "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, "@types/minimatch": { @@ -2042,9 +2040,9 @@ "dev": true }, "@types/node": { - "version": "14.0.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", - "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", + "version": "14.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", + "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", "dev": true }, "@types/parse-json": { @@ -2066,9 +2064,9 @@ "dev": true }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -2132,12 +2130,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -2343,9 +2341,9 @@ "dev": true }, "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "abbrev": { @@ -2388,9 +2386,9 @@ } }, "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "acorn-walk": { @@ -2453,9 +2451,9 @@ } }, "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "requires": { "clean-stack": "^2.0.0", @@ -2689,14 +2687,15 @@ } }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" }, "dependencies": { "bn.js": { @@ -3214,14 +3213,14 @@ } }, "parse-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", - "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, @@ -3887,9 +3886,9 @@ "dev": true }, "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", "dev": true }, "body-parser": { @@ -4121,15 +4120,15 @@ } }, "browserslist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", - "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001111", - "electron-to-chromium": "^1.3.523", - "escalade": "^3.0.2", - "node-releases": "^1.1.60" + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" } }, "bser": { @@ -4309,9 +4308,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001113", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001113.tgz", - "integrity": "sha512-qMvjHiKH21zzM/VDZr6oosO6Ri3U0V2tC015jRXjOecwQCJtsU5zklTNTk31jQbIOP8gha0h1ccM/g0ECP+4BA==", + "version": "1.0.30001141", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001141.tgz", + "integrity": "sha512-EHfInJHoQTmlMdVZrEc5gmwPc0zyN/hVufmGHPbVNQwlk7tJfCmQ2ysRZMY2MeleBivALUTyyxXnQjK18XrVpA==", "dev": true }, "capture-exit": { @@ -4959,13 +4958,13 @@ } }, "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "elliptic": "^6.5.3" }, "dependencies": { "bn.js": { @@ -5227,9 +5226,9 @@ } }, "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.1.tgz", + "integrity": "sha512-wHOppVDKl4vTAOWzJt5Ek37Sgd9qq1Bmj/T1OjvicWbU5W7ru7Pqbn0Jdqii3Drx/h+dixHKXNhZYx7blthL7g==", "dev": true }, "cssdb": { @@ -5773,9 +5772,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", "dev": true } } @@ -5831,9 +5830,9 @@ } }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -5857,9 +5856,9 @@ "integrity": "sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw=" }, "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "duplexify": { @@ -5890,9 +5889,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.529", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.529.tgz", - "integrity": "sha512-n3sriLldqNyjBlosbnPftjCY+m1dVOY307I1Y0HaHAqDGe3hRvK7ksJwWd+qs599ybR4jobCo1+7zXM9GyNMSA==", + "version": "1.3.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.576.tgz", + "integrity": "sha512-uSEI0XZ//5ic+0NdOqlxp0liCD44ck20OAGyLMSymIWTEAtHKVJi6JM18acOnRgUgX7Q65QqnI+sNncNvIy8ew==", "dev": true }, "elliptic": { @@ -5936,14 +5935,6 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -6060,9 +6051,9 @@ } }, "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", "dev": true }, "escape-html": { @@ -6191,12 +6182,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "doctrine": { @@ -6598,12 +6589,12 @@ "dev": true }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -6657,12 +6648,20 @@ } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -6690,9 +6689,9 @@ "dev": true }, "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "events": { @@ -6908,9 +6907,9 @@ }, "dependencies": { "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", "dev": true } } @@ -8166,6 +8165,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -8396,9 +8396,9 @@ } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -8566,9 +8566,9 @@ "dev": true }, "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", "dev": true }, "is-extendable": { @@ -8611,6 +8611,12 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -8699,7 +8705,8 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "is-string": { "version": "1.0.5", @@ -8769,6 +8776,13 @@ "requires": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + } } }, "isstream": { @@ -8841,12 +8855,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -10043,6 +10057,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -10900,19 +10920,10 @@ "tslib": "^1.10.0" } }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, "node-gyp": { @@ -11021,9 +11032,9 @@ } }, "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", "dev": true }, "node-sass": { @@ -11245,28 +11256,28 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-regex": { @@ -11277,6 +11288,46 @@ "requires": { "has-symbols": "^1.0.1" } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } } } }, @@ -11353,18 +11404,18 @@ } }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, "open": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz", - "integrity": "sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", + "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", "dev": true, "requires": { "is-docker": "^2.0.0", @@ -11473,9 +11524,9 @@ "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -11565,14 +11616,13 @@ } }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -11813,9 +11863,9 @@ "dev": true }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11891,9 +11941,9 @@ } }, "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", + "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", "dev": true, "requires": { "postcss": "^7.0.27", @@ -12202,9 +12252,9 @@ } }, "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "dev": true, "requires": { "cosmiconfig": "^5.0.0", @@ -12842,14 +12892,15 @@ } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "dev": true, "requires": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } }, "postcss-svgo": { @@ -12913,9 +12964,9 @@ "dev": true }, "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", + "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==", "dev": true }, "pretty-error": { @@ -13005,12 +13056,13 @@ } }, "prop-types": { - "version": "15.5.9", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.9.tgz", - "integrity": "sha1-1Hju8OdhOWlC9wx453L3bovnR8k=", + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, "proxy-addr": { @@ -13131,9 +13183,9 @@ "dev": true }, "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, "raf": { @@ -13149,6 +13201,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -13650,9 +13703,9 @@ "integrity": "sha1-hQMv3UxrLx4p/Z14k8CO8x+OEM8=" }, "react-scripts": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.2.tgz", - "integrity": "sha512-dTeydv5tiCBM9BJgARQQ4cbHU2TlFmA4iIagDa5ZWnPUPqvk5UWaTXjeY+Sp0ySv9dA2qqDLQ4TytGJdsWhOuA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.3.tgz", + "integrity": "sha512-oSnoWmii/iKdeQiwaO6map1lUaZLmG0xIUyb/HwCVFLT7gNbj8JZ9RmpvMCZ4fB98ZUMRfNmp/ft8uy/xD1RLA==", "dev": true, "requires": { "@babel/core": "7.9.0", @@ -13701,7 +13754,7 @@ "sass-loader": "8.0.2", "semver": "6.3.0", "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.5", + "terser-webpack-plugin": "2.3.8", "ts-pnp": "1.1.6", "url-loader": "2.3.0", "webpack": "4.42.0", @@ -13811,17 +13864,6 @@ "json5": "^1.0.1" } }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, "resolve": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", @@ -14061,9 +14103,9 @@ "dev": true }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, "requires": { "regenerate": "^1.4.0", @@ -14472,9 +14514,9 @@ } }, "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -14698,20 +14740,20 @@ } }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "dependencies": { "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -14738,12 +14780,12 @@ "dev": true }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "dev": true, "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { @@ -14803,6 +14845,15 @@ } } }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -14971,13 +15022,68 @@ "dev": true }, "side-channel": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", - "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", + "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", "dev": true, "requires": { - "es-abstract": "^1.17.0-next.1", - "object-inspect": "^1.7.0" + "es-abstract": "^1.18.0-next.0", + "object-inspect": "^1.8.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } } }, "signal-exit": { @@ -15311,12 +15417,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -15342,12 +15448,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -15569,28 +15675,28 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-regex": { @@ -15601,6 +15707,46 @@ "requires": { "has-symbols": "^1.0.1" } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } } } }, @@ -15633,28 +15779,28 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-regex": { @@ -15665,6 +15811,46 @@ "requires": { "has-symbols": "^1.0.1" } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } } } }, @@ -15992,19 +16178,19 @@ } }, "terser-webpack-plugin": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", - "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", + "integrity": "sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==", "dev": true, "requires": { "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", + "find-cache-dir": "^3.3.1", + "jest-worker": "^25.4.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", - "terser": "^4.4.3", + "terser": "^4.6.12", "webpack-sources": "^1.4.3" }, "dependencies": { @@ -16093,15 +16279,6 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16109,9 +16286,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -17072,14 +17249,6 @@ "ajv-keywords": "^3.1.0" } }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "requires": { - "randombytes": "^2.1.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17096,31 +17265,20 @@ } }, "terser-webpack-plugin": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", - "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "dev": true, "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^3.1.0", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" - }, - "dependencies": { - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - } } }, "yallist": { @@ -17212,12 +17370,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "fsevents": { @@ -17268,9 +17426,9 @@ } }, "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", - "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", + "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==", "dev": true }, "ms": { @@ -17809,12 +17967,6 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -17842,12 +17994,6 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -17867,22 +18013,24 @@ "requires": { "ansi-regex": "^4.1.0" } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } } diff --git a/cerberus-dashboard/package.json b/cerberus-dashboard/package.json index 244ab65f9..8aaa8fb0e 100644 --- a/cerberus-dashboard/package.json +++ b/cerberus-dashboard/package.json @@ -25,8 +25,8 @@ "lodash": "^4.17.20", "loglevel": "1.4.1", "node-sass": "4.13.1", - "prop-types": "15.5.9", - "react": "15.6.2", + "prop-types": "^15.7.2", + "react": "15.6", "react-addons-create-fragment": "15.6.2", "react-addons-css-transition-group": "15.6.2", "react-addons-shallow-compare": "15.6.2", @@ -52,7 +52,7 @@ "eslint-loader": "1.3.0", "eslint-plugin-react": "5.2.2", "estraverse-fb": "1.3.1", - "react-scripts": "^3.4.2", + "react-scripts": "3.4.3", "redux-devtools": "3.3.1" }, "browserslist": { @@ -69,7 +69,8 @@ }, "resolutions": { "yargs-parser": "13.1.2", - "serialize-javascript": "4.0.0" + "serialize-javascript": "4.0.0", + "node-fetch": "2.6.1" }, "comments:": { "resolutions": { diff --git a/cerberus-dashboard/src/actions/authenticationActions.js b/cerberus-dashboard/src/actions/authenticationActions.js index 243499fe8..e78d79e63 100644 --- a/cerberus-dashboard/src/actions/authenticationActions.js +++ b/cerberus-dashboard/src/actions/authenticationActions.js @@ -245,7 +245,44 @@ export function triggerCodeChallenge(mfaDeviceId, stateToken) { )); + dispatch(resetAuthState()); + }); + }; +} +/** + * This action triggers a push notification challenge for a user with MFA, if MFA is required + * @param mfaDeviceId ID of the MFA security device + * @param stateToken Identifying token for the authentication request + */ +export function triggerPushChallenge(mfaDeviceId, stateToken) { + return function (dispatch) { + dispatch(loginMfaChallenge()); + return axios({ + method: 'post', + url: environmentService.getDomain() + cms.USER_AUTH_MFA_PATH, + data: { + state_token: stateToken, + device_id: mfaDeviceId, + is_push: true + }, + timeout: AUTH_ACTION_TIMEOUT + }) + .then(function (response) { + handleUserLogin(response, dispatch); + }) + .catch(function ({ response }) { + log.error('Failed to finalize MFA login', response); + + dispatch(messengerActions.addNewMessage( +
+
Failed to Login
+
+
Server Message:
+
{cmsUtils.parseCMSError(response, true)}
+
+
+ )); dispatch(resetAuthState()); }); }; diff --git a/cerberus-dashboard/src/components/LoginMfaForm/LoginMfaForm.js b/cerberus-dashboard/src/components/LoginMfaForm/LoginMfaForm.js index 931d863e4..12254154b 100644 --- a/cerberus-dashboard/src/components/LoginMfaForm/LoginMfaForm.js +++ b/cerberus-dashboard/src/components/LoginMfaForm/LoginMfaForm.js @@ -19,7 +19,7 @@ import { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { reduxForm, touch } from 'redux-form'; -import { finalizeMfaLogin, triggerCodeChallenge } from '../../actions/authenticationActions'; +import {finalizeMfaLogin, triggerCodeChallenge, triggerPushChallenge} from '../../actions/authenticationActions'; import MfaDeviceSelect from '../MfaDeviceSelect/MfaDeviceSelect'; import './LoginFormMfa.scss'; @@ -64,61 +64,74 @@ class LoginMfaForm extends Component { render() { const { fields: { otpToken, mfaDeviceId }, stateToken, handleSubmit, isAuthenticating, isChallengeSent, mfaDevices, - dispatch, selectedDeviceId, shouldDisplaySendCodeButton } = this.props; + dispatch, selectedDeviceId, shouldDisplaySendCodeButton, shouldDisplaySendPushButton } = this.props; return (

MFA is required.

-
{ - dispatch(finalizeMfaLogin(data.otpToken, data.mfaDeviceId, stateToken)); - })}> + (shouldDisplaySendPushButton) ? + dispatch(triggerPushChallenge(selectedDeviceId, stateToken, shouldDisplaySendPushButton)) : + dispatch(finalizeMfaLogin(data.otpToken, data.mfaDeviceId, stateToken)))}>
-
{ this.handleMfaDeviceTouch(formName); }} /> + dispatch={dispatch} + mfaDevices={mfaDevices} + handleBeingTouched={() => { this.handleMfaDeviceTouch(formName); }} />
- - + {!shouldDisplaySendPushButton && + + }
- {shouldDisplaySendCodeButton && - + >{isChallengeSent ? "Sent" : "Send Code"} } - + {!shouldDisplaySendPushButton && + className='ncss-input pt2-sm pr4-sm pb2-sm pl4-sm r' + placeholder='Please enter your OTP token' + autoComplete="off" + autoFocus={true} + {...otpToken} /> + }
{otpToken.touched && otpToken.error &&
{otpToken.error}
}
-
-
- - +
+ + {shouldDisplaySendPushButton && + + } + {!shouldDisplaySendPushButton && + + }
@@ -129,6 +142,7 @@ class LoginMfaForm extends Component { const mapStateToProps = state => ({ shouldDisplaySendCodeButton: state.auth.shouldDisplaySendCodeButton, + shouldDisplaySendPushButton: state.auth.shouldDisplaySendPushButton, selectedDeviceId: state.auth.selectedDeviceId, mfaDevices: state.auth.mfaDevices, stateToken: state.auth.stateToken, diff --git a/cerberus-dashboard/src/reducers/authenticationReducer.js b/cerberus-dashboard/src/reducers/authenticationReducer.js index 0fdff2015..23451787b 100644 --- a/cerberus-dashboard/src/reducers/authenticationReducer.js +++ b/cerberus-dashboard/src/reducers/authenticationReducer.js @@ -108,7 +108,9 @@ export default createReducer(initialState, { return Object.assign({}, state, { selectedDeviceId: payload.selectedDeviceId, shouldDisplaySendCodeButton: state.mfaDevices - .filter(device => device.id === payload.selectedDeviceId)[0].requires_trigger + .filter(device => device.id === payload.selectedDeviceId)[0].requires_trigger, + shouldDisplaySendPushButton: state.mfaDevices + .filter(device => device.id === payload.selectedDeviceId)[0].is_push }) } }) diff --git a/cerberus-dashboard/src/utils/cmsUtils.js b/cerberus-dashboard/src/utils/cmsUtils.js index e63fa6269..b1dde4d15 100644 --- a/cerberus-dashboard/src/utils/cmsUtils.js +++ b/cerberus-dashboard/src/utils/cmsUtils.js @@ -14,11 +14,14 @@ * limitations under the License. */ -export function parseCMSError(response) { +export function parseCMSError(response, is_push=false) { let msg = 'Connection timed out. Check console for full error response.' try { - if (response.data.errors[0].message) { + if(is_push && ! response.data.errors[0].message){ + msg = "Push notification was not approved prior to timing out, please try again" + } + else if (response.data.errors[0].message) { msg = response.data.errors[0].message } } catch(TypeError) { diff --git a/cerberus-domain/cerberus-domain.gradle b/cerberus-domain/cerberus-domain.gradle index 746bdb724..8d9459142 100644 --- a/cerberus-domain/cerberus-domain.gradle +++ b/cerberus-domain/cerberus-domain.gradle @@ -20,6 +20,7 @@ dependencies { api group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.10.1' api group: 'org.apache.commons', name: 'commons-lang3', version: '3.9' + api group: 'org.apache.commons', name: 'commons-text', version: '1.9' testImplementation group: 'org.glassfish', name: 'javax.el', version: '3.0.0' } diff --git a/cerberus-domain/src/main/java/com/nike/cerberus/domain/MfaCheckRequest.java b/cerberus-domain/src/main/java/com/nike/cerberus/domain/MfaCheckRequest.java index aa4d7490f..2af488b99 100644 --- a/cerberus-domain/src/main/java/com/nike/cerberus/domain/MfaCheckRequest.java +++ b/cerberus-domain/src/main/java/com/nike/cerberus/domain/MfaCheckRequest.java @@ -25,6 +25,8 @@ public class MfaCheckRequest { private String otpToken; + private boolean isPush; + public String getStateToken() { return stateToken; } @@ -51,4 +53,13 @@ public MfaCheckRequest setOtpToken(String otpToken) { this.otpToken = otpToken; return this; } + + public boolean isPush() { + return isPush; + } + + public MfaCheckRequest setIsPush(boolean isPush) { + this.isPush = isPush; + return this; + } } diff --git a/cerberus-web/src/main/java/com/nike/cerberus/controller/authentication/UserAuthenticationController.java b/cerberus-web/src/main/java/com/nike/cerberus/controller/authentication/UserAuthenticationController.java index f15603581..fb3f53f71 100644 --- a/cerberus-web/src/main/java/com/nike/cerberus/controller/authentication/UserAuthenticationController.java +++ b/cerberus-web/src/main/java/com/nike/cerberus/controller/authentication/UserAuthenticationController.java @@ -78,7 +78,9 @@ public AuthResponse authenticate( @RequestMapping(value = "/mfa_check", method = POST, consumes = APPLICATION_JSON_VALUE) public AuthResponse handleMfaCheck(@Valid @RequestBody MfaCheckRequest request) { - if (StringUtils.isBlank(request.getOtpToken())) { + if (request.isPush()) { + return authenticationService.triggerPush(request); + } else if (StringUtils.isBlank(request.getOtpToken())) { return authenticationService.triggerChallenge(request); } else { return authenticationService.mfaCheck(request); diff --git a/cerberus-web/src/main/java/com/nike/cerberus/error/DefaultApiErrorsImpl.java b/cerberus-web/src/main/java/com/nike/cerberus/error/DefaultApiErrorsImpl.java index 7e92931d5..39ef7f830 100644 --- a/cerberus-web/src/main/java/com/nike/cerberus/error/DefaultApiErrorsImpl.java +++ b/cerberus-web/src/main/java/com/nike/cerberus/error/DefaultApiErrorsImpl.java @@ -16,7 +16,9 @@ package com.nike.cerberus.error; +import static com.nike.backstopper.apierror.ApiErrorConstants.*; import static com.nike.backstopper.apierror.projectspecificinfo.ProjectSpecificErrorCodeRange.ALLOW_ALL_ERROR_CODES; +import static javax.servlet.http.HttpServletResponse.SC_NOT_IMPLEMENTED; import com.nike.backstopper.apierror.ApiError; import com.nike.backstopper.apierror.projectspecificinfo.ProjectSpecificErrorCodeRange; @@ -28,6 +30,21 @@ /** TODO remove dependency on SampleProjectApiErrors, have everything be in this project */ public class DefaultApiErrorsImpl extends SampleProjectApiErrorsBase { + static final List CERBERUS_STATUS_CODE_PRIORITY_ORDER = + Arrays.asList( + HTTP_STATUS_CODE_FORBIDDEN, + HTTP_STATUS_CODE_UNAUTHORIZED, + HTTP_STATUS_CODE_SERVICE_UNAVAILABLE, + HTTP_STATUS_CODE_TOO_MANY_REQUESTS, + HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR, + HTTP_STATUS_CODE_METHOD_NOT_ALLOWED, + HTTP_STATUS_CODE_NOT_ACCEPTABLE, + HTTP_STATUS_CODE_UNSUPPORTED_MEDIA_TYPE, + HTTP_STATUS_CODE_NOT_FOUND, + HTTP_STATUS_CODE_CONFLICT, + HTTP_STATUS_CODE_BAD_REQUEST, + SC_NOT_IMPLEMENTED); + @Override protected List getProjectSpecificApiErrors() { return new ArrayList<>(Arrays.asList(DefaultApiError.values())); @@ -42,4 +59,9 @@ protected ProjectSpecificErrorCodeRange getProjectSpecificErrorCodeRange() { public ApiError getForbiddenApiError() { return DefaultApiError.ACCESS_DENIED; } + + @Override + public List getStatusCodePriorityOrder() { + return CERBERUS_STATUS_CODE_PRIORITY_ORDER; + } } diff --git a/cerberus-web/src/main/java/com/nike/cerberus/service/AuthenticationService.java b/cerberus-web/src/main/java/com/nike/cerberus/service/AuthenticationService.java index 1026e1d3e..98ae8b496 100644 --- a/cerberus-web/src/main/java/com/nike/cerberus/service/AuthenticationService.java +++ b/cerberus-web/src/main/java/com/nike/cerberus/service/AuthenticationService.java @@ -186,6 +186,28 @@ public AuthResponse triggerChallenge(final MfaCheckRequest challengeRequest) { return authResponse; } + /** + * Enables a user to trigger a factor challenge. + * + * @param challengeRequest Request containing the MFA token details with no passcode + * @return The auth response + */ + public AuthResponse triggerPush(final MfaCheckRequest challengeRequest) { + final AuthResponse authResponse = + authServiceConnector.triggerPush( + challengeRequest.getStateToken(), challengeRequest.getDeviceId()); + if (authResponse.getStatus() == AuthStatus.SUCCESS) { + authResponse + .getData() + .setClientToken( + generateToken( + authResponse.getData().getUsername(), + authServiceConnector.getGroups(authResponse.getData()), + 0)); + } + return authResponse; + } + /** * Enables a user to execute an MFA check to complete authentication and get an auth token. * diff --git a/gradle.properties b/gradle.properties index fac2958b0..58b940ab1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,6 +14,6 @@ # limitations under the License. # -version=4.8.1 +version=4.9.0 group=com.nike.cerberus -springBootVersion=2.3.2.RELEASE +springBootVersion=2.3.4.RELEASE diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 10f538fba..77abff060 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -7,54 +7,67 @@ + + + + + + + + + + + + + @@ -68,19 +81,23 @@ + + + + @@ -102,9 +119,11 @@ + + @@ -126,19 +145,23 @@ + + + + @@ -154,6 +177,7 @@ + @@ -167,9 +191,11 @@ + + @@ -183,9 +209,11 @@ + + @@ -207,9 +235,11 @@ + + @@ -231,78 +261,97 @@ + + + + + + + + + + + + + + + + + + + @@ -316,17 +365,21 @@ + + + + @@ -342,16 +395,19 @@ + + + @@ -362,9 +418,22 @@ + + + + + + + + + + + + + @@ -372,9 +441,16 @@ + + + + + + + @@ -382,21 +458,25 @@ + + + + @@ -412,14 +492,17 @@ + + + @@ -433,12 +516,24 @@ + + + + + + + + + + + + @@ -449,9 +544,11 @@ + + @@ -465,12 +562,24 @@ + + + + + + + + + + + + @@ -481,12 +590,24 @@ + + + + + + + + + + + + @@ -497,12 +618,24 @@ + + + + + + + + + + + + @@ -510,9 +643,16 @@ + + + + + + + @@ -523,12 +663,24 @@ + + + + + + + + + + + + @@ -539,12 +691,24 @@ + + + + + + + + + + + + @@ -555,12 +719,24 @@ + + + + + + + + + + + + @@ -571,12 +747,24 @@ + + + + + + + + + + + + @@ -584,14 +772,23 @@ + + + + + + + + + @@ -608,12 +805,15 @@ + + + @@ -630,124 +830,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -761,9 +992,11 @@ + + @@ -774,55 +1007,67 @@ + + + + + + + + + + + + @@ -836,14 +1081,17 @@ + + + @@ -854,6 +1102,7 @@ + @@ -867,33 +1116,41 @@ + + + + + + + + @@ -904,21 +1161,25 @@ + + + + @@ -945,9 +1206,11 @@ + + @@ -961,22 +1224,27 @@ + + + + + @@ -987,19 +1255,23 @@ + + + + @@ -1013,9 +1285,11 @@ + + @@ -1026,6 +1300,7 @@ + @@ -1039,53 +1314,65 @@ + + + + + + + + + + + + @@ -1099,22 +1386,27 @@ + + + + + @@ -1128,9 +1420,11 @@ + + @@ -1141,243 +1435,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1390,9 +1766,11 @@ + + @@ -1401,6 +1779,12 @@ + + + + + + @@ -1409,6 +1793,16 @@ + + + + + + + + + + @@ -1417,6 +1811,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1430,6 +1880,16 @@ + + + + + + + + + + @@ -1438,6 +1898,16 @@ + + + + + + + + + + @@ -1446,6 +1916,16 @@ + + + + + + + + + + @@ -1456,21 +1936,31 @@ + + + + + + + + + + @@ -1484,17 +1974,21 @@ + + + + @@ -1505,89 +1999,109 @@ + + + + + + + + + + + + + + + + + + + + @@ -1598,6 +2112,7 @@ + @@ -1611,169 +2126,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1787,97 +2340,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -1886,46 +2463,62 @@ + + + + + + + + + + + + + + + + @@ -1933,20 +2526,34 @@ + + + + + + + + + + + + + + @@ -1957,14 +2564,22 @@ + + + + + + + + @@ -1972,89 +2587,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2062,9 +2734,16 @@ + + + + + + + @@ -2075,19 +2754,33 @@ + + + + + + + + + + + + + + @@ -2098,24 +2791,40 @@ + + + + + + + + + + + + + + + + @@ -2128,93 +2837,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2225,156 +2962,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2388,14 +3178,17 @@ + + + @@ -2409,110 +3202,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2526,12 +3346,24 @@ + + + + + + + + + + + + @@ -2542,12 +3374,24 @@ + + + + + + + + + + + + @@ -2555,50 +3399,67 @@ + + + + + + + + + + + + + + + + + @@ -2617,261 +3478,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2882,47 +3809,57 @@ + + + + + + + + + + @@ -2933,157 +3870,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3094,6 +4081,7 @@ + @@ -3107,14 +4095,17 @@ + + + @@ -3125,6 +4116,7 @@ + @@ -3138,9 +4130,11 @@ + + @@ -3154,9 +4148,11 @@ + + @@ -3170,9 +4166,11 @@ + + @@ -3183,6 +4181,7 @@ + @@ -3196,9 +4195,11 @@ + + @@ -3212,9 +4213,11 @@ + + @@ -3228,9 +4231,11 @@ + + @@ -3241,185 +4246,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3433,9 +4482,11 @@ + + @@ -3446,6 +4497,7 @@ + @@ -3456,75 +4508,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3538,9 +4628,11 @@ + + @@ -3554,229 +4646,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3790,9 +4938,11 @@ + + @@ -3803,6 +4953,7 @@ + @@ -3813,58 +4964,71 @@ + + + + + + + + + + + + + @@ -3878,6 +5042,7 @@ + @@ -3888,16 +5053,19 @@ + + + @@ -3908,338 +5076,421 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4250,6 +5501,7 @@ + @@ -4263,9 +5515,11 @@ + + @@ -4279,205 +5533,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4491,117 +5797,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4615,9 +5949,11 @@ + + @@ -4631,9 +5967,11 @@ + + @@ -4644,6 +5982,7 @@ + @@ -4657,41 +5996,51 @@ + + + + + + + + + + @@ -4705,33 +6054,41 @@ + + + + + + + + @@ -4745,17 +6102,21 @@ + + + + @@ -4766,11 +6127,13 @@ + + @@ -4781,39 +6144,47 @@ + + + + + + + + @@ -4827,29 +6198,35 @@ + + + + + + @@ -4860,6 +6237,7 @@ + @@ -4873,9 +6251,11 @@ + + @@ -4886,6 +6266,7 @@ + @@ -4899,22 +6280,27 @@ + + + + + @@ -4928,12 +6314,24 @@ + + + + + + + + + + + + @@ -4944,12 +6342,24 @@ + + + + + + + + + + + + @@ -4960,12 +6370,24 @@ + + + + + + + + + + + + @@ -4976,12 +6398,24 @@ + + + + + + + + + + + + @@ -4992,19 +6426,33 @@ + + + + + + + + + + + + + + @@ -5015,9 +6463,16 @@ + + + + + + + @@ -5028,12 +6483,24 @@ + + + + + + + + + + + + @@ -5044,12 +6511,24 @@ + + + + + + + + + + + + @@ -5060,12 +6539,24 @@ + + + + + + + + + + + + @@ -5076,12 +6567,24 @@ + + + + + + + + + + + + @@ -5092,12 +6595,24 @@ + + + + + + + + + + + + @@ -5108,12 +6623,24 @@ + + + + + + + + + + + + @@ -5121,9 +6648,16 @@ + + + + + + + @@ -5137,15 +6671,32 @@ + + + + + + + + + + + + + + + + + @@ -5159,15 +6710,32 @@ + + + + + + + + + + + + + + + + + @@ -5181,15 +6749,32 @@ + + + + + + + + + + + + + + + + + @@ -5203,15 +6788,32 @@ + + + + + + + + + + + + + + + + + @@ -5222,19 +6824,33 @@ + + + + + + + + + + + + + + @@ -5245,9 +6861,16 @@ + + + + + + + @@ -5258,12 +6881,24 @@ + + + + + + + + + + + + @@ -5274,12 +6909,24 @@ + + + + + + + + + + + + @@ -5301,15 +6948,32 @@ + + + + + + + + + + + + + + + + + @@ -5323,15 +6987,32 @@ + + + + + + + + + + + + + + + + + @@ -5345,15 +7026,32 @@ + + + + + + + + + + + + + + + + + @@ -5367,15 +7065,32 @@ + + + + + + + + + + + + + + + + + @@ -5389,15 +7104,32 @@ + + + + + + + + + + + + + + + + + @@ -5411,15 +7143,32 @@ + + + + + + + + + + + + + + + + + @@ -5433,15 +7182,32 @@ + + + + + + + + + + + + + + + + + @@ -5455,15 +7221,32 @@ + + + + + + + + + + + + + + + + + @@ -5477,15 +7260,32 @@ + + + + + + + + + + + + + + + + + @@ -5499,15 +7299,32 @@ + + + + + + + + + + + + + + + + + @@ -5521,137 +7338,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5662,16 +7521,25 @@ + + + + + + + + + @@ -5682,16 +7550,25 @@ + + + + + + + + + @@ -5705,14 +7582,17 @@ + + + @@ -5723,9 +7603,16 @@ + + + + + + + @@ -5736,12 +7623,24 @@ + + + + + + + + + + + + @@ -5752,12 +7651,24 @@ + + + + + + + + + + + + @@ -5768,29 +7679,51 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -5801,9 +7734,11 @@ + + @@ -5817,38 +7752,47 @@ + + + + + + + + + @@ -5878,9 +7822,11 @@ + + @@ -5894,25 +7840,31 @@ + + + + + +