diff --git a/dbrepo-authentication-service/dbrepo-realm.json b/dbrepo-authentication-service/dbrepo-realm.json index d3cadb4e7168edaff547f13e7437be41155a7a2d..c861fbd662986b4363f6a08dbe48bdc5333592d0 100644 --- a/dbrepo-authentication-service/dbrepo-realm.json +++ b/dbrepo-authentication-service/dbrepo-realm.json @@ -5,10 +5,10 @@ "defaultSignatureAlgorithm" : "RS256", "revokeRefreshToken" : false, "refreshTokenMaxReuse" : 1, - "accessTokenLifespan" : 86400, + "accessTokenLifespan" : 900, "accessTokenLifespanForImplicitFlow" : 900, - "ssoSessionIdleTimeout" : 1800, - "ssoSessionMaxLifespan" : 36000, + "ssoSessionIdleTimeout" : 864000, + "ssoSessionMaxLifespan" : 2592000, "ssoSessionIdleTimeoutRememberMe" : 0, "ssoSessionMaxLifespanRememberMe" : 0, "offlineSessionIdleTimeout" : 2592000, @@ -1059,7 +1059,7 @@ "otpPolicyLookAheadWindow" : 1, "otpPolicyPeriod" : 30, "otpPolicyCodeReusable" : false, - "otpSupportedApplications" : [ "totpAppFreeOTPName", "totpAppMicrosoftAuthenticatorName", "totpAppGoogleName" ], + "otpSupportedApplications" : [ "totpAppMicrosoftAuthenticatorName", "totpAppGoogleName", "totpAppFreeOTPName" ], "webAuthnPolicyRpEntityName" : "keycloak", "webAuthnPolicySignatureAlgorithms" : [ "ES256" ], "webAuthnPolicyRpId" : "", @@ -2009,6 +2009,23 @@ "config" : { "allow-default-scopes" : [ "true" ] } + }, { + "id" : "1849e52a-b8c9-44a8-af3d-ee19376a1ed1", + "name" : "Trusted Hosts", + "providerId" : "trusted-hosts", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "host-sending-registration-request-must-match" : [ "true" ], + "client-uris-must-match" : [ "true" ] + } + }, { + "id" : "f565cb47-3bcf-4078-8f94-eb4179c375b8", + "name" : "Full Scope Disabled", + "providerId" : "scope", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { } }, { "id" : "0efa669d-1017-4b4a-82e1-c2eaf72de2c9", "name" : "Allowed Client Scopes", @@ -2026,60 +2043,25 @@ "subComponents" : { }, "config" : { } }, { - "id" : "3ab11d74-5e76-408a-b85a-26bf8950f979", + "id" : "104ec5a9-025b-4c44-8ac0-82d22887ca3e", "name" : "Allowed Protocol Mapper Types", "providerId" : "allowed-protocol-mappers", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { - "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-usermodel-property-mapper", "saml-role-list-mapper", "oidc-address-mapper", "oidc-usermodel-attribute-mapper" ] - } - }, { - "id" : "1849e52a-b8c9-44a8-af3d-ee19376a1ed1", - "name" : "Trusted Hosts", - "providerId" : "trusted-hosts", - "subType" : "anonymous", + "subType" : "authenticated", "subComponents" : { }, "config" : { - "host-sending-registration-request-must-match" : [ "true" ], - "client-uris-must-match" : [ "true" ] + "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "oidc-address-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-user-attribute-mapper", "saml-user-property-mapper", "oidc-full-name-mapper", "oidc-usermodel-attribute-mapper", "oidc-usermodel-property-mapper" ] } }, { - "id" : "f565cb47-3bcf-4078-8f94-eb4179c375b8", - "name" : "Full Scope Disabled", - "providerId" : "scope", - "subType" : "anonymous", - "subComponents" : { }, - "config" : { } - }, { - "id" : "104ec5a9-025b-4c44-8ac0-82d22887ca3e", + "id" : "3ab11d74-5e76-408a-b85a-26bf8950f979", "name" : "Allowed Protocol Mapper Types", "providerId" : "allowed-protocol-mappers", - "subType" : "authenticated", + "subType" : "anonymous", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "oidc-usermodel-attribute-mapper", "oidc-usermodel-property-mapper", "oidc-address-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-role-list-mapper" ] + "allowed-protocol-mapper-types" : [ "oidc-usermodel-property-mapper", "saml-user-property-mapper", "oidc-full-name-mapper", "oidc-address-mapper", "saml-user-attribute-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper" ] } } ], - "org.keycloak.userprofile.UserProfileProvider" : [ { - "id" : "7970b87f-f28b-4085-8612-43281968f118", - "providerId" : "declarative-user-profile", - "subComponents" : { }, - "config" : { } - } ], "org.keycloak.keys.KeyProvider" : [ { - "id" : "2f53ccf3-37b0-4d34-83e7-ed497499ee51", - "name" : "rsa-enc-generated", - "providerId" : "rsa-enc-generated", - "subComponents" : { }, - "config" : { - "privateKey" : [ "MIIEowIBAAKCAQEA3b1tNLfcjFLUw9UShVDNf+ZD8sQqb4YBaIXcSJTX/zDQUPiCp176BBGI3s4VplDArnOW+LumozmKogeoHEnGEIDW8ovgK5uMU9tSA2p0qqGBUMOdR8YATTIfCJe7qGiiuGa3WZy3sQLM70SuRzx02YU8gvUcvl2Js4KyqAziOUX/w3Wa59H9jjGNUXYyqaPWJp73eHzbVYWySzyLG22mVlcUtBx5siL5T2/Xu0p9z4l7/bapwwmOVi1ZrcHjbEAwdGEiSMGI/uWqAF+r1BRpmJLR7HNXcL3eK4/56VYLaiwSejfyYeRFMITEn/UxGYhcXZ5xMUUCG0TxjBhLYpTBuwIDAQABAoIBAA4dwebcxkrH99Poa8+WkiE7JgaS9sahx9OBI2xwJANoIU2TpzGuNLQZ76uLgB+rPWZTD9Xm5a1iJjwOyQ9/937TzPCk91D0tpgcusRikb8jx/6TGB9acL4kBjYUVCCHr3BA2G75MKKGtJ2OMvAbCQSosZj+r2VDwYFEPUkV2jheE5JHSBkwyIRrus3JCwu8gu5fyCg9z8ljcxJxI5HIsi4v8Z21aCw/cLj7h5cMt44wCjQz4rOfYNBEFeHDtlfR1QtWKgjm4ZHHJbKrzf9b2kQXclziceEbSM0tYbROEXKi+s0Zc+z3HEG89vv0vfN400clmzzIAijKY6gg3pPRWdECgYEA+lnWYbSlXDMNYx6RBXm1RnlMUYIm4oy4/9ljgnoGJ6WCn3SjFkgaDtiKfGIG1BSB85r04pAPANgcWHf5tWDnq0ARvBVG0BX2bKd++7B3D4d3CRYKCwm88SslJXv9dfHVhq4+zViFPiUWwT20A72jCuUCvL88y5fh/YBecfdh+jECgYEA4r5RD0NB9dMaeg5/jk/GEHIo4Z9KLc6FrSoOFo2xFkPOy1sgDpDOiNtypuWvniO7k7Ose3DS3hlfTMsKzIW/CgQJ20+Y4cvBWDaOsRxfjj7w3d+jH5OSJdKKSzTrgLKc9ZhlRzVXy0J0hipIA6HG5kdVdLXmh85ITmf1CbJhE6sCgYBjPVeBNbXTHZ2x6/z62aslO5IoQVqetb/kE82hfDOSZcao5Ph9Lam+ttH2ynkAevykj4mBgi+gWwqpey2uW7KaLPSaxShj9kDQA3mP1fzsV/u0y1rB02Nlin/YIxVvOqU1FT9p8SwoXVVu1sHUNck62VtDbN9xqUx5S/ikXrclEQKBgQCoTssOwEcK+Vty9KYcdfy4onTUHZBLdjxl8Iyqkxy7QTQUYRznkvesQPDXEDGO+kk3dyx2KKZt9Hl4IFNww2quPZcvcuMx4DQxjbXXpA8OIIxcta95NepLJwA+mRai3nKCH1A2TlNP7pFeMa5o+8IPly3Ix2lKr4Wepa4PN5i1pwKBgCZ1QP6XAOERl9NznNmU0rXVcvYNP4PIIfQWfvGsldZ4QKkmjjAGiS0/oYqdWs+UDRZyCRChaVjDXO9fk0PEG5OGKAj9nyiYCT/M8xtJ3UeP5ffZZvJ/vnye3QdDIo1e38ZzsWwJHmLYw7fRqY9W5Vxo0Vsy22U3CJY70KTxVdTy" ], - "keyUse" : [ "ENC" ], - "certificate" : [ "MIICmzCCAYMCBgGG3GWycDANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZkYnJlcG8wHhcNMjMwMzEzMTkxMzE3WhcNMzMwMzEzMTkxNDU3WjARMQ8wDQYDVQQDDAZkYnJlcG8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdvW00t9yMUtTD1RKFUM1/5kPyxCpvhgFohdxIlNf/MNBQ+IKnXvoEEYjezhWmUMCuc5b4u6ajOYqiB6gcScYQgNbyi+Arm4xT21IDanSqoYFQw51HxgBNMh8Il7uoaKK4ZrdZnLexAszvRK5HPHTZhTyC9Ry+XYmzgrKoDOI5Rf/DdZrn0f2OMY1RdjKpo9Ymnvd4fNtVhbJLPIsbbaZWVxS0HHmyIvlPb9e7Sn3PiXv9tqnDCY5WLVmtweNsQDB0YSJIwYj+5aoAX6vUFGmYktHsc1dwvd4rj/npVgtqLBJ6N/Jh5EUwhMSf9TEZiFxdnnExRQIbRPGMGEtilMG7AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAK3kQ1VkQrzvSWvmXmazmNoA1ZiPzRDs1XhGUWxgsxzgPylr3dGBuqQbKvgnLUBQLSqlJHpI4fZflHswu1qrvVZYtekPcGef4WhcKAu2i1RwxrKa6RJQ1tRbrLuVYCzPv5p/DWgltWVn88aoLnqQn0SK/0PB/o4a4Cm7Kq2ZzCr1dACBr06LvOHsc7249OySmbG4HH+pLK6jVURhZ9VaObqAHe2FJBVVoIzURbdiRRURqumrIvbnpeaU1aFyg6ED5wTnXvmMPmVPt9F79mcB33bASO5wyu00X8t1hyN2Show2l2vxLACGUzVkTQt15s7uDLKE7qLmKSR3EuSGXWv3wA=" ], - "priority" : [ "100" ], - "algorithm" : [ "RSA-OAEP" ] - } - }, { "id" : "28ca0b6d-b2e2-4785-b04b-2391e6344e30", "name" : "aes-generated", "providerId" : "aes-generated", @@ -2100,6 +2082,18 @@ "priority" : [ "100" ], "algorithm" : [ "HS256" ] } + }, { + "id" : "2f53ccf3-37b0-4d34-83e7-ed497499ee51", + "name" : "rsa-enc-generated", + "providerId" : "rsa-enc-generated", + "subComponents" : { }, + "config" : { + "privateKey" : [ "MIIEowIBAAKCAQEA3b1tNLfcjFLUw9UShVDNf+ZD8sQqb4YBaIXcSJTX/zDQUPiCp176BBGI3s4VplDArnOW+LumozmKogeoHEnGEIDW8ovgK5uMU9tSA2p0qqGBUMOdR8YATTIfCJe7qGiiuGa3WZy3sQLM70SuRzx02YU8gvUcvl2Js4KyqAziOUX/w3Wa59H9jjGNUXYyqaPWJp73eHzbVYWySzyLG22mVlcUtBx5siL5T2/Xu0p9z4l7/bapwwmOVi1ZrcHjbEAwdGEiSMGI/uWqAF+r1BRpmJLR7HNXcL3eK4/56VYLaiwSejfyYeRFMITEn/UxGYhcXZ5xMUUCG0TxjBhLYpTBuwIDAQABAoIBAA4dwebcxkrH99Poa8+WkiE7JgaS9sahx9OBI2xwJANoIU2TpzGuNLQZ76uLgB+rPWZTD9Xm5a1iJjwOyQ9/937TzPCk91D0tpgcusRikb8jx/6TGB9acL4kBjYUVCCHr3BA2G75MKKGtJ2OMvAbCQSosZj+r2VDwYFEPUkV2jheE5JHSBkwyIRrus3JCwu8gu5fyCg9z8ljcxJxI5HIsi4v8Z21aCw/cLj7h5cMt44wCjQz4rOfYNBEFeHDtlfR1QtWKgjm4ZHHJbKrzf9b2kQXclziceEbSM0tYbROEXKi+s0Zc+z3HEG89vv0vfN400clmzzIAijKY6gg3pPRWdECgYEA+lnWYbSlXDMNYx6RBXm1RnlMUYIm4oy4/9ljgnoGJ6WCn3SjFkgaDtiKfGIG1BSB85r04pAPANgcWHf5tWDnq0ARvBVG0BX2bKd++7B3D4d3CRYKCwm88SslJXv9dfHVhq4+zViFPiUWwT20A72jCuUCvL88y5fh/YBecfdh+jECgYEA4r5RD0NB9dMaeg5/jk/GEHIo4Z9KLc6FrSoOFo2xFkPOy1sgDpDOiNtypuWvniO7k7Ose3DS3hlfTMsKzIW/CgQJ20+Y4cvBWDaOsRxfjj7w3d+jH5OSJdKKSzTrgLKc9ZhlRzVXy0J0hipIA6HG5kdVdLXmh85ITmf1CbJhE6sCgYBjPVeBNbXTHZ2x6/z62aslO5IoQVqetb/kE82hfDOSZcao5Ph9Lam+ttH2ynkAevykj4mBgi+gWwqpey2uW7KaLPSaxShj9kDQA3mP1fzsV/u0y1rB02Nlin/YIxVvOqU1FT9p8SwoXVVu1sHUNck62VtDbN9xqUx5S/ikXrclEQKBgQCoTssOwEcK+Vty9KYcdfy4onTUHZBLdjxl8Iyqkxy7QTQUYRznkvesQPDXEDGO+kk3dyx2KKZt9Hl4IFNww2quPZcvcuMx4DQxjbXXpA8OIIxcta95NepLJwA+mRai3nKCH1A2TlNP7pFeMa5o+8IPly3Ix2lKr4Wepa4PN5i1pwKBgCZ1QP6XAOERl9NznNmU0rXVcvYNP4PIIfQWfvGsldZ4QKkmjjAGiS0/oYqdWs+UDRZyCRChaVjDXO9fk0PEG5OGKAj9nyiYCT/M8xtJ3UeP5ffZZvJ/vnye3QdDIo1e38ZzsWwJHmLYw7fRqY9W5Vxo0Vsy22U3CJY70KTxVdTy" ], + "keyUse" : [ "ENC" ], + "certificate" : [ "MIICmzCCAYMCBgGG3GWycDANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZkYnJlcG8wHhcNMjMwMzEzMTkxMzE3WhcNMzMwMzEzMTkxNDU3WjARMQ8wDQYDVQQDDAZkYnJlcG8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdvW00t9yMUtTD1RKFUM1/5kPyxCpvhgFohdxIlNf/MNBQ+IKnXvoEEYjezhWmUMCuc5b4u6ajOYqiB6gcScYQgNbyi+Arm4xT21IDanSqoYFQw51HxgBNMh8Il7uoaKK4ZrdZnLexAszvRK5HPHTZhTyC9Ry+XYmzgrKoDOI5Rf/DdZrn0f2OMY1RdjKpo9Ymnvd4fNtVhbJLPIsbbaZWVxS0HHmyIvlPb9e7Sn3PiXv9tqnDCY5WLVmtweNsQDB0YSJIwYj+5aoAX6vUFGmYktHsc1dwvd4rj/npVgtqLBJ6N/Jh5EUwhMSf9TEZiFxdnnExRQIbRPGMGEtilMG7AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAK3kQ1VkQrzvSWvmXmazmNoA1ZiPzRDs1XhGUWxgsxzgPylr3dGBuqQbKvgnLUBQLSqlJHpI4fZflHswu1qrvVZYtekPcGef4WhcKAu2i1RwxrKa6RJQ1tRbrLuVYCzPv5p/DWgltWVn88aoLnqQn0SK/0PB/o4a4Cm7Kq2ZzCr1dACBr06LvOHsc7249OySmbG4HH+pLK6jVURhZ9VaObqAHe2FJBVVoIzURbdiRRURqumrIvbnpeaU1aFyg6ED5wTnXvmMPmVPt9F79mcB33bASO5wyu00X8t1hyN2Show2l2vxLACGUzVkTQt15s7uDLKE7qLmKSR3EuSGXWv3wA=" ], + "priority" : [ "100" ], + "algorithm" : [ "RSA-OAEP" ] + } }, { "id" : "2293ff99-3c6d-46d1-8635-5e679d5b134a", "name" : "rsa-generated", @@ -2116,7 +2110,7 @@ "internationalizationEnabled" : false, "supportedLocales" : [ ], "authenticationFlows" : [ { - "id" : "7b272faa-5cbf-4783-8bca-cabe292e80cc", + "id" : "b8378805-a082-46a0-9e28-a1e5d4db7e41", "alias" : "Account verification options", "description" : "Method with which to verity the existing account", "providerId" : "basic-flow", @@ -2138,7 +2132,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "9d570708-d15a-4063-a3b1-d742c9c85529", + "id" : "2652bbd9-bd49-465c-8595-690099333bf7", "alias" : "Authentication Options", "description" : "Authentication options.", "providerId" : "basic-flow", @@ -2167,7 +2161,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "2579048c-e648-4e95-9bd9-fb1fe776a64b", + "id" : "967c3248-c2e9-45a9-b770-b02e965b958a", "alias" : "Browser - Conditional OTP", "description" : "Flow to determine if the OTP is required for the authentication", "providerId" : "basic-flow", @@ -2189,7 +2183,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "76197fdc-44e0-470c-b84f-7e666edda852", + "id" : "f78ad348-c3e1-476e-a916-fce0c383376a", "alias" : "Direct Grant - Conditional OTP", "description" : "Flow to determine if the OTP is required for the authentication", "providerId" : "basic-flow", @@ -2211,7 +2205,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "1c163e76-4872-4996-b7a2-937fd9827f4a", + "id" : "788cf02b-5744-4ea6-940a-96bc762da4bd", "alias" : "First broker login - Conditional OTP", "description" : "Flow to determine if the OTP is required for the authentication", "providerId" : "basic-flow", @@ -2233,7 +2227,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "fac05c8f-328f-4bb6-ac68-e5cf0dbaf768", + "id" : "273e61b7-9cc3-464e-a7b8-27c71aca4014", "alias" : "Handle Existing Account", "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider", "providerId" : "basic-flow", @@ -2255,7 +2249,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "e9478687-f9bd-4854-83a2-768903dd06a7", + "id" : "00f41bfc-8513-466d-8c6a-366b7f2f36ca", "alias" : "Reset - Conditional OTP", "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", "providerId" : "basic-flow", @@ -2277,7 +2271,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "a6a6064c-91e3-455d-a8f7-8530f0d9f932", + "id" : "980ebf01-fe0a-4cfa-880e-dd86ce8e190e", "alias" : "User creation or linking", "description" : "Flow for the existing/non-existing user alternatives", "providerId" : "basic-flow", @@ -2300,7 +2294,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "bf274d56-ea30-450d-9ba7-1d4206f8b9ae", + "id" : "5e6a7a10-4be8-4038-8fc5-0588b452328d", "alias" : "Verify Existing Account by Re-authentication", "description" : "Reauthentication of existing account", "providerId" : "basic-flow", @@ -2322,7 +2316,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "38133f86-344b-497e-9402-87c454d7128c", + "id" : "024e07f8-f975-41ef-b755-d2b089b5567c", "alias" : "browser", "description" : "browser based authentication", "providerId" : "basic-flow", @@ -2358,7 +2352,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "f644f101-4f4a-458a-990d-6ced0d1353fe", + "id" : "324da9be-755e-4556-a1d3-58569b9df47c", "alias" : "clients", "description" : "Base authentication for clients", "providerId" : "client-flow", @@ -2394,7 +2388,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "a12de1f9-53eb-4563-8aa8-051e583bb144", + "id" : "bced47d4-5d04-4bb9-8605-94041185c0f3", "alias" : "direct grant", "description" : "OpenID Connect Resource Owner Grant", "providerId" : "basic-flow", @@ -2423,7 +2417,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "edc782a3-5dee-41a2-ab0d-715fc55b01c9", + "id" : "6b301d9d-68c0-44c3-9a57-92669d08b2f3", "alias" : "docker auth", "description" : "Used by Docker clients to authenticate against the IDP", "providerId" : "basic-flow", @@ -2438,7 +2432,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "358c0c7d-832d-477c-b9d0-258a786325d5", + "id" : "9c9ddfeb-37a2-4186-a58f-cf90dca8e191", "alias" : "first broker login", "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", "providerId" : "basic-flow", @@ -2461,7 +2455,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "891b4eb9-3a7f-4556-8cb8-f6a07c637dae", + "id" : "a9ef5094-93bf-49fc-9d0f-dcfc551cac5a", "alias" : "forms", "description" : "Username, password, otp and other auth forms.", "providerId" : "basic-flow", @@ -2483,7 +2477,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "b74eeba1-2096-41d4-bafb-940ad65ecd42", + "id" : "fae6e2e4-a071-458b-ac03-41dda3456f5a", "alias" : "http challenge", "description" : "An authentication flow based on challenge-response HTTP Authentication Schemes", "providerId" : "basic-flow", @@ -2505,7 +2499,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "37ca760b-2b9f-491f-aa1c-a9896923ab61", + "id" : "ae5bcac5-8867-42e1-887f-fc67418b0c4b", "alias" : "registration", "description" : "registration flow", "providerId" : "basic-flow", @@ -2521,7 +2515,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "1cf97e2c-9063-4b0e-8b99-56c463a6effc", + "id" : "72524b5d-1cfc-41b0-b29b-6f6890d2dc7f", "alias" : "registration form", "description" : "registration form", "providerId" : "form-flow", @@ -2557,7 +2551,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "01499d7a-b0a1-4dd0-a866-62e6a28d5119", + "id" : "834c96b8-790d-4869-8c66-d42cd35e4873", "alias" : "reset credentials", "description" : "Reset credentials for a user if they forgot their password or something", "providerId" : "basic-flow", @@ -2593,7 +2587,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "579397ef-7c1f-4a24-93c4-7e9ea2514783", + "id" : "7f131501-e3ff-48f2-98e6-e34e4c5d6f9e", "alias" : "saml ecp", "description" : "SAML ECP Profile Authentication Flow", "providerId" : "basic-flow", @@ -2609,13 +2603,13 @@ } ] } ], "authenticatorConfig" : [ { - "id" : "8f778718-7e1d-417a-b6e6-fc4788b45c44", + "id" : "638341f1-94ba-4042-a3ee-41a0f41718f6", "alias" : "create unique user config", "config" : { "require.password.update.after.registration" : "false" } }, { - "id" : "fdf2fe79-06e9-4bea-b361-dab88bd38680", + "id" : "3c355b8c-8a51-4346-88f2-1ff81856b55c", "alias" : "review profile config", "config" : { "update.profile.on.first.login" : "missing" diff --git a/dbrepo-ui/api/authentication.service.js b/dbrepo-ui/api/authentication.service.js index 776aca523bf5768604687c5f705609b2094e0f56..035a8106202043cdb98f4ac36dc3c063f1d3aefb 100644 --- a/dbrepo-ui/api/authentication.service.js +++ b/dbrepo-ui/api/authentication.service.js @@ -3,7 +3,6 @@ import store from '@/store' import qs from 'qs' import UserMapper from '@/api/user.mapper' import axios from 'axios' -import AuthenticationMapper from '@/api/authentication.mapper' /** * Service class for interaction with Authentication Service in the back end. @@ -100,22 +99,6 @@ class AuthenticationService { }) }) } - - refreshToken () { - const refreshToken = store().state.refreshToken - if (AuthenticationMapper.isExpiredToken(refreshToken)) { - /* refresh token expired */ - console.error('Refresh token expired:', AuthenticationMapper.tokenToExpiryDate(refreshToken)) - return false - } - this.authenticateToken(refreshToken) - .then((response) => { - store().commit('SET_TOKEN', response.access_token) - store().commit('SET_REFRESH_TOKEN', response.refresh_token) - console.debug('new access token expires:', AuthenticationMapper.tokenToExpiryDate(refreshToken)) - return false - }) - } } export default new AuthenticationService() diff --git a/dbrepo-ui/components/UserToolbar.vue b/dbrepo-ui/components/UserToolbar.vue index 878a48085952cbb9774cba87e61aad394b419bfe..47e925add6e215794ef92f77231345910d4dc74c 100644 --- a/dbrepo-ui/components/UserToolbar.vue +++ b/dbrepo-ui/components/UserToolbar.vue @@ -12,7 +12,7 @@ <v-tab to="/user/authentication"> Authentication </v-tab> - <v-tab v-if="canHandleMessages" to="/user/developer"> + <v-tab to="/user/developer"> Developer </v-tab> </v-tabs> @@ -33,21 +33,6 @@ export default { }, roles () { return this.$store.state.roles - }, - canCreateMessage () { - if (!this.roles) { - return false - } - return this.roles.includes('create-maintenance-message') - }, - canModifyMessage () { - if (!this.roles) { - return false - } - return this.roles.includes('modify-maintenance-message') - }, - canHandleMessages () { - return this.canCreateMessage || this.canModifyMessage } } } diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue index d52ff87dd60acced367f8749b2c8c7be076979e0..533bb01c5eb64bb213354e13fdde6d5a9ed0ab7e 100644 --- a/dbrepo-ui/layouts/default.vue +++ b/dbrepo-ui/layouts/default.vue @@ -132,8 +132,6 @@ <script> import DatabaseService from '@/api/database.service' import TableService from '@/api/table.service' -import AuthenticationService from '@/api/authentication.service' -import AuthenticationMapper from '@/api/authentication.mapper' import DatabaseMapper from '@/api/database.mapper' import IdentifierMapper from '@/api/identifier.mapper' @@ -227,7 +225,6 @@ export default { }, mounted () { this.initEnvironment() - this.attemptRefreshToken() this.$store.dispatch('reloadMessages') this.$store.dispatch('reloadOntologies') if (this.$route.query && this.$route.query.q) { @@ -313,17 +310,6 @@ export default { if (this.locale) { this.$i18n.locale = this.locale } - }, - attemptRefreshToken () { - if (!this.$store.state.token || !this.$store.state.refreshToken) { - return - } - if (AuthenticationMapper.isExpiredToken(this.$store.state.refreshToken)) { - console.error('Refresh token is expired: trigger logout of user') - this.$store.dispatch('logout') - } else { - AuthenticationService.refreshToken() - } } }, head () { diff --git a/dbrepo-ui/package.json b/dbrepo-ui/package.json index 04b7cc1b28731a8667a8daaa31a277f62f48e1d3..3c3f9616b97fea7de5fb27729480f8e6f3397dbc 100644 --- a/dbrepo-ui/package.json +++ b/dbrepo-ui/package.json @@ -41,7 +41,7 @@ "jwt-decode": "^3.1.2", "knex": "^0.95.6", "lodash": "^4.17.21", - "moment": "^2.29.1", + "moment": "^2.30.1", "multer": "^1.4.2", "node-fetch": "^2.6.1", "nuxt": "^2.15.8", diff --git a/dbrepo-ui/pages/user/developer.vue b/dbrepo-ui/pages/user/developer.vue index 7825e5624307bd69ddea0c086d411adf3afd5e22..2d14d40011a3f68fa1d98e2790c9e6854fe82469 100644 --- a/dbrepo-ui/pages/user/developer.vue +++ b/dbrepo-ui/pages/user/developer.vue @@ -1,9 +1,9 @@ <template> - <div v-if="canHandleMessages"> + <div> <UserToolbar /> <v-tabs-items v-model="tab"> <v-tab-item> - <v-card flat tile> + <v-card v-if="canHandleMessages" flat tile> <v-card-title>Maintenance Messages</v-card-title> <v-data-table :headers="headers" @@ -28,6 +28,40 @@ </v-btn> </v-card-text> </v-card> + <v-divider v-if="canHandleMessages" /> + <v-card flat tile> + <v-card-title>Token Information</v-card-title> + <v-card-text> + <v-row dense> + <v-col xl="4"> + <v-text-field + v-model="token" + disabled + label="Access Token" /> + </v-col> + <v-col xl="2"> + <v-text-field + v-model="tokenExpiry" + disabled + :label="tokenExpiryLabel" /> + </v-col> + </v-row> + <v-row dense> + <v-col xl="4"> + <v-text-field + v-model="refreshToken" + disabled + label="Refresh Token" /> + </v-col> + <v-col xl="2"> + <v-text-field + v-model="refreshTokenExpiry" + disabled + :label="refreshTokenExpiryLabel" /> + </v-col> + </v-row> + </v-card-text> + </v-card> </v-tab-item> </v-tabs-items> <v-dialog @@ -43,7 +77,8 @@ import UserToolbar from '@/components/UserToolbar' import MetadataService from '@/api/metadata.service' import EditMaintenanceMessage from '@/components/dialogs/EditMaintenanceMessage' -import { isActiveMessage } from '@/utils' +import { formatTimestampUTCLabel, isActiveMessage, timestampsToHumanDifference } from '@/utils' +import AuthenticationMapper from '@/api/authentication.mapper' export default { components: { @@ -69,6 +104,33 @@ export default { token () { return this.$store.state.token }, + tokenExpiry () { + if (!this.token) { + return null + } + return formatTimestampUTCLabel(AuthenticationMapper.tokenToExpiryDate(this.token)) + }, + tokenExpiryLabel () { + if (!this.token) { + return 'Expiry Date' + } + return `Expiry Date (${timestampsToHumanDifference(Date.now(), AuthenticationMapper.tokenToExpiryDate(this.token))})` + }, + refreshToken () { + return this.$store.state.refreshToken + }, + refreshTokenExpiry () { + if (!this.refreshToken) { + return null + } + return formatTimestampUTCLabel(AuthenticationMapper.tokenToExpiryDate(this.refreshToken)) + }, + refreshTokenExpiryLabel () { + if (!this.refreshToken) { + return 'Expiry Date' + } + return `Expiry Date (${timestampsToHumanDifference(Date.now(), AuthenticationMapper.tokenToExpiryDate(this.refreshToken))})` + }, user () { return this.$store.state.user }, diff --git a/dbrepo-ui/plugins/axios.js b/dbrepo-ui/plugins/axios.js index aca6db132348c8d56175ac9dab9623ec4c8186fa..b2d7170ddf72f7e07c8e1ba3cefe21d013be2e42 100644 --- a/dbrepo-ui/plugins/axios.js +++ b/dbrepo-ui/plugins/axios.js @@ -2,15 +2,51 @@ import Vue from 'vue' import store from '@/store' import api from '@/api' import VueAxios from 'vue-axios' +import AuthenticationMapper from '@/api/authentication.mapper' +import AuthenticationService from '@/api/authentication.service' -api.interceptors.request.use((config) => { - const token = store().state.token - if (!token) { - return config - } - console.debug('interceptor inject authorization header for url', config.url) - config.headers.Authorization = `Bearer ${store().state.token}` - return config -}) +/** + * Attempts to refresh the access token with the refresh token (if not expired). + * Success: stores the new access-refresh token pair in the store. + * Error: deletes the access-refresh token pair in the store. + * https://stackoverflow.com/questions/44985708/axios-request-interceptor-wait-until-ajax-call-finishes + */ +api.interceptors.request.use(config => + new Promise((resolve, reject) => { + const token = store().state.token + const refreshToken = store().state.refreshToken + if (!store().state.token || !refreshToken) { + resolve(config) + } else if (AuthenticationMapper.isExpiredToken(token)) { + if (AuthenticationMapper.isExpiredToken(refreshToken)) { + console.warn('Refresh token is expired: trigger logout of user') + store().dispatch('logout') + .then(() => { + resolve(config) + }) + .catch((error) => { + console.error('Failed to logout', error) + reject(error) + }) + resolve(config) + } + AuthenticationService.authenticateToken(refreshToken) + .then((response) => { + store().commit('SET_TOKEN', response.access_token) + store().commit('SET_REFRESH_TOKEN', response.refresh_token) + console.debug('new access token expires:', AuthenticationMapper.tokenToExpiryDate(response.access_token)) + config.headers.Authorization = `Bearer ${response.access_token}` + resolve(config) + }) + .catch((error) => { + console.error('Failed to refresh token', error) + resolve(config) + }) + } else { + config.headers.Authorization = `Bearer ${store().state.token}` + resolve(config) + } + }) +) Vue.use(VueAxios, api) diff --git a/dbrepo-ui/utils/index.js b/dbrepo-ui/utils/index.js index fbfb4a19c534c45976dae3e22a4ed65acd118e94..3e08f463448d549aa1ab6d455fa3c3b8046557e8 100644 --- a/dbrepo-ui/utils/index.js +++ b/dbrepo-ui/utils/index.js @@ -1,4 +1,5 @@ const { format } = require('date-fns') +const moment = require('moment') function notEmpty (str) { return typeof str === 'string' && str.trim().length > 0 @@ -1013,22 +1014,6 @@ function formatLanguage (code) { return filter[0].name } -function isOrcid (orcid) { - if (!orcid || orcid.startsWith('http')) { - return false - } - const input = orcid.replace('-', '') - let total = 0 - for (let i = 0; i < input.length; i++) { - const digit = Number(input.charAt(i)) - total = (total + digit) * 2 - } - const remainder = total % 11 - const result = (12 - remainder) % 11 - const checksum = result === 10 ? 'X' : String(result) - return orcid.charAt(orcid.length - 1) === checksum -} - function isActiveMessage (message) { if (!message) { return false @@ -1055,6 +1040,12 @@ function timestampToTimeZonedTimestamp (str) { return format(new Date(str), 'yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\'') } +function timestampsToHumanDifference (date1, date2) { + const date = moment(date1) + const other = moment(date2) + return moment.duration(other.diff(date)).humanize(true) +} + module.exports = { notEmpty, formatTimestamp, @@ -1065,10 +1056,10 @@ module.exports = { formatYearUTC, formatMonthUTC, formatDayUTC, - isOrcid, isActiveMessage, timestampToTimeZonedTimestamp, formatBinaryStream, languages, - formatLanguage + formatLanguage, + timestampsToHumanDifference } diff --git a/dbrepo-ui/yarn.lock b/dbrepo-ui/yarn.lock index d5a3920df7018fd57ec7b47837ff13f92cd42e7f..d54c5fb9575306e84aec500078bfb34481801022 100644 --- a/dbrepo-ui/yarn.lock +++ b/dbrepo-ui/yarn.lock @@ -3675,11 +3675,6 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== -async@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -4007,13 +4002,6 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -block-stream2@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/block-stream2/-/block-stream2-2.1.0.tgz#ac0c5ef4298b3857796e05be8ebed72196fa054b" - integrity sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg== - dependencies: - readable-stream "^3.4.0" - bluebird@^3.1.1, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -6033,7 +6021,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-error@^4.0.1, es6-error@^4.1.1: +es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== @@ -6563,13 +6551,6 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-xml-parser@^3.17.5: - version "3.21.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz#152a1d51d445380f7046b304672dd55d15c9e736" - integrity sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg== - dependencies: - strnum "^1.0.4" - fastparse@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" @@ -8656,11 +8637,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-stream/-/json-stream-1.0.0.tgz#1a3854e28d2bbeeab31cc7ddf683d2ddc5652708" - integrity sha512-H/ZGY0nIAg3QcOwE1QN/rK/Fa7gJn7Ii5obwp6zyPO4xiPNwpIMjqy2gwjBEGqzkF/vSWEIBQCBuN19hYiL6Qg== - json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -9316,7 +9292,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.14, mime-types@^2.1.19, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.19, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -9396,24 +9372,6 @@ minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minio@7.0.18: - version "7.0.18" - resolved "https://registry.yarnpkg.com/minio/-/minio-7.0.18.tgz#a2a6dae52a4dde9e35ed47cdf2accc21df4a512d" - integrity sha512-jVRjkw8A5Spf+ETY5OXQUcQckHriuUA3u2+MAcX36btLT8EytlOVivxIseXvyFf9cNn3dy5w1F1UyjMvHU+nqg== - dependencies: - async "^3.1.0" - block-stream2 "^2.0.0" - es6-error "^4.1.1" - fast-xml-parser "^3.17.5" - json-stream "^1.0.0" - lodash "^4.17.20" - mime-types "^2.1.14" - mkdirp "^0.5.1" - querystring "0.2.0" - through2 "^3.0.1" - xml "^1.0.0" - xml2js "^0.4.15" - minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -9491,10 +9449,10 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -moment@^2.29.1: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== +moment@^2.30.1: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== move-concurrently@^1.0.1: version "1.0.1" @@ -11432,11 +11390,6 @@ querystring-es3@^0.2.0: resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -11572,7 +11525,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -11983,11 +11936,6 @@ sass@1.32.12, sass@~1.32.13: dependencies: chokidar ">=3.0.0 <4.0.0" -sax@>=0.6.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== - saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -12613,11 +12561,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strnum@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" - integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== - style-resources-loader@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/style-resources-loader/-/style-resources-loader-1.5.0.tgz#6e0585ca475b9dac45387c308be90d74c814f41f" @@ -12869,14 +12812,6 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== - dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" - through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -13924,24 +13859,6 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@^0.4.15: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xml@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" - integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"