Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,17 @@
package org.keycloak.services.resources.admin;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.ws.rs.ForbiddenException;
import org.jboss.logging.Logger;
import org.jboss.resteasy.reactive.NoCache;
import org.keycloak.http.HttpRequest;
import org.keycloak.http.HttpResponse;
import jakarta.ws.rs.NotFoundException;
import org.keycloak.Config;
import org.keycloak.common.ClientConnection;
import org.keycloak.common.Profile;
import org.keycloak.common.Version;
import org.keycloak.common.util.UriUtils;
import org.keycloak.headers.SecurityHeadersProvider;
import org.keycloak.http.HttpRequest;
import org.keycloak.http.HttpResponse;
import org.keycloak.models.AdminRoles;
import org.keycloak.models.ClientModel;
import org.keycloak.models.Constants;
Expand All @@ -48,6 +49,8 @@
import org.keycloak.utils.MediaType;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.NotAuthorizedException;
import jakarta.ws.rs.NotFoundException;
import jakarta.ws.rs.OPTIONS;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
Expand All @@ -57,7 +60,6 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
Expand Down Expand Up @@ -191,14 +193,18 @@ public Response whoAmIPreFlight() {
/**
* Permission information
*
* @param headers
* @param currentRealm
* @return
*/
@Path("whoami")
@GET
@Produces(MediaType.APPLICATION_JSON)
@NoCache
public Response whoAmI(@QueryParam("currentRealm") String currentRealm) {
if (!Profile.isFeatureEnabled(Profile.Feature.ADMIN_API)) {
throw new NotFoundException();
}

RealmManager realmManager = new RealmManager(session);
AuthenticationManager.AuthResult authResult = new AppAuthManager.BearerTokenAuthenticator(session)
.setRealm(realm)
Expand All @@ -207,8 +213,13 @@ public Response whoAmI(@QueryParam("currentRealm") String currentRealm) {
.authenticate();

if (authResult == null) {
return Response.status(401).build();
throw new NotAuthorizedException("Bearer");
}

if (!Constants.ADMIN_CONSOLE_CLIENT_ID.equals(authResult.getToken().getIssuedFor())) {
throw new ForbiddenException("Token not valid for admin console");
}

UserModel user= authResult.getUser();
String displayName;
if ((user.getFirstName() != null && !user.getFirstName().trim().equals("")) || (user.getLastName() != null && !user.getLastName().trim().equals(""))) {
Expand Down Expand Up @@ -237,6 +248,11 @@ public Response whoAmI(@QueryParam("currentRealm") String currentRealm) {
addRealmAccess(realm, user, realmAccess);
}

if (realmAccess.isEmpty() || realmAccess.values().iterator().next().isEmpty()) {
// if the user has no access in the realm just return forbidden/403
throw new ForbiddenException("No realm access");
}

Locale locale = session.getContext().resolveLocale(user);

Cors.add(request).allowedOrigins(authResult.getToken()).allowedMethods("GET").auth()
Expand All @@ -256,29 +272,13 @@ private void addMasterRealmAccess(UserModel user, String currentRealm, Map<Strin
getRealmAdminAccess(realm, realm.getMasterAdminClient(), user, realmAdminAccess);
}

private static <T> HashSet<T> union(Set<T> set1, Set<T> set2) {
if (set1 == null && set2 == null) {
return null;
}
HashSet<T> res;
if (set1 instanceof HashSet) {
res = (HashSet <T>) set1;
} else {
res = set1 == null ? new HashSet<>() : new HashSet<>(set1);
}
if (set2 != null) {
res.addAll(set2);
}
return res;
}

private void getRealmAdminAccess(RealmModel realm, ClientModel client, UserModel user, Map<String, Set<String>> realmAdminAccess) {
Set<String> realmRoles = client.getRolesStream()
.filter(user::hasRole)
.map(RoleModel::getName)
.collect(Collectors.toSet());

realmAdminAccess.merge(realm.getName(), realmRoles, AdminConsole::union);
realmAdminAccess.put(realm.getName(), realmRoles);
}

/**
Expand Down

This file was deleted.

Loading