if (realm == null || nonce == null || digest == null) {
return;
}
SipHeaders sipHeaders = sipMessage.getSipHeaders();
String cseq = sipHeaders.get(
new SipHeaderFieldName(RFC3261.HDR_CSEQ)).getValue();
String method = cseq.substring(cseq.trim().lastIndexOf(' ') + 1);
digest = getRequestDigest(method);
StringBuffer buf = new StringBuffer();
buf.append(RFC2617.SCHEME_DIGEST).append(" ");
appendParameter(buf, RFC2617.PARAM_USERNAME, username);
buf.append(RFC2617.PARAM_SEPARATOR).append(" ");
appendParameter(buf, RFC2617.PARAM_REALM, realm);
buf.append(RFC2617.PARAM_SEPARATOR).append(" ");
appendParameter(buf, RFC2617.PARAM_NONCE, nonce);
buf.append(RFC2617.PARAM_SEPARATOR).append(" ");
appendParameter(buf, RFC2617.PARAM_URI, requestUri);
buf.append(RFC2617.PARAM_SEPARATOR).append(" ");
appendParameter(buf, RFC2617.PARAM_RESPONSE, digest);
SipHeaderFieldName authorizationName;
if (statusCode == RFC3261.CODE_401_UNAUTHORIZED) {
authorizationName = new SipHeaderFieldName(
RFC3261.HDR_AUTHORIZATION);
} else if (statusCode == RFC3261.CODE_407_PROXY_AUTHENTICATION_REQUIRED) {
authorizationName = new SipHeaderFieldName(
RFC3261.HDR_PROXY_AUTHORIZATION);
} else {
return;
}
sipHeaders.add(authorizationName,
new SipHeaderFieldValue(buf.toString()));
// manage authentication on unregister challenge...
if (contact != null) {
SipHeaderParamName expiresName =
new SipHeaderParamName(RFC3261.PARAM_EXPIRES);
String expiresString = contact.getParam(expiresName);
if (expiresString != null && Integer.parseInt(expiresString) == 0) {
SipHeaderFieldValue requestContact =
sipHeaders.get(new SipHeaderFieldName(RFC3261.HDR_CONTACT));
requestContact.addParam(expiresName, expiresString);
}
}
}