/*
* JLibs: Common Utilities for Java
* Copyright (C) 2009 Santhosh Kumar T <santhosh.tekuri@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package jlibs.nio.http.util;
import jlibs.nio.Reactor;
import static java.util.Objects.requireNonNull;
/**
* @author Santhosh Kumar Tekuri
*/
public class DigestCredentials implements Credentials{
public static final String SCHEME = "Digest";
public static final String USERNAME = "username";
public static final String REALM = "realm";
public static final String NONCE = "nonce";
public static final String URI = "uri";
public static final String RESPONSE = "response";
public static final String ALGORITHM = "algorithm";
public static final String CNONCE = "cnonce";
public static final String OPAQUE = "opaque";
public static final String QOP = "qop";
public static final String NC = "nc";
// mandatory
public String username;
public String realm;
public String nonce;
public String uri;
public String response;
// optional
public String algorithm;
public String cnonce;
public String opaque;
public String qop;
public String nc;
@Override
public String scheme(){
return SCHEME;
}
public void validate(){
requireNonNull(username, "username==null");
requireNonNull(realm, "realm==null");
requireNonNull(nonce, "nonce==null");
requireNonNull(uri, "uri==null");
requireNonNull(response, "response==null");
}
@Override
public String toString(){
StringBuilder buffer = Reactor.stringBuilder();
buffer.append(SCHEME).append(' ');
Parser.appendQuotedValue(buffer, USERNAME, username);
buffer.append(',');
Parser.appendQuotedValue(buffer, REALM, realm);
buffer.append(',');
Parser.appendQuotedValue(buffer, NONCE, nonce);
buffer.append(',');
Parser.appendQuotedValue(buffer, URI, uri);
buffer.append(',');
Parser.appendQuotedValue(buffer, RESPONSE, response);
if(algorithm!=null){
buffer.append(',');
buffer.append(ALGORITHM).append('=').append(algorithm);
}
if(cnonce!=null){
buffer.append(',');
Parser.appendQuotedValue(buffer, CNONCE, cnonce);
}
if(opaque!=null){
buffer.append(',');
Parser.appendQuotedValue(buffer, OPAQUE, opaque);
}
if(qop!=null){
buffer.append(',');
buffer.append(QOP).append('=').append(qop);
}
if(nc!=null){
buffer.append(',');
Parser.appendValue(buffer, NC, nc);
}
return Reactor.free(buffer);
}
public static DigestCredentials valueOf(String value){
DigestCredentials dc = new DigestCredentials();
Parser parser = new Parser(true, value);
while(true){
String name = parser.lvalue();
if(name==null)
break;
if(USERNAME.equalsIgnoreCase(name))
dc.username = parser.rvalue();
else if(REALM.equalsIgnoreCase(name))
dc.realm = parser.rvalue();
else if(NONCE.equalsIgnoreCase(name))
dc.nonce = parser.rvalue();
else if(URI.equalsIgnoreCase(name))
dc.uri = parser.rvalue();
else if(RESPONSE.equalsIgnoreCase(name))
dc.response = parser.rvalue();
else if(ALGORITHM.equalsIgnoreCase(name))
dc.algorithm = parser.rvalue();
else if(CNONCE.equalsIgnoreCase(name))
dc.cnonce = parser.rvalue();
else if(OPAQUE.equalsIgnoreCase(name))
dc.opaque = parser.rvalue();
else if(QOP.equalsIgnoreCase(name))
dc.qop = parser.rvalue();
else if(NC.equalsIgnoreCase(name))
dc.nc = parser.rvalue();
parser.skipPairs();
parser.skip();
}
dc.validate();
return dc;
}
}