+
+ if (GetHash(keys, "signed", 6, (void *) &o_signed)) {
+ curl_formadd(&formpost, &lastptr,
+ CURLFORM_COPYNAME, "openid.signed",
+ CURLFORM_COPYCONTENTS, o_signed,
+ CURLFORM_END);
+ syslog(LOG_DEBUG, "%25s : %s", "openid.signed", o_signed);
+
+ num_signed_values = num_tokens(o_signed, ',');
+ for (i=0; i<num_signed_values; ++i) {
+ extract_token(k_keyname, o_signed, i, ',', sizeof k_keyname);
+ if (strcasecmp(k_keyname, "mode")) { // work around phpMyID bug
+ if (GetHash(keys, k_keyname, strlen(k_keyname), (void *) &k_value)) {
+ snprintf(k_o_keyname, sizeof k_o_keyname, "openid.%s", k_keyname);
+ curl_formadd(&formpost, &lastptr,
+ CURLFORM_COPYNAME, k_o_keyname,
+ CURLFORM_COPYCONTENTS, k_value,
+ CURLFORM_END);
+ syslog(LOG_DEBUG, "%25s : %s", k_o_keyname, k_value);
+ }
+ else {
+ syslog(LOG_INFO, "OpenID: signed field '%s' is missing",
+ k_keyname);
+ }
+ }
+ }
+ }
+
+ ReplyBuf = NewStrBuf();
+
+ curl = ctdl_openid_curl_easy_init(errmsg);
+ curl_easy_setopt(curl, CURLOPT_URL, ChrPtr(oiddata->op_url));
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, ReplyBuf);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlFillStrBuf_callback);
+ curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
+
+ res = curl_easy_perform(curl);
+ if (res) {
+ syslog(LOG_DEBUG, "cmd_oidf() libcurl error %d: %s", res, errmsg);
+ }
+ curl_easy_cleanup(curl);
+ curl_formfree(formpost);
+
+ if (cbmstrcasestr(ChrPtr(ReplyBuf), "is_valid:true")) {
+ oiddata->verified = 1;
+ }
+ FreeStrBuf(&ReplyBuf);
+
+ syslog(LOG_DEBUG, "Authentication %s.", (oiddata->verified ? "succeeded" : "failed") );
+
+ /* Respond to the client */
+
+ if (oiddata->verified) {
+
+ /* If we were already logged in, attach the OpenID to the user's account */
+ if (CC->logged_in) {
+ if (attach_openid(&CC->user, oiddata->claimed_id) == 0) {
+ cprintf("attach\n");
+ syslog(LOG_DEBUG, "OpenID attach succeeded");
+ }
+ else {
+ cprintf("fail\n");
+ syslog(LOG_DEBUG, "OpenID attach failed");
+ }