package nl.topicus.konijn.xmpp.authentication; import nl.topicus.konijn.xmpp.util.WicketInjector; import org.apache.commons.codec.binary.Base64; import org.apache.vysper.xmpp.authentication.SASLMechanism; import org.apache.vysper.xmpp.protocol.NamespaceURIs; import org.apache.vysper.xmpp.protocol.SessionStateHolder; import org.apache.vysper.xmpp.server.SessionContext; import org.apache.vysper.xmpp.stanza.Stanza; import org.apache.vysper.xmpp.stanza.StanzaBuilder; import org.apache.vysper.xmpp.uuid.JVMBuiltinUUIDGenerator; import org.apache.vysper.xmpp.uuid.UUIDGenerator; /** * handles SASL DigestMD5 mechanism. * * @author Joost Limburg */ public class DigestMD5 implements SASLMechanism { // private static final AuthenticationResponses AUTHENTICATION_RESPONSES = // new AuthenticationResponses(); private UUIDGenerator uuidGenerator = new JVMBuiltinUUIDGenerator(); // private static char Q = '"'; public String getName() { return "DIGEST-MD5"; } public Stanza started(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza authStanza) { WicketInjector.inject(sessionContext); String nonce = uuidGenerator.create(); String challengeReply = "nonce=" + Q + nonce + Q + ",qop=" + Q + "auth" + Q + ",charset=utf-8,algorithm=md5-sess"; sessionContext.putAttribute("nonce", nonce); challengeReply = new String(Base64.encodeBase64(challengeReply .getBytes())); Stanza stan = new StanzaBuilder("challenge", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL).addText( challengeReply).build(); return stan; } }