X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fopenid%2Fserv_openid_rp.c;h=813cb9b636ce33ec862274a7726c5a958ab08f66;hb=44a4976c75c9db62fc2ee2ecabe5e79afb9a3237;hp=bdb945df6ecec9ecdde952d7af67eaf30993ea60;hpb=13a8c2159a8b51d744772ca21b67407ebd3b1de5;p=citadel.git diff --git a/citadel/modules/openid/serv_openid_rp.c b/citadel/modules/openid/serv_openid_rp.c index bdb945df6..813cb9b63 100644 --- a/citadel/modules/openid/serv_openid_rp.c +++ b/citadel/modules/openid/serv_openid_rp.c @@ -666,6 +666,8 @@ void xrds_xml_end(void *data, const char *supplied_el) { void xrds_xml_chardata(void *data, const XML_Char *s, int len) { struct xrds *xrds = (struct xrds *) data; + + if (xrds) ; /* this is only here to silence the warning for now */ /* StrBufAppendBufPlain (xrds->CData, s, len, 0); */ } @@ -693,14 +695,13 @@ int parse_xrds_document(StrBuf *ReplyBuf) { syslog(LOG_ALERT, "Cannot create XML parser"); } - return(0); + return(0); /* FIXME return nonzero if something wonderful happened */ } -/* - * Attempt to perform YADIS discovery. - * If successful, returns nonzero and fills the session's claimed ID blah FIXME this comment - * If YADIS fails, returns 0 and does nothing else. +/* Attempt to perform Yadis discovery as specified in Yadis 1.0 section 6.2.5. + * If successful, returns nonzero and calls parse_xrds_document() to act upon the received data. + * If Yadis fails, returns 0 and does nothing else. */ int perform_yadis_discovery(StrBuf *YadisURL) { int docbytes = (-1); @@ -708,8 +709,8 @@ int perform_yadis_discovery(StrBuf *YadisURL) { int r; CURL *curl; CURLcode result; - /*char *effective_url = NULL;*/ char errmsg[1024] = ""; + struct curl_slist *my_headers = NULL; if (YadisURL == NULL) return(0); if (StrLength(YadisURL) == 0) return(0); @@ -724,44 +725,43 @@ int perform_yadis_discovery(StrBuf *YadisURL) { curl_easy_setopt(curl, CURLOPT_WRITEDATA, ReplyBuf); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlFillStrBuf_callback); + my_headers = curl_slist_append(my_headers, "Accept:"); /* disable the default Accept: header */ + my_headers = curl_slist_append(my_headers, "Accept: application/xrds+xml"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, my_headers); + result = curl_easy_perform(curl); if (result) { syslog(LOG_DEBUG, "libcurl error %d: %s", result, errmsg); } - /*curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url); - StrBufPlain(YadisURL, effective_url, -1);*/ + curl_slist_free_all(my_headers); curl_easy_cleanup(curl); docbytes = StrLength(ReplyBuf); - if (docbytes < 0) { - return(0); - } - if (docbytes == 0) { - FreeStrBuf(&ReplyBuf); - return(0); - } /* FIXME here we need to handle Yadis 1.0 section 6.2.5. * * The response from the server will be one of: * - * 1. An HTML document with a element that includes a element with http-equiv + * Option 1: An HTML document with a element that includes a element with http-equiv * attribute, X-XRDS-Location, * - * 2. HTTP response-headers that include an X-XRDS-Location response-header, together with a - * document + * Option 2: HTTP response-headers that include an X-XRDS-Location response-header, together with a + * document (NOTE: we can probably recurse for this) * - * 3. HTTP response-headers only, which MAY include an X-XRDS-Location response-header, + * Option 3:. HTTP response-headers only, which MAY include an X-XRDS-Location response-header, * a contenttype response-header specifying MIME media type, application/xrds+xml, or both. * - * 4. A document of MIME media type, application/xrds+xml - * - * We are only handling case #4 here and assuming that the server returned an XRDS document. */ - /* Parse the XRDS document. */ - r = parse_xrds_document(ReplyBuf); - FreeStrBuf(&ReplyBuf); + /* + * Option 4: the returned web page may *be* an XRDS document. Try to parse it. + */ + r = 0; + if (docbytes >= 0) { + r = parse_xrds_document(ReplyBuf); + FreeStrBuf(&ReplyBuf); + } + return(r); } @@ -811,7 +811,7 @@ void cmd_oids(char *argbuf) { * So we're not even going to bother attempting this mode. */ - /* Second we attempt YADIS. + /* Second we attempt Yadis. * Google uses this so we'd better do our best to implement it. */ int yadis_succeeded = perform_yadis_discovery(oiddata->claimed_id);