package org.emdev.common.http;
import org.ebookdroid.opds.exceptions.AuthorizationRequiredException;
import org.ebookdroid.opds.exceptions.OPDSException;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.client.methods.HttpGet;
import org.emdev.common.http.HostCredentials.State;
public class BasicAuthenticator {
private final Map<String, HostCredentials> credentials = new HashMap<String, HostCredentials>();
public void setAuthorization(final String host, final String username, final String password) {
final HostCredentials newCred = new HostCredentials(host, username, password);
final HostCredentials oldCred = credentials.put(host, newCred);
if (oldCred != null && oldCred.getState() == State.AUTH_ASKED) {
newCred.setState(State.AUTH_ENTERED);
}
}
public HostCredentials onPreAuthorization(final HttpGet req) {
final String host = req.getURI().getHost();
final HostCredentials cred = credentials.get(host);
final State state = cred != null ? cred.getState() : null;
if (state == State.AUTH_ENTERED || state == State.AUTH_SENT) {
cred.setState(State.AUTH_ENTERED, State.AUTH_SENT);
return cred;
}
return null;
}
public HostCredentials onAuthorizationAsked(final HttpGet req) throws OPDSException {
final String host = req.getURI().getHost();
HostCredentials cred = credentials.get(host);
if (cred == null) {
cred = new HostCredentials(host, "", "");
cred.setState(State.AUTH_ASKED);
credentials.put(host, cred);
throw new AuthorizationRequiredException(host, "Basic");
}
if (req.getFirstHeader("Authorization") != null) {
cred.setState(State.AUTH_SENT, State.AUTH_FAILED);
}
final State state = cred.getState();
if (state == State.AUTH_ASKED || state == State.AUTH_FAILED) {
throw new AuthorizationRequiredException(host, "Basic");
}
cred.setState(State.AUTH_SENT);
return cred;
}
}