keycloak-d4science-spi-parent/avatar-realm-resource/src/main/java/org/gcube/keycloak/avatar/AvatarAdminResource.java

96 lines
3.3 KiB
Java

package org.gcube.keycloak.avatar;
import java.io.InputStream;
import org.gcube.keycloak.avatar.storage.AvatarStorageProvider;
import org.jboss.resteasy.annotations.cache.NoCache;
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
import org.keycloak.common.ClientConnection;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.ForbiddenException;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.NotAuthorizedException;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
public class AvatarAdminResource extends AbstractAvatarResource {
@Context
private AvatarStorageProvider avatarStorageProvider;
@Context
private HttpHeaders httpHeaders;
@Context
private ClientConnection clientConnection;
public AvatarAdminResource(KeycloakSession session) {
super(session);
// tokenManager = new TokenManager();
}
public void init() {
checkRealmAdmin();
}
@GET
@Path("/{user_id}")
@Produces({ "image/png", "image/jpeg", "image/gif" })
public Response downloadUserAvatarImage(@PathParam("user_id") String userId) {
try {
UserModel user = session.users().getUserById(session.getContext().getRealm(), userId);
return fetchAndCreateResponse(session.getContext().getRealm(), user);
} catch (ForbiddenException e) {
return Response.status(Response.Status.FORBIDDEN).entity(e.getMessage()).build();
} catch (Exception e) {
logger.error("error getting user avatar", e);
return Response.serverError().entity(e.getMessage()).build();
}
}
@POST
@NoCache
@Path("/{user_id}")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadUserAvatarImage(@PathParam("user_id") String userId, MultipartFormDataInput input) {
try {
if (auth == null) {
return Response.status(Response.Status.UNAUTHORIZED).build();
}
RealmModel realm = session.getContext().getRealm();
UserModel user = session.users().getUserById(session.getContext().getRealm(), userId);
InputStream imageInputStream = input.getFormDataPart(AVATAR_IMAGE_PARAMETER, InputStream.class, null);
saveUserImage(realm, user, imageInputStream);
} catch (ForbiddenException e) {
return Response.status(Response.Status.FORBIDDEN).entity(e.getMessage()).build();
} catch (Exception e) {
logger.error("error saving user avatar", e);
return Response.serverError().entity(e.getMessage()).build();
}
return Response.ok().build();
}
private void checkRealmAdmin() {
if (auth == null) {
throw new NotAuthorizedException("Bearer");
} else if (auth.getToken().getRealmAccess() == null
|| !auth.getToken().getRealmAccess().isUserInRole("admin")) {
throw new ForbiddenException("Does not have realm admin role");
}
}
}