From b8944ab71ccdc9951c6b74ef8ed8686d0329f99c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Fri, 27 Aug 2010 17:05:18 +0300 Subject: authdb: implement basics Implement a shared memory based authentication cache. It's a simple local cache indexed by IP-address, and keeps track of that IP's auth info such as username, allowed categories and timeouts. This provides basis for captive portal, per-user definable category restrictions and implementation of soft blocks (block which can be overridden by user by clicking a button on the blocked page). --- squark-auth-snmp.c | 69 +++++------------------------------------------------- 1 file changed, 6 insertions(+), 63 deletions(-) (limited to 'squark-auth-snmp.c') diff --git a/squark-auth-snmp.c b/squark-auth-snmp.c index 4b88913..f386ab3 100644 --- a/squark-auth-snmp.c +++ b/squark-auth-snmp.c @@ -22,12 +22,12 @@ #include #include #include -#include #include #include #include "blob.h" +#include "addr.h" /* Compile time configurables */ #define SWITCH_HASH_SIZE 128 @@ -167,43 +167,6 @@ static inline void blob_pull_oid_dump(blob_t *b, blob_t d) /* ----------------------------------------------------------------- */ -typedef union { - struct sockaddr any; - struct sockaddr_in ipv4; -} sockaddr_any; - -int addr_len(const sockaddr_any *addr) -{ - switch (addr->any.sa_family) { - case AF_INET: - return sizeof(struct sockaddr_in); - default: - return 0; - } -} - -void addr_copy(sockaddr_any *dst, const sockaddr_any *src) -{ - memcpy(dst, src, addr_len(src)); -} - -int addr_cmp(const sockaddr_any *a, const sockaddr_any *b) -{ - if (a->any.sa_family != b->any.sa_family) - return -1; - return memcmp(a, b, addr_len(a)); -} - -sockaddr_any *addr_parse(const char *str, sockaddr_any *addr) -{ - memset(addr, 0, sizeof(*addr)); - addr->ipv4.sin_family = AF_INET; - addr->ipv4.sin_addr.s_addr = inet_addr(str); - if (addr->ipv4.sin_addr.s_addr == -1) - return NULL; - return addr; -} - void blob_push_iana_afn(blob_t *b, sockaddr_any *addr) { unsigned char *ptr; @@ -245,26 +208,6 @@ sockaddr_any *blob_pull_iana_afn(blob_t *b, sockaddr_any *addr) return addr; } -unsigned long addr_hash(const sockaddr_any *addr) -{ - switch (addr->any.sa_family) { - case AF_INET: - return htonl(addr->ipv4.sin_addr.s_addr); - default: - return 0; - } -} - -const char *addr_print(const sockaddr_any *addr) -{ - switch (addr->any.sa_family) { - case AF_INET: - return inet_ntoa(addr->ipv4.sin_addr); - default: - return "unknown"; - } -} - /* ----------------------------------------------------------------- */ static void safe_free(void *ptr) @@ -435,10 +378,10 @@ void link_switch(const char *a, int ap, const char *b, int bp) struct switch_port_info *spia, *spib; sockaddr_any addr; - sia = get_switch(addr_parse(a, &addr)); + sia = get_switch(addr_parse(BLOB_STRLEN(a), &addr)); spia = get_switch_port(sia, ap); - sib = get_switch(addr_parse(b, &addr)); + sib = get_switch(addr_parse(BLOB_STRLEN(b), &addr)); spib = get_switch_port(sib, bp); addr_copy(&spia->link_partner, &sib->addr); @@ -994,7 +937,7 @@ void start_authentication(const char *token, const char *ip) auth = calloc(1, sizeof(*auth)); auth->token = strdup(token); - if (addr_parse(ip, &auth->addr) == NULL) { + if (addr_parse(BLOB_STRLEN(ip), &auth->addr) == NULL) { auth_completed(auth); return; } @@ -1112,9 +1055,9 @@ int main(int argc, char **argv) if (l2_root == NULL) l2_root = l3_root; - l3_root_dev = get_switch(addr_parse(l3_root, &addr)); + l3_root_dev = get_switch(addr_parse(BLOB_STRLEN(l3_root), &addr)); l3_if_ndx = resolve_ifName2ifIndex(l3_root_dev, BLOB_STRLEN((char *) l3_ifname)); - l2_root_dev = get_switch(addr_parse(l2_root, &addr)); + l2_root_dev = get_switch(addr_parse(BLOB_STRLEN(l2_root), &addr)); l2_vlan_ndx = atoi(l2_vlan); username_format_flags = parse_format(username_format); -- cgit v1.2.3