static int http_da_parse_header(struct soap *soap, const char *key, const char *val) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; /* check if server received Authorization Digest HTTP header from client */ if (!soap_tag_cmp(key, "Authorization") && !soap_tag_cmp(val, "Digest *")) { soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "realm")); soap->userid = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "username")); soap->passwd = NULL; data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); data->alg = NULL; data->ncount = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nc")); data->cnonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "cnonce")); data->response = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "response")); return SOAP_OK; } /* check if client received WWW-Authenticate Digest HTTP header from server */ if ((!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate")) && !soap_tag_cmp(val, "Digest *")) { soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "realm")); data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); data->alg = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "algorithm")); data->nc = 1; data->ncount = NULL; data->cnonce = NULL; data->response = NULL; return SOAP_OK; } return data->fparsehdr(soap, key, val); }
static int http_da_parse_header(struct soap *soap, const char *key, const char *val) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; /* check if server received Authorization Digest HTTP header from client */ if (!soap_tag_cmp(key, "Authorization") && !soap_tag_cmp(val, "Digest *")) { soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "realm")); soap->userid = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "username")); soap->passwd = NULL; data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); data->alg = NULL; data->ncount = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nc")); data->cnonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "cnonce")); data->response = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "response")); if (data->qop && !soap_tag_cmp(data->qop, "auth-int")) { if (soap->fpreparerecv != http_da_preparerecv) { data->fpreparerecv = soap->fpreparerecv; soap->fpreparerecv = http_da_preparerecv; } if (soap->fdisconnect != http_da_disconnect) { data->fdisconnect = soap->fdisconnect; soap->fdisconnect = http_da_disconnect; } md5_handler(soap, &data->context, MD5_INIT, NULL, 0); } return SOAP_OK; } /* check if client received WWW-Authenticate Digest HTTP header from server */ if (!soap_tag_cmp(key, "WWW-Authenticate") && !soap_tag_cmp(val, "Digest *")) { soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "realm")); data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); data->alg = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "algorithm")); data->nc = 1; data->ncount = NULL; data->cnonce = NULL; data->response = NULL; return SOAP_OK; } return data->fparsehdr(soap, key, val); }
static int http_da_parse_header(struct soap *soap, const char *key, const char *val) { struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); if (!data) return SOAP_PLUGIN_ERROR; /* check if server received Authorization Digest HTTP header from client */ if (!soap_tag_cmp(key, "Authorization") && !soap_tag_cmp(val, "Digest *")) { data->alg = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "algorithm")); soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "realm")); soap->userid = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "username")); soap->passwd = NULL; data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); data->ncount = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nc")); data->cnonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "cnonce")); (void)soap_hex2s(soap, soap_get_header_attribute(soap, val + 7, "response"), data->response, 32, NULL); return SOAP_OK; } /* check if client received WWW-Authenticate Digest HTTP header from server */ if ((!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate")) && !soap_tag_cmp(val, "Digest *")) { const char *authrealm = soap_get_header_attribute(soap, val + 7, "realm"); if (authrealm && (!soap->authrealm || strcmp(authrealm, soap->authrealm))) { const char *alg; soap->authrealm = soap_strdup(soap, authrealm); alg = soap_get_header_attribute(soap, val + 7, "algorithm"); if (!alg || soap_tag_cmp(alg, "SHA-512-256*")) { /* got the first authenticate header for this realm that we can accept */ data->alg = soap_strdup(soap, alg); data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); data->nc = 1; data->ncount = NULL; data->cnonce = NULL; } else { soap->authrealm = NULL; } } return SOAP_OK; } return data->fparsehdr(soap, key, val); }