Fix warnings all over citserver; handle function replies; remove unused code.
[citadel.git] / citadel / modules / openid / serv_openid_rp.c
index 384e2b6e08d8cfaf6931f36f562f975ee91e4a34..c82a6c286a0a5175fe3a2f1a646f4ddf2873ff11 100644 (file)
@@ -1,23 +1,21 @@
 /*
- * $Id$
- *
  * This is an implementation of OpenID 1.1 Relying Party support, in stateless mode.
  *
- * Copyright (c) 2007-2009 by the citadel.org team
+ * Copyright (c) 2007-2010 by the citadel.org team
  *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
  *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
 #include "sysdep.h"
@@ -76,7 +74,7 @@ void openid_cleanup_function(void) {
        struct CitContext *CCC = CC;    /* CachedCitContext - performance boost */
 
        if (CCC->openid_data != NULL) {
-               CtdlLogPrintf(CTDL_DEBUG, "Clearing OpenID session state\n");
+               syslog(LOG_DEBUG, "Clearing OpenID session state\n");
                Free_ctdl_openid((ctdl_openid **) &CCC->openid_data);
        }
 }
@@ -127,11 +125,11 @@ int attach_openid(struct ctdluser *who, StrBuf *claimed_id)
                cdb_free(cdboi);
 
                if (fetched_usernum == who->usernum) {
-                       CtdlLogPrintf(CTDL_INFO, "%s already associated; no action is taken\n", claimed_id);
+                       syslog(LOG_INFO, "%s already associated; no action is taken\n", ChrPtr(claimed_id));
                        return(0);
                }
                else {
-                       CtdlLogPrintf(CTDL_INFO, "%s already belongs to another user\n", claimed_id);
+                       syslog(LOG_INFO, "%s already belongs to another user\n", ChrPtr(claimed_id));
                        return(3);
                }
        }
@@ -150,7 +148,7 @@ int attach_openid(struct ctdluser *who, StrBuf *claimed_id)
        snprintf(buf, sizeof buf, "User <%s> (#%ld) has claimed the OpenID URL %s\n",
                 who->fullname, who->usernum, ChrPtr(claimed_id));
        CtdlAideMessage(buf, "OpenID claim");
-       CtdlLogPrintf(CTDL_INFO, "%s", buf);
+       syslog(LOG_INFO, "%s", buf);
        return(0);
 }
 
@@ -190,7 +188,7 @@ void openid_purge(struct ctdluser *usbuf) {
        HashPos = GetNewHashPos(keys, 0);
        while (GetNextHashPos(keys, HashPos, &len, &Key, &Value)!=0)
        {
-               CtdlLogPrintf(CTDL_DEBUG, "Deleting associated OpenID <%s>\n", Value);
+               syslog(LOG_DEBUG, "Deleting associated OpenID <%s>\n", (char*)Value);
                cdb_delete(CDB_OPENID, Value, strlen(Value));
                /* note: don't free(Value) -- deleting the hash list will handle this for us */
        }
@@ -423,11 +421,11 @@ int openid_create_user_via_sreg(StrBuf *claimed_id, HashList *sreg_keys)
        if (CC->logged_in) return(3);
        if (!GetHash(sreg_keys, "sreg.nickname", 13, (void *) &desired_name)) return(4);
 
-       CtdlLogPrintf(CTDL_DEBUG, "The desired account name is <%s>\n", desired_name);
+       syslog(LOG_DEBUG, "The desired account name is <%s>\n", desired_name);
 
        len = cutuserkey(desired_name);
        if (!CtdlGetUser(&CC->user, desired_name)) {
-               CtdlLogPrintf(CTDL_DEBUG, "<%s> is already taken by another user.\n", desired_name);
+               syslog(LOG_DEBUG, "<%s> is already taken by another user.\n", desired_name);
                memset(&CC->user, 0, sizeof(struct ctdluser));
                return(5);
        }
@@ -487,7 +485,7 @@ int login_via_openid(StrBuf *claimed_id)
  */
 void extract_link(StrBuf *target_buf, const char *rel, long repllen, StrBuf *source_buf)
 {
-       int len, i;
+       int i;
        const char *ptr;
        const char *href_start = NULL;
        const char *href_end = NULL;
@@ -503,16 +501,14 @@ void extract_link(StrBuf *target_buf, const char *rel, long repllen, StrBuf *sou
        ptr = ChrPtr(source_buf);
 
        FlushStrBuf(target_buf);
-       while (ptr = bmstrcasestr(ptr, "<link"), ptr != NULL) {
+       while (ptr = cbmstrcasestr(ptr, "<link"), ptr != NULL) {
 
                link_tag_start = ptr;
                link_tag_end = strchr(ptr, '>');
                if (link_tag_end == NULL)
                        break;
                for (i=0; i < 1; i++ ){
-                       len = link_tag_end - link_tag_start;
-
-                       rel_start = bmstrcasestr(link_tag_start, "rel=");
+                       rel_start = cbmstrcasestr(link_tag_start, "rel=");
                        if ((rel_start == NULL) ||
                            (rel_start > link_tag_end)) 
                                continue;
@@ -530,7 +526,7 @@ void extract_link(StrBuf *target_buf, const char *rel, long repllen, StrBuf *sou
                        if (strncasecmp(rel, rel_start, repllen)!= 0)
                                continue; /* didn't match? never mind... */
                        
-                       href_start = bmstrcasestr(link_tag_start, "href=");
+                       href_start = cbmstrcasestr(link_tag_start, "href=");
                        if ((href_start == NULL) || 
                            (href_start >= link_tag_end)) 
                                continue;
@@ -571,7 +567,7 @@ int fetch_http(StrBuf *url, StrBuf **target_buf)
 
        curl = curl_easy_init();
        if (!curl) {
-               CtdlLogPrintf(CTDL_ALERT, "Unable to initialize libcurl.\n");
+               syslog(LOG_ALERT, "Unable to initialize libcurl.\n");
                return(-1);
        }
 
@@ -590,12 +586,17 @@ int fetch_http(StrBuf *url, StrBuf **target_buf)
 #endif
        curl_easy_setopt(curl, CURLOPT_USERAGENT, CITADEL);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 180);           /* die after 180 seconds */
-       if (!IsEmptyStr(config.c_ip_addr)) {
+       if (
+               (!IsEmptyStr(config.c_ip_addr))
+               && (strcmp(config.c_ip_addr, "*"))
+               && (strcmp(config.c_ip_addr, "::"))
+               && (strcmp(config.c_ip_addr, "0.0.0.0"))
+       ) {
                curl_easy_setopt(curl, CURLOPT_INTERFACE, config.c_ip_addr);
        }
        res = curl_easy_perform(curl);
        if (res) {
-               CtdlLogPrintf(CTDL_DEBUG, "fetch_http() libcurl error %d: %s\n", res, errmsg);
+               syslog(LOG_DEBUG, "fetch_http() libcurl error %d: %s\n", res, errmsg);
        }
        curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
        StrBufPlain(url, effective_url, -1);
@@ -643,7 +644,7 @@ void cmd_oids(char *argbuf) {
        oiddata->verified = 0;
 
        i = fetch_http(oiddata->claimed_id, &ReplyBuf);
-       CtdlLogPrintf(CTDL_DEBUG, "Normalized URL and Claimed ID is: %s\n", 
+       syslog(LOG_DEBUG, "Normalized URL and Claimed ID is: %s\n", 
                      ChrPtr(oiddata->claimed_id));
        if ((StrLength(ReplyBuf) > 0) && (i > 0)) {
 
@@ -741,13 +742,13 @@ void cmd_oidf(char *argbuf) {
                if (len < 0)
                        len = sizeof(thiskey) - 1;
                extract_token(thisdata, buf, 1, '|', sizeof thisdata);
-               CtdlLogPrintf(CTDL_DEBUG, "%s: [%d] %s\n", thiskey, strlen(thisdata), thisdata);
+               syslog(LOG_DEBUG, "%s: ["SIZE_T_FMT"] %s\n", thiskey, strlen(thisdata), thisdata);
                Put(keys, thiskey, len, strdup(thisdata), NULL);
        }
 
 
        /* Now that we have all of the parameters, we have to validate the signature against the server */
-       CtdlLogPrintf(CTDL_DEBUG, "About to validate the signature...\n");
+       syslog(LOG_DEBUG, "About to validate the signature...\n");
 
        CURL *curl;
        CURLcode res;
@@ -768,14 +769,14 @@ void cmd_oidf(char *argbuf) {
                CURLFORM_COPYNAME,      "openid.mode",
                CURLFORM_COPYCONTENTS,  "check_authentication",
                CURLFORM_END);
-       CtdlLogPrintf(CTDL_DEBUG, "%25s : %s\n", "openid.mode", "check_authentication");
+       syslog(LOG_DEBUG, "%25s : %s\n", "openid.mode", "check_authentication");
 
        if (GetHash(keys, "assoc_handle", 12, (void *) &o_assoc_handle)) {
                curl_formadd(&formpost, &lastptr,
                        CURLFORM_COPYNAME,      "openid.assoc_handle",
                        CURLFORM_COPYCONTENTS,  o_assoc_handle,
                        CURLFORM_END);
-               CtdlLogPrintf(CTDL_DEBUG, "%25s : %s\n", "openid.assoc_handle", o_assoc_handle);
+               syslog(LOG_DEBUG, "%25s : %s\n", "openid.assoc_handle", o_assoc_handle);
        }
 
        if (GetHash(keys, "sig", 3, (void *) &o_sig)) {
@@ -783,7 +784,7 @@ void cmd_oidf(char *argbuf) {
                        CURLFORM_COPYNAME,      "openid.sig",
                        CURLFORM_COPYCONTENTS,  o_sig,
                        CURLFORM_END);
-                       CtdlLogPrintf(CTDL_DEBUG, "%25s : %s\n", "openid.sig", o_sig);
+                       syslog(LOG_DEBUG, "%25s : %s\n", "openid.sig", o_sig);
        }
 
        if (GetHash(keys, "signed", 6, (void *) &o_signed)) {
@@ -791,7 +792,7 @@ void cmd_oidf(char *argbuf) {
                        CURLFORM_COPYNAME,      "openid.signed",
                        CURLFORM_COPYCONTENTS,  o_signed,
                        CURLFORM_END);
-               CtdlLogPrintf(CTDL_DEBUG, "%25s : %s\n", "openid.signed", o_signed);
+               syslog(LOG_DEBUG, "%25s : %s\n", "openid.signed", o_signed);
 
                num_signed_values = num_tokens(o_signed, ',');
                for (i=0; i<num_signed_values; ++i) {
@@ -803,10 +804,10 @@ void cmd_oidf(char *argbuf) {
                                                CURLFORM_COPYNAME,      k_o_keyname,
                                                CURLFORM_COPYCONTENTS,  k_value,
                                                CURLFORM_END);
-                                       CtdlLogPrintf(CTDL_DEBUG, "%25s : %s\n", k_o_keyname, k_value);
+                                       syslog(LOG_DEBUG, "%25s : %s\n", k_o_keyname, k_value);
                                }
                                else {
-                                       CtdlLogPrintf(CTDL_INFO, "OpenID: signed field '%s' is missing\n",
+                                       syslog(LOG_INFO, "OpenID: signed field '%s' is missing\n",
                                                k_keyname);
                                }
                        }
@@ -831,23 +832,28 @@ void cmd_oidf(char *argbuf) {
 #endif
        curl_easy_setopt(curl, CURLOPT_USERAGENT, CITADEL);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 180);           /* die after 180 seconds */
-       if (!IsEmptyStr(config.c_ip_addr)) {
+       if (
+               (!IsEmptyStr(config.c_ip_addr))
+               && (strcmp(config.c_ip_addr, "*"))
+               && (strcmp(config.c_ip_addr, "::"))
+               && (strcmp(config.c_ip_addr, "0.0.0.0"))
+       ) {
                curl_easy_setopt(curl, CURLOPT_INTERFACE, config.c_ip_addr);
        }
 
        res = curl_easy_perform(curl);
        if (res) {
-               CtdlLogPrintf(CTDL_DEBUG, "cmd_oidf() libcurl error %d: %s\n", res, errmsg);
+               syslog(LOG_DEBUG, "cmd_oidf() libcurl error %d: %s\n", res, errmsg);
        }
        curl_easy_cleanup(curl);
        curl_formfree(formpost);
 
-       if (bmstrcasestr(ChrPtr(ReplyBuf), "is_valid:true")) {
+       if (cbmstrcasestr(ChrPtr(ReplyBuf), "is_valid:true")) {
                oiddata->verified = 1;
        }
        FreeStrBuf(&ReplyBuf);
 
-       CtdlLogPrintf(CTDL_DEBUG, "Authentication %s.\n", (oiddata->verified ? "succeeded" : "failed") );
+       syslog(LOG_DEBUG, "Authentication %s.\n", (oiddata->verified ? "succeeded" : "failed") );
 
        /* Respond to the client */
 
@@ -857,11 +863,11 @@ void cmd_oidf(char *argbuf) {
                if (CC->logged_in) {
                        if (attach_openid(&CC->user, oiddata->claimed_id) == 0) {
                                cprintf("attach\n");
-                               CtdlLogPrintf(CTDL_DEBUG, "OpenID attach succeeded\n");
+                               syslog(LOG_DEBUG, "OpenID attach succeeded\n");
                        }
                        else {
                                cprintf("fail\n");
-                               CtdlLogPrintf(CTDL_DEBUG, "OpenID attach failed\n");
+                               syslog(LOG_DEBUG, "OpenID attach failed\n");
                        }
                }
 
@@ -878,7 +884,7 @@ void cmd_oidf(char *argbuf) {
                        if (login_via_openid(oiddata->claimed_id) == 0) {
                                cprintf("authenticate\n%s\n%s\n", CC->user.fullname, CC->user.password);
                                logged_in_response();
-                               CtdlLogPrintf(CTDL_DEBUG, "Logged in using previously claimed OpenID\n");
+                               syslog(LOG_DEBUG, "Logged in using previously claimed OpenID\n");
                        }
 
                        /*
@@ -887,7 +893,7 @@ void cmd_oidf(char *argbuf) {
                         */
                        else if (config.c_disable_newu) {
                                cprintf("fail\n");
-                               CtdlLogPrintf(CTDL_DEBUG, "Creating user failed due to local policy\n");
+                               syslog(LOG_DEBUG, "Creating user failed due to local policy\n");
                        }
 
                        /*
@@ -896,7 +902,7 @@ void cmd_oidf(char *argbuf) {
                        else if (openid_create_user_via_sreg(oiddata->claimed_id, keys) == 0) {
                                cprintf("authenticate\n%s\n%s\n", CC->user.fullname, CC->user.password);
                                logged_in_response();
-                               CtdlLogPrintf(CTDL_DEBUG, "Successfully auto-created new user\n");
+                               syslog(LOG_DEBUG, "Successfully auto-created new user\n");
                        }
 
                        /*
@@ -913,7 +919,7 @@ void cmd_oidf(char *argbuf) {
                                else {
                                        cprintf("\n");
                                }
-                               CtdlLogPrintf(CTDL_DEBUG, "The desired Simple Registration name is already taken.\n");
+                               syslog(LOG_DEBUG, "The desired Simple Registration name is already taken.\n");
                        }
                }
        }
@@ -956,8 +962,9 @@ CTDL_MODULE_INIT(openid_rp)
                }
                CtdlRegisterSessionHook(openid_cleanup_function, EVT_LOGOUT);
                CtdlRegisterUserHook(openid_purge, EVT_PURGEUSER);
+               openid_level_supported = 1;     /* This module supports OpenID 1.0 only */
        }
 
-       /* return our Subversion id for the Log */
-       return "$Id$";
+       /* return our module name for the log */
+       return "openid_rp";
 }