package com.bradmcevoy.http.http11.auth;
import com.bradmcevoy.http.Auth;
import com.bradmcevoy.http.AuthenticationHandler;
import com.bradmcevoy.http.Request;
import com.bradmcevoy.http.Resource;
import com.bradmcevoy.http.SecurityManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author brad
*/
public class SecurityManagerDigestAuthenticationHandler implements AuthenticationHandler {
private static final Logger log = LoggerFactory.getLogger( SecurityManagerDigestAuthenticationHandler.class );
private final NonceProvider nonceProvider;
private final SecurityManager securityManager;
private final DigestHelper digestHelper;
public SecurityManagerDigestAuthenticationHandler( NonceProvider nonceProvider, SecurityManager securityManager ) {
this.nonceProvider = nonceProvider;
this.securityManager = securityManager;
digestHelper = new DigestHelper(nonceProvider);
}
public SecurityManagerDigestAuthenticationHandler(SecurityManager securityManager) {
this.nonceProvider = new SimpleMemoryNonceProvider( 60*60*24 ); // one day
this.securityManager = securityManager;
digestHelper = new DigestHelper(nonceProvider);
}
public boolean supports( Resource r, Request request ) {
Auth auth = request.getAuthorization();
return Auth.Scheme.DIGEST.equals( auth.getScheme() );
}
public Object authenticate( Resource r, Request request ) {
Auth auth = request.getAuthorization();
DigestResponse resp = digestHelper.calculateResponse(auth, securityManager.getRealm(request.getHostHeader()), request.getMethod());
if( resp == null ) {
log.debug("requested digest authentication is invalid or incorrectly formatted");
return null;
} else {
Object o = securityManager.authenticate( resp );
return o;
}
}
public String getChallenge( Resource resource, Request request ) {
String nonceValue = nonceProvider.createNonce( resource, request );
return digestHelper.getChallenge(nonceValue, request.getAuthorization(), securityManager.getRealm(request.getHostHeader()));
}
public boolean isCompatible( Resource resource ) {
return true;
}
}