Revision: 14792
Author: adrian.chadd
Date: Mon Sep  6 21:39:50 2010
Log: This is an ugly multi-commit patch which needs to be broken up into
its component parts before merging into LUSCA_HEAD.

* the new aclCheckSetup() / aclCheckFinish() functions are now
  being called wherever an aclCheck_t is being statically used
  rather than created via aclChecklistCreate().

* aclCheck_t->src_addr has now become the IPv6-aware aclCheck_t->src_address ;
  all the users (which I could find!) have been renamed

* Delay pools has a hack to work around it for now - so yes, delay pools is
  still v4 only.

* ICP, SNMP, HTCP are still IPv4-only but they now do IPv6-aware ACL lookups.


http://code.google.com/p/lusca-cache/source/detail?r=14792

Modified:
 /playpen/LUSCA_HEAD_ipv6/src/acl.c
 /playpen/LUSCA_HEAD_ipv6/src/client_side.c
 /playpen/LUSCA_HEAD_ipv6/src/delay_pools.c
 /playpen/LUSCA_HEAD_ipv6/src/external_acl.c
 /playpen/LUSCA_HEAD_ipv6/src/forward.c
 /playpen/LUSCA_HEAD_ipv6/src/htcp.c
 /playpen/LUSCA_HEAD_ipv6/src/http.c
 /playpen/LUSCA_HEAD_ipv6/src/icp_v2.c
 /playpen/LUSCA_HEAD_ipv6/src/icp_v3.c
 /playpen/LUSCA_HEAD_ipv6/src/snmp_core.c
 /playpen/LUSCA_HEAD_ipv6/src/structs.h

=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/acl.c  Mon Sep  6 21:35:23 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/acl.c  Mon Sep  6 21:39:50 2010
@@ -64,7 +64,7 @@
 static void aclParseUserMaxIP(void *data);
 static void aclDestroyUserMaxIP(void *data);
 static wordlist *aclDumpUserMaxIP(void *data);
-static int aclMatchUserMaxIP(void *, auth_user_request_t *, struct in_addr); +static int aclMatchUserMaxIP(void *, auth_user_request_t *, sqaddr_t *addr);
 static void aclParseHeader(void *data);
 static void aclDestroyHeader(void *data);
 static squid_acl aclStrToType(const char *s);
@@ -1786,7 +1786,7 @@
  */
 int
 aclMatchUserMaxIP(void *data, auth_user_request_t * auth_user_request,
-    struct in_addr src_addr)
+    sqaddr_t *src)
 {
 /*
  * the logic for flush the ip list when the limit is hit vs keep
@@ -1798,20 +1798,17 @@
if (authenticateAuthUserRequestIPCount(auth_user_request) <= acldata->max)
        return 0;

- debug(28, 1) ("aclMatchUserMaxIP: user '%s' tries to use too many IP addresses (max %d allowed)!\n", authenticateUserRequestUsername(auth_user_request), acldata->max); + debug(28, 1) ("aclMatchUserMaxIP: user '%s' tries to use too many IP addresses (max %d allowed)!\n",
+      authenticateUserRequestUsername(auth_user_request), acldata->max);

     /* this is a match */
     if (acldata->flags.strict) {
-       sqaddr_t a;
        /*
         * simply deny access - the user name is already associated with
         * the request
         */
        /* remove _this_ ip, as it is the culprit for going over the limit */
-        sqinet_init(&a);
-       sqinet_set_v4_inaddr(&a, &src_addr);
-       authenticateAuthUserRequestRemoveIp(auth_user_request, &a);
-       sqinet_done(&a);
+       authenticateAuthUserRequestRemoveIp(auth_user_request, src);
        debug(28, 4) ("aclMatchUserMaxIP: Denying access in strict mode\n");
     } else {
        /*
@@ -1954,7 +1951,6 @@
 {
     request_t *r = checklist->request;
     http_hdr_type headertype;
-    sqaddr_t a;
     int rv;

     if (NULL == r) {
@@ -1971,10 +1967,7 @@
     }
     /* get authed here */
/* Note: this fills in checklist->auth_user_request when applicable (auth incomplete) */
-    sqinet_init(&a);
-    sqinet_copy_v4_inaddr(&a, &checklist->src_addr, SQADDR_NONE);
- rv = authenticateTryToAuthenticateAndSetAuthUser(&checklist->auth_user_request, headertype, checklist->request, checklist->conn, &a);
-    sqinet_done(&a);
+ rv = authenticateTryToAuthenticateAndSetAuthUser(&checklist->auth_user_request, headertype, checklist->request, checklist->conn, &checklist->src_address);
     switch (rv) {
     case AUTH_ACL_CANNOT_AUTHENTICATE:
debug(28, 4) ("aclAuthenticated: returning 0 user authenticated but not authorised.\n");
@@ -2045,7 +2038,7 @@
     debug(28, 3) ("aclMatchAcl: checking '%s'\n", ae->cfgline);
     switch (ae->type) {
     case ACL_SRC_IP:
-       return aclMatchIp4(&ae->data, checklist->src_addr);
+       return aclMatchIp(&ae->data, &checklist->src_address);
        /* NOTREACHED */
     case ACL_MY_IP:
        if (sqinet_get_family(&checklist->my_address) == AF_INET)
@@ -2094,12 +2087,14 @@
        return aclMatchDomainList(&ae->data, "none");
        /* NOTREACHED */
     case ACL_SRC_DOMAIN:
-       fqdn = fqdncache_gethostbyaddr(checklist->src_addr, 
FQDN_LOOKUP_IF_MISS);
+ fqdn = fqdncache_gethostbyaddr6(&checklist->src_address, FQDN_LOOKUP_IF_MISS);
        if (fqdn) {
            return aclMatchDomainList(&ae->data, fqdn);
        } else if (checklist->state[ACL_SRC_DOMAIN] == ACL_LOOKUP_NONE) {
+           LOCAL_ARRAY(char, cbuf, MAX_IPSTRLEN);
+ (void) sqinet_ntoa(&checklist->src_address, cbuf, MAX_IPSTRLEN, SQADDR_NONE);
            debug(28, 3) ("aclMatchAcl: Can't yet compare '%s' ACL for '%s'\n",
-               ae->name, inet_ntoa(checklist->src_addr));
+               ae->name, cbuf);
            checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_NEEDED;
            return 0;
        }
@@ -2122,12 +2117,14 @@
        return aclMatchRegex(ae->data, "none");
        /* NOTREACHED */
     case ACL_SRC_DOM_REGEX:
-       fqdn = fqdncache_gethostbyaddr(checklist->src_addr, 
FQDN_LOOKUP_IF_MISS);
+ fqdn = fqdncache_gethostbyaddr6(&checklist->src_address, FQDN_LOOKUP_IF_MISS);
        if (fqdn) {
            return aclMatchRegex(ae->data, fqdn);
        } else if (checklist->state[ACL_SRC_DOMAIN] == ACL_LOOKUP_NONE) {
+           LOCAL_ARRAY(char, cbuf, MAX_IPSTRLEN);
+ (void) sqinet_ntoa(&checklist->src_address, cbuf, MAX_IPSTRLEN, SQADDR_NONE);
            debug(28, 3) ("aclMatchAcl: Can't yet compare '%s' ACL for '%s'\n",
-               ae->name, inet_ntoa(checklist->src_addr));
+               ae->name, cbuf);
            checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_NEEDED;
            return 0;
        }
@@ -2157,7 +2154,7 @@
        return k;
        /* NOTREACHED */
     case ACL_MAXCONN:
-       k = clientdbEstablished(checklist->src_addr, 0);
+       k = clientdbEstablished6(&checklist->src_address, 0);
        return ((k > ((intlist *) ae->data)->i) ? 1 : 0);
        /* NOTREACHED */
     case ACL_URL_PORT:
@@ -2227,7 +2224,7 @@
        if ((ti = aclAuthenticated(checklist)) != 1)
            return ti;
        ti = aclMatchUserMaxIP(ae->data, r->auth_user_request,
-           checklist->src_addr);
+           &checklist->src_address);
        return ti;
        /* NOTREACHED */
 #if SQUID_SNMP
@@ -2236,13 +2233,13 @@
        /* NOTREACHED */
 #endif
     case ACL_SRC_ASN:
-       return asnMatchIp(ae->data, checklist->src_addr);
+       return asnMatchIp(ae->data, &checklist->src_address);
        /* NOTREACHED */
     case ACL_DST_ASN:
        ia = ipcache_gethostbyname(r->host, IP_LOOKUP_IF_MISS);
        if (ia) {
            for (k = 0; k < (int) ia->count; k++) {
-               if (asnMatchIp(ae->data, ia->in_addrs[k]))
+               if (asnMatchIp4(ae->data, ia->in_addrs[k]))
                    return 1;
            }
            return 0;
@@ -2251,7 +2248,7 @@
                ae->name, r->host);
            checklist->state[ACL_DST_ASN] = ACL_LOOKUP_NEEDED;
        } else {
-           return asnMatchIp(ae->data, no_addr);
+           return asnMatchIp4(ae->data, no_addr);
        }
        return 0;
        /* NOTREACHED */
@@ -2422,10 +2419,14 @@
 int
 aclCheckFastRequest(const acl_access * A, request_t * request)
 {
+    int r;
     aclCheck_t ch;
     memset(&ch, 0, sizeof(ch));
+    aclCheckSetup(&ch);
     ch.request = request;
-    return aclCheckFast(A, &ch);
+    r = aclCheckFast(A, &ch);
+    aclCheckFinish(&ch);
+    return r;
 }

 static void
@@ -2463,7 +2464,7 @@
            return;
        } else if (checklist->state[ACL_SRC_DOMAIN] == ACL_LOOKUP_NEEDED) {
            checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_PENDING;
-           fqdncache_nbgethostbyaddr(checklist->src_addr,
+           fqdncache_nbgethostbyaddr6(&checklist->src_address,
                aclLookupSrcFQDNDone, checklist);
            return;
        } else if (checklist->state[ACL_DST_DOMAIN] == ACL_LOOKUP_NEEDED) {
@@ -2558,7 +2559,7 @@
        checklist->callback_data = NULL;
     }
     aclCheckCleanup(checklist);
-    sqinet_done(&checklist->my_address);
+    aclCheckFinish(checklist);
     cbdataFree(checklist);
 }

@@ -2669,13 +2670,21 @@
 aclChecklistCacheInit(aclCheck_t * checklist)
 {
     request_t *request = checklist->request;
-    if (request != NULL && checklist->src_addr.s_addr == 0) {
+#warning This sqinet_get_family check should really be a "has this sqaddr had an address set yet?"
+    /*
+ * checklist->src_address has already been init'ed but it may not have an
+     * address.
+     *
+ * The previous code checked if src_addr == 0. This new code needs to do something
+     * slightly different.
+     */
+ if (request != NULL && (sqinet_get_family(&checklist->src_address) == 0)) {
 #if FOLLOW_X_FORWARDED_FOR
        if (Config.onoff.acl_uses_indirect_client) {
            checklist->src_addr = request->indirect_client_addr;
        } else
 #endif /* FOLLOW_X_FORWARDED_FOR */
-           checklist->src_addr = request->client_addr;
+       sqinet_set_v4_inaddr(&checklist->src_address, &request->client_addr);
         sqinet_copy(&checklist->my_address, &request->my_address);
 #if 0 && USE_IDENT
        /*
@@ -2688,6 +2697,20 @@
 #endif
     }
 }
+
+void
+aclCheckSetup(aclCheck_t *ch)
+{
+    sqinet_init(&ch->my_address);
+    sqinet_init(&ch->src_address);
+}
+
+void
+aclCheckFinish(aclCheck_t *ch)
+{
+    sqinet_done(&ch->my_address);
+    sqinet_done(&ch->src_address);
+}

 void
 aclCheckSetup(aclCheck_t *ch)
@@ -2727,7 +2750,7 @@
        xstrncpy(checklist->rfc931, ident, USER_IDENT_SZ);
 #endif
     checklist->auth_user_request = NULL;
-    sqinet_init(&checklist->my_address);
+    aclCheckSetup(checklist);
     return checklist;
 }

=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/client_side.c  Mon Sep  6 09:12:09 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/client_side.c  Mon Sep  6 21:39:50 2010
@@ -2586,9 +2586,9 @@
        if (Config.onoff.log_fqdn)
            fqdncache_gethostbyaddr6(&peer, FQDN_LOOKUP_IF_MISS);
        commSetTimeout(fd, Config.Timeout.request, requestTimeout, connState);
-        sqinet_init(&identChecklist.my_address);
+        aclCheckSetup(&identChecklist);
 #if USE_IDENT
- identChecklist.src_addr = sqinet_get_v4_inaddr(&peer, SQADDR_ASSERT_IS_V4);
+       sqinet_copy(&identChecklist.src_address, &peer);
         sqinet_copy(&identChecklist.my_address, &me);
        if (aclCheckFast(Config.accessList.identLookup, &identChecklist))
identStart(&connState->me2, &connState->peer2, clientIdentDone, connState);
@@ -2604,7 +2604,7 @@
        incoming_sockets_accepted++;
         sqinet_done(&peer);
         sqinet_done(&me);
-        sqinet_done(&identChecklist.my_address);
+        aclCheckFinish(&identChecklist);
     }
 }

@@ -2756,9 +2756,9 @@
        if (Config.onoff.log_fqdn)
            fqdncache_gethostbyaddr6(&connState->peer2, FQDN_LOOKUP_IF_MISS);
        commSetTimeout(fd, Config.Timeout.request, requestTimeout, connState);
-        sqinet_init(&identChecklist.my_address);
+        aclCheckSetup(&identChecklist);
 #if USE_IDENT
- identChecklist.src_addr = sqinet_get_v4_inaddr(&peer, SQADDR_ASSERT_IS_V4);
+       sqinet_copy(&identChecklist.src_address, &peer);
         sqinet_copy(&identChecklist.my_address, &me);
        if (aclCheckFast(Config.accessList.identLookup, &identChecklist))
identStart(&connState->me2, &connState->peer2, clientIdentDone, connState);
@@ -2773,7 +2773,7 @@
        httpsAcceptSSL(connState, s->sslContext);
         sqinet_done(&peer);
         sqinet_done(&me);
-        sqinet_done(&identChecklist.my_address);
+       aclCheckFinish(&identChecklist);
     }
 }

=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/delay_pools.c  Mon Jun 30 04:36:05 2008
+++ /playpen/LUSCA_HEAD_ipv6/src/delay_pools.c  Mon Sep  6 21:39:50 2010
@@ -324,24 +324,36 @@
 {
     request_t *r;
     aclCheck_t ch;
+    struct in_addr a;
     ushort pool;
     assert(http);
     r = http->request;

     memset(&ch, '\0', sizeof(ch));
+    aclCheckSetup(&ch);
     ch.conn = http->conn;
     ch.request = r;
     if (r->client_addr.s_addr == INADDR_BROADCAST) {
debug(77, 2) ("delayClient: WARNING: Called with 'allones' address, ignoring\n");
+        aclCheckFinish(&ch);
        return delayId(0, 0);
     }
     for (pool = 0; pool < Config.Delay.pools; pool++) {
if (Config.Delay.access[pool] && aclCheckFast(Config.Delay.access[pool], &ch))
            break;
     }
-    if (pool == Config.Delay.pools)
+    if (pool == Config.Delay.pools) {
+        aclCheckFinish(&ch);
        return delayId(0, 0);
-    return delayPoolClient(pool, ch.src_addr.s_addr);
+    }
+#warning delay pools needs to be made v6 aware!
+    if (sqinet_get_family(&ch.src_address) != AF_INET) {
+        aclCheckFinish(&ch);
+        return delayId(0, 0);
+    }
+    a = sqinet_get_v4_inaddr(&ch.src_address, SQADDR_ASSERT_IS_V4);
+    aclCheckFinish(&ch);
+    return delayPoolClient(pool, a.s_addr);
 }

 delay_id
=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/external_acl.c Mon Sep  6 09:06:16 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/external_acl.c Mon Sep  6 21:39:50 2010
@@ -645,7 +645,8 @@
            break;
 #endif
        case EXT_ACL_SRC:
-           str = inet_ntoa(ch->src_addr);
+           (void) sqinet_ntoa(&ch->src_address, buf, sizeof(buf), SQADDR_NONE);
+           str = buf;
            break;
        case EXT_ACL_SRCPORT:
            snprintf(buf, sizeof(buf), "%d", request->client_port);
=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/forward.c      Mon Sep  6 09:06:16 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/forward.c      Mon Sep  6 21:39:50 2010
@@ -493,22 +493,30 @@
 getOutgoingAddr(request_t * request)
 {
     aclCheck_t ch;
+    struct in_addr r;
     memset(&ch, '\0', sizeof(aclCheck_t));
+    aclCheckSetup(&ch);
     if (request) {
        ch.request = request;
     }
-    return aclMapAddr(Config.accessList.outgoing_address, &ch);
+    r = aclMapAddr(Config.accessList.outgoing_address, &ch);
+    aclCheckFinish(&ch);
+    return r;
 }

 unsigned long
 getOutgoingTOS(request_t * request)
 {
     aclCheck_t ch;
+    unsigned long r;
     memset(&ch, '\0', sizeof(aclCheck_t));
+    aclCheckSetup(&ch);
     if (request) {
        ch.request = request;
     }
-    return aclMapTOS(Config.accessList.outgoing_tos, &ch);
+    r = aclMapTOS(Config.accessList.outgoing_tos, &ch);
+    aclCheckFinish(&ch);
+    return r;
 }

 /*
=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/htcp.c Sat Sep  4 07:04:25 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/htcp.c Mon Sep  6 21:39:50 2010
@@ -655,13 +655,17 @@
     int r;
     aclCheck_t checklist;
     memset(&checklist, '\0', sizeof(checklist));
-    checklist.src_addr = from->sin_addr;
+    sqinet_init(&checklist.src_address);
+#warning HTCP needs to be made v6 aware!
+    sqinet_set_family(&checklist.src_address, AF_INET);
+    sqinet_set_v4_inaddr(&checklist.src_address, &from->sin_addr);
     sqinet_init(&checklist.my_address);
sqinet_set_family(&checklist.my_address, AF_INET); /* XXX will need to be taught about "from"! -adrian */
     sqinet_set_noaddr(&checklist.my_address);
     checklist.request = s->request;
     r = aclCheckFast(acl, &checklist);
     sqinet_done(&checklist.my_address);
+    sqinet_done(&checklist.src_address);
     return r;
 }

=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/http.c Wed Aug  4 22:24:11 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/http.c Mon Sep  6 21:39:50 2010
@@ -424,6 +424,7 @@
        if (strcmp(name, "accept-encoding") == 0) {
            aclCheck_t checklist;
            memset(&checklist, 0, sizeof(checklist));
+           aclCheckSetup(&checklist);
            checklist.request = request;
            checklist.reply = reply;
if (Config.accessList.vary_encoding && aclCheckFast(Config.accessList.vary_encoding, &checklist)) {
@@ -431,6 +432,7 @@
request->vary_encoding = httpHeaderGetStrOrList(&request->header, HDR_ACCEPT_ENCODING);
                strCat(request->vary_encoding, "");
            }
+           aclCheckFinish(&checklist);
        }
        if (strcmp(name, "*") == 0) {
/* Can not handle "Vary: *" efficiently, bail out making the response not cached */
=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/icp_v2.c       Sat Sep  4 07:04:25 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/icp_v2.c       Mon Sep  6 21:39:50 2010
@@ -229,8 +229,9 @@
            break;
        }
        memset(&checklist, '\0', sizeof(checklist));
-       checklist.src_addr = from.sin_addr;
-        sqinet_init(&checklist.my_address);
+       aclCheckSetup(&checklist);
+       sqinet_set_family(&checklist.src_address, AF_INET);
+       sqinet_set_v4_inaddr(&checklist.src_address, &from.sin_addr);
 #warning needs to be made v6 "my_address" aware!
         sqinet_set_family(&checklist.my_address, AF_INET);
         sqinet_set_noaddr(&checklist.my_address);
@@ -321,7 +322,7 @@
     }
     if (icp_request)
        requestDestroy(icp_request);
-    sqinet_done(&checklist.my_address);
+    aclCheckFinish(&checklist);
 }

 #ifdef ICP_PKT_DUMP
=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/icp_v3.c       Sat Sep  4 07:04:25 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/icp_v3.c       Mon Sep  6 21:39:50 2010
@@ -82,8 +82,9 @@
            break;
        }
        memset(&checklist, '\0', sizeof(checklist));
-       checklist.src_addr = from.sin_addr;
-        sqinet_init(&checklist.my_address);
+       aclCheckSetup(&checklist);
+       sqinet_set_family(&checklist.src_address, AF_INET);
+       sqinet_set_v4_inaddr(&checklist.src_address, &from.sin_addr);
 #warning needs to be made ipv6-aware for "my_address"!
        sqinet_set_family(&checklist.my_address, AF_INET);
        sqinet_set_noaddr(&checklist.my_address);
@@ -161,5 +162,5 @@
     }
     if (icp_request)
        requestDestroy(icp_request);
-     sqinet_done(&checklist.my_address);
-}
+     aclCheckFinish(&checklist);
+}
=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/snmp_core.c    Sun Jul  4 06:56:53 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/snmp_core.c    Mon Sep  6 21:39:50 2010
@@ -452,7 +452,8 @@
     rq->session.Version = SNMP_VERSION_1;
     Community = snmp_parse(&rq->session, PDU, buf, len);
     memset(&checklist, '\0', sizeof(checklist));
-    checklist.src_addr = rq->from.sin_addr;
+    aclCheckSetup(&checklist);
+    sqinet_set_v4_inaddr(&checklist.src_address, &rq->from.sin_addr);
     checklist.snmp_community = (char *) Community;

     if (Community)
@@ -469,6 +470,7 @@
     }
     if (Community)
        xfree(Community);
+    aclCheckFinish(&checklist);
 }

 /*
=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/structs.h      Mon Sep  6 09:12:29 2010
+++ /playpen/LUSCA_HEAD_ipv6/src/structs.h      Mon Sep  6 21:39:50 2010
@@ -286,7 +286,7 @@

 struct _aclCheck_t {
     const acl_access *access_list;
-    struct in_addr src_addr;
+    sqaddr_t src_address;
     struct in_addr dst_addr;
     struct in_addr fwdip_addr;
     sqaddr_t my_address;

--
You received this message because you are subscribed to the Google Groups 
"lusca-commit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/lusca-commit?hl=en.

Reply via email to