68 lines
2.3 KiB
Java
68 lines
2.3 KiB
Java
package org.gcube.keycloak.avatar;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import javax.ws.rs.core.Response;
|
|
import javax.ws.rs.core.StreamingOutput;
|
|
|
|
import org.apache.commons.io.IOUtils;
|
|
import org.gcube.keycloak.avatar.storage.AvatarStorageProvider;
|
|
import org.gcube.keycloak.avatar.storage.file.FileAvatarStorageProvider;
|
|
import org.jboss.logging.Logger;
|
|
import org.keycloak.models.KeycloakSession;
|
|
import org.keycloak.models.RealmModel;
|
|
import org.keycloak.models.UserModel;
|
|
|
|
public abstract class AbstractAvatarResource {
|
|
|
|
protected static final Logger logger = Logger.getLogger(AbstractAvatarResource.class);
|
|
|
|
protected static final String AVATAR_IMAGE_PARAMETER = "image";
|
|
|
|
public static final Class<?> DEFAULT_IMPLEMENTATION = FileAvatarStorageProvider.class;
|
|
|
|
protected KeycloakSession session;
|
|
|
|
public AbstractAvatarResource(KeycloakSession session) {
|
|
this.session = session;
|
|
}
|
|
|
|
public AvatarStorageProvider getAvatarStorageProvider() {
|
|
AvatarStorageProvider asp = lookupAvatarStorageProvider(session);
|
|
if (asp == null) {
|
|
logger.warnf("Provider not found via SPI configuration, defualting to: %s",
|
|
DEFAULT_IMPLEMENTATION.getName());
|
|
|
|
try {
|
|
asp = (AvatarStorageProvider) DEFAULT_IMPLEMENTATION.newInstance();
|
|
} catch (InstantiationException | IllegalAccessException e) {
|
|
logger.error("Cannot instatiate storage implementation class", e);
|
|
}
|
|
}
|
|
return asp;
|
|
}
|
|
|
|
protected AvatarStorageProvider lookupAvatarStorageProvider(KeycloakSession keycloakSession) {
|
|
return keycloakSession.getProvider(AvatarStorageProvider.class);
|
|
}
|
|
|
|
protected Response unauthorized() {
|
|
return Response.status(Response.Status.UNAUTHORIZED).build();
|
|
}
|
|
|
|
protected Response invalidState() {
|
|
return Response.status(Response.Status.FORBIDDEN).build();
|
|
}
|
|
|
|
protected void saveUserImage(RealmModel realm, UserModel user, InputStream imageInputStream) {
|
|
getAvatarStorageProvider().saveAvatarImage(realm, user, imageInputStream);
|
|
}
|
|
|
|
protected StreamingOutput fetchUserImage(RealmModel realm, UserModel user) {
|
|
AvatarStorageProvider asp = getAvatarStorageProvider();
|
|
InputStream is = asp.loadAvatarImage(realm, user);
|
|
return output -> IOUtils.copy(is, output);
|
|
}
|
|
|
|
}
|