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); } }