From: Russell Bryant Date: Mon, 5 May 2008 19:49:25 +0000 (+0000) Subject: Avoid putting opaque="" in Digest authentication. This patch came from switchvox. X-Git-Tag: 1.4.20~25 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fbf07008d9aa9f193bd87f97020524ff437910d0;p=thirdparty%2Fasterisk.git Avoid putting opaque="" in Digest authentication. This patch came from switchvox. It fixes authentication with Primus in Canada, and has been in use for a very long time without causing problems with any other providers. (closes issue AST-36) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@115304 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 8bf290a637..4c43b899b2 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -11600,6 +11600,7 @@ static int build_reply_digest(struct sip_pvt *p, int method, char* digest, int d char resp[256]; char resp_hash[256]; char uri[256]; + char opaque[256] = ""; char cnonce[80]; const char *username; const char *secret; @@ -11648,11 +11649,17 @@ static int build_reply_digest(struct sip_pvt *p, int method, char* digest, int d else snprintf(resp,sizeof(resp),"%s:%s:%s", a1_hash, p->nonce, a2_hash); ast_md5_hash(resp_hash, resp); + + /* only include the opaque string if it's set */ + if (!ast_strlen_zero(p->opaque)) { + snprintf(opaque, sizeof(opaque), ", opaque=\"%s\"", p->opaque); + } + /* XXX We hard code our qop to "auth" for now. XXX */ if (!ast_strlen_zero(p->qop)) - snprintf(digest, digest_len, "Digest username=\"%s\", realm=\"%s\", algorithm=MD5, uri=\"%s\", nonce=\"%s\", response=\"%s\", opaque=\"%s\", qop=auth, cnonce=\"%s\", nc=%08x", username, p->realm, uri, p->nonce, resp_hash, p->opaque, cnonce, p->noncecount); + snprintf(digest, digest_len, "Digest username=\"%s\", realm=\"%s\", algorithm=MD5, uri=\"%s\", nonce=\"%s\", response=\"%s\"%s, qop=auth, cnonce=\"%s\", nc=%08x", username, p->realm, uri, p->nonce, resp_hash, opaque, cnonce, p->noncecount); else - snprintf(digest, digest_len, "Digest username=\"%s\", realm=\"%s\", algorithm=MD5, uri=\"%s\", nonce=\"%s\", response=\"%s\", opaque=\"%s\"", username, p->realm, uri, p->nonce, resp_hash, p->opaque); + snprintf(digest, digest_len, "Digest username=\"%s\", realm=\"%s\", algorithm=MD5, uri=\"%s\", nonce=\"%s\", response=\"%s\"%s", username, p->realm, uri, p->nonce, resp_hash, opaque); append_history(p, "AuthResp", "Auth response sent for %s in realm %s - nc %d", username, p->realm, p->noncecount);