freeipa/ipatests/test_integration/test_sso.py
Florence Blanc-Renaud 6f3721a885 ipatests: xfail on all fedora for test_ipa_login_with_sso_user
With the new fedora36 vagrant image, the test is also failing.
Mark xfail for all fedora versions.
Related: https://pagure.io/freeipa/issue/9264

Signed-off-by: Florence Blanc-Renaud <flo@redhat.com>
Reviewed-By: Scott Poore <spoore@redhat.com>
2022-12-14 11:26:17 +01:00

144 lines
5.7 KiB
Python

from __future__ import absolute_import
import pytest
import textwrap
from ipaplatform.osinfo import osinfo
from ipatests.test_integration.base import IntegrationTest
from ipatests.pytest_ipa.integration import tasks, create_keycloak
from ipatests.pytest_ipa.integration import create_bridge
user_code_script = textwrap.dedent("""
from selenium import webdriver
from datetime import datetime
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.headless = True
driver = webdriver.Firefox(executable_path="/opt/geckodriver", options=options)
verification_uri = "https://{hostname}:8443/auth/realms/master/account/#/"
driver.get(verification_uri)
try:
element = WebDriverWait(driver, 90).until(
EC.element_to_be_clickable((By.ID, "landingSignInButton")))
driver.find_element(By.ID, "landingSignInButton").click()
element = WebDriverWait(driver, 90).until(
EC.presence_of_element_located((By.ID, "kc-login")))
driver.find_element(By.ID, "username").send_keys("{username}")
driver.find_element(By.ID, "password").send_keys("{password}")
driver.find_element(By.ID, "kc-login").click()
element = WebDriverWait(driver, 900).until(
EC.text_to_be_present_in_element((By.ID, "landingLoggedInUser"),
"{username_fl}"))
assert driver.find_element(By.ID, "landingLoggedInUser").text \
== "{username_fl}"
finally:
now = datetime.now().strftime("%M-%S")
driver.get_screenshot_as_file("/var/log/httpd/screenshot-%s.png" % now)
driver.quit()
""")
def keycloak_login(host, username, password, username_fl=None):
if username_fl is None:
username_fl = username
contents = user_code_script.format(hostname=host.hostname,
username=username,
password=password,
username_fl=username_fl)
try:
host.put_file_contents("/tmp/keycloak_login.py", contents)
tasks.run_repeatedly(host, ['python3', '/tmp/keycloak_login.py'])
finally:
host.run_command(["rm", "-f", "/tmp/keycloak_login.py"])
def keycloak_add_user(host, kcadm_pass, username, password=None):
domain = host.domain.name
kcadmin_sh = "/opt/keycloak/bin/kcadm.sh"
kcadmin = [kcadmin_sh, "config", "credentials", "--server",
f"https://{host.hostname}:8443/auth/",
"--realm", "master", "--user", "admin",
"--password", kcadm_pass]
host.run_command(kcadmin)
host.run_command([kcadmin_sh, "create", "users", "-r", "master",
"-s", f"username={username}",
"-s", f"email={username}@{domain}",
"-s", "enabled=true"])
if password is not None:
host.run_command([kcadmin_sh, "set-password", "-r", "master",
"--username", "testuser1", "--new-password",
password])
class TestSsoBridge(IntegrationTest):
# Replicas used instead of clients due to memory requirements
# for running Keycloak and Bridge servers
num_replicas = 2
@classmethod
def install(cls, mh):
cls.keycloak = cls.replicas[0]
cls.bridge = cls.replicas[1]
tasks.install_master(cls.master, extra_args=['--no-dnssec-validation'])
tasks.install_client(cls.master, cls.replicas[0],
extra_args=["--mkhomedir"])
tasks.install_client(cls.master, cls.replicas[1],
extra_args=["--mkhomedir"])
tasks.clear_sssd_cache(cls.master)
tasks.clear_sssd_cache(cls.keycloak)
tasks.clear_sssd_cache(cls.bridge)
tasks.kinit_admin(cls.master)
username = 'ipauser1'
password = cls.keycloak.config.admin_password
tasks.create_active_user(cls.master, username, password)
create_keycloak.setup_keycloakserver(cls.keycloak)
create_keycloak.setup_keycloak_client(cls.keycloak)
create_bridge.setup_scim_server(cls.bridge)
create_bridge.setup_keycloak_scim_plugin(cls.keycloak,
cls.bridge.hostname)
@classmethod
def uninstall(cls, mh):
tasks.uninstall_client(cls.keycloak)
tasks.uninstall_client(cls.bridge)
tasks.uninstall_master(cls.master)
create_keycloak.uninstall_keycloak(cls.keycloak)
create_bridge.uninstall_scim_server(cls.bridge)
create_bridge.uninstall_scim_plugin(cls.keycloak)
def test_sso_login_with_ipa_user(self):
"""
Test case to check authenticating to Keycloak as an IPA user
"""
username = 'ipauser1'
username_fl = 'test user'
password = self.keycloak.config.admin_password
keycloak_login(self.keycloak, username, password, username_fl)
@pytest.mark.xfail(
osinfo.id == 'fedora',
reason='freeipa ticket 9264', strict=True)
def test_ipa_login_with_sso_user(self):
"""
Test case to authenticate via ssh to IPA client as Keycloak
user with password set in IPA without using external IdP
related: https://pagure.io/freeipa/issue/9250
"""
username = "kcuser1"
password = self.keycloak.config.admin_password
keycloak_add_user(self.keycloak, password, username)
tasks.set_user_password(self.master, username, password)
tasks.run_ssh_cmd(to_host=self.master.external_hostname,
username=username, auth_method="password",
password=password)