package com.philemonworks.critter.action; import java.nio.charset.Charset; import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import com.philemonworks.critter.rule.RuleContext; import com.thoughtworks.xstream.core.util.Base64Encoder; public class DigestAuthentication extends RuleIngredient implements Action { private static final String NONCE = "critter.proxy.simulated.nonce"; private static final String OPAQUE = "critter.proxy.simulated.opaque"; public String username, password, realm; @Override public void perform(RuleContext context) { String value = context.httpContext.getRequest().getHeaderValue("Authorization"); if (StringUtils.isEmpty(value)) { context.forwardResponse = Response.status(401).header("WWW-Authenticate", this.compute401Header()).build(); return; } } public String compute401Header() { StringBuilder sb = new StringBuilder(); sb .append("Digest realm=\"").append(this.realm).append("\",") .append("gop=\"auth,auth-int\",") .append("nonce=\"").append(NONCE).append("\",") .append("opaque=\"").append(OPAQUE).append("\","); return sb.toString(); } public String computeDigestAuthenticationHeaderValue(String username2, String password2) { String toEncode = username2 + ":" + password2; return "Basic " + new Base64Encoder().encode(toEncode.getBytes(Charset.forName("utf-8"))); } @Override public String explain() { return "digest authenticated with ["+username+ "] and [" + password + "] for [" + realm + "]"; } }