fticks_hashmac has moved.
[libradsec.git] / radsecproxy.c
index 5c6b260..6554e8d 100644 (file)
@@ -69,7 +69,6 @@
 #include <openssl/err.h>
 #include <openssl/md5.h>
 #include "debug.h"
-#include "list.h"
 #include "hash.h"
 #include "util.h"
 #include "hostport.h"
@@ -78,7 +77,9 @@
 #include "tcp.h"
 #include "tls.h"
 #include "dtls.h"
+#if defined(WANT_FTICKS)
 #include "fticks.h"
+#endif
 
 static struct options options;
 static struct list *clconfs, *srvconfs;
@@ -1666,6 +1667,12 @@ void replyh(struct server *server, unsigned char *buf) {
        }
     }
 
+#if defined(WANT_FTICKS)
+    if (msg->code == RAD_Access_Accept || msg->code == RAD_Access_Reject)
+       if (options.fticks_reporting && from->conf->fticks_viscountry != NULL)
+           fticks_log(&options, from, msg, rqout);
+#endif
+
     msg->id = (char)rqout->rq->rqid;
     memcpy(msg->auth, rqout->rq->rqauth, 16);
 
@@ -1692,80 +1699,6 @@ void replyh(struct server *server, unsigned char *buf) {
     debug(msg->code == RAD_Access_Accept || msg->code == RAD_Access_Reject || msg->code == RAD_Accounting_Response ? DBG_WARN : DBG_INFO,
          "replyh: passing %s to client %s (%s)", radmsgtype2string(msg->code), from->conf->name, addr2string(from->addr));
 
-    if (options.fticks_reporting && from->conf->fticks_viscountry != NULL) {
-       unsigned char *username = NULL;
-       unsigned char *realm = NULL;
-       uint8_t visinst[8+40+1+1]; /* Room for 40 octets of VISINST.  */
-       uint8_t *macin = NULL;
-       uint8_t macout[2*32+1]; /* Room for ASCII representation of SHA256.  */
-
-       username = radattr2ascii(radmsg_gettype(rqout->rq->msg,
-                                               RAD_Attr_User_Name));
-       if (username != NULL) {
-           realm = (unsigned char *) strrchr((char *) username, '@');
-           if (realm != NULL)
-               realm++;
-           else
-               realm = (unsigned char *) "";
-       }
-
-       memset(visinst, 0, sizeof(visinst));
-       if (options.fticks_reporting == RSP_FTICKS_REPORTING_FULL)
-           snprintf((char *) visinst, sizeof(visinst), "VISINST=%s#",
-                    from->conf->name);
-
-#define BOGUS_MAC "00:00:00:00:00:00" /* FIXME: Is there a standard
-                                      * for bogus MAC addresses?  */
-       memset(macout, 0, sizeof(macout));
-       strncpy((char *) macout, BOGUS_MAC, sizeof(macout) - 1);
-       if (options.fticks_mac != RSP_FTICKS_MAC_STATIC) {
-           macin = radattr2ascii(radmsg_gettype(rqout->rq->msg,
-                                                RAD_Attr_Calling_Station_Id));
-       }
-#if RS_TESTING || 1
-       if (macin == NULL)
-           macin = (uint8_t *) strdup(BOGUS_MAC);
-#endif /* RS_TESTING */
-
-       switch (options.fticks_mac)
-       {
-       case RSP_FTICKS_MAC_STATIC:
-           memcpy(macout, BOGUS_MAC, sizeof(BOGUS_MAC));
-           break;
-       case RSP_FTICKS_MAC_ORIGINAL:
-           memcpy(macout, macin, sizeof(macout));
-           break;
-       case RSP_FTICKS_MAC_VENDOR_HASHED:
-           fticks_hashmac(macin + 3, NULL, sizeof(macout), macout);
-           break;
-       case RSP_FTICKS_MAC_VENDOR_KEY_HASHED:
-           fticks_hashmac(macin + 3, options.fticks_key, sizeof(macout),
-                          macout);
-           break;
-       case RSP_FTICKS_MAC_FULLY_HASHED:
-           fticks_hashmac(macin, NULL, sizeof(macout), macout);
-           break;
-       case RSP_FTICKS_MAC_FULLY_KEY_HASHED:
-           fticks_hashmac(macin, options.fticks_key, sizeof(macout), macout);
-           break;
-       default:
-           debugx(2, DBG_ERR, "invalid fticks mac configuration: %d",
-                  options.fticks_mac);
-       }
-       debug(0xff,
-             "F-TICKS/eduroam/1.0#REALM=%s#VISCOUNTRY=%s#%sCSI=%s#RESULT=%s#",
-             realm,
-             from->conf->fticks_viscountry,
-             visinst,
-             macout,
-             msg->code == RAD_Access_Accept ? "OK" : "FAIL");
-       if (macin != NULL)
-           free(macin);
-       if (username != NULL)
-           free(username);
-
-    }
-
     radmsg_free(rqout->rq->msg);
     rqout->rq->msg = msg;
     sendreply(newrqref(rqout->rq));
@@ -2330,10 +2263,8 @@ int dynamicconfig(struct server *server) {
 
     close(fd[1]);
     pushgconffile(&cf, fdopen(fd[0], "r"), conf->dynamiclookupcommand);
-    ok = getgenericconfig(&cf, NULL,
-                         "Server", CONF_CBK, confserver_cb, (void *)conf,
-                         NULL
-       );
+    ok = getgenericconfig(&cf, NULL, "Server", CONF_CBK, confserver_cb,
+                         (void *) conf, NULL);
     freegconf(&cf);
 
     if (waitpid(pid, &status, 0) < 0) {
@@ -2751,7 +2682,9 @@ int confclient_cb(struct gconffile **cf, void *arg, char *block, char *opt, char
            "rewriteIn", CONF_STR, &conf->confrewritein,
            "rewriteOut", CONF_STR, &conf->confrewriteout,
            "rewriteattribute", CONF_STR, &conf->confrewriteusername,
+#if defined(WANT_FTICKS)
            "fticksVISCOUNTRY", CONF_STR, &conf->fticks_viscountry,
+#endif
            NULL
            ))
        debugx(1, DBG_ERR, "configuration error");
@@ -2867,7 +2800,7 @@ int compileserverconfig(struct clsrvconf *conf, const char *block) {
        conf->rewriteout = getrewrite(conf->confrewriteout, NULL);
 
     if (!addhostport(&conf->hostports, conf->hostsrc, conf->portsrc, 0)) {
-       debug(DBG_ERR, "error in block %s, failed to parse %s", block, conf->hostsrc);
+       debug(DBG_ERR, "error in block %s, failed to parse %s", block, *conf->hostsrc);
        return 0;
     }
 
@@ -3079,79 +3012,16 @@ int setprotoopts(uint8_t type, char **listenargs, char *sourcearg) {
     return 1;
 }
 
-/* FIXME: Move to fticks.c.  */
-int configure_fticks(uint8_t **reportingp, uint8_t **macp, uint8_t **keyp) {
-    int r = 0;
-    const char *reporting = (const char *) *reportingp;
-    const char *mac = (const char *) *macp;
-
-    if (reporting == NULL)
-       goto out;
-
-    if (strcasecmp(reporting, "None") == 0)
-       options.fticks_reporting = RSP_FTICKS_REPORTING_NONE;
-    else if (strcasecmp(reporting, "Basic") == 0)
-       options.fticks_reporting = RSP_FTICKS_REPORTING_BASIC;
-    else if (strcasecmp(reporting, "Full") == 0)
-       options.fticks_reporting = RSP_FTICKS_REPORTING_FULL;
-    else {
-       debugx(1, DBG_ERR, "config error: invalid FTicksReporting value: %s",
-              reporting);
-       r = 1;
-       goto out;
-    }
-
-    if (strcasecmp(mac, "Static") == 0)
-       options.fticks_mac = RSP_FTICKS_MAC_STATIC;
-    else if (strcasecmp(mac, "Original") == 0)
-       options.fticks_mac = RSP_FTICKS_MAC_ORIGINAL;
-    else if (strcasecmp(mac, "VendorHashed") == 0)
-       options.fticks_mac = RSP_FTICKS_MAC_VENDOR_HASHED;
-    else if (strcasecmp(mac, "VendorKeyHashed") == 0)
-       options.fticks_mac = RSP_FTICKS_MAC_VENDOR_KEY_HASHED;
-    else if (strcasecmp(mac, "FullyHashed") == 0)
-       options.fticks_mac = RSP_FTICKS_MAC_FULLY_HASHED;
-    else if (strcasecmp(mac, "FullyKeyHashed") == 0)
-       options.fticks_mac = RSP_FTICKS_MAC_FULLY_KEY_HASHED;
-    else {
-       debugx(1, DBG_ERR, "config error: invalid FTicksMAC value: %s", mac);
-       r = 1;
-       goto out;
-    }
-
-    if (*keyp == NULL
-       && (options.fticks_mac == RSP_FTICKS_MAC_VENDOR_KEY_HASHED
-           || options.fticks_mac == RSP_FTICKS_MAC_FULLY_KEY_HASHED)) {
-       debugx(1, DBG_ERR,
-              "config error: FTicksMAC %s requires an FTicksKey", mac);
-       options.fticks_mac = RSP_FTICKS_MAC_STATIC;
-       r = 1;
-       goto out;
-    }
-
-    if (*keyp != NULL)
-       options.fticks_key = *keyp;
-
-out:
-    if (*reportingp != NULL) {
-       free(*reportingp);
-       *reportingp = NULL;
-    }
-    if (*macp != NULL) {
-       free(*macp);
-       *macp = NULL;
-    }
-    return r;
-}
-
 void getmainconfig(const char *configfile) {
     long int addttl = LONG_MIN, loglevel = LONG_MIN;
     struct gconffile *cfs;
     char **listenargs[RAD_PROTOCOUNT];
     char *sourcearg[RAD_PROTOCOUNT];
+#if defined(WANT_FTICKS)
     uint8_t *fticks_reporting_str = NULL;
     uint8_t *fticks_mac_str = NULL;
     uint8_t *fticks_key_str = NULL;
+#endif
     int i;
 
     cfs = openconfigfile(configfile);
@@ -3205,9 +3075,11 @@ void getmainconfig(const char *configfile) {
            "TLS", CONF_CBK, conftls_cb, NULL,
 #endif
            "Rewrite", CONF_CBK, confrewrite_cb, NULL,
+#if defined(WANT_FTICKS)
            "FTicksReporting", CONF_STR, &fticks_reporting_str,
            "FTicksMAC", CONF_STR, &fticks_mac_str,
            "FTicksKey", CONF_STR, &fticks_key_str,
+#endif
            NULL
            ))
        debugx(1, DBG_ERR, "configuration error");
@@ -3225,7 +3097,10 @@ void getmainconfig(const char *configfile) {
     if (!setttlattr(&options, DEFAULT_TTL_ATTR))
        debugx(1, DBG_ERR, "Failed to set TTLAttribute, exiting");
 
-    configure_fticks(&fticks_reporting_str, &fticks_mac_str, &fticks_key_str);
+#if defined(WANT_FTICKS)
+    fticks_configure(&options, &fticks_reporting_str, &fticks_mac_str,
+                    &fticks_key_str);
+#endif
 
     for (i = 0; i < RAD_PROTOCOUNT; i++)
        if (listenargs[i] || sourcearg[i])
@@ -3332,7 +3207,7 @@ int createpidfile(const char *pidfile) {
     return f && !fclose(f) && r >= 0;
 }
 
-int main(int argc, char **argv) {
+int radsecproxy_main(int argc, char **argv) {
     pthread_t sigth;
     sigset_t sigset;
     struct list_node *entry;