/*
* Copyright 2009-2014 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.security.auth;
import java.util.concurrent.atomic.AtomicBoolean;
import org.springframework.util.Assert;
/**
* Composite class which delegates to each of the configured providers in turn.
* The first instance which is responible for a user name wins.
*
* @author Josh Moore, josh at glencoesoftware.com
* @since 4.0
*/
public class PasswordProviders implements PasswordProvider {
final private PasswordProvider[] providers;
private AtomicBoolean ignoreCaseLookup;
public PasswordProviders(PasswordProvider... providers) {
this(new AtomicBoolean(false), providers);
}
public PasswordProviders(AtomicBoolean ignoreCaseLookup,
PasswordProvider... providers) {
Assert.notNull(providers);
int l = providers.length;
this.providers = new PasswordProvider[l];
System.arraycopy(providers, 0, this.providers, 0, l);
this.ignoreCaseLookup = ignoreCaseLookup;
}
public boolean hasPassword(String user) {
user = ignoreCaseLookup.get() ? user.toLowerCase() : user;
for (PasswordProvider provider : providers) {
boolean hasPassword = provider.hasPassword(user);
if (hasPassword) {
return true;
}
}
return false;
}
public Boolean checkPassword(String user, String password, boolean readOnly) {
user = ignoreCaseLookup.get() ? user.toLowerCase() : user;
for (PasswordProvider provider : providers) {
Boolean rv = provider.checkPassword(user, password, readOnly);
if (rv != null) {
return rv;
}
}
return null;
}
public void changePassword(String user, String password)
throws PasswordChangeException {
user = ignoreCaseLookup.get() ? user.toLowerCase() : user;
for (PasswordProvider provider : providers) {
boolean hasPassword = provider.hasPassword(user);
if (hasPassword) {
provider.changePassword(user, password);
return;
}
}
throw new PasswordChangeException("No provider found: " + user);
}
public void changeDistinguisedName(String user, String dn)
throws PasswordChangeException {
for (PasswordProvider provider : providers) {
boolean hasPassword = provider.hasPassword(user);
if (hasPassword) {
provider.changePassword(user, dn);
return;
}
}
throw new PasswordChangeException("No provider found:" + user);
}
}