diff --git a/testsuite/integration-arquillian/tests/other/webauthn/pom.xml b/testsuite/integration-arquillian/tests/other/webauthn/pom.xml index bf51e2897f..551fe9d7e0 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/pom.xml +++ b/testsuite/integration-arquillian/tests/other/webauthn/pom.xml @@ -14,9 +14,12 @@ 4.1.0 - 3.0.0-alpha.2 - 3.55.0 - 3.0.0-alpha.2 + 3.0.0-alpha.3 + 3.58.0 + 3.0.0-alpha.4 + ${project.build.directory}/dependency/firefox-user-preferences.js + + 4.1.2 @@ -71,4 +74,50 @@ compile + + + + firefox + + + browser + firefox + + + + + org.seleniumhq.selenium + selenium-firefox-driver + ${selenium.firefox.driver.version} + + + + + + maven-resources-plugin + + + copy-common-dependencies + generate-resources + + copy-resources + + + ${project.build.directory}/dependency + + + src/test/resources + + firefox-user-preferences.js + + + + + + + + + + + diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/main/java/org/keycloak/testsuite/webauthn/pages/WebAuthnRegisterPage.java b/testsuite/integration-arquillian/tests/other/webauthn/src/main/java/org/keycloak/testsuite/webauthn/pages/WebAuthnRegisterPage.java index a655684230..8f1723f58a 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/main/java/org/keycloak/testsuite/webauthn/pages/WebAuthnRegisterPage.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/main/java/org/keycloak/testsuite/webauthn/pages/WebAuthnRegisterPage.java @@ -31,6 +31,7 @@ import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; import static org.hamcrest.MatcherAssert.assertThat; +import static org.keycloak.testsuite.util.WaitUtils.waitForPageToLoad; /** * WebAuthnRegisterPage, which is displayed when WebAuthnRegister required action is triggered. It is useful with Chrome testing API. @@ -72,6 +73,7 @@ public class WebAuthnRegisterPage extends AbstractPage { Alert promptDialog = driver.switchTo().alert(); promptDialog.sendKeys(authenticatorLabel); promptDialog.accept(); + waitForPageToLoad(); } public boolean isRegisterAlertPresent() { diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/AbstractWebAuthnVirtualTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/AbstractWebAuthnVirtualTest.java index 4007dc09d6..de8249a47b 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/AbstractWebAuthnVirtualTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/AbstractWebAuthnVirtualTest.java @@ -55,19 +55,26 @@ import org.keycloak.testsuite.webauthn.updaters.AbstractWebAuthnRealmUpdater; import org.keycloak.testsuite.webauthn.updaters.PasswordLessRealmAttributeUpdater; import org.keycloak.testsuite.webauthn.updaters.WebAuthnRealmAttributeUpdater; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.virtualauthenticator.Credential; import org.openqa.selenium.virtualauthenticator.VirtualAuthenticatorOptions; import javax.ws.rs.core.Response; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Optional; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude.AuthServer.REMOTE; +import static org.keycloak.testsuite.util.BrowserDriverUtil.isDriverFirefox; +import static org.keycloak.testsuite.util.BrowserDriverUtil.isDriverInstanceOf; import static org.keycloak.testsuite.util.WaitUtils.waitForPageToLoad; /** @@ -118,14 +125,18 @@ public abstract class AbstractWebAuthnVirtualTest extends AbstractTestRealmKeycl @Before @Override public void setUpVirtualAuthenticator() { - this.virtualAuthenticatorManager = createDefaultVirtualManager(driver, getDefaultAuthenticatorOptions()); + if (!isDriverFirefox(driver)) { + this.virtualAuthenticatorManager = createDefaultVirtualManager(driver, getDefaultAuthenticatorOptions()); + } clearEventQueue(); } @After @Override public void removeVirtualAuthenticator() { - virtualAuthenticatorManager.removeAuthenticator(); + if (!isDriverFirefox(driver)) { + virtualAuthenticatorManager.removeAuthenticator(); + } clearEventQueue(); } @@ -163,6 +174,7 @@ public abstract class AbstractWebAuthnVirtualTest extends AbstractTestRealmKeycl return DefaultVirtualAuthOptions.DEFAULT.getOptions(); } + // Warning: The virtual authenticator manager is not initialized for Firefox Browser !! public VirtualAuthenticatorManager getVirtualAuthManager() { return virtualAuthenticatorManager; } @@ -228,6 +240,8 @@ public abstract class AbstractWebAuthnVirtualTest extends AbstractTestRealmKeycl events.clear(); tryRegisterAuthenticator(authenticatorLabel); } + + waitForPageToLoad(); } private void tryRegisterAuthenticator(String authenticatorLabel) { @@ -241,7 +255,8 @@ public abstract class AbstractWebAuthnVirtualTest extends AbstractTestRealmKeycl * Manual testing with Google Chrome authenticators works as expected */ private void tryRegisterAuthenticator(String authenticatorLabel, int numberOfAllowedRetries) { - final boolean hasResidentKey = Optional.ofNullable(getVirtualAuthManager().getCurrent()) + final boolean hasResidentKey = Optional.ofNullable(getVirtualAuthManager()) + .map(VirtualAuthenticatorManager::getCurrent) .map(KcVirtualAuthenticator::getOptions) .map(KcVirtualAuthenticator.Options::hasResidentKey) .orElse(false); @@ -368,11 +383,33 @@ public abstract class AbstractWebAuthnVirtualTest extends AbstractTestRealmKeycl protected void logout() { try { + waitForPageToLoad(); appPage.open(); appPage.assertCurrent(); appPage.logout(); + waitForPageToLoad(); } catch (Exception e) { throw new RuntimeException("Cannot logout user", e); } } + + protected String getExpectedMessageByDriver(Map, String> values) { + if (values == null || values.isEmpty()) return ""; + + return values.entrySet() + .stream() + .filter(Objects::nonNull) + .filter(f -> isDriverInstanceOf(driver, f.getKey())) + .findFirst() + .map(Map.Entry::getValue) + .orElse(""); + } + + protected String getExpectedMessageByDriver(String firefoxMessage, String chromeMessage) { + final Map, String> map = new HashMap<>(); + map.put(FirefoxDriver.class, firefoxMessage); + map.put(ChromeDriver.class, chromeMessage); + + return getExpectedMessageByDriver(map); + } } diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/AppInitiatedActionWebAuthnTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/AppInitiatedActionWebAuthnTest.java index 0751ee0730..8861385b85 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/AppInitiatedActionWebAuthnTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/AppInitiatedActionWebAuthnTest.java @@ -53,6 +53,7 @@ import static org.keycloak.common.Profile.Feature.WEB_AUTHN; import static org.keycloak.models.AuthenticationExecutionModel.Requirement.ALTERNATIVE; import static org.keycloak.models.AuthenticationExecutionModel.Requirement.REQUIRED; import static org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude.AuthServer.REMOTE; +import static org.keycloak.testsuite.util.BrowserDriverUtil.isDriverFirefox; import static org.keycloak.testsuite.util.WaitUtils.waitForPageToLoad; /** @@ -80,13 +81,17 @@ public class AppInitiatedActionWebAuthnTest extends AbstractAppInitiatedActionTe @Before @Override public void setUpVirtualAuthenticator() { - virtualManager = AbstractWebAuthnVirtualTest.createDefaultVirtualManager(driver, DefaultVirtualAuthOptions.DEFAULT.getOptions()); + if (!isDriverFirefox(driver)) { + virtualManager = AbstractWebAuthnVirtualTest.createDefaultVirtualManager(driver, DefaultVirtualAuthOptions.DEFAULT.getOptions()); + } } @After @Override public void removeVirtualAuthenticator() { - virtualManager.removeAuthenticator(); + if (!isDriverFirefox(driver)) { + virtualManager.removeAuthenticator(); + } } @Override @@ -167,8 +172,6 @@ public class AppInitiatedActionWebAuthnTest extends AbstractAppInitiatedActionTe webAuthnRegisterPage.clickRegister(); webAuthnRegisterPage.registerWebAuthnCredential("authenticator1"); - waitForPageToLoad(); - assertKcActionStatus(SUCCESS); assertThat(getCredentialCount.get(), is(credentialsCount + 1)); diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/VirtualAuthenticatorsManagerTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/VirtualAuthenticatorsManagerTest.java index cd7bafcc92..c4c3e02b58 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/VirtualAuthenticatorsManagerTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/VirtualAuthenticatorsManagerTest.java @@ -20,11 +20,13 @@ import org.hamcrest.Matchers; import org.jboss.arquillian.drone.api.annotation.Drone; import org.junit.Test; import org.keycloak.representations.idm.RealmRepresentation; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.util.SecondBrowser; import org.keycloak.testsuite.webauthn.authenticators.DefaultVirtualAuthOptions; import org.keycloak.testsuite.webauthn.authenticators.KcVirtualAuthenticator; import org.keycloak.testsuite.webauthn.authenticators.VirtualAuthenticatorManager; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.virtualauthenticator.VirtualAuthenticatorOptions; import static org.hamcrest.CoreMatchers.is; @@ -37,6 +39,7 @@ import static org.hamcrest.MatcherAssert.assertThat; * * @author Martin Bartos */ +@IgnoreBrowserDriver(FirefoxDriver.class) public class VirtualAuthenticatorsManagerTest extends AbstractWebAuthnVirtualTest { @Drone diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnPropertyTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnPropertyTest.java index 5a68707c1b..15c054a687 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnPropertyTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnPropertyTest.java @@ -22,8 +22,10 @@ import org.keycloak.WebAuthnConstants; import org.keycloak.models.credential.WebAuthnCredentialModel; import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.representations.idm.UserRepresentation; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.util.WaitUtils; import org.keycloak.testsuite.webauthn.utils.WebAuthnRealmData; +import org.openqa.selenium.firefox.FirefoxDriver; import java.io.Closeable; import java.io.IOException; @@ -44,6 +46,7 @@ import static org.keycloak.testsuite.webauthn.utils.PropertyRequirement.YES; public class WebAuthnPropertyTest extends AbstractWebAuthnVirtualTest { @Test + @IgnoreBrowserDriver(FirefoxDriver.class) public void residentKey() throws IOException { getVirtualAuthManager().useAuthenticator(DEFAULT_RESIDENT_KEY.getOptions()); @@ -79,6 +82,7 @@ public class WebAuthnPropertyTest extends AbstractWebAuthnVirtualTest { } @Test + @IgnoreBrowserDriver(FirefoxDriver.class) public void timeout() throws IOException { final Integer TIMEOUT = 3; //seconds @@ -102,6 +106,7 @@ public class WebAuthnPropertyTest extends AbstractWebAuthnVirtualTest { } @Test + @IgnoreBrowserDriver(FirefoxDriver.class) public void changeAuthenticatorProperties() throws IOException { getVirtualAuthManager().useAuthenticator(DEFAULT_RESIDENT_KEY.getOptions()); diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnRegisterAndLoginTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnRegisterAndLoginTest.java index cd7e9e521a..b8a8311585 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnRegisterAndLoginTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnRegisterAndLoginTest.java @@ -54,6 +54,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; @@ -413,13 +414,16 @@ public class WebAuthnRegisterAndLoginTest extends AbstractWebAuthnVirtualTest { final CredentialRepresentation credentialRep = userResource.credentials() .stream() + .filter(Objects::nonNull) .filter(credential -> credentialType.equals(credential.getType())) - .findFirst().orElse(null); + .findFirst() + .orElse(null); - assertThat(credentialRep, notNullValue()); - if (assertUserLabel != null) { - assertThat(credentialRep.getUserLabel(), is(assertUserLabel)); + if (credentialRep != null) { + if (assertUserLabel != null) { + assertThat(credentialRep.getUserLabel(), is(assertUserLabel)); + } + userResource.removeCredential(credentialRep.getId()); } - userResource.removeCredential(credentialRep.getId()); } } diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnTransportsTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnTransportsTest.java index c8b4c11e5e..42cd83d126 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnTransportsTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/WebAuthnTransportsTest.java @@ -18,7 +18,9 @@ package org.keycloak.testsuite.webauthn; import org.junit.Test; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.webauthn.pages.WebAuthnAuthenticatorsList; +import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.virtualauthenticator.VirtualAuthenticatorOptions; import java.util.List; @@ -34,6 +36,7 @@ import static org.keycloak.testsuite.webauthn.authenticators.DefaultVirtualAuthO /** * @author Martin Bartos */ +@IgnoreBrowserDriver(FirefoxDriver.class) public class WebAuthnTransportsTest extends AbstractWebAuthnVirtualTest { @Test diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/AbstractWebAuthnAccountTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/AbstractWebAuthnAccountTest.java index 107a22990a..19ccbdea87 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/AbstractWebAuthnAccountTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/AbstractWebAuthnAccountTest.java @@ -50,6 +50,7 @@ import org.openqa.selenium.virtualauthenticator.VirtualAuthenticatorOptions; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.keycloak.models.AuthenticationExecutionModel.Requirement.REQUIRED; +import static org.keycloak.testsuite.util.BrowserDriverUtil.isDriverFirefox; import static org.keycloak.testsuite.util.WaitUtils.waitForPageToLoad; @EnableFeature(value = Profile.Feature.WEB_AUTHN, skipRestart = true, onlyForProduct = true) @@ -74,13 +75,17 @@ public abstract class AbstractWebAuthnAccountTest extends AbstractAuthTest imple @Override @Before public void setUpVirtualAuthenticator() { - webAuthnManager = AbstractWebAuthnVirtualTest.createDefaultVirtualManager(driver, getDefaultOptions()); + if (!isDriverFirefox(driver)) { + webAuthnManager = AbstractWebAuthnVirtualTest.createDefaultVirtualManager(driver, getDefaultOptions()); + } } @Override @After public void removeVirtualAuthenticator() { - webAuthnManager.removeAuthenticator(); + if (!isDriverFirefox(driver)) { + webAuthnManager.removeAuthenticator(); + } } @Before diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/WebAuthnErrorTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/WebAuthnErrorTest.java index 2aef47bb1b..398b7d9fae 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/WebAuthnErrorTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/WebAuthnErrorTest.java @@ -21,12 +21,14 @@ import org.hamcrest.Matchers; import org.jboss.arquillian.graphene.page.Page; import org.junit.Test; import org.keycloak.representations.idm.RealmRepresentation; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.updaters.RealmAttributeUpdater; import org.keycloak.testsuite.util.WaitUtils; import org.keycloak.testsuite.webauthn.pages.WebAuthnAuthenticatorsList; import org.keycloak.testsuite.webauthn.pages.WebAuthnErrorPage; import org.keycloak.testsuite.webauthn.pages.WebAuthnLoginPage; import org.keycloak.testsuite.webauthn.updaters.WebAuthnRealmAttributeUpdater; +import org.openqa.selenium.firefox.FirefoxDriver; import java.io.IOException; @@ -43,6 +45,7 @@ public class WebAuthnErrorTest extends AbstractWebAuthnAccountTest { protected WebAuthnErrorPage webAuthnErrorPage; @Test + @IgnoreBrowserDriver(FirefoxDriver.class) public void errorPageWithTimeout() throws IOException { final int timeoutSec = 3; final String authenticatorLabel = "authenticator"; diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/WebAuthnTransportLocaleTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/WebAuthnTransportLocaleTest.java index 30089cf454..aee95bff1b 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/WebAuthnTransportLocaleTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/account/WebAuthnTransportLocaleTest.java @@ -19,8 +19,10 @@ package org.keycloak.testsuite.webauthn.account; import org.hamcrest.Matchers; import org.junit.Test; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.webauthn.authenticators.DefaultVirtualAuthOptions; import org.keycloak.testsuite.webauthn.pages.WebAuthnAuthenticatorsList; +import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.virtualauthenticator.VirtualAuthenticatorOptions; import java.io.Closeable; @@ -45,6 +47,7 @@ import static org.keycloak.testsuite.webauthn.authenticators.DefaultVirtualAuthO * * @author Martin Bartos */ +@IgnoreBrowserDriver(FirefoxDriver.class) public class WebAuthnTransportLocaleTest extends AbstractWebAuthnAccountTest { @Test diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/AttestationConveyanceRegisterTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/AttestationConveyanceRegisterTest.java index e94b7a6f35..64c759fa73 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/AttestationConveyanceRegisterTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/AttestationConveyanceRegisterTest.java @@ -21,10 +21,12 @@ import com.webauthn4j.data.AttestationConveyancePreference; import org.junit.Ignore; import org.junit.Test; import org.keycloak.models.credential.dto.WebAuthnCredentialData; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.webauthn.AbstractWebAuthnVirtualTest; import org.keycloak.testsuite.webauthn.updaters.AbstractWebAuthnRealmUpdater; import org.keycloak.testsuite.webauthn.utils.WebAuthnDataWrapper; import org.keycloak.testsuite.webauthn.utils.WebAuthnRealmData; +import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.virtualauthenticator.Credential; import java.io.IOException; @@ -62,18 +64,21 @@ public class AttestationConveyanceRegisterTest extends AbstractWebAuthnVirtualTe @Ignore("invalid cert path") @Test + @IgnoreBrowserDriver(FirefoxDriver.class) public void attestationConveyancePreferenceNone() { assertAttestationConveyance(true, AttestationConveyancePreference.NONE); } @Ignore("invalid cert path") @Test + @IgnoreBrowserDriver(FirefoxDriver.class) public void attestationConveyancePreferenceIndirect() { assertAttestationConveyance(true, AttestationConveyancePreference.INDIRECT); } @Ignore("invalid cert path") @Test + @IgnoreBrowserDriver(FirefoxDriver.class) public void attestationConveyancePreferenceDirect() { getVirtualAuthManager().useAuthenticator(DEFAULT.getOptions().setHasResidentKey(true).setIsUserConsenting(true).setHasUserVerification(true)); assertAttestationConveyance(true, AttestationConveyancePreference.DIRECT); diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/AuthAttachmentRegisterTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/AuthAttachmentRegisterTest.java index 43ef7d8a66..4daef1e19d 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/AuthAttachmentRegisterTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/AuthAttachmentRegisterTest.java @@ -19,8 +19,10 @@ package org.keycloak.testsuite.webauthn.registration; import com.webauthn4j.data.AuthenticatorAttachment; import com.webauthn4j.data.UserVerificationRequirement; import org.junit.Test; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.webauthn.AbstractWebAuthnVirtualTest; import org.keycloak.testsuite.webauthn.utils.WebAuthnRealmData; +import org.openqa.selenium.firefox.FirefoxDriver; import java.io.Closeable; import java.io.IOException; @@ -35,6 +37,7 @@ import static org.keycloak.testsuite.webauthn.authenticators.DefaultVirtualAuthO /** * @author Martin Bartos */ +@IgnoreBrowserDriver(FirefoxDriver.class) public class AuthAttachmentRegisterTest extends AbstractWebAuthnVirtualTest { @Test diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/PolicyJsInjectionTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/PolicyJsInjectionTest.java index fb3798ae9b..35a3325bdf 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/PolicyJsInjectionTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/PolicyJsInjectionTest.java @@ -68,24 +68,37 @@ public class PolicyJsInjectionTest extends AbstractWebAuthnVirtualTest { registerDefaultUser(false); webAuthnErrorPage.assertCurrent(); - assertThat(webAuthnErrorPage.getError(), containsString("The relying party ID is not a registrable domain suffix of, nor equal to the current domain.")); + + final String expectedMessage = getExpectedMessageByDriver( + "SecurityError: The operation is insecure.", + "The relying party ID is not a registrable domain suffix of, nor equal to the current domain."); + + assertThat(webAuthnErrorPage.getError(), containsString(expectedMessage)); } } @Test public void attestationConveyancePreference() { + final String expectedMessage = getExpectedMessageByDriver( + "(value of 'attestation' member of PublicKeyCredentialCreationOptions) is not a valid value for enumeration AttestationConveyancePreference.", + "The provided value 'required\"; window.location.href = \"http://www.keycloak.org\";\"' is not a valid enum value of type AttestationConveyancePreference."); + verifyInjection((updater) -> updater.setWebAuthnPolicyAttestationConveyancePreference(REDIRECT_SCRIPT), WebAuthnRealmData::getAttestationConveyancePreference, REDIRECT_SCRIPT, - "Failed to read the 'attestation' property from 'PublicKeyCredentialCreationOptions': The provided value 'required\"; window.location.href = \"http://www.keycloak.org\";\"' is not a valid enum value of type AttestationConveyancePreference."); + expectedMessage); } @Test public void authenticatorAttachment() { + final String expectedMessage = getExpectedMessageByDriver( + "(value of 'authenticatorAttachment' member of AuthenticatorSelectionCriteria) is not a valid value for enumeration AuthenticatorAttachment.", + "The provided value 'required\"; window.location.href = \"http://www.keycloak.org\";\"' is not a valid enum value of type AuthenticatorAttachment."); + verifyInjection((updater) -> updater.setWebAuthnPolicyAuthenticatorAttachment(REDIRECT_SCRIPT), WebAuthnRealmData::getAuthenticatorAttachment, REDIRECT_SCRIPT, - "Failed to read the 'authenticatorAttachment' property from 'AuthenticatorSelectionCriteria': The provided value 'required\"; window.location.href = \"http://www.keycloak.org\";\"' is not a valid enum value of type AuthenticatorAttachment."); + expectedMessage); } @Test @@ -98,10 +111,14 @@ public class PolicyJsInjectionTest extends AbstractWebAuthnVirtualTest { @Test public void userVerificationRequirement() { + String expectedMessage = getExpectedMessageByDriver( + "(value of 'userVerification' member of AuthenticatorSelectionCriteria) is not a valid value for enumeration UserVerificationRequirement.", + "The provided value 'required\"; window.prompt('Injection'); \" ' is not a valid enum value of type UserVerificationRequirement."); + verifyInjection((updater) -> updater.setWebAuthnPolicyUserVerificationRequirement(PROMPT_SCRIPT), WebAuthnRealmData::getUserVerificationRequirement, PROMPT_SCRIPT, - "Failed to read the 'userVerification' property from 'AuthenticatorSelectionCriteria': The provided value 'required\"; window.prompt('Injection'); \" ' is not a valid enum value of type UserVerificationRequirement."); + expectedMessage); } @Test diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/PubKeySignRegisterTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/PubKeySignRegisterTest.java index 5125e62a48..063b379c88 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/PubKeySignRegisterTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/PubKeySignRegisterTest.java @@ -90,7 +90,10 @@ public class PubKeySignRegisterTest extends AbstractWebAuthnVirtualTest { assertThat(webAuthnErrorPage.isCurrent(), is(!shouldSuccess)); if (!shouldSuccess) { - assertThat(webAuthnErrorPage.getError(), containsString("The operation either timed out or was not allowed")); + final String expectedMessage = getExpectedMessageByDriver( + "NotSupportedError: Operation is not supported", + "The operation either timed out or was not allowed"); + assertThat(webAuthnErrorPage.getError(), containsString(expectedMessage)); return; } diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/ResidentKeyRegisterTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/ResidentKeyRegisterTest.java index 9b8c50d9f9..89c48a2636 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/ResidentKeyRegisterTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/ResidentKeyRegisterTest.java @@ -20,9 +20,11 @@ package org.keycloak.testsuite.webauthn.registration; import org.hamcrest.Matchers; import org.junit.Test; import org.keycloak.testsuite.admin.ApiUtil; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.webauthn.AbstractWebAuthnVirtualTest; import org.keycloak.testsuite.webauthn.utils.PropertyRequirement; import org.keycloak.testsuite.webauthn.utils.WebAuthnRealmData; +import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.virtualauthenticator.Credential; import java.io.Closeable; @@ -40,6 +42,7 @@ import static org.keycloak.testsuite.webauthn.authenticators.DefaultVirtualAuthO /** * @author Martin Bartos */ +@IgnoreBrowserDriver(FirefoxDriver.class) public class ResidentKeyRegisterTest extends AbstractWebAuthnVirtualTest { @Test diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/UserVerificationRegisterTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/UserVerificationRegisterTest.java index f6b6c57765..0de7bcf69d 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/UserVerificationRegisterTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/UserVerificationRegisterTest.java @@ -20,9 +20,11 @@ package org.keycloak.testsuite.webauthn.registration; import com.webauthn4j.data.UserVerificationRequirement; import org.junit.Ignore; import org.junit.Test; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.util.WaitUtils; import org.keycloak.testsuite.webauthn.AbstractWebAuthnVirtualTest; import org.keycloak.testsuite.webauthn.utils.WebAuthnRealmData; +import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.virtualauthenticator.VirtualAuthenticatorOptions; import java.io.Closeable; @@ -36,6 +38,7 @@ import static org.hamcrest.MatcherAssert.assertThat; /** * @author Martin Bartos */ +@IgnoreBrowserDriver(FirefoxDriver.class) public class UserVerificationRegisterTest extends AbstractWebAuthnVirtualTest { @Test diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/WebAuthnOtherSettingsTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/WebAuthnOtherSettingsTest.java index 61f1a2b691..05062c73be 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/WebAuthnOtherSettingsTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/WebAuthnOtherSettingsTest.java @@ -31,11 +31,13 @@ import org.keycloak.events.Details; import org.keycloak.events.EventType; import org.keycloak.models.credential.dto.WebAuthnCredentialData; import org.keycloak.representations.idm.UserRepresentation; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.pages.AppPage; import org.keycloak.testsuite.util.WaitUtils; import org.keycloak.testsuite.webauthn.AbstractWebAuthnVirtualTest; import org.keycloak.testsuite.webauthn.utils.WebAuthnDataWrapper; import org.keycloak.testsuite.webauthn.utils.WebAuthnRealmData; +import org.openqa.selenium.firefox.FirefoxDriver; import java.io.Closeable; import java.io.IOException; @@ -50,6 +52,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.keycloak.testsuite.util.BrowserDriverUtil.isDriverFirefox; import static org.keycloak.testsuite.util.WaitUtils.pause; import static org.keycloak.testsuite.util.WaitUtils.waitForPageToLoad; @@ -84,6 +87,8 @@ public class WebAuthnOtherSettingsTest extends AbstractWebAuthnVirtualTest { .assertEvent(); final String credentialType = getCredentialType(); + // Soft token in Firefox does not increment counter + long credentialCount = isDriverFirefox(driver) ? 0 : 1L; getTestingClient().server(TEST_REALM_NAME).run(session -> { final WebAuthnDataWrapper dataWrapper = new WebAuthnDataWrapper(session, USERNAME, credentialType); @@ -95,7 +100,7 @@ public class WebAuthnOtherSettingsTest extends AbstractWebAuthnVirtualTest { assertThat(data.getAaguid(), is(ALL_ZERO_AAGUID)); assertThat(data.getAttestationStatement(), nullValue()); assertThat(data.getCredentialPublicKey(), notNullValue()); - assertThat(data.getCounter(), is(1L)); + assertThat(data.getCounter(), is(credentialCount)); assertThat(data.getAttestationStatementFormat(), is(AttestationConveyancePreference.NONE.getValue())); final COSEKey pubKey = dataWrapper.getKey(); @@ -108,6 +113,7 @@ public class WebAuthnOtherSettingsTest extends AbstractWebAuthnVirtualTest { } @Test + @IgnoreBrowserDriver(FirefoxDriver.class) public void timeout() throws IOException { final Integer TIMEOUT = 3; //seconds diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessAuthAttachmentRegTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessAuthAttachmentRegTest.java index 951d158d5c..6aa4b59413 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessAuthAttachmentRegTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessAuthAttachmentRegTest.java @@ -17,11 +17,14 @@ package org.keycloak.testsuite.webauthn.registration.passwordless; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.webauthn.registration.AuthAttachmentRegisterTest; +import org.openqa.selenium.firefox.FirefoxDriver; /** * @author Martin Bartos */ +@IgnoreBrowserDriver(FirefoxDriver.class) public class PwdLessAuthAttachmentRegTest extends AuthAttachmentRegisterTest { @Override diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessResidentKeyRegTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessResidentKeyRegTest.java index da0c7f4308..04fcc5ef80 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessResidentKeyRegTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessResidentKeyRegTest.java @@ -17,11 +17,14 @@ package org.keycloak.testsuite.webauthn.registration.passwordless; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.webauthn.registration.ResidentKeyRegisterTest; +import org.openqa.selenium.firefox.FirefoxDriver; /** * @author Martin Bartos */ +@IgnoreBrowserDriver(FirefoxDriver.class) public class PwdLessResidentKeyRegTest extends ResidentKeyRegisterTest { @Override diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessUserVerRegTest.java b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessUserVerRegTest.java index a96fe41730..0641131021 100644 --- a/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessUserVerRegTest.java +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/java/org/keycloak/testsuite/webauthn/registration/passwordless/PwdLessUserVerRegTest.java @@ -17,11 +17,14 @@ package org.keycloak.testsuite.webauthn.registration.passwordless; +import org.keycloak.testsuite.arquillian.annotation.IgnoreBrowserDriver; import org.keycloak.testsuite.webauthn.registration.UserVerificationRegisterTest; +import org.openqa.selenium.firefox.FirefoxDriver; /** * @author Martin Bartos */ +@IgnoreBrowserDriver(FirefoxDriver.class) public class PwdLessUserVerRegTest extends UserVerificationRegisterTest { @Override diff --git a/testsuite/integration-arquillian/tests/other/webauthn/src/test/resources/firefox-user-preferences.js b/testsuite/integration-arquillian/tests/other/webauthn/src/test/resources/firefox-user-preferences.js new file mode 100644 index 0000000000..6219e38ae0 --- /dev/null +++ b/testsuite/integration-arquillian/tests/other/webauthn/src/test/resources/firefox-user-preferences.js @@ -0,0 +1,2 @@ +user_pref("security.webauth.webauthn_enable_softtoken", true); +user_pref("security.webauth.webauthn_enable_usbtoken", false); \ No newline at end of file