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