+ curl_slist_free_all(my_headers);
+ curl_easy_cleanup(curl);
+ docbytes = StrLength(ReplyBuf);
+
+ /*
+ * The response from the server will be one of:
+ *
+ * Option 1: An HTML document with a <head> element that includes a <meta> element with http-equiv
+ * attribute, X-XRDS-Location,
+ */
+ /* FIXME handle this somehow */
+
+ /*
+ * Option 2: HTTP response-headers that include an X-XRDS-Location response-header,
+ * together with a document.
+ * 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.
+ *
+ * If the X-XRDS-Location header was delivered, we know about it at this point...
+ */
+ if ( (x_xrds_location)
+ && (strcmp(ChrPtr(x_xrds_location), ChrPtr(YadisURL)))
+ ) {
+ syslog(LOG_DEBUG, "X-XRDS-Location: %s ... recursing!", ChrPtr(x_xrds_location));
+ return_value = perform_openid2_discovery(x_xrds_location);
+ FreeStrBuf(&x_xrds_location);
+ }
+
+ /*
+ * Option 4: the returned web page may *be* an XRDS document. Try to parse it.
+ */
+ else if (docbytes >= 0) {
+ return_value = parse_xrds_document(ReplyBuf);
+ }
+
+ /*
+ * Option 5: if all else fails, attempt HTML based discovery.
+ */
+ if (return_value == 0) {
+ syslog(LOG_DEBUG, "Attempting HTML discovery");
+ StrBuf *foo = NewStrBuf();
+ extract_link(foo, HKEY("openid2.provider"), ReplyBuf);
+ if (StrLength(foo) > 0) {
+ syslog(LOG_DEBUG, "\033[31mHTML DISCO PROVIDER: %s\033[0m", ChrPtr(foo));
+ }
+ FreeStrBuf(&foo);
+ }
+
+ if (ReplyBuf != NULL) {
+ FreeStrBuf(&ReplyBuf);
+ }
+ return(return_value);
+}
+
+
+/*
+ * Setup an OpenID authentication
+ */
+void cmd_oids(char *argbuf) {
+ struct CitContext *CCC = CC; /* CachedCitContext - performance boost */
+ const char *Pos = NULL;
+ StrBuf *ArgBuf = NULL;
+ StrBuf *ReplyBuf = NULL;
+ StrBuf *return_to = NULL;
+ StrBuf *trust_root = NULL;
+ StrBuf *openid_delegate = NULL;
+ StrBuf *RedirectUrl = NULL;
+ ctdl_openid *oiddata;
+ int discovery_succeeded = 0;
+
+ Free_ctdl_openid ((ctdl_openid**)&CCC->openid_data);
+
+ CCC->openid_data = oiddata = malloc(sizeof(ctdl_openid));