keycloak-d4science-spi-parent/avatar-realm-resource/src/main/java/org/gcube/keycloak/avatar/storage/userattribute/UserAttributeAvatarStorageP...

62 lines
2.1 KiB
Java

package org.gcube.keycloak.avatar.storage.userattribute;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import org.apache.commons.io.IOUtils;
import org.gcube.keycloak.avatar.storage.AvatarStorageProvider;
import org.jboss.logging.Logger;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
public class UserAttributeAvatarStorageProvider implements AvatarStorageProvider {
private static final Logger logger = Logger.getLogger(UserAttributeAvatarStorageProvider.class);
private final String userAttribute;
public UserAttributeAvatarStorageProvider() {
this(UserAttributeAvatarStorageProviderFactory.USER_ATTRIBUTE_NAME);
}
public UserAttributeAvatarStorageProvider(String userAttribute) {
this.userAttribute = userAttribute;
}
@Override
public void saveAvatarImage(RealmModel realm, UserModel user, InputStream input) {
logger.debugf("Saving avatar image to user attribute: %s", userAttribute);
user.setSingleAttribute(userAttribute, getBase64EncodedString(input));
}
private String getBase64EncodedString(InputStream input) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
IOUtils.copy(input, baos);
} catch (IOException e) {
logger.error("Getting image stream as bytes array", e);
}
return Base64.getEncoder().encodeToString(baos.toByteArray());
}
@Override
public InputStream loadAvatarImage(RealmModel realm, UserModel user) {
logger.debugf("Getting avatar image from user attribute: %s", userAttribute);
return toBinaryStream(user.getFirstAttribute(userAttribute));
}
private InputStream toBinaryStream(String base64EncodedImage) {
byte[] decoded = base64EncodedImage != null ? Base64.getDecoder().decode(base64EncodedImage) : new byte[0];
return new ByteArrayInputStream(decoded);
}
@Override
public void close() {
// NOOP
}
}