diff --git a/.github/actions/integration-test-setup/action.yml b/.github/actions/integration-test-setup/action.yml
index d777e68bd874..ec5a9b8723d8 100644
--- a/.github/actions/integration-test-setup/action.yml
+++ b/.github/actions/integration-test-setup/action.yml
@@ -40,6 +40,7 @@ runs:
shell: bash
run: |
if [ "$RUNNER_OS" == "Windows" ]; then
- choco install zstandard
+ # zstd binary might be missing in older versions, install only when necessary
+ which zstd > /dev/null || choco install zstandard
fi
tar -C ~/ --use-compress-program="zstd -d" -xf m2-keycloak.tzts
diff --git a/.github/actions/maven-cache/action.yml b/.github/actions/maven-cache/action.yml
index b131eaba52fc..a4f1ffedb25d 100644
--- a/.github/actions/maven-cache/action.yml
+++ b/.github/actions/maven-cache/action.yml
@@ -28,18 +28,40 @@ runs:
~/.m2/repository/*/*
!~/.m2/repository/org/keycloak
key: ${{ steps.weekly-cache-key.outputs.key }}
+ # Enable cross-os archive use the cache on both Linux and Windows
+ enableCrossOsArchive: true
+
+ - id: download-node-for-windows
+ # This is necessary as the build which creates the cache will run on a Linux node and therefore will never download the Windows artifact by default.
+ # If we wouldn't download it manually, it would be downloaded on each Windows build, which proved to be unstable as downloads would randomly fail in the middle of the download.
+ if: inputs.create-cache-if-it-doesnt-exist == 'true' && steps.cache-maven-repository.outputs.cache-hit != 'true'
+ shell: bash
+ run: |
+ export VERSION=$(mvn help:evaluate -Dexpression=node.version -q -DforceStdout | cut -c 2-)
+ curl -Lf https://nodejs.org/dist/v${VERSION}/win-x64/node.exe --create-dirs -o ~/.m2/repository/com/github/eirslett/node/${VERSION}/node-${VERSION}-win-x64.exe
+
+ - shell: powershell
+ name: Link the cached Maven repository to the OS-dependent location
+ if: inputs.create-cache-if-it-doesnt-exist == 'false' && runner.os == 'Windows'
+ # The cache restore in the next step uses the relative path which was valid on Linux and that is part of the archive it downloads.
+ # You'll see that path when you enable debugging for the GitHub workflow on Windows.
+ # On Windows, the .m2 folder is in different location, so move all the contents to the right folder here.
+ # Also, not using the C: drive will speed up the build, see https://github.com/actions/runner-images/issues/8755
+ run: |
+ mkdir -p ../../../.m2/repository
+ cmd /c mklink /d $HOME\.m2\repository D:\.m2\repository
- id: restore-maven-repository
name: Maven cache
uses: actions/cache/restore@v4
if: inputs.create-cache-if-it-doesnt-exist == 'false'
with:
- # Two asterisks are needed to make the follow-up exclusion work
- # see https://github.com/actions/toolkit/issues/713 for the upstream issue
+ # This needs to repeat the same path pattern as above to find the matching cache
path: |
~/.m2/repository/*/*
!~/.m2/repository/org/keycloak
key: ${{ steps.weekly-cache-key.outputs.key }}
+ enableCrossOsArchive: true
- name: Cache Maven Wrapper
uses: actions/cache@v4
diff --git a/.github/scripts/ansible/aws_ec2.sh b/.github/scripts/ansible/aws_ec2.sh
index 2677461d5920..d6ab3c032134 100755
--- a/.github/scripts/ansible/aws_ec2.sh
+++ b/.github/scripts/ansible/aws_ec2.sh
@@ -12,7 +12,7 @@ REGION=$2
case $OPERATION in
requirements)
ansible-galaxy collection install -r requirements.yml
- pip3 install --user boto3 botocore
+ pip3 install --user "ansible==9.*" boto3 botocore
;;
create|delete|start|stop)
if [ -f "env.yml" ]; then ANSIBLE_CUSTOM_VARS_ARG="-e @env.yml"; fi
diff --git a/.github/scripts/ansible/roles/aws_ec2/tasks/create-resources.yml b/.github/scripts/ansible/roles/aws_ec2/tasks/create-resources.yml
index 65c029c487f4..3ce145a605da 100644
--- a/.github/scripts/ansible/roles/aws_ec2/tasks/create-resources.yml
+++ b/.github/scripts/ansible/roles/aws_ec2/tasks/create-resources.yml
@@ -1,5 +1,5 @@
- name: Get Ansible Control Host's public IP
- shell: curl -ks --ipv4 https://ifconfig.me
+ shell: curl -fks --ipv4 https://ifconfig.me
register: control_host_ip
no_log: "{{ no_log_sensitive }}"
diff --git a/.github/scripts/snyk-report.sh b/.github/scripts/snyk-report.sh
index 5630d9410743..4c094c6ce318 100755
--- a/.github/scripts/snyk-report.sh
+++ b/.github/scripts/snyk-report.sh
@@ -14,7 +14,7 @@ check_github_issue_exists() {
# Extract the CVE ID
local CVE_ID=$(echo "$issue_title" | grep -oE '(CVE-[0-9]{4}-[0-9]{4,7}|SNYK-[A-Z]+-[A-Z0-9]+-[0-9]{4,7})')
local search_url="https://api.github.com/search/issues?q=$CVE_ID+is%3Aissue+sort%3Aupdated-desc+repo:$KEYCLOAK_REPO"
- local response=$(curl -s -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3+json" "$search_url")
+ local response=$(curl -f -s -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3+json" "$search_url")
local count=$(echo "$response" | jq '.total_count')
# Check for bad credentials
@@ -52,7 +52,7 @@ create_github_issue() {
local api_url="https://api.github.com/repos/$KEYCLOAK_REPO/issues"
local data=$(jq -n --arg title "$title" --arg body "$body" --arg branch "backport/$BRANCH_NAME" \
'{title: $title, body: $body, labels: ["status/triage", "kind/cve", "kind/bug", $branch]}')
- local response=$(curl -s -w "%{http_code}" -X POST -H "Authorization: token $GITHUB_TOKEN" -H "Content-Type: application/json" -d "$data" "$api_url")
+ local response=$(curl -f -s -w "%{http_code}" -X POST -H "Authorization: token $GITHUB_TOKEN" -H "Content-Type: application/json" -d "$data" "$api_url")
local http_code=$(echo "$response" | tail -n1)
if [[ $http_code -eq 201 ]]; then
@@ -67,11 +67,11 @@ create_github_issue() {
update_github_issue() {
local issue_id="$1"
local api_url="https://api.github.com/repos/$KEYCLOAK_REPO/issues/$issue_id"
- local existing_labels=$(curl -s -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3+json" "$api_url" | jq '.labels | .[].name' | jq -s .)
+ local existing_labels=$(curl -f -s -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3+json" "$api_url" | jq '.labels | .[].name' | jq -s .)
local new_label="backport/$BRANCH_NAME"
local updated_labels=$(echo "$existing_labels" | jq --arg new_label "$new_label" '. + [$new_label] | unique')
local data=$(jq -n --argjson labels "$updated_labels" '{labels: $labels}')
- local response=$(curl -s -w "%{http_code}" -X PATCH -H "Authorization: token $GITHUB_TOKEN" -H "Content-Type: application/json" -d "$data" "$api_url")
+ local response=$(curl -f -s -w "%{http_code}" -X PATCH -H "Authorization: token $GITHUB_TOKEN" -H "Content-Type: application/json" -d "$data" "$api_url")
local http_code=$(echo "$response" | tail -n1)
if [[ $http_code -eq 200 ]]; then
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index cd5ec8c80bde..aea299ea3c41 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -424,7 +424,6 @@ jobs:
export CLUSTER_NAME=keycloak_$(git rev-parse --short HEAD)
echo "ec2_cluster=${CLUSTER_NAME}" >> $GITHUB_OUTPUT
./aws_ec2.sh requirements
- pipx inject ansible-core boto3 botocore
./aws_ec2.sh create ${REGION}
./keycloak_ec2_installer.sh ${REGION} /tmp/keycloak.zip
./mvn_ec2_runner.sh ${REGION} "clean install -B -DskipTests -Pdistribution"
@@ -534,7 +533,7 @@ jobs:
- name: Run cluster tests
run: |
- ./mvnw test ${{ env.SUREFIRE_RETRY }} -Pauth-server-cluster-quarkus -Dsession.cache.owners=2 -Dtest=**.cluster.** -pl testsuite/integration-arquillian/tests/base 2>&1 | misc/log/trimmer.sh
+ ./mvnw test ${{ env.SUREFIRE_RETRY }} -Pauth-server-cluster-quarkus,db-postgres -Dsession.cache.owners=2 -Dtest=**.cluster.** -pl testsuite/integration-arquillian/tests/base 2>&1 | misc/log/trimmer.sh
- name: Upload JVM Heapdumps
if: always()
diff --git a/.github/workflows/js-ci.yml b/.github/workflows/js-ci.yml
index 48c9f0b56fcd..629a601f8e20 100644
--- a/.github/workflows/js-ci.yml
+++ b/.github/workflows/js-ci.yml
@@ -182,8 +182,6 @@ jobs:
- name: Run Playwright tests
run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} test
- env:
- KEYCLOAK_SERVER: http://localhost:8080
- name: Upload Playwright report
uses: actions/upload-artifact@v4
@@ -285,7 +283,6 @@ jobs:
working-directory: js/apps/admin-ui
env:
CYPRESS_BASE_URL: http://localhost:8080/admin/
- CYPRESS_KEYCLOAK_SERVER: http://localhost:8080
SPLIT: ${{ strategy.job-total }}
SPLIT_INDEX: ${{ strategy.job-index }}
SPLIT_RANDOM_SEED: ${{ needs.generate-test-seed.outputs.seed }}
diff --git a/adapters/oidc/js/pom.xml b/adapters/oidc/js/pom.xml
index 22fa4462f939..bdc561bffa59 100644
--- a/adapters/oidc/js/pom.xml
+++ b/adapters/oidc/js/pom.xml
@@ -5,7 +5,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml
diff --git a/adapters/oidc/pom.xml b/adapters/oidc/pom.xml
index c546dd376e8f..a7e03a46f0a9 100755
--- a/adapters/oidc/pom.xml
+++ b/adapters/oidc/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../pom.xmlKeycloak OIDC Client Adapter Modules
diff --git a/adapters/pom.xml b/adapters/pom.xml
index fac0534171c2..0be8c27596bf 100755
--- a/adapters/pom.xml
+++ b/adapters/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xmlKeycloak Adapters
diff --git a/adapters/saml/core-jakarta/pom.xml b/adapters/saml/core-jakarta/pom.xml
index 0d02b6f1ea13..a205b93579c6 100644
--- a/adapters/saml/core-jakarta/pom.xml
+++ b/adapters/saml/core-jakarta/pom.xml
@@ -6,7 +6,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml
diff --git a/adapters/saml/core-public/pom.xml b/adapters/saml/core-public/pom.xml
index a5e4e0aa3f9b..a7d5afe403f7 100755
--- a/adapters/saml/core-public/pom.xml
+++ b/adapters/saml/core-public/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml4.0.0
diff --git a/adapters/saml/core/pom.xml b/adapters/saml/core/pom.xml
index 49c5a82b806f..5fd465137e8d 100755
--- a/adapters/saml/core/pom.xml
+++ b/adapters/saml/core/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml4.0.0
diff --git a/adapters/saml/pom.xml b/adapters/saml/pom.xml
index b2e4ff88ea4a..454910b5ab60 100755
--- a/adapters/saml/pom.xml
+++ b/adapters/saml/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../pom.xmlKeycloak SAML Client Adapter Modules
diff --git a/adapters/saml/undertow/pom.xml b/adapters/saml/undertow/pom.xml
index b4d5480a78c1..ed193eadb8a1 100755
--- a/adapters/saml/undertow/pom.xml
+++ b/adapters/saml/undertow/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml4.0.0
diff --git a/adapters/saml/wildfly-elytron-jakarta/pom.xml b/adapters/saml/wildfly-elytron-jakarta/pom.xml
index b112bc08e269..b674435dd25a 100755
--- a/adapters/saml/wildfly-elytron-jakarta/pom.xml
+++ b/adapters/saml/wildfly-elytron-jakarta/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml4.0.0
diff --git a/adapters/saml/wildfly-elytron/pom.xml b/adapters/saml/wildfly-elytron/pom.xml
index f9c891061431..efff325b7aed 100755
--- a/adapters/saml/wildfly-elytron/pom.xml
+++ b/adapters/saml/wildfly-elytron/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml4.0.0
diff --git a/adapters/saml/wildfly/pom.xml b/adapters/saml/wildfly/pom.xml
index 02f49d830727..31dbdbe093f3 100755
--- a/adapters/saml/wildfly/pom.xml
+++ b/adapters/saml/wildfly/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xmlKeycloak SAML Wildfly Integration
diff --git a/adapters/saml/wildfly/wildfly-jakarta-subsystem/pom.xml b/adapters/saml/wildfly/wildfly-jakarta-subsystem/pom.xml
index 640531d7eba2..bc9f9161705b 100755
--- a/adapters/saml/wildfly/wildfly-jakarta-subsystem/pom.xml
+++ b/adapters/saml/wildfly/wildfly-jakarta-subsystem/pom.xml
@@ -21,7 +21,7 @@
org.keycloakkeycloak-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../../../../pom.xml
diff --git a/adapters/saml/wildfly/wildfly-subsystem/pom.xml b/adapters/saml/wildfly/wildfly-subsystem/pom.xml
index 90b38b0f7462..0c25f77eb52b 100755
--- a/adapters/saml/wildfly/wildfly-subsystem/pom.xml
+++ b/adapters/saml/wildfly/wildfly-subsystem/pom.xml
@@ -21,7 +21,7 @@
org.keycloakkeycloak-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../../../../pom.xml
diff --git a/adapters/spi/adapter-spi/pom.xml b/adapters/spi/adapter-spi/pom.xml
index aab344d284be..699c02678144 100755
--- a/adapters/spi/adapter-spi/pom.xml
+++ b/adapters/spi/adapter-spi/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml4.0.0
diff --git a/adapters/spi/jboss-adapter-core/pom.xml b/adapters/spi/jboss-adapter-core/pom.xml
index a184ae5e0d8a..edb4b56a5638 100755
--- a/adapters/spi/jboss-adapter-core/pom.xml
+++ b/adapters/spi/jboss-adapter-core/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml4.0.0
diff --git a/adapters/spi/pom.xml b/adapters/spi/pom.xml
index 64b28a099a5b..1294f08517c8 100755
--- a/adapters/spi/pom.xml
+++ b/adapters/spi/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../pom.xmlKeycloak Client Adapter SPI Modules
diff --git a/adapters/spi/undertow-adapter-spi/pom.xml b/adapters/spi/undertow-adapter-spi/pom.xml
index 884b93c77400..5aaf36dea5fd 100755
--- a/adapters/spi/undertow-adapter-spi/pom.xml
+++ b/adapters/spi/undertow-adapter-spi/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xml4.0.0
diff --git a/authz/client/pom.xml b/authz/client/pom.xml
index 342294ebed29..0ad73cab0fa6 100644
--- a/authz/client/pom.xml
+++ b/authz/client/pom.xml
@@ -7,7 +7,7 @@
org.keycloakkeycloak-authz-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/authz/policy-enforcer/pom.xml b/authz/policy-enforcer/pom.xml
index 096833adf698..1436bb1cd63a 100755
--- a/authz/policy-enforcer/pom.xml
+++ b/authz/policy-enforcer/pom.xml
@@ -21,7 +21,7 @@
org.keycloakkeycloak-authz-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml4.0.0
diff --git a/authz/policy/common/pom.xml b/authz/policy/common/pom.xml
index ec7c0f5ddc4d..6f39cfddff1d 100644
--- a/authz/policy/common/pom.xml
+++ b/authz/policy/common/pom.xml
@@ -25,7 +25,7 @@
org.keycloakkeycloak-authz-provider-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/authz/policy/common/src/main/java/org/keycloak/authorization/policy/provider/role/RolePolicyProvider.java b/authz/policy/common/src/main/java/org/keycloak/authorization/policy/provider/role/RolePolicyProvider.java
index 499acba9a838..43f0eaf91cde 100644
--- a/authz/policy/common/src/main/java/org/keycloak/authorization/policy/provider/role/RolePolicyProvider.java
+++ b/authz/policy/common/src/main/java/org/keycloak/authorization/policy/provider/role/RolePolicyProvider.java
@@ -22,6 +22,7 @@
import org.jboss.logging.Logger;
import org.keycloak.authorization.AuthorizationProvider;
+import org.keycloak.authorization.attribute.Attributes.Entry;
import org.keycloak.authorization.identity.Identity;
import org.keycloak.authorization.model.Policy;
import org.keycloak.authorization.policy.evaluation.Evaluation;
@@ -31,6 +32,8 @@
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserModel;
+import org.keycloak.models.UserProvider;
+import org.keycloak.representations.JsonWebToken;
import org.keycloak.representations.idm.authorization.RolePolicyRepresentation;
/**
@@ -74,9 +77,8 @@ public void evaluate(Evaluation evaluation) {
private boolean hasRole(Identity identity, RoleModel role, RealmModel realm, AuthorizationProvider authorizationProvider, boolean fetchRoles) {
if (fetchRoles) {
- KeycloakSession session = authorizationProvider.getKeycloakSession();
- UserModel user = session.users().getUserById(realm, identity.getId());
- return user.hasRole(role);
+ UserModel subject = getSubject(identity, realm, authorizationProvider);
+ return subject != null && subject.hasRole(role);
}
String roleName = role.getName();
if (role.isClientRole()) {
@@ -86,8 +88,26 @@ private boolean hasRole(Identity identity, RoleModel role, RealmModel realm, Aut
return identity.hasRealmRole(roleName);
}
+ private UserModel getSubject(Identity identity, RealmModel realm, AuthorizationProvider authorizationProvider) {
+ KeycloakSession session = authorizationProvider.getKeycloakSession();
+ UserProvider users = session.users();
+ UserModel user = users.getUserById(realm, identity.getId());
+
+ if (user == null) {
+ Entry sub = identity.getAttributes().getValue(JsonWebToken.SUBJECT);
+
+ if (sub == null || sub.isEmpty()) {
+ return null;
+ }
+
+ return users.getUserById(realm, sub.asString(0));
+ }
+
+ return user;
+ }
+
@Override
public void close() {
}
-}
\ No newline at end of file
+}
diff --git a/authz/policy/pom.xml b/authz/policy/pom.xml
index 48091592faad..6b5c894387bd 100644
--- a/authz/policy/pom.xml
+++ b/authz/policy/pom.xml
@@ -7,7 +7,7 @@
org.keycloakkeycloak-authz-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/authz/pom.xml b/authz/pom.xml
index 31224da50309..2d5382f647b0 100644
--- a/authz/pom.xml
+++ b/authz/pom.xml
@@ -7,7 +7,7 @@
org.keycloakkeycloak-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/boms/adapter/pom.xml b/boms/adapter/pom.xml
index d4953f21a65b..83a8d343d595 100644
--- a/boms/adapter/pom.xml
+++ b/boms/adapter/pom.xml
@@ -22,7 +22,7 @@
org.keycloak.bomkeycloak-bom-parent
- 999.0.0-SNAPSHOT
+ 25.0.4org.keycloak.bom
diff --git a/boms/misc/pom.xml b/boms/misc/pom.xml
index 7305aa3bb610..d49dff82328e 100644
--- a/boms/misc/pom.xml
+++ b/boms/misc/pom.xml
@@ -22,7 +22,7 @@
org.keycloak.bomkeycloak-bom-parent
- 999.0.0-SNAPSHOT
+ 25.0.4org.keycloak.bom
diff --git a/boms/pom.xml b/boms/pom.xml
index c67416d7afa0..085eede22c98 100644
--- a/boms/pom.xml
+++ b/boms/pom.xml
@@ -27,7 +27,7 @@
org.keycloak.bomkeycloak-bom-parent
- 999.0.0-SNAPSHOT
+ 25.0.4pom
diff --git a/boms/spi/pom.xml b/boms/spi/pom.xml
index 339c18bb3033..77dd41129ce1 100644
--- a/boms/spi/pom.xml
+++ b/boms/spi/pom.xml
@@ -23,7 +23,7 @@
org.keycloak.bomkeycloak-bom-parent
- 999.0.0-SNAPSHOT
+ 25.0.4org.keycloak.bom
diff --git a/common/pom.xml b/common/pom.xml
index 5f644cbc0af2..43879378b4f8 100755
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml4.0.0
diff --git a/common/src/main/java/org/keycloak/common/util/Environment.java b/common/src/main/java/org/keycloak/common/util/Environment.java
index 02aa6da79d00..f491eed5d305 100644
--- a/common/src/main/java/org/keycloak/common/util/Environment.java
+++ b/common/src/main/java/org/keycloak/common/util/Environment.java
@@ -29,6 +29,10 @@ public class Environment {
public static final int DEFAULT_JBOSS_AS_STARTUP_TIMEOUT = 300;
+ public static final String PROFILE = "kc.profile";
+ public static final String ENV_PROFILE = "KC_PROFILE";
+ public static final String DEV_PROFILE_VALUE = "dev";
+
public static int getServerStartupTimeout() {
String timeout = System.getProperty("jboss.as.management.blocking.timeout");
if (timeout != null) {
@@ -57,4 +61,17 @@ public static boolean isJavaInFipsMode() {
return false;
}
+ public static boolean isDevMode() {
+ return DEV_PROFILE_VALUE.equalsIgnoreCase(getProfile());
+ }
+
+ public static String getProfile() {
+ String profile = System.getProperty(PROFILE);
+
+ if (profile != null) {
+ return profile;
+ }
+
+ return System.getenv(ENV_PROFILE);
+ }
}
diff --git a/core/pom.xml b/core/pom.xml
index c057066ccc49..87ba75f5d722 100755
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml4.0.0
@@ -54,6 +54,10 @@
com.fasterxml.jackson.corejackson-databind
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jdk8
+ org.jboss.loggingjboss-logging
diff --git a/core/src/main/java/org/keycloak/representations/IDToken.java b/core/src/main/java/org/keycloak/representations/IDToken.java
index 33c54b70ef37..8f7f25958fb7 100755
--- a/core/src/main/java/org/keycloak/representations/IDToken.java
+++ b/core/src/main/java/org/keycloak/representations/IDToken.java
@@ -140,7 +140,7 @@ public class IDToken extends JsonWebToken {
// Financial API - Part 2: Read and Write API Security Profile
// http://openid.net/specs/openid-financial-api-part-2.html#authorization-server
@JsonProperty(S_HASH)
- protected String stateHash;
+ protected String stateHash;
public String getNonce() {
return nonce;
@@ -172,7 +172,7 @@ public void setSessionId(String sessionId) {
@Deprecated
@JsonIgnore
public String getSessionState() {
- return sessionId;
+ return getSessionId();
}
public String getAccessTokenHash() {
diff --git a/core/src/main/java/org/keycloak/representations/RefreshToken.java b/core/src/main/java/org/keycloak/representations/RefreshToken.java
index b7c0f77b1355..2f6b5a1b75ff 100755
--- a/core/src/main/java/org/keycloak/representations/RefreshToken.java
+++ b/core/src/main/java/org/keycloak/representations/RefreshToken.java
@@ -53,4 +53,11 @@ public RefreshToken(AccessToken token) {
public TokenCategory getCategory() {
return TokenCategory.INTERNAL;
}
+
+ @Override
+ public String getSessionId() {
+ String sessionId = super.getSessionId();
+ // Fallback as offline tokens created in Keycloak 14 or earlier have only the "session_state" claim, but not "sid"
+ return sessionId != null ? sessionId : (String) getOtherClaims().get(IDToken.SESSION_STATE);
+ }
}
diff --git a/core/src/main/java/org/keycloak/representations/idm/TestLdapConnectionRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/TestLdapConnectionRepresentation.java
index fbf75feedb07..715ac6f65907 100644
--- a/core/src/main/java/org/keycloak/representations/idm/TestLdapConnectionRepresentation.java
+++ b/core/src/main/java/org/keycloak/representations/idm/TestLdapConnectionRepresentation.java
@@ -16,10 +16,15 @@ public TestLdapConnectionRepresentation() {
}
public TestLdapConnectionRepresentation(String action, String connectionUrl, String bindDn, String bindCredential, String useTruststoreSpi, String connectionTimeout) {
- this(action, connectionUrl, bindDn, bindCredential, useTruststoreSpi, connectionTimeout, null, null);
+ this(action, connectionUrl, bindDn, bindCredential, useTruststoreSpi, connectionTimeout, null, null, null);
}
public TestLdapConnectionRepresentation(String action, String connectionUrl, String bindDn, String bindCredential, String useTruststoreSpi, String connectionTimeout, String startTls, String authType) {
+ this(action, connectionUrl, bindDn, bindCredential, useTruststoreSpi, connectionTimeout, startTls, authType, null);
+ }
+
+ public TestLdapConnectionRepresentation(String action, String connectionUrl, String bindDn, String bindCredential,
+ String useTruststoreSpi, String connectionTimeout, String startTls, String authType, String componentId) {
this.action = action;
this.connectionUrl = connectionUrl;
this.bindDn = bindDn;
@@ -28,6 +33,7 @@ public TestLdapConnectionRepresentation(String action, String connectionUrl, Str
this.connectionTimeout = connectionTimeout;
this.startTls = startTls;
this.authType = authType;
+ this.componentId = componentId;
}
public String getAction() {
diff --git a/core/src/main/java/org/keycloak/util/JsonSerialization.java b/core/src/main/java/org/keycloak/util/JsonSerialization.java
index e321d11151f5..e082ac54ba20 100755
--- a/core/src/main/java/org/keycloak/util/JsonSerialization.java
+++ b/core/src/main/java/org/keycloak/util/JsonSerialization.java
@@ -24,6 +24,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import java.io.IOException;
import java.io.InputStream;
@@ -41,6 +42,7 @@ public class JsonSerialization {
public static final ObjectMapper sysPropertiesAwareMapper = new ObjectMapper(new SystemPropertiesJsonParserFactory());
static {
+ mapper.registerModule(new Jdk8Module());
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
prettyMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
diff --git a/crypto/default/pom.xml b/crypto/default/pom.xml
index 2b0cf1fb234f..66a1f2f2a4d5 100644
--- a/crypto/default/pom.xml
+++ b/crypto/default/pom.xml
@@ -21,7 +21,7 @@
keycloak-crypto-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml4.0.0
diff --git a/crypto/elytron/pom.xml b/crypto/elytron/pom.xml
index 51b7d6dbeac7..d96d32e9685c 100644
--- a/crypto/elytron/pom.xml
+++ b/crypto/elytron/pom.xml
@@ -21,7 +21,7 @@
keycloak-crypto-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml4.0.0
diff --git a/crypto/fips1402/pom.xml b/crypto/fips1402/pom.xml
index 7691a0f12880..43dcb162a3b6 100644
--- a/crypto/fips1402/pom.xml
+++ b/crypto/fips1402/pom.xml
@@ -21,7 +21,7 @@
keycloak-crypto-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml4.0.0
diff --git a/crypto/pom.xml b/crypto/pom.xml
index de2f6d339653..284914af1487 100644
--- a/crypto/pom.xml
+++ b/crypto/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xmlKeycloak Crypto Parent
diff --git a/dependencies/pom.xml b/dependencies/pom.xml
index 019146bf55c3..be495901ac63 100755
--- a/dependencies/pom.xml
+++ b/dependencies/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.44.0.0
diff --git a/dependencies/server-all/pom.xml b/dependencies/server-all/pom.xml
index c25827c2a373..9edc17f99b74 100755
--- a/dependencies/server-all/pom.xml
+++ b/dependencies/server-all/pom.xml
@@ -21,7 +21,7 @@
keycloak-dependencies-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.44.0.0
diff --git a/dependencies/server-min/pom.xml b/dependencies/server-min/pom.xml
index 8749833cd6fd..41d0b3368ba7 100755
--- a/dependencies/server-min/pom.xml
+++ b/dependencies/server-min/pom.xml
@@ -21,7 +21,7 @@
keycloak-dependencies-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.44.0.0
diff --git a/distribution/api-docs-dist/pom.xml b/distribution/api-docs-dist/pom.xml
index d2d67f406042..1197c8c86221 100755
--- a/distribution/api-docs-dist/pom.xml
+++ b/distribution/api-docs-dist/pom.xml
@@ -21,7 +21,7 @@
keycloak-distribution-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4keycloak-api-docs-dist
diff --git a/distribution/downloads/pom.xml b/distribution/downloads/pom.xml
index 3651b049e9b5..5f78ac36d30d 100755
--- a/distribution/downloads/pom.xml
+++ b/distribution/downloads/pom.xml
@@ -21,7 +21,7 @@
keycloak-distribution-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4keycloak-dist-downloads
diff --git a/distribution/feature-packs/adapter-feature-pack/pom.xml b/distribution/feature-packs/adapter-feature-pack/pom.xml
index e36605f0599f..808bdd4bb300 100755
--- a/distribution/feature-packs/adapter-feature-pack/pom.xml
+++ b/distribution/feature-packs/adapter-feature-pack/pom.xml
@@ -19,7 +19,7 @@
org.keycloakfeature-packs-parent
- 999.0.0-SNAPSHOT
+ 25.0.4
diff --git a/distribution/feature-packs/pom.xml b/distribution/feature-packs/pom.xml
index 4c66eecf261f..265fa942b422 100644
--- a/distribution/feature-packs/pom.xml
+++ b/distribution/feature-packs/pom.xml
@@ -20,7 +20,7 @@
keycloak-distribution-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4Feature Pack Builds
diff --git a/distribution/galleon-feature-packs/pom.xml b/distribution/galleon-feature-packs/pom.xml
index fc16e8511026..d81d562ed784 100644
--- a/distribution/galleon-feature-packs/pom.xml
+++ b/distribution/galleon-feature-packs/pom.xml
@@ -20,7 +20,7 @@
keycloak-distribution-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4Galleon Feature Pack Builds
diff --git a/distribution/galleon-feature-packs/saml-adapter-galleon-pack-layer-metadata-tests/pom.xml b/distribution/galleon-feature-packs/saml-adapter-galleon-pack-layer-metadata-tests/pom.xml
index d9d706e53e88..6608c79ff9a8 100644
--- a/distribution/galleon-feature-packs/saml-adapter-galleon-pack-layer-metadata-tests/pom.xml
+++ b/distribution/galleon-feature-packs/saml-adapter-galleon-pack-layer-metadata-tests/pom.xml
@@ -19,7 +19,7 @@
org.keycloakgalleon-feature-packs-parent
- 999.0.0-SNAPSHOT
+ 25.0.44.0.0
diff --git a/distribution/galleon-feature-packs/saml-adapter-galleon-pack/pom.xml b/distribution/galleon-feature-packs/saml-adapter-galleon-pack/pom.xml
index 05f1758387fc..e2bb4bb481ab 100644
--- a/distribution/galleon-feature-packs/saml-adapter-galleon-pack/pom.xml
+++ b/distribution/galleon-feature-packs/saml-adapter-galleon-pack/pom.xml
@@ -19,7 +19,7 @@
org.keycloakgalleon-feature-packs-parent
- 999.0.0-SNAPSHOT
+ 25.0.44.0.0
diff --git a/distribution/licenses-common/download-license-files.sh b/distribution/licenses-common/download-license-files.sh
index 1b3089043ec9..9e9efddf6021 100755
--- a/distribution/licenses-common/download-license-files.sh
+++ b/distribution/licenses-common/download-license-files.sh
@@ -64,7 +64,7 @@ do
# Windows won't like it if : is used as a separator
filename="$groupid,$artifactid,$version,$name.txt"
echo "$filename"
- curl -LsS -o "$output_dir/$filename" "$url"
+ curl -LfsS -o "$output_dir/$filename" "$url"
done
xmlstarlet sel -T -t -m "/licenseSummary/others/other/licenses/license" -v "../../description/text()" -o $'\t' -v "name/text()" -o $'\t' -v "url/text()" --nl "$xml" | \
@@ -73,7 +73,7 @@ do
# Windows won't like it if : is used as a separator
filename="$description,$name.txt"
echo "$filename"
- curl -LsS -o "$output_dir/$filename" "$url"
+ curl -LfsS -o "$output_dir/$filename" "$url"
done
echo "==> Normalizing license line endings" >&2
diff --git a/distribution/licenses-common/pom.xml b/distribution/licenses-common/pom.xml
index bf615a63ee6f..770433707118 100644
--- a/distribution/licenses-common/pom.xml
+++ b/distribution/licenses-common/pom.xml
@@ -20,7 +20,7 @@
keycloak-distribution-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4keycloak-distribution-licenses-common
diff --git a/distribution/maven-plugins/licenses-processor/pom.xml b/distribution/maven-plugins/licenses-processor/pom.xml
index 547d24d96374..e6319d606f40 100644
--- a/distribution/maven-plugins/licenses-processor/pom.xml
+++ b/distribution/maven-plugins/licenses-processor/pom.xml
@@ -20,7 +20,7 @@
keycloak-distribution-maven-plugins-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4keycloak-distribution-licenses-maven-plugin
diff --git a/distribution/maven-plugins/pom.xml b/distribution/maven-plugins/pom.xml
index 10e04448b091..7ec5fe91b016 100644
--- a/distribution/maven-plugins/pom.xml
+++ b/distribution/maven-plugins/pom.xml
@@ -20,7 +20,7 @@
keycloak-distribution-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4keycloak-distribution-maven-plugins-parent
diff --git a/distribution/pom.xml b/distribution/pom.xml
index af0b61b24dd4..1f125538e4cb 100755
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/distribution/saml-adapters/pom.xml b/distribution/saml-adapters/pom.xml
index e0bf923961d4..ea6218fe4f96 100755
--- a/distribution/saml-adapters/pom.xml
+++ b/distribution/saml-adapters/pom.xml
@@ -20,7 +20,7 @@
keycloak-distribution-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4SAML Adapters Distribution Parent
diff --git a/distribution/saml-adapters/wildfly-adapter/pom.xml b/distribution/saml-adapters/wildfly-adapter/pom.xml
index ab52d865dab5..7ccb48f7a76e 100755
--- a/distribution/saml-adapters/wildfly-adapter/pom.xml
+++ b/distribution/saml-adapters/wildfly-adapter/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../pom.xmlKeycloak Wildfly SAML Adapter
diff --git a/distribution/saml-adapters/wildfly-adapter/wildfly-adapter-jakarta-zip/pom.xml b/distribution/saml-adapters/wildfly-adapter/wildfly-adapter-jakarta-zip/pom.xml
index 794389bd1605..14c4feaae40e 100755
--- a/distribution/saml-adapters/wildfly-adapter/wildfly-adapter-jakarta-zip/pom.xml
+++ b/distribution/saml-adapters/wildfly-adapter/wildfly-adapter-jakarta-zip/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../../pom.xml
diff --git a/distribution/saml-adapters/wildfly-adapter/wildfly-adapter-zip/pom.xml b/distribution/saml-adapters/wildfly-adapter/wildfly-adapter-zip/pom.xml
index d503885a0fb5..7b5a63e6bd7b 100755
--- a/distribution/saml-adapters/wildfly-adapter/wildfly-adapter-zip/pom.xml
+++ b/distribution/saml-adapters/wildfly-adapter/wildfly-adapter-zip/pom.xml
@@ -21,7 +21,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../../pom.xml
diff --git a/distribution/saml-adapters/wildfly-adapter/wildfly-jakarta-modules/pom.xml b/distribution/saml-adapters/wildfly-adapter/wildfly-jakarta-modules/pom.xml
index 634ddcbee246..836c062353ce 100755
--- a/distribution/saml-adapters/wildfly-adapter/wildfly-jakarta-modules/pom.xml
+++ b/distribution/saml-adapters/wildfly-adapter/wildfly-jakarta-modules/pom.xml
@@ -25,7 +25,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../../pom.xml
diff --git a/distribution/saml-adapters/wildfly-adapter/wildfly-modules/pom.xml b/distribution/saml-adapters/wildfly-adapter/wildfly-modules/pom.xml
index 68cc6b70703f..f7aae1fb5b08 100755
--- a/distribution/saml-adapters/wildfly-adapter/wildfly-modules/pom.xml
+++ b/distribution/saml-adapters/wildfly-adapter/wildfly-modules/pom.xml
@@ -25,7 +25,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../../../pom.xml
diff --git a/docs/documentation/aggregation/pom.xml b/docs/documentation/aggregation/pom.xml
index af92b7cddec8..ee628de5de61 100644
--- a/docs/documentation/aggregation/pom.xml
+++ b/docs/documentation/aggregation/pom.xml
@@ -5,7 +5,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/api_documentation/pom.xml b/docs/documentation/api_documentation/pom.xml
index 580cefbb335e..dccba8ccc384 100644
--- a/docs/documentation/api_documentation/pom.xml
+++ b/docs/documentation/api_documentation/pom.xml
@@ -5,7 +5,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/api_documentation/topics/overview.adoc b/docs/documentation/api_documentation/topics/overview.adoc
index a06996fbf7b3..76616bdfc9fc 100644
--- a/docs/documentation/api_documentation/topics/overview.adoc
+++ b/docs/documentation/api_documentation/topics/overview.adoc
@@ -1,6 +1,4 @@
-include::templates/making-open-source-more-inclusive.adoc[]
-
== {project_name} API Documentation
=== JavaDocs Documentation
diff --git a/docs/documentation/authorization_services/pom.xml b/docs/documentation/authorization_services/pom.xml
index 6e1042aa8410..4341b45faa16 100644
--- a/docs/documentation/authorization_services/pom.xml
+++ b/docs/documentation/authorization_services/pom.xml
@@ -5,7 +5,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/dist/pom.xml b/docs/documentation/dist/pom.xml
index 7ae91bdb25a5..0985b0156c5e 100644
--- a/docs/documentation/dist/pom.xml
+++ b/docs/documentation/dist/pom.xml
@@ -5,7 +5,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/header-maven-plugin/pom.xml b/docs/documentation/header-maven-plugin/pom.xml
index ff6ef9310a40..d7b9c3e418fd 100644
--- a/docs/documentation/header-maven-plugin/pom.xml
+++ b/docs/documentation/header-maven-plugin/pom.xml
@@ -5,12 +5,12 @@
documentation-parentorg.keycloak.documentation
- 999.0.0-SNAPSHOT
+ 25.0.4org.keycloak.documentationheader-maven-plugin
- 999.0.0-SNAPSHOT
+ 25.0.4maven-plugingithub-maven-plugin
diff --git a/docs/documentation/pom.xml b/docs/documentation/pom.xml
index d228d63f1adb..35ab6cd714e3 100644
--- a/docs/documentation/pom.xml
+++ b/docs/documentation/pom.xml
@@ -5,14 +5,14 @@
keycloak-docs-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xmlKeycloak Documentation Parentorg.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4pom
diff --git a/docs/documentation/release_notes/pom.xml b/docs/documentation/release_notes/pom.xml
index 57d62bebae50..98f1c456fa02 100644
--- a/docs/documentation/release_notes/pom.xml
+++ b/docs/documentation/release_notes/pom.xml
@@ -5,7 +5,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/release_notes/topics/25_0_0.adoc b/docs/documentation/release_notes/topics/25_0_0.adoc
index 48676f830632..0a38eae14e5c 100644
--- a/docs/documentation/release_notes/topics/25_0_0.adoc
+++ b/docs/documentation/release_notes/topics/25_0_0.adoc
@@ -59,13 +59,13 @@ For information on how to migrate, see the link:{upgradingguide_link}[{upgrading
= Persistent user sessions
Previous versions of {project_name} stored only offline user and offline client sessions in the databases.
-The new feature `persistent-user-session` stores online user sessions and online client sessions not only in memory, but also in the database.
+The new feature `persistent-user-sessions` stores online user sessions and online client sessions not only in memory, but also in the database.
This will allow a user to stay logged in even if all instances of {project_name} are restarted or upgraded.
The feature is a preview feature and disabled by default. To use it, add the following to your build command:
----
-bin/kc.sh build --features=persistent-user-session ...
+bin/kc.sh build --features=persistent-user-sessions ...
----
For more details see the https://www.keycloak.org/server/features[Enabling and disabling features] {section}.
@@ -244,4 +244,4 @@ This remaining work is mainly about preparing the feature for production deploym
on the feedback we get until the next major release, we might eventually accept additional capabilities and add more value to
the feature, without compromising its roadmap.
-For more details, see link:{adminguide_link}#_managing_organizations_[{adminguide_name}].
+For more details, see link:{adminguide_link}#_managing_organizations[{adminguide_name}].
diff --git a/docs/documentation/securing_apps/pom.xml b/docs/documentation/securing_apps/pom.xml
index 6d8dce060ebe..5f7183dfe529 100644
--- a/docs/documentation/securing_apps/pom.xml
+++ b/docs/documentation/securing_apps/pom.xml
@@ -5,7 +5,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/securing_apps/topics/saml/java/logout.adoc b/docs/documentation/securing_apps/topics/saml/java/logout.adoc
index 15166c52238b..7ba190d5b3f0 100644
--- a/docs/documentation/securing_apps/topics/saml/java/logout.adoc
+++ b/docs/documentation/securing_apps/topics/saml/java/logout.adoc
@@ -64,7 +64,7 @@ share HTTP sessions).
To cover this case, the SAML session cache described <<_saml_logout_in_cluster,above>> needs to be replicated
not only within individual clusters but across all the data centers for example
-https://access.redhat.com/documentation/en-us/red_hat_data_grid/6.6/html/administration_and_configuration_guide/chap-externalize_sessions#Externalize_HTTP_Session_from_JBoss_EAP_6.x_to_JBoss_Data_Grid[via standalone Infinispan/JDG server]:
+https://docs.redhat.com/en/documentation/red_hat_data_grid/6.6/html/administration_and_configuration_guide/chap-externalize_sessions#Externalize_HTTP_Session_from_JBoss_EAP_6.x_to_JBoss_Data_Grid[via standalone Infinispan/JDG server]:
1. A cache has to be added to the standalone Infinispan/JDG server.
diff --git a/docs/documentation/server_admin/pom.xml b/docs/documentation/server_admin/pom.xml
index cb0c3fdffef2..4583d49bb82a 100644
--- a/docs/documentation/server_admin/pom.xml
+++ b/docs/documentation/server_admin/pom.xml
@@ -5,7 +5,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/server_admin/topics/assembly-managing-organizations.adoc b/docs/documentation/server_admin/topics/assembly-managing-organizations.adoc
index d6f077742b53..c8f32e7a8dab 100644
--- a/docs/documentation/server_admin/topics/assembly-managing-organizations.adoc
+++ b/docs/documentation/server_admin/topics/assembly-managing-organizations.adoc
@@ -1,5 +1,5 @@
[id="assembly-managing-organizations_{context}"]
-[[_managing_organizations_]]
+[[_managing_organizations]]
== Managing organizations
:tech_feature_name: Organizations
diff --git a/docs/documentation/server_admin/topics/authentication/kerberos.adoc b/docs/documentation/server_admin/topics/authentication/kerberos.adoc
index 84e255714e84..56a3a4114592 100644
--- a/docs/documentation/server_admin/topics/authentication/kerberos.adoc
+++ b/docs/documentation/server_admin/topics/authentication/kerberos.adoc
@@ -118,7 +118,7 @@ User profile information, such as first name, last name, and email, are not prov
==== Setup and configuration of client machines
-Client machines must have a Kerberos client and set up the `krb5.conf` as described <<_server_setup, above>>. The client machines must also enable SPNEGO login support in their browser. See link:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/configuring_applications_for_sso[configuring Firefox for Kerberos] if you are using the Firefox browser.
+Client machines must have a Kerberos client and set up the `krb5.conf` as described <<_server_setup, above>>. The client machines must also enable SPNEGO login support in their browser. See link:https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/system-level_authentication_guide/configuring_applications_for_sso[configuring Firefox for Kerberos] if you are using the Firefox browser.
The `.mydomain.org` URI must be in the `network.negotiate-auth.trusted-uris` configuration option.
@@ -168,7 +168,7 @@ Configure `forwardable` Kerberos tickets in `krb5.conf` file and add support for
[WARNING]
====
-Credential delegation has security implications, so use it only if necessary and only with HTTPS. See https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/configuring_applications_for_sso[this article] for more details and an example.
+Credential delegation has security implications, so use it only if necessary and only with HTTPS. See https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/system-level_authentication_guide/configuring_applications_for_sso[this article] for more details and an example.
====
==== Cross-realm trust
diff --git a/docs/documentation/server_admin/topics/clients/con-client-scopes.adoc b/docs/documentation/server_admin/topics/clients/con-client-scopes.adoc
index ca25d92445cb..28ff3911eb04 100644
--- a/docs/documentation/server_admin/topics/clients/con-client-scopes.adoc
+++ b/docs/documentation/server_admin/topics/clients/con-client-scopes.adoc
@@ -29,7 +29,7 @@ This scope is also not defined in the OpenID Connect specification and not added
+
** *microprofile-jwt*
+
-This scope handles claims defined in the https://wiki.eclipse.org/MicroProfile/JWT_Auth[MicroProfile/JWT Auth Specification]. This scope defines a user property mapper for the *upn* claim and a realm role mapper for the *groups* claim. These mappers can be changed so different properties can be used to create the MicroProfile/JWT specific claims.
+This scope handles claims defined in the https://github.com/eclipse/microprofile/wiki/JWT_Auth[MicroProfile/JWT Auth Specification]. This scope defines a user property mapper for the *upn* claim and a realm role mapper for the *groups* claim. These mappers can be changed so different properties can be used to create the MicroProfile/JWT specific claims.
+
** *offline_access*
+
diff --git a/docs/documentation/server_admin/topics/login-settings/update-email-workflow.adoc b/docs/documentation/server_admin/topics/login-settings/update-email-workflow.adoc
index 836fa6f4ce2c..c884bf12b668 100644
--- a/docs/documentation/server_admin/topics/login-settings/update-email-workflow.adoc
+++ b/docs/documentation/server_admin/topics/login-settings/update-email-workflow.adoc
@@ -6,7 +6,7 @@ With this workflow, users will have to use an UPDATE_EMAIL action to change thei
The action is associated with a single email input form. If the realm has email verification disabled, this action will allow to update the email without verification. If the realm has email verification enabled, the action will send an email update action token to the new email address without changing the account email. Only the action token triggering will complete the email update.
-Applications are able to send their users to the email update form by leveraging UPDATE_EMAIL as an AIA (Application Initiated Action).
+Applications are able to send their users to the email update form by leveraging UPDATE_EMAIL as an <>.
:tech_feature_name: UpdateEmail
:tech_feature_id: update-email
diff --git a/docs/documentation/server_admin/topics/sessions.adoc b/docs/documentation/server_admin/topics/sessions.adoc
index ab5e509d190c..768a4016ac7a 100644
--- a/docs/documentation/server_admin/topics/sessions.adoc
+++ b/docs/documentation/server_admin/topics/sessions.adoc
@@ -13,7 +13,7 @@ When users log into realms, {project_name} maintains a user session for each use
ifeval::[{project_community}==true]
By default, online user and online client sessions are only kept in memory, and will be lost if all {project_name} nodes are shut down for maintenance or during upgrades.
-If the feature `persistent-user-session` is enabled, {project_name} online user and online client sessions are saved to the database to persist them across restarts and upgrades.
+If the feature `persistent-user-sessions` is enabled, {project_name} online user and online client sessions are saved to the database to persist them across restarts and upgrades.
See https://www.keycloak.org/server/caching[Configuring distributed caches] on how to configure this.
endif::[]
diff --git a/docs/documentation/server_admin/topics/sessions/offline.adoc b/docs/documentation/server_admin/topics/sessions/offline.adoc
index f7c5b1e9695b..74fced31f74d 100644
--- a/docs/documentation/server_admin/topics/sessions/offline.adoc
+++ b/docs/documentation/server_admin/topics/sessions/offline.adoc
@@ -10,7 +10,7 @@ The client application is responsible for persisting the offline token in storag
The difference between a refresh token and an offline token is that an offline token never expires and is not subject to the `SSO Session Idle` timeout and `SSO Session Max` lifespan. The offline token is valid after a user logout or server restart. You must use the offline token for a refresh token action at least once per thirty days or for the value of the <<_offline-session-idle, Offline Session Idle>>.
-If you enable <<_offline-session-max-limited, Offline Session Max Limited>>, offline tokens expire after 60 days even if you use the offline token for a refresh token action. You can change this value, <<_offline-session-max, Offline Session Max>>, in the Admin Console.
+If you enable <<_offline-session-max-limited, Offline Session Max Limited>>, offline tokens expire after 60 days even if you use the offline token for a refresh token action. You can change this value, <<_offline-session-max, Offline Session Max>>, in the Admin Console.
When using offline access, client idle and max timeouts can be overridden at the <<_client_advanced_settings_oidc,client level>>. The options *Client Offline Session Idle* and *Client Offline Session Max*, in the client *Advanced Settings* tab, allow you to have a shorter offline timeouts for a specific application. Note that client session values also control the refresh token expiration but they never affect the global offline user SSO session. The option *Client Offline Session Max* is only evaluated in the client if <<_offline-session-max-limited, Offline Session Max Limited>> is *Enabled* at the realm level.
@@ -26,7 +26,7 @@ Offline sessions are besides the Infinispan caches stored also in the database.
To reduce memory requirements, we introduced a configuration option to shorten lifespan for imported offline sessions. Such sessions will be evicted from the Infinispan caches after the specified lifespan, but still available in the database. This will lower memory consumption, especially for deployments with a large number of offline sessions. Currently, the offline session lifespan override is disabled by default.
ifeval::[{project_community}==true]
-This override is only available if the feature `persistent-user-session` is disabled.
+This override is only available if the feature `persistent-user-sessions` is disabled.
endif::[]
To specify the lifespan override for offline user sessions, start {project_name} server with the following parameter:
@@ -34,7 +34,7 @@ To specify the lifespan override for offline user sessions, start {project_name}
[source,bash]
----
--spi-user-sessions-infinispan-offline-session-cache-entry-lifespan-override=
-----
+----
Similarly for offline client sessions:
@@ -44,7 +44,7 @@ Similarly for offline client sessions:
----
ifeval::[{project_community}==true]
-If the feature `persistent-user-session` is enabled, {project_name} will limit its internal cache for offline user and offline client sessions to 10000 entries by default, which will reduce the overall memory usage for offline sessions.
+If the feature `persistent-user-sessions` is enabled, {project_name} will limit its internal cache for offline user and offline client sessions to 10000 entries by default, which will reduce the overall memory usage for offline sessions.
Items which are evicted from memory will be loaded on-demand from the database when needed.
To set different sizes for the caches, edit {project_name}'s cache config file to set a `++` for those caches.
endif::[]
diff --git a/docs/documentation/server_admin/topics/user-federation/sssd.adoc b/docs/documentation/server_admin/topics/user-federation/sssd.adoc
index 6e94e4ae98de..d7a1cac7bade 100644
--- a/docs/documentation/server_admin/topics/user-federation/sssd.adoc
+++ b/docs/documentation/server_admin/topics/user-federation/sssd.adoc
@@ -3,9 +3,9 @@
=== SSSD and FreeIPA Identity Management integration
-{project_name} includes the https://fedoraproject.org/wiki/Features/SSSD[System Security Services Daemon (SSSD)] plugin. SSSD is part of the Fedora and Red Hat Enterprise Linux (RHEL), and it provides access to multiple identities and authentication providers. SSSD also provides benefits such as failover and offline support. For more information, see https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/sssd[the Red Hat Enterprise Linux Identity Management documentation].
+{project_name} includes the https://fedoraproject.org/wiki/Features/SSSD[System Security Services Daemon (SSSD)] plugin. SSSD is part of the Fedora and Red Hat Enterprise Linux (RHEL), and it provides access to multiple identities and authentication providers. SSSD also provides benefits such as failover and offline support. For more information, see https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/system-level_authentication_guide/sssd[the Red Hat Enterprise Linux Identity Management documentation].
-SSSD integrates with the FreeIPA identity management (IdM) server, providing authentication and access control. With this integration, {project_name} can authenticate against privileged access management (PAM) services and retrieve user data from SSSD. For more information about using Red Hat Identity Management in Linux environments, see https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/linux_domain_identity_authentication_and_policy_guide/index[the Red Hat Enterprise Linux Identity Management documentation].
+SSSD integrates with the FreeIPA identity management (IdM) server, providing authentication and access control. With this integration, {project_name} can authenticate against privileged access management (PAM) services and retrieve user data from SSSD. For more information about using Red Hat Identity Management in Linux environments, see https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/linux_domain_identity_authentication_and_policy_guide/index[the Red Hat Enterprise Linux Identity Management documentation].
image:images/keycloak-sssd-freeipa-integration-overview.png[]
diff --git a/docs/documentation/server_admin/topics/users/con-aia.adoc b/docs/documentation/server_admin/topics/users/con-aia.adoc
index a2077b7b2db0..e2b6fa8f4abb 100644
--- a/docs/documentation/server_admin/topics/users/con-aia.adoc
+++ b/docs/documentation/server_admin/topics/users/con-aia.adoc
@@ -39,18 +39,35 @@ by checking the claims like `acr` in the tokens.
[id="con-aia-reauth_{context}"]
== Re-authentication during AIA
-In case the user is already authenticated due to an active SSO session, that user usually does not need to actively re-authenticate. However, if that user actively authenticated longer than five minutes ago,
+In case the user is already authenticated due to an active SSO session, that user usually does not need to actively re-authenticate. However, if that user actively authenticated longer than five minutes ago,
the client can still request re-authentication when some AIA is requested. Exceptions exist from this guideline as follows:
* The action `delete_account` will always require the user to actively re-authenticate
* The action `update_password` might require the user to actively re-authenticate according to the configured <>.
-In case the policy is not configured, it also defaults to five minutes.
+In case the policy is not configured, it is also possible to configure it on the required action itself in the <>
+when configuring the particular required action. If the policy is not configured in any of those places, it defaults to five minutes.
* If you want to use a shorter re-authentication, you can still use a parameter query parameter such as `max_age` with the specified shorter value or eventually `prompt=login`, which will always require user to
actively re-authenticate as described in the OIDC specification. Note that using `max_age` for a longer value than the default five minutes (or the one prescribed by password policy) is not supported.
The `max_age` can be currently used only to make the value shorter than the default five minutes.
+* If <<_step-up-flow,Step-up authentication>> is enabled and the action is to add or delete a credential, authentication is required with the level corresponding
+to the given credential. This requirement exists in case the user already has the credential of the particular level. For example, if `otp` and `webauthn` are configured in the authentication flow as 2nd-factor authenticators
+(both in the authentication flow at level 2) and the user already has a 2nd-factor credential (`otp` or `webauthn` in this case), the user is required to authenticate with an existing 2nd-factor credential to add another 2nd-level credential.
+In the same manner, deleting an existing 2nd-factor credential (`otp` or `webauthn` in this case), authentication with an existing 2nd-factor level credential is required. The requirement exists for security reasons.
+
+[id="con-aia-parameterized_{context}"]
+== Parameterized AIA
+
+Some AIA can require the parameter to be sent together with the action name. For instance, the `Delete Credential` action can be triggered only by AIA and it requires a parameter to be sent together with the name
+of the action, which points to the ID of the removed credential. So the URL for this example would be `kc_action=delete_credential:ce1008ac-f811-427f-825a-c0b878d1c24b`. In this case, the
+part after the colon character (`ce1008ac-f811-427f-825a-c0b878d1c24b`) contains the ID of the credential of the particular user, which is to be deleted. The `Delete Credential` action
+displays the confirmation screen where the user can confirm agreement to delete the credential.
+
+NOTE: The <<_account-service,{project_name} Account Console>> typically uses the `Delete Credential` action when deleting a 2nd-factor credential. You can check the Account Console for examples if you want
+to use this action directly from your own applications. However, relying on the Account Console is best instead of managing credentials from your own applications.
+
[id="con-aia-available-actions_{context}"]
== Available actions
diff --git a/docs/documentation/server_admin/topics/users/con-required-actions.adoc b/docs/documentation/server_admin/topics/users/con-required-actions.adoc
index c3cbf38f332a..ff6c33a99f6e 100644
--- a/docs/documentation/server_admin/topics/users/con-required-actions.adoc
+++ b/docs/documentation/server_admin/topics/users/con-required-actions.adoc
@@ -13,7 +13,7 @@ action can require the user to update the <> as long
The following are examples of required action types:
-Update Password::
+Update Password::
The user must change their password.
Configure OTP::
@@ -25,3 +25,7 @@ Verify Email::
Update Profile::
The user must update profile information, such as name, address, email, and phone number.
+NOTE: Some actions do not makes sense to be added to the user account directly. For example, the `Update User Locale` is a helper action to handle some localization related parameters. Another
+example is the `Delete Credential` action, which is supposed to be triggered as a <>. Regarding this one, if the administrator wants to delete the credential of some
+user, that administrator can do it directly in the Admin Console. The `Delete Credential` action is dedicated to be used for example by the <<_account-service,{project_name} Account Console>>.
+
diff --git a/docs/documentation/server_admin/topics/users/proc-enabling-recaptcha.adoc b/docs/documentation/server_admin/topics/users/proc-enabling-recaptcha.adoc
index 3334f3582dea..fd0fac0a338d 100644
--- a/docs/documentation/server_admin/topics/users/proc-enabling-recaptcha.adoc
+++ b/docs/documentation/server_admin/topics/users/proc-enabling-recaptcha.adoc
@@ -7,7 +7,7 @@
[role="_abstract"]
To safeguard registration against bots, {project_name} has integration with Google reCAPTCHA (see <>) and reCAPTCHA Enterprise (see <>).
-The default theme (`register.ftl`) supports both v2 (visible, checkbox-based) and v3 (score-based, invisible) reCAPTCHA (see https://cloud.google.com/recaptcha-enterprise/docs/choose-key-type[Choose the appropriate reCAPTCHA key type]).
+The default theme (`register.ftl`) supports both v2 (visible, checkbox-based) and v3 (score-based, invisible) reCAPTCHA (see https://cloud.google.com/recaptcha/docs/choose-key-type[Choose the appropriate reCAPTCHA key type]).
[[procedure_recaptcha]]
== Setting up Google reCAPTCHA
@@ -85,7 +85,7 @@ image:images/recaptcha-enterprise-config.png[]
.. Enter the *Recaptcha Site Key* generated at the beginning of the procedure.
.. Enter the *Recaptcha API Key* generated at the beginning of the procedure.
.. Toggle **reCAPTCHA v3** according to your Site Key type: on for score-based reCAPTCHA (v3), off for challenge reCAPTCHA (v2).
-.. (Optional) Customize the *Min. Score Threshold* as you see fit. Set it to the minimum score, between 0.0 and 1.0, that a user should achieve on reCAPTCHA to be allowed to register. See https://cloud.google.com/recaptcha-enterprise/docs/interpret-assessment-website#interpret_scores[interpret scores].
+.. (Optional) Customize the *Min. Score Threshold* as you see fit. Set it to the minimum score, between 0.0 and 1.0, that a user should achieve on reCAPTCHA to be allowed to register. See https://cloud.google.com/recaptcha/docs/interpret-assessment-website#interpret_scores[interpret scores].
.. (Optional) Toggle *Use recaptcha.net* to use `www.recatcha.net` instead of `www.google.com` domain for cookies. See https://developers.google.com/recaptcha/docs/faq[reCAPTCHA faq] for more information.
. Authorize Google to use the registration page as an iframe. See the last steps of <> for a detailed procedure.
diff --git a/docs/documentation/server_development/pom.xml b/docs/documentation/server_development/pom.xml
index 6e0ec2e820c6..8aaa9afd3309 100644
--- a/docs/documentation/server_development/pom.xml
+++ b/docs/documentation/server_development/pom.xml
@@ -5,7 +5,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/tests/pom.xml b/docs/documentation/tests/pom.xml
index c65992a41636..5de783f217c2 100644
--- a/docs/documentation/tests/pom.xml
+++ b/docs/documentation/tests/pom.xml
@@ -59,7 +59,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/topics/templates/document-attributes.adoc b/docs/documentation/topics/templates/document-attributes.adoc
index 6bc252fbb001..f51d3533ac69 100644
--- a/docs/documentation/topics/templates/document-attributes.adoc
+++ b/docs/documentation/topics/templates/document-attributes.adoc
@@ -2,10 +2,10 @@
:project_name_full: Keycloak
:project_community: true
:project_product: false
-:project_version: DEV
-:project_versionMvn: 999.0.0-SNAPSHOT
-:project_versionNpm: 999.0.0-SNAPSHOT
-:project_versionDoc: DEV
+:project_version: 25.0.4
+:project_versionMvn: 25.0.4
+:project_versionNpm: 25.0.4
+:project_versionDoc: 25.0.4
:archivebasename: keycloak
:archivedownloadurl: https://github.com/keycloak/keycloak/releases/download/{project_version}/keycloak-{project_version}.zip
diff --git a/docs/documentation/topics/templates/making-open-source-more-inclusive.adoc b/docs/documentation/topics/templates/making-open-source-more-inclusive.adoc
deleted file mode 100644
index 2b88037619fd..000000000000
--- a/docs/documentation/topics/templates/making-open-source-more-inclusive.adoc
+++ /dev/null
@@ -1,7 +0,0 @@
-ifeval::[{project_product}==true]
-[preface]
-[id="making-open-source-more-inclusive"]
-== Making open source more inclusive
-
-Red Hat is committed to replacing problematic language in our code, documentation, and web properties. We are beginning with these four terms: master, slave, blacklist, and whitelist. Because of the enormity of this endeavor, these changes will be implemented gradually over several upcoming releases. For more details, see link:https://www.redhat.com/en/blog/making-open-source-more-inclusive-eradicating-problematic-language[our CTO Chris Wright's message].
-endif::[]
diff --git a/docs/documentation/upgrading/pom.xml b/docs/documentation/upgrading/pom.xml
index 9c081109a538..e81535eebce4 100644
--- a/docs/documentation/upgrading/pom.xml
+++ b/docs/documentation/upgrading/pom.xml
@@ -5,7 +5,7 @@
org.keycloak.documentationdocumentation-parent
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/documentation/upgrading/topics/changes/changes-24_0_3.adoc b/docs/documentation/upgrading/topics/changes/changes-24_0_3.adoc
index 9dcfc9823027..85792dc5514f 100644
--- a/docs/documentation/upgrading/topics/changes/changes-24_0_3.adoc
+++ b/docs/documentation/upgrading/topics/changes/changes-24_0_3.adoc
@@ -22,3 +22,8 @@ Because of security concerns, the redirect URI verification now performs a exact
The full wildcard `*` can still be used as a valid redirect in development for http(s) URIs with those characteristics. In production environments a exact valid redirect URI without wildcard needs to be configured for any URI of that type.
Please note that wildcard valid redirect URIs are not recommended for production and not covered by the OAuth 2.0 specification.
+
+= Deprecated Account REST endpoint for removing credential
+
+The Account REST endpoint for removing the credential of the user is deprecated. Starting at this version, the Account Console no longer uses this endpoint. It is replaced by the `Delete Credential` application-initiated
+action, which is triggered by the Account Console when a user want to remove the credential of a user.
diff --git a/docs/documentation/upgrading/topics/changes/changes-25_0_0.adoc b/docs/documentation/upgrading/topics/changes/changes-25_0_0.adoc
index b68586894607..6abf8cfc862e 100644
--- a/docs/documentation/upgrading/topics/changes/changes-25_0_0.adoc
+++ b/docs/documentation/upgrading/topics/changes/changes-25_0_0.adoc
@@ -83,7 +83,7 @@ For more details and more comprehensive scenarios, see https://www.keycloak.org/
= Persistent user sessions
Previous versions of {project_name} stored only offline user and offline client sessions in the databases.
-The new feature `persistent-user-session` stores online user sessions and online client sessions not only in memory, but also in the database.
+The new feature `persistent-user-sessions` stores online user sessions and online client sessions not only in memory, but also in the database.
This will allow a user to stay logged in even if all instances of {project_name} are restarted or upgraded.
== Enabling persistent user sessions
@@ -91,7 +91,7 @@ This will allow a user to stay logged in even if all instances of {project_name}
The feature is a preview feature and disabled by default. To use it, add the following to your build command:
----
-bin/kc.sh build --features=persistent-user-session ...
+bin/kc.sh build --features=persistent-user-sessions ...
----
For more details see the https://www.keycloak.org/server/features[Enabling and disabling features] {section}.
@@ -142,7 +142,7 @@ The first starting node will:
. Migrate the database to the schema version 25.
. Copy all session information from either the remote {jdgserver_name} or the JDBC persistence configured for {project_name}'s embedded cache to the database of {project_name}.
+
-The data will be stored in the tables `offline_user_session` and `online_user_session` with `offline_flag` set to `false`.
+The data will be stored in the tables `offline_user_session` and `offline_client_session` with `offline_flag` set to `false`.
. Clear the caches.
+
@@ -162,7 +162,7 @@ TIP: If the remote {jdgserver_name} is used in a multi-site setup, you can reduc
== Signing out existing users
In previous versions and when the feature is disabled, a restart of all {project_name} nodes logged out all users.
-To sign out all online users sessions of a realm with the `persistent-user-session` feature enabled, use the following steps as before:
+To sign out all online users sessions of a realm with the `persistent-user-sessions` feature enabled, use the following steps as before:
. Log in to the Admin Console.
. Select the menu entry *Sessions*.
@@ -445,22 +445,15 @@ If you wish to use Oracle DB, you must manually install a version of the Oracle
= Deprecated theme variables
-The following variables were deprecated in the Account theme:
+The following variables were deprecated in the Admin theme and will be removed in a future version:
-* `authUrl`. Use `authServerUrl` instead.
+* `authServerUrl`. Use `serverBaseUrl` instead.
+* `authUrl`. Use `adminBaseUrl` instead.
-The following variables from the environment script injected into the page of the Account theme are deprecated:
+The following variables were deprecated in the Account theme and will be removed in a future version:
-* `authUrl`. Use `authServerUrl` instead.
-* `features.isInternationalizationEnabled`. Do not use this variable.
-
-The following variables were deprecated in the Admin theme:
-
-* `authUrl`. Do not use this variable.
-
-The following variables from the environment script injected into the page of the Admin theme are deprecated:
-
-* `authUrl`. Do not use this variable.
+* `authServerUrl`. Use `serverBaseUrl` instead, note `serverBaseUrl` does not include trailing slash.
+* `authUrl`. Use `serverBaseUrl` instead, note `serverBaseUrl` does not include trailing slash.
= Methods to get and set current refresh token in client session are now deprecated
diff --git a/docs/documentation/upgrading/topics/changes/changes-25_0_2.adoc b/docs/documentation/upgrading/topics/changes/changes-25_0_2.adoc
new file mode 100644
index 000000000000..83a1fe03c272
--- /dev/null
+++ b/docs/documentation/upgrading/topics/changes/changes-25_0_2.adoc
@@ -0,0 +1,5 @@
+= Improving performance for deletion of user consents
+
+When a client scope or the full realm are deleted the associated user consents should also be removed. A new index over the table `USER_CONSENT_CLIENT_SCOPE` has been added to increase the performance.
+
+Note that, if the table contains more than 300.000 entries, by default {project_name} skips the creation of the indexes during the automatic schema migration and logs the SQL statements to the console instead. The statements must be run manually in the DB after {project_name}'s startup. Check the link:{upgradingguide_link}[{upgradingguide_name}] for details on how to configure a different limit.
diff --git a/docs/documentation/upgrading/topics/changes/changes-25_0_3.adoc b/docs/documentation/upgrading/topics/changes/changes-25_0_3.adoc
new file mode 100644
index 000000000000..f7c81a038fdf
--- /dev/null
+++ b/docs/documentation/upgrading/topics/changes/changes-25_0_3.adoc
@@ -0,0 +1,10 @@
+= Concurrent login requests are blocked by default when brute force is enabled
+
+If an attacker launched many login attempts in parallel then the attacker could have more guesses at a password than the brute force protection configuration permits. This was due to the brute force check occurring before the brute force protector has locked the user. To prevent this race the Brute Force Protector now rejects all login attempts that occur while another login is in progress in the same server.
+
+If, for whatever reason, the new feature wants to be disabled there is a startup factory option:
+
+[source,bash]
+----
+bin/kc.[sh|bat] start --spi-brute-force-protector-default-brute-force-detector-allow-concurrent-requests=true
+----
diff --git a/docs/documentation/upgrading/topics/changes/changes.adoc b/docs/documentation/upgrading/topics/changes/changes.adoc
index e4ac65ff9584..3983d68a0b41 100644
--- a/docs/documentation/upgrading/topics/changes/changes.adoc
+++ b/docs/documentation/upgrading/topics/changes/changes.adoc
@@ -1,6 +1,14 @@
[[migration-changes]]
== Migration Changes
+=== Migrating to 25.0.3
+
+include::changes-25_0_3.adoc[leveloffset=3]
+
+=== Migrating to 25.0.2
+
+include::changes-25_0_2.adoc[leveloffset=3]
+
=== Migrating to 25.0.0
include::changes-25_0_0.adoc[leveloffset=3]
@@ -456,7 +464,7 @@ Cross-Datacenter Replication changes::
not guaranteed as we don't test it anymore.
==== New optional client scope
-We have added a new `microprofile-jwt` optional client scope to handle the claims defined in the https://wiki.eclipse.org/MicroProfile/JWT_Auth[MicroProfile/JWT Auth Specification].
+We have added a new `microprofile-jwt` optional client scope to handle the claims defined in the https://github.com/eclipse/microprofile/wiki/JWT_Auth[MicroProfile/JWT Auth Specification].
This new client scope defines protocol mappers to set the username of the authenticated user to the `upn` claim and to
set the realm roles to the `groups` claim.
diff --git a/docs/documentation/upgrading/topics/prep_migration.adoc b/docs/documentation/upgrading/topics/prep_migration.adoc
index aec905dd661a..c64efd5c9243 100644
--- a/docs/documentation/upgrading/topics/prep_migration.adoc
+++ b/docs/documentation/upgrading/topics/prep_migration.adoc
@@ -20,7 +20,7 @@ After the upgrade of {project_name}, except for offline user sessions, user sess
endif::[]
ifeval::[{project_community}==true]
-After the upgrade of {project_name}, only if the feature `persistent-user-session` is enabled, users will still be logged in with their online sessions.
+After the upgrade of {project_name}, only if the feature `persistent-user-sessions` is enabled, users will still be logged in with their online sessions.
If it is not enabled, users will have to log in again, except where offline user sessions are used.
endif::[]
diff --git a/docs/guides/high-availability/concepts-threads.adoc b/docs/guides/high-availability/concepts-threads.adoc
index 16d526b3dbe1..b20158e61d1b 100644
--- a/docs/guides/high-availability/concepts-threads.adoc
+++ b/docs/guides/high-availability/concepts-threads.adoc
@@ -34,13 +34,14 @@ Low numbers ensure fast response times for all clients, even if there is an occa
=== JGroups connection pool
The combined number of executor threads in all {project_name} nodes in the cluster should not exceed the number of threads available in JGroups thread pool to avoid the error `org.jgroups.util.ThreadPool: thread pool is full`.
-To see the error the first time it happens, the system property `jgroups.thread_dumps_threshold` needs to be set to `1`, as otherwise the message appears only after 10000 threads have been rejected.
+To see the error the first time it happens, the system property `jgroups.thread_dumps_threshold` needs to be set to `1`, as otherwise the message appears only after 10000 requests have been rejected.
--
include::partials/threads/executor-jgroups-thread-calculation.adoc[]
--
-Use the metrics `vendor_jgroups_tcp_get_thread_pool_size` to monitor the total JGroup threads in the pool and `vendor_jgroups_tcp_get_thread_pool_size_active` for the threads active in the pool.
+Use metrics to monitor the total JGroup threads in the pool and for the threads active in the pool.
+When using TCP as the JGroups transport protocol, the metrics `vendor_jgroups_tcp_get_thread_pool_size` and `vendor_jgroups_tcp_get_thread_pool_size_active` are available for monitoring. When using UDP, the metrics `vendor_jgroups_udp_get_thread_pool_size` and `vendor_jgroups_udp_get_thread_pool_size_active` are available.
This is useful to monitor that limiting the Quarkus thread pool size keeps the number of active JGroup threads below the maximum JGroup thread pool size.
[#load-shedding]
diff --git a/docs/guides/high-availability/examples/generated/ispn-single.yaml b/docs/guides/high-availability/examples/generated/ispn-single.yaml
index 9bff526727e3..08f61651c7f8 100644
--- a/docs/guides/high-availability/examples/generated/ispn-single.yaml
+++ b/docs/guides/high-availability/examples/generated/ispn-single.yaml
@@ -224,7 +224,7 @@ spec:
expose:
type: Route
configMapName: "cluster-config"
- image: quay.io/infinispan/server:15.0.4.Final
+ image: quay.io/infinispan/server:15.0.7.Final
configListener:
enabled: false
container:
diff --git a/docs/guides/high-availability/examples/generated/ispn-site-a.yaml b/docs/guides/high-availability/examples/generated/ispn-site-a.yaml
index 88782afe45f4..85c1d017e36f 100644
--- a/docs/guides/high-availability/examples/generated/ispn-site-a.yaml
+++ b/docs/guides/high-availability/examples/generated/ispn-site-a.yaml
@@ -363,7 +363,7 @@ spec:
expose:
type: Route
configMapName: "cluster-config"
- image: quay.io/infinispan/server:15.0.4.Final
+ image: quay.io/infinispan/server:15.0.7.Final
configListener:
enabled: false
container:
diff --git a/docs/guides/high-availability/examples/generated/ispn-site-b.yaml b/docs/guides/high-availability/examples/generated/ispn-site-b.yaml
index 854c4afd29fe..e990a0d1427a 100644
--- a/docs/guides/high-availability/examples/generated/ispn-site-b.yaml
+++ b/docs/guides/high-availability/examples/generated/ispn-site-b.yaml
@@ -363,7 +363,7 @@ spec:
expose:
type: Route
configMapName: "cluster-config"
- image: quay.io/infinispan/server:15.0.4.Final
+ image: quay.io/infinispan/server:15.0.7.Final
configListener:
enabled: false
container:
diff --git a/docs/guides/operator/advanced-configuration.adoc b/docs/guides/operator/advanced-configuration.adoc
index e0572e5ef01f..aa6769eb0e9b 100644
--- a/docs/guides/operator/advanced-configuration.adoc
+++ b/docs/guides/operator/advanced-configuration.adoc
@@ -118,7 +118,7 @@ The `unsupported` field of the CR contains highly experimental configuration opt
==== Pod Template
The Pod Template is a raw API representation that is used for the Deployment Template.
-This field is a temporary workaround in case no supported field exists at the top level of the CR for your use case.
+This field is a temporary workaround in case no supported field exists at the top level of the CR for your use case.
The Operator merges the fields of the provided template with the values generated by the Operator for the specific Deployment.
With this feature, you have access to a high level of customizations. However, no guarantee exists that the Deployment will work as expected.
@@ -204,7 +204,7 @@ It is achieved by providing certain JVM options.
For more details, see <@links.server id="containers" />.
-== Management Interface
+=== Management Interface
To change the port of the management interface, use the first-class citizen field `httpManagement.port` in the Keycloak CR.
To change the properties of the management interface, you can do it by providing `additionalOptions` field.
@@ -225,6 +225,10 @@ spec:
value: /management
----
+NOTE: If you are using a custom image, the Operator is *unaware* of any configuration options that might've been specified there.
+For instance, it may cause that the management interface uses the `https` schema, but the Operator accesses it via `http` when the TLS settings is specified in the custom image.
+To ensure proper TLS configuration, use the `tlsSecret` and `truststores` fields in the Keycloak CR so that the Operator can reflect that.
+
=== Truststores
If you need to provide trusted certificates, the Keycloak CR provides a top level feature for configuring the server's truststore as discussed in <@links.server id="keycloak-truststore"/>.
@@ -259,7 +263,7 @@ stringData:
...
------
-When running on a Kubernetes or OpenShift environment well-known locations of trusted certificates are included automatically.
-This includes /var/run/secrets/kubernetes.io/serviceaccount/ca.crt and the /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt when present.
+When running on a Kubernetes or OpenShift environment well-known locations of trusted certificates are included automatically.
+This includes `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` and the `/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt` when present.
@tmpl.guide>
diff --git a/docs/guides/operator/basic-deployment.adoc b/docs/guides/operator/basic-deployment.adoc
index 0b62ea552e1f..a8268ad6121d 100644
--- a/docs/guides/operator/basic-deployment.adoc
+++ b/docs/guides/operator/basic-deployment.adoc
@@ -265,6 +265,8 @@ Misconfiguration will leave {project_name} exposed to security vulnerabilities.
For more details refer to the <@links.server id="reverseproxy"/> guide.
+NOTE: In an edge scenario where you do not wish to set `proxy.headers`, you must set `proxy=edge` as an option in `additionalOptions` field to override the implied default of `proxy=passthrough`. This will not be necessary in subsequent major releases.
+
=== Accessing the Admin Console
When deploying {project_name}, the operator generates an arbitrary initial admin `username` and `password` and stores those credentials as a basic-auth Secret object in the same namespace as the CR.
diff --git a/docs/guides/operator/customizing-keycloak.adoc b/docs/guides/operator/customizing-keycloak.adoc
index d773b66bab7e..3f12b45b0469 100644
--- a/docs/guides/operator/customizing-keycloak.adoc
+++ b/docs/guides/operator/customizing-keycloak.adoc
@@ -43,10 +43,10 @@ spec:
hostname: test.keycloak.org
----
-[NOTE]
-====
-With custom images, every build time option passed either through a dedicated field or the `additionalOptions` is ignored.
-====
+NOTE: With custom images, every build time option passed either through a dedicated field or the `additionalOptions` is ignored.
+
+NOTE: The Operator is *unaware* of any configuration options that are specified in a custom image.
+Use the Keycloak CR for any configuration that requires Operator awareness, namely the TLS and HTTP(S) settings reflected when configuring services and probes.
=== Non-optimized custom image
diff --git a/docs/guides/pom.xml b/docs/guides/pom.xml
index 050466394dcb..645a49793423 100644
--- a/docs/guides/pom.xml
+++ b/docs/guides/pom.xml
@@ -19,7 +19,7 @@
keycloak-docs-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/guides/server/caching.adoc b/docs/guides/server/caching.adoc
index 439eab3939fb..297fb032c46e 100644
--- a/docs/guides/server/caching.adoc
+++ b/docs/guides/server/caching.adoc
@@ -18,7 +18,7 @@ By default, caches are using a UDP transport stack so that nodes are discovered
To explicitly enable distributed infinispan caching, enter this command:
-<@kc.build parameters="--cache=ispn"/>
+<@kc.start parameters="--cache=ispn"/>
When you start {project_name} in development mode, by using the `start-dev` command, {project_name} uses only local caches and distributed caches are completely disabled by implicitly setting the `--cache=local` option.
The `local` cache mode is intended only for development and testing purposes.
@@ -109,13 +109,13 @@ CPU, memory, and network utilization.
ifeval::[{project_community}==true]
.Persistent user sessions
-The feature `persistent-user-session` stores online user and client sessions also in the database.
+The feature `persistent-user-sessions` stores online user and client sessions also in the database.
This will allow a user to stay logged in even if all instances of {project_name} are restarted or upgraded.
The feature is disabled by default. To use it, enable the feature:
----
-bin/kc.sh start --features=persistent-user-session ...
+bin/kc.sh start --features=persistent-user-sessions ...
----
With this feature enabled, the in-memory caches for online user sessions and online client sessions are limited to, by default, 10000 entries per node which will reduce the overall memory usage of {project_name} for larger installations.
@@ -146,7 +146,7 @@ Upon a cluster restart, offline sessions are lazily loaded from the database and
ifeval::[{project_community}==true]
-With feature `persistent-user-session` enabled, the in-memory caches for offline user sessions and offline client sessions are limited to 10000 entries which will reduce the overall memory usage of Keycloak for larger installations.
+With feature `persistent-user-sessions` enabled, the in-memory caches for offline user sessions and offline client sessions are limited to 10000 entries which will reduce the overall memory usage of Keycloak for larger installations.
Items which are evicted from memory will be loaded on-demand from the database when needed.
To set different sizes for the caches, edit {project_name}'s cache config file to set a `++` for those caches.
@@ -176,7 +176,7 @@ to change the number of owners accordingly to better fit into your availability
To specify your own cache configuration file, enter this command:
-<@kc.build parameters="--cache-config-file=my-cache-file.xml"/>
+<@kc.start parameters="--cache-config-file=my-cache-file.xml"/>
The configuration file is relative to the `conf/` directory.
@@ -204,7 +204,7 @@ Transport stacks ensure that distributed cache nodes in a cluster communicate in
To apply a specific cache stack, enter this command:
-<@kc.build parameters="--cache-stack="/>
+<@kc.start parameters="--cache-stack="/>
The default stack is set to `udp` when distributed caches are enabled.
@@ -220,7 +220,7 @@ The following table shows transport stacks that are available without any furthe
|udp|UDP|UDP multicast
|===
-The following table shows transport stacks that are available using the `--cache-stack` build option and a minimum configuration:
+The following table shows transport stacks that are available using the `--cache-stack` runtime option and a minimum configuration:
[%autowidth]
|===
@@ -249,7 +249,7 @@ For more information and links to repositories with these dependencies, see the
To provide the dependencies to {project_name}, put the respective JAR in the `providers` directory and build {project_name} by entering this command:
-<@kc.build parameters="--cache-stack="/>
+<@kc.start parameters="--cache-stack="/>
=== Custom transport stacks
If none of the available transport stacks are enough for your deployment, you are able to change your cache configuration file
diff --git a/docs/guides/server/configuration-production.adoc b/docs/guides/server/configuration-production.adoc
index 85a67da200f2..a6e2fc0be7ab 100644
--- a/docs/guides/server/configuration-production.adoc
+++ b/docs/guides/server/configuration-production.adoc
@@ -23,6 +23,14 @@ In a production environment, {project_name} instances usually run in a private n
For details on the endpoint categories and instructions on how to configure the public hostname for them, see <@links.server id="hostname"/>.
+=== Exposing the {project_name} Administration APIs and UI on a different hostname
+
+It is considered a best practice to expose the {project_name} Administration REST API and Console on a different hostname or context-path than the one used for the public frontend URLs that are used e.g. by login flows. This separation ensures that the Administration interfaces are not exposed to the public internet, which reduces the attack surface.
+
+WARNING: Access to REST APIs needs to be blocked on the reverse proxy level, if they are not intended to be publicly exposed.
+
+For details, see <@links.server id="hostname"/>.
+
== Reverse proxy in a distributed environment
Apart from <@links.server id="hostname"/>, production environments usually include a reverse proxy / load balancer component. It separates and unifies access to the network used by your company or organization. For a {project_name} production environment, this component is recommended.
@@ -64,4 +72,4 @@ For example, to change the IP stack preference to IPv4, set an environment varia
export JAVA_OPTS_APPEND="-Djava.net.preferIPv4Stack=true"
----
-@tmpl.guide>
\ No newline at end of file
+@tmpl.guide>
diff --git a/docs/guides/server/configuration.adoc b/docs/guides/server/configuration.adoc
index dbb09dcaacb0..33b6a7629d56 100644
--- a/docs/guides/server/configuration.adoc
+++ b/docs/guides/server/configuration.adoc
@@ -124,7 +124,7 @@ After executing the command, you will be prompted to *Enter the password to be s
When the KeyStore is created, you can start the server using the following parameters:
-<@kc.start parameters="--config-keystore=/path/to/keystore.p12 --config-keystore-password=storepass --config-keystore-type=PKCS12"/>
+<@kc.start parameters="--config-keystore=/path/to/keystore.p12 --config-keystore-password=keystorepass --config-keystore-type=PKCS12"/>
=== Format for raw Quarkus properties
In most cases, the available configuration options should suffice to configure the server.
diff --git a/docs/guides/server/containers.adoc b/docs/guides/server/containers.adoc
index a6b9a5221fd7..be2cdc01645c 100644
--- a/docs/guides/server/containers.adoc
+++ b/docs/guides/server/containers.adoc
@@ -133,7 +133,7 @@ To start the image, run:
[source, bash]
----
-podman|docker run --name mykeycloak -p 8443:8443 \
+podman|docker run --name mykeycloak -p 8443:8443 -p 9000:9000 \
-e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=change_me \
mykeycloak \
start --optimized
@@ -141,9 +141,9 @@ podman|docker run --name mykeycloak -p 8443:8443 \
{project_name} starts in production mode, using only secured HTTPS communication, and is available on `https://localhost:8443`.
-Health check endpoints are available at `https://localhost:8443/health`, `https://localhost:8443/health/ready` and `https://localhost:8443/health/live`.
+Health check endpoints are available at `https://localhost:9000/health`, `https://localhost:9000/health/ready` and `https://localhost:9000/health/live`.
-Opening up `https://localhost:8443/metrics` leads to a page containing operational metrics that could be used by your monitoring solution.
+Opening up `https://localhost:9000/metrics` leads to a page containing operational metrics that could be used by your monitoring solution.
== Exposing the container to a different port
diff --git a/docs/guides/server/db.adoc b/docs/guides/server/db.adoc
index 060b2e6c9112..ffd6f24ef0c8 100644
--- a/docs/guides/server/db.adoc
+++ b/docs/guides/server/db.adoc
@@ -32,9 +32,22 @@ only exists for development use-cases. The `dev-file` database is not suitable f
== Installing a database driver
-Database drivers are shipped as part of {project_name} except for the Oracle Database<@profile.ifProduct> and Microsoft SQL Server drivers@profile.ifProduct>.
+Database drivers are shipped as part of {project_name} except for the
+<@profile.ifProduct>
+Oracle Database and Microsoft SQL Server drivers.
+@profile.ifProduct>
+<@profile.ifCommunity>
+Oracle Database driver.
+@profile.ifCommunity>
-Install the necessary missing driver manually if you want to connect to one of these databases or skip this section if you want to connect to a different database for which the database driver is already included.
+Install the necessary missing driver manually if you want to connect to
+<@profile.ifProduct>
+one of these databases
+@profile.ifProduct>
+<@profile.ifCommunity>
+this database
+@profile.ifCommunity>
+or skip this section if you want to connect to a different database for which the database driver is already included.
=== Installing the Oracle Database driver
@@ -268,7 +281,7 @@ The maximum timeout for this lock is 900 seconds. If a node waits on this lock f
<@kc.start parameters="--spi-dblock-jpa-lock-wait-timeout 900"/>
== Using Database Vendors with XA transaction support
-{project_name} uses non-XA transactions and the appropriate database drivers by default.
+{project_name} uses non-XA transactions and the appropriate database drivers by default.
If you wish to use the XA transaction support offered by your driver, enter the following command:
@@ -278,7 +291,7 @@ If you wish to use the XA transaction support offered by your driver, enter the
NOTE: Certain vendors, such as Azure SQL and MariaDB Galera, do not support or rely on the XA transaction mechanism.
-XA recovery defaults to enabled and will use the file system location `KEYCLOAK_HOME/data/transaction-logs` to store transaction logs.
+XA recovery defaults to enabled and will use the file system location `KEYCLOAK_HOME/data/transaction-logs` to store transaction logs.
NOTE: Enabling XA transactions in a containerized environment does not fully support XA recovery unless stable storage is available at that path.
diff --git a/docs/guides/server/enabletls.adoc b/docs/guides/server/enabletls.adoc
index 41e9371cc86a..b98429b890e7 100644
--- a/docs/guides/server/enabletls.adoc
+++ b/docs/guides/server/enabletls.adoc
@@ -81,4 +81,8 @@ Using the value `required` sets up {project_name} to always ask for certificates
Be aware that this is the basic certificate configuration for mTLS use cases where {project_name} acts as server. When {project_name} acts as client instead, e.g. when {project_name} tries to get a token from a token endpoint of a brokered identity provider that is secured by mTLS, you need to set up the HttpClient to provide the right certificates in the keystore for the outgoing request. To configure mTLS in these scenarios, see <@links.server id="outgoinghttp"/>.
+NOTE: Management interface properties are inherited from the main HTTP server, including mTLS settings.
+It means when mTLS is set, it is also enabled for the management interface.
+To override the behavior, use the `https-management-client-auth` property.
+
@tmpl.guide>
diff --git a/docs/guides/server/features.adoc b/docs/guides/server/features.adoc
index 2f78a6ca771b..5f1029915dbf 100644
--- a/docs/guides/server/features.adoc
+++ b/docs/guides/server/features.adoc
@@ -40,11 +40,6 @@ For example to disable `impersonation`, enter this command:
<@kc.build parameters="--features-disabled=\"impersonation\""/>
-You can disable all default features by entering this command:
-
-<@kc.build parameters="--features-disabled=\"default\""/>
-
-This command can be used in combination with `features` to explicitly set what features should be available.
It is not allowed to have a feature in both the `features-disabled` list and the `features` list.
When a feature is disabled all versions of that feature are disabled.
diff --git a/docs/guides/server/hostname.adoc b/docs/guides/server/hostname.adoc
index b9d77409d3ff..adcbda951d8d 100644
--- a/docs/guides/server/hostname.adoc
+++ b/docs/guides/server/hostname.adoc
@@ -73,6 +73,8 @@ This allows you to access {project_name} at `https://my.keycloak.org` and the Ad
NOTE: Keep in mind that hostname and proxy options do not change the ports on which the server listens. Instead it changes only the ports of static resources like JavaScript and CSS links, OIDC well-known endpoints, redirect URIs, etc. that will be used in front of the proxy. You need to use HTTP configuration options to change the actual ports the server is listening on. Refer to the <@links.server id="all-config"/> for details.
+WARNING: Using the `hostname-admin` option does not prevent accessing the Administration REST API endpoints via the frontend URL specified by the `hostname` option. If you want to restrict access to the Administration REST API, you need to do it on the reverse proxy level. Administration Console implicitly accesses the API using the URL as specified by the `hostname-admin` option.
+
== Background - server endpoints
{project_name} exposes several endpoints, each with a different purpose. They are typically used for communication among applications or for managing the server. We recognize 3 main endpoint groups:
@@ -110,7 +112,7 @@ Note that `hostname` option must be set to a URL. For more information, refer to
=== Administration
-Similarly to the base frontend URL, you can also set the base URL for resources and endpoints of the administration console. The server exposes the administration console and static resources using a specific URL. This URL is used for redirect URLs, loading resources (CSS, JS), etc. It can be done by setting the `hostname-admin` option:
+Similarly to the base frontend URL, you can also set the base URL for resources and endpoints of the administration console. The server exposes the administration console and static resources using a specific URL. This URL is used for redirect URLs, loading resources (CSS, JS), Administration REST API etc. It can be done by setting the `hostname-admin` option:
<@kc.start parameters="--hostname https://my.keycloak.org --hostname-admin https://admin.my.keycloak.org:8443"/>
diff --git a/docs/guides/server/management-interface.adoc b/docs/guides/server/management-interface.adoc
index 453ddabed9e3..d575832c85ca 100644
--- a/docs/guides/server/management-interface.adoc
+++ b/docs/guides/server/management-interface.adoc
@@ -14,10 +14,10 @@ The most significant advantage might be seen in Kubernetes environments as the s
== Management interface configuration
The management interface is turned on by default, so management endpoints such as `/metrics`, and `/health` are exposed on the default management port `9000`.
+The management interface provides a set of options and is fully configurable.
In order to change the port for the management interface, you can use the {project_name} option `http-management-port`.
-The management interface provides a set of options and is fully configurable.
-If these options for the management HTTP server are not explicitly set, their values are automatically inherited from the default HTTP server.
+NOTE: If management interface properties are not explicitly set, their values are automatically inherited from the default HTTP server.
You can change the relative path of the management interface, as the prefix path for the management endpoints can be different.
You can achieve it via the {project_name} option `http-management-relative-path`.
@@ -48,4 +48,4 @@ Beware, the `legacy-observability-interface` option is deprecated and will be re
It only allows you to give more time for the migration.
====
-@tmpl.guide>
\ No newline at end of file
+@tmpl.guide>
diff --git a/docs/guides/server/reverseproxy.adoc b/docs/guides/server/reverseproxy.adoc
index 6d7d740d5027..9e75a37a4c93 100644
--- a/docs/guides/server/reverseproxy.adoc
+++ b/docs/guides/server/reverseproxy.adoc
@@ -29,7 +29,7 @@ If this header is incorrectly configured, rogue clients can set this header and
NOTE: When using the `xforwarded` setting, the `X-Forwarded-Port` takes precedence over any port included in the `X-Forwarded-Host`.
-== Proxy modes
+== Proxy modes (deprecated)
NOTE: The support for setting proxy modes is deprecated and will be removed in a future {project_name} release. Consider configuring accepted reverse proxy headers instead as described in the chapter above. For migration instructions consult the https://www.keycloak.org/docs/latest/upgrading/index.html#deprecated-proxy-option[Upgrading Guide].
For {project_name}, your choice of proxy modes depends on the TLS termination in your environment. The following proxy modes are available:
@@ -57,15 +57,11 @@ To select the proxy mode, enter this command:
== Different context-path on reverse proxy
{project_name} assumes it is exposed through the reverse proxy under the same context path as {project_name} is configured for. By default {project_name} is exposed through the root (`/`), which means it expects to be exposed through the reverse proxy on `/` as well.
-You can use `hostname-path` or `hostname-url` in these cases, for example using `--hostname-path=/auth` if {project_name} is exposed through the reverse proxy on `/auth`.
+You can use a full URL for the `hostname` option in these cases, for example using `--hostname=https://my.keycloak.org/auth` if {project_name} is exposed through the reverse proxy on `/auth`.
-Alternatively you can also change the context path of {project_name} itself to match the context path for the reverse proxy using the `http-relative-path` option, which will change the context-path of {project_name} itself to match the context path used by the reverse proxy.
-
-== Trust the proxy to set hostname
-
-By default, {project_name} needs to know under which hostname it will be called. If your reverse proxy is configured to check for the correct hostname, you can set {project_name} to accept any hostname.
+For more details on exposing {project_name} on different hostname or context-path incl. Administration REST API and Console, see <@links.server id="hostname"/>.
-<@kc.start parameters="--proxy-headers=forwarded|xforwarded --hostname-strict=false"/>
+Alternatively you can also change the context path of {project_name} itself to match the context path for the reverse proxy using the `http-relative-path` option, which will change the context-path of {project_name} itself to match the context path used by the reverse proxy.
== Enable sticky sessions
@@ -103,16 +99,7 @@ to `false` in order to avoid attaching the node to cookies and just rely on the
By default, the `spi-sticky-session-encoder-infinispan-should-attach-route` option value is `true` so that the node name is attached to
cookies to indicate to the reverse proxy the node that subsequent requests should be sent to.
-=== Exposing the administration console
-
-By default, the administration console URLs are created solely based on the requests to resolve the proper scheme, host name, and port. For instance,
-if you are using the `edge` proxy mode and your proxy is misconfigured, backend requests from your TLS termination proxy are going to use plain HTTP and potentially cause the administration
-console from being accessible because URLs are going to be created using the `http` scheme and the proxy does not support plain HTTP.
-
-In order to proper expose the administration console, you should make sure that your proxy is setting the `X-Forwarded-*` headers herein mentioned in order
-to create URLs using the scheme, host name, and port, being exposed by your proxy.
-
-=== Exposed path recommendations
+== Exposed path recommendations
When using a reverse proxy, {project_name} only requires certain paths need to be exposed.
The following table shows the recommended paths to expose.
@@ -135,11 +122,6 @@ The following table shows the recommended paths to expose.
|Yes (see note below)
|Access to keycloak.js needed for "internal" clients, e.g. the account console
-|/welcome/
-| -
-|No
-|No need exists to expose the welcome page after initial installation.
-
|/realms/
|/realms/
|Yes
@@ -173,7 +155,7 @@ As it's true that the `js` path is needed for internal clients like the account
We assume you run {project_name} on the root path `/` on your reverse proxy/gateway's public API.
If not, prefix the path with your desired one.
-=== Enabling client certificate lookup
+== Enabling client certificate lookup
When the proxy is configured as a TLS termination proxy the client certificate information can be forwarded to the server through specific HTTP request headers and then used to authenticate
clients. You are able to configure how the server is going to retrieve client certificate information depending on the proxy you are using.
@@ -226,7 +208,7 @@ to load additional certificates from headers `CERT_CHAIN_0` to `CERT_CHAIN_9` if
| Enable trusting NGINX proxy certificate verification, instead of forwarding the certificate to {project_name} and verifying it in {project_name}.
|===
-==== Configuring the NGINX provider
+=== Configuring the NGINX provider
The NGINX SSL/TLS module does not expose the client certificate chain. {project_name}'s NGINX certificate lookup provider rebuilds it by using the {project_name} truststore.
diff --git a/docs/maven-plugin/pom.xml b/docs/maven-plugin/pom.xml
index 2c07a98d449c..592d07243454 100644
--- a/docs/maven-plugin/pom.xml
+++ b/docs/maven-plugin/pom.xml
@@ -20,7 +20,7 @@
keycloak-docs-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml
diff --git a/docs/pom.xml b/docs/pom.xml
index 35f5dfa64ff6..71f13dd1aff2 100644
--- a/docs/pom.xml
+++ b/docs/pom.xml
@@ -19,7 +19,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xmlKeycloak Docs Parent
diff --git a/federation/kerberos/pom.xml b/federation/kerberos/pom.xml
index 95e483b06bf3..34f0c472037b 100755
--- a/federation/kerberos/pom.xml
+++ b/federation/kerberos/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../pom.xml4.0.0
diff --git a/federation/ldap/pom.xml b/federation/ldap/pom.xml
index 6d976016a891..1c8f7b0ea27c 100755
--- a/federation/ldap/pom.xml
+++ b/federation/ldap/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../pom.xml4.0.0
diff --git a/federation/ldap/src/main/java/org/keycloak/services/managers/LDAPServerCapabilitiesManager.java b/federation/ldap/src/main/java/org/keycloak/services/managers/LDAPServerCapabilitiesManager.java
index 224e1eaaff70..49dba42a79a4 100755
--- a/federation/ldap/src/main/java/org/keycloak/services/managers/LDAPServerCapabilitiesManager.java
+++ b/federation/ldap/src/main/java/org/keycloak/services/managers/LDAPServerCapabilitiesManager.java
@@ -16,20 +16,25 @@
*/
package org.keycloak.services.managers;
+import java.net.URI;
import java.util.Collections;
+import java.util.Objects;
import java.util.Set;
import javax.naming.ldap.LdapContext;
import org.jboss.logging.Logger;
import org.keycloak.common.util.MultivaluedHashMap;
+import org.keycloak.component.ComponentModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.LDAPConstants;
+import org.keycloak.models.ModelValidationException;
import org.keycloak.models.RealmModel;
import org.keycloak.representations.idm.ComponentRepresentation;
import org.keycloak.representations.idm.TestLdapConnectionRepresentation;
import org.keycloak.services.ServicesLogger;
import org.keycloak.storage.ldap.LDAPConfig;
import org.keycloak.representations.idm.LDAPCapabilityRepresentation;
+import org.keycloak.storage.ldap.idm.model.LDAPDn;
import org.keycloak.storage.ldap.idm.store.ldap.LDAPContextManager;
import org.keycloak.storage.ldap.idm.store.ldap.LDAPIdentityStore;
import org.keycloak.storage.ldap.mappers.membership.group.GroupTreeResolver;
@@ -63,8 +68,17 @@ private static int parseConnectionTimeout(String connectionTimeout) {
public static LDAPConfig buildLDAPConfig(TestLdapConnectionRepresentation config, RealmModel realm) {
String bindCredential = config.getBindCredential();
- if (config.getComponentId() != null && ComponentRepresentation.SECRET_VALUE.equals(bindCredential)) {
- bindCredential = realm.getComponent(config.getComponentId()).getConfig().getFirst(LDAPConstants.BIND_CREDENTIAL);
+ if (config.getComponentId() != null && !LDAPConstants.AUTH_TYPE_NONE.equals(config.getAuthType())
+ && ComponentRepresentation.SECRET_VALUE.equals(bindCredential)) {
+ // check the connection URL and the bind DN are the same to allow using the same configured password
+ ComponentModel component = realm.getComponent(config.getComponentId());
+ if (component != null) {
+ LDAPConfig ldapConfig = new LDAPConfig(component.getConfig());
+ if (checkLdapConnectionUrl(config, ldapConfig)
+ && config.getBindDn() != null && config.getBindDn().equalsIgnoreCase(ldapConfig.getBindDN())) {
+ bindCredential = ldapConfig.getBindCredential();
+ }
+ }
}
MultivaluedHashMap configMap = new MultivaluedHashMap<>();
configMap.putSingle(LDAPConstants.AUTH_TYPE, config.getAuthType());
@@ -81,6 +95,28 @@ public static LDAPConfig buildLDAPConfig(TestLdapConnectionRepresentation config
return new LDAPConfig(configMap);
}
+ /**
+ * Ensure provided connection URI matches parsed LDAP connection URI.
+ *
+ * See: https://docs.oracle.com/javase/jndi/tutorial/ldap/misc/url.html
+ * @param config
+ * @param ldapConfig
+ * @return
+ */
+ private static boolean checkLdapConnectionUrl(TestLdapConnectionRepresentation config, LDAPConfig ldapConfig) {
+ // There could be multiple connection URIs separated via spaces.
+ String[] configConnectionUrls = config.getConnectionUrl().trim().split(" ");
+ String[] ldapConfigConnectionUrls = ldapConfig.getConnectionUrl().trim().split(" ");
+ if (configConnectionUrls.length != ldapConfigConnectionUrls.length) {
+ return false;
+ }
+ boolean urlsMatch = true;
+ for (int i = 0; i < configConnectionUrls.length && urlsMatch; i++) {
+ urlsMatch = Objects.equals(URI.create(configConnectionUrls[i]), URI.create(ldapConfigConnectionUrls[i]));
+ }
+ return urlsMatch;
+ }
+
public static Set queryServerCapabilities(TestLdapConnectionRepresentation config, KeycloakSession session,
RealmModel realm) {
diff --git a/federation/ldap/src/main/java/org/keycloak/storage/ldap/mappers/membership/group/GroupLDAPStorageMapper.java b/federation/ldap/src/main/java/org/keycloak/storage/ldap/mappers/membership/group/GroupLDAPStorageMapper.java
index b72f6a658a01..ccda382696e9 100644
--- a/federation/ldap/src/main/java/org/keycloak/storage/ldap/mappers/membership/group/GroupLDAPStorageMapper.java
+++ b/federation/ldap/src/main/java/org/keycloak/storage/ldap/mappers/membership/group/GroupLDAPStorageMapper.java
@@ -194,13 +194,15 @@ public String getStatus() {
return syncResult;
}
- private void syncExistingGroup(GroupModel kcExistingGroup, Map.Entry groupEntry,
+ private void syncExistingGroup(RealmModel realm, GroupModel kcExistingGroup, Map.Entry groupEntry,
SynchronizationResult syncResult, Set visitedGroupIds, String groupName) {
try {
// Update each existing group to be synced in its own inner transaction to prevent race condition when
// the groups intended to be updated was already deleted via other channel in the meantime
KeycloakModelUtils.runJobInTransaction(ldapProvider.getSession().getKeycloakSessionFactory(), session -> {
- updateAttributesOfKCGroup(kcExistingGroup, groupEntry.getValue());
+ RealmModel innerTransactionRealm = session.realms().getRealm(realm.getId());
+ GroupModel innerTransactionGroup = session.groups().getGroupById(innerTransactionRealm, kcExistingGroup.getId());
+ updateAttributesOfKCGroup(innerTransactionGroup, groupEntry.getValue());
syncResult.increaseUpdated();
visitedGroupIds.add(kcExistingGroup.getId());
});
@@ -278,9 +280,9 @@ private void syncFlatGroupStructure(RealmModel realm, SynchronizationResult sync
GroupModel kcExistingGroup = transactionGroupPathGroups.get(groupName);
if (kcExistingGroup != null) {
- syncExistingGroup(kcExistingGroup, groupEntry, syncResult, visitedGroupIds, groupName);
+ syncExistingGroup(currentRealm, kcExistingGroup, groupEntry, syncResult, visitedGroupIds, groupName);
} else {
- syncNonExistingGroup(realm, groupEntry, syncResult, visitedGroupIds, groupName);
+ syncNonExistingGroup(currentRealm, groupEntry, syncResult, visitedGroupIds, groupName);
}
}
});
diff --git a/federation/pom.xml b/federation/pom.xml
index 314e274a73b3..3a577aeb998c 100755
--- a/federation/pom.xml
+++ b/federation/pom.xml
@@ -22,7 +22,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xml4.0.0
diff --git a/federation/sssd/pom.xml b/federation/sssd/pom.xml
index 72e1c71365b5..6e14b689479c 100644
--- a/federation/sssd/pom.xml
+++ b/federation/sssd/pom.xml
@@ -4,7 +4,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../../pom.xml4.0.0
diff --git a/integration/admin-client-jee/pom.xml b/integration/admin-client-jee/pom.xml
index 510faebcafb2..fad7d7c4b0d5 100755
--- a/integration/admin-client-jee/pom.xml
+++ b/integration/admin-client-jee/pom.xml
@@ -22,7 +22,7 @@
keycloak-integration-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.44.0.0
diff --git a/integration/admin-client/pom.xml b/integration/admin-client/pom.xml
index 5e8212558f01..deb1011034c9 100755
--- a/integration/admin-client/pom.xml
+++ b/integration/admin-client/pom.xml
@@ -22,7 +22,7 @@
keycloak-integration-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.44.0.0
diff --git a/integration/client-cli/admin-cli/pom.xml b/integration/client-cli/admin-cli/pom.xml
index d7ca8276dae6..b3ebc96b156e 100755
--- a/integration/client-cli/admin-cli/pom.xml
+++ b/integration/client-cli/admin-cli/pom.xml
@@ -21,7 +21,7 @@
keycloak-client-cli-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.44.0.0
diff --git a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/cli/common/BaseAuthOptionsCmd.java b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/cli/common/BaseAuthOptionsCmd.java
index e2fd26374be0..3b7a8bfdde7d 100644
--- a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/cli/common/BaseAuthOptionsCmd.java
+++ b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/cli/common/BaseAuthOptionsCmd.java
@@ -63,19 +63,19 @@ public abstract class BaseAuthOptionsCmd extends BaseGlobalOptionsCmd {
@Option(names = "--user", description = "Username to login with")
protected String user;
- @Option(names = "--password", description = "Password to login with (prompted for if not specified, --user is used, and the env variable KC_CLI_PASSWORD is not defined)", defaultValue = "${env:KC_CLI_PASSWORD}")
+ @Option(names = "--password", description = "Password to login with (prompted for if not specified, --user is used, and the env variable KC_CLI_PASSWORD is not defined)")
protected String password;
- @Option(names = "--secret", description = "Secret to authenticate the client (prompted for if no --user nor --keystore is specified, and the env variable KC_CLI_CLIENT_SECRET is not defined)", defaultValue = "${env:KC_CLI_CLIENT_SECRET}")
+ @Option(names = "--secret", description = "Secret to authenticate the client (prompted for if no --user nor --keystore is specified, and the env variable KC_CLI_CLIENT_SECRET is not defined)")
protected String secret;
@Option(names = "--keystore", description = "Path to a keystore containing private key")
protected String keystore;
- @Option(names = "--storepass", description = "Keystore password (prompted for if not specified, --keystore is used, and the env variable KC_CLI_STORE_PASSWORD is undefined)", defaultValue = "${env:KC_CLI_STORE_PASSWORD}")
+ @Option(names = "--storepass", description = "Keystore password (prompted for if not specified, --keystore is used, and the env variable KC_CLI_STORE_PASSWORD is undefined)")
protected String storePass;
- @Option(names = "--keypass", description = "Key password (prompted for if not specified and --keystore is used without --storepass, \n otherwise defaults to keystore password)", defaultValue = "${env:KC_CLI_KEY_PASSWORD}")
+ @Option(names = "--keypass", description = "Key password (prompted for if not specified, --keystore is used without --storepass, and the env variable KC_CLI_KEY_PASSWORD is undefined, otherwise defaults to keystore password)")
protected String keyPass;
@Option(names = "--alias", description = "Alias of the key inside a keystore (defaults to the value of ClientId)")
@@ -84,7 +84,7 @@ public abstract class BaseAuthOptionsCmd extends BaseGlobalOptionsCmd {
@Option(names = "--truststore", description = "Path to a truststore")
protected String trustStore;
- @Option(names = "--trustpass", description = "Truststore password (prompted for if not specified, --user is used, and the env variable KC_CLI_TRUSTSTORE_PASSWORD is not defined)", defaultValue = "${env:KC_CLI_TRUSTSTORE_PASSWORD}")
+ @Option(names = "--trustpass", description = "Truststore password (prompted for if not specified, --user is used, and the env variable KC_CLI_TRUSTSTORE_PASSWORD is not defined)")
protected String trustPass;
@Option(names = "--insecure", description = "Turns off TLS validation")
@@ -174,7 +174,10 @@ protected void setupTruststore(ConfigData configData) {
pass = configData.getTrustpass();
}
if (pass == null) {
- pass = IoUtil.readSecret("Enter truststore password: ");
+ pass = System.getenv("KC_CLI_TRUSTSTORE_PASSWORD");
+ }
+ if (pass == null) {
+ pass = IoUtil.readSecret("Enter truststore password: ");
}
try {
diff --git a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/cli/common/BaseConfigCredentialsCmd.java b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/cli/common/BaseConfigCredentialsCmd.java
index 0fcd28e39029..dcf6f839372f 100644
--- a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/cli/common/BaseConfigCredentialsCmd.java
+++ b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/cli/common/BaseConfigCredentialsCmd.java
@@ -103,6 +103,9 @@ public void process() {
printErr("Logging into " + server + " as user " + user + " of realm " + realm);
// if user was set there needs to be a password so we can authenticate
+ if (password == null) {
+ password = System.getenv("KC_CLI_PASSWORD");
+ }
if (password == null) {
password = readSecret("Enter password: ");
}
@@ -114,7 +117,10 @@ public void process() {
grantTypeForAuthentication = OAuth2Constants.CLIENT_CREDENTIALS;
printErr("Logging into " + server + " as " + "service-account-" + clientId + " of realm " + realm);
if (keystore == null && secret == null) {
- secret = readSecret("Enter client secret: ");
+ secret = System.getenv("KC_CLI_CLIENT_SECRET");
+ if (secret == null) {
+ secret = readSecret("Enter client secret: ");
+ }
}
}
@@ -127,9 +133,18 @@ public void process() {
throw new RuntimeException("No such keystore file: " + keystore);
}
+ if (storePass == null) {
+ storePass = System.getenv("KC_CLI_STORE_PASSWORD");
+ }
+ if (keyPass == null) {
+ keyPass = System.getenv("KC_CLI_KEY_PASSWORD");
+ }
+
if (storePass == null) {
storePass = readSecret("Enter keystore password: ");
- keyPass = readSecret("Enter key password: ");
+ if (keyPass == null) {
+ keyPass = readSecret("Enter key password: ");
+ }
}
if (keyPass == null) {
diff --git a/integration/client-cli/client-cli-dist/pom.xml b/integration/client-cli/client-cli-dist/pom.xml
index 679d8647b605..9e7c409b37cb 100755
--- a/integration/client-cli/client-cli-dist/pom.xml
+++ b/integration/client-cli/client-cli-dist/pom.xml
@@ -21,7 +21,7 @@
keycloak-client-cli-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4keycloak-client-cli-dist
diff --git a/integration/client-cli/pom.xml b/integration/client-cli/pom.xml
index c751fb955906..e0e2699b4da7 100644
--- a/integration/client-cli/pom.xml
+++ b/integration/client-cli/pom.xml
@@ -20,7 +20,7 @@
keycloak-integration-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4Keycloak Client CLI
diff --git a/integration/client-registration/pom.xml b/integration/client-registration/pom.xml
index 9546266379ba..fe3dc5f08c0b 100755
--- a/integration/client-registration/pom.xml
+++ b/integration/client-registration/pom.xml
@@ -21,7 +21,7 @@
keycloak-integration-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.44.0.0
diff --git a/integration/pom.xml b/integration/pom.xml
index dc6dde5da414..b00c588b136d 100755
--- a/integration/pom.xml
+++ b/integration/pom.xml
@@ -20,7 +20,7 @@
keycloak-parentorg.keycloak
- 999.0.0-SNAPSHOT
+ 25.0.4../pom.xmlKeycloak Integration
diff --git a/js/apps/account-ui/README.md b/js/apps/account-ui/README.md
index 9d03f353f3b2..c7802611de73 100644
--- a/js/apps/account-ui/README.md
+++ b/js/apps/account-ui/README.md
@@ -22,7 +22,7 @@ import { KeycloakProvider } from "@keycloak/keycloak-account-ui";
//...
diff --git a/js/apps/account-ui/index.html b/js/apps/account-ui/index.html
deleted file mode 100644
index f284617802de..000000000000
--- a/js/apps/account-ui/index.html
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
-
-
- Codestin Search App
-
-
-
-