package com.airbnb.shiro;
import com.google.common.base.Charsets;
import com.google.common.collect.Sets;
import com.google.common.hash.Funnel;
import com.google.common.hash.Hashing;
import com.google.common.hash.PrimitiveSink;
import lombok.Getter;
import org.apache.shiro.authc.HostAuthenticationToken;
import org.apache.shiro.authc.RememberMeAuthenticationToken;
import org.joda.time.Duration;
import java.util.Set;
public class AllowAllToken
implements RememberMeAuthenticationToken, HostAuthenticationToken
{
private final boolean rememberMe;
private final String host;
@Getter
private final String userName;
@Getter
private final Set<String> groups;
@Getter
private final String defaultSchema;
@Getter
private final Duration queryTimeout;
@Getter
private final String accessLevel;
public AllowAllToken(String host,
boolean rememberMe,
String userName,
Iterable<String> groups,
String defaultSchema,
Duration queryTimeout,
String accessLevel)
{
this.host = host;
this.rememberMe = rememberMe;
this.userName = userName;
this.groups = Sets.newHashSet(groups);
this.defaultSchema = defaultSchema;
this.queryTimeout = queryTimeout;
this.accessLevel = accessLevel;
}
@Override
public String getHost()
{
return host;
}
@Override
public boolean isRememberMe()
{
return rememberMe;
}
@Override
public Object getPrincipal()
{
return new AllowAllUser(getUserName(), getGroups(), getDefaultSchema(), getQueryTimeout(), getAccessLevel());
}
@Override
public Object getCredentials()
{
AllowAllUser user = (AllowAllUser) getPrincipal();
if (user != null) {
return Hashing.sha256().hashObject(user, new Funnel<AllowAllUser>()
{
@Override
public void funnel(AllowAllUser from, PrimitiveSink into)
{
Set<String> fromGroups = from.getGroups();
String fromName = from.getUserName();
into.putString(fromName, Charsets.UTF_8);
for (String fromGroup : fromGroups) {
into.putString(fromGroup, Charsets.UTF_8);
}
}
});
}
return null;
}
}