]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
SourceLayout: shuffle BasicAuthQueueNode to Auth:: namespace
authorAmos Jeffries <squid3@treenet.co.nz>
Fri, 22 Feb 2013 13:26:12 +0000 (02:26 +1300)
committerAmos Jeffries <squid3@treenet.co.nz>
Fri, 22 Feb 2013 13:26:12 +0000 (02:26 +1300)
... and document what it is used for by authentication.

There is only one logic change in this patch. The QueueNode destructor
is added to clear the queued CBDATA entries when the queue is deleted.
Previously the pointer was just erased in hopes that the queue was
notified prior to deletion.

src/auth/Makefile.am
src/auth/QueueNode.h [new file with mode: 0644]
src/auth/basic/User.cc
src/auth/basic/User.h
src/auth/basic/UserRequest.cc
src/auth/basic/auth_basic.h

index 1abb966dfc3618da1ee3b0b5ba03ec69e2bfb4eb..2423048bf260359fb473029559cd27acadb401ef 100644 (file)
@@ -18,6 +18,7 @@ libauth_la_SOURCES = \
        CredentialState.h \
        Gadgets.cc \
        Gadgets.h \
+       QueueNode.h \
        Scheme.cc \
        Scheme.h \
        State.h \
diff --git a/src/auth/QueueNode.h b/src/auth/QueueNode.h
new file mode 100644 (file)
index 0000000..70bf0b8
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef SQUID_SRC_AUTH_QUEUENODE_H
+#define SQUID_SRC_AUTH_QUEUENODE_H
+
+namespace Auth
+{
+
+/**
+ * A queue of auth requests waiting for verification to occur.
+ *
+ * Certain authentication schemes such a Basic and Bearer auth
+ * permit credentials tokens to be repeated from multiple sources
+ * simultaneously. This queue node allows multiple validation
+ * queries to be collapsed into one backend helper lookup.
+ * CBDATA and handlers stored in these queue nodes can be notified
+ * all at once with a result when the lookup completes.
+ */
+class QueueNode
+{
+
+private:
+    // we store CBDATA here, copy is not safe
+    QueueNode(const QueueNode &);
+    QueueNode &operator =(const QueueNode &);
+
+public:
+    QueueNode(Auth::UserRequest *aRequest, AUTHCB *aHandler, void *aData) : auth_user_request(aRequest), handler(aHandler), data(cbdataReference(aData)) {}
+    ~QueueNode() {
+        cbdataReferenceDone(data);
+        while (next) {
+            QueueNode *tmp = next->next;
+            next->next = NULL;
+            delete next;
+            next = tmp;
+        };
+    }
+
+    Auth::QueueNode *next;
+    Auth::UserRequest::Pointer auth_user_request;
+    AUTHCB *handler;
+    void *data;
+
+    MEMPROXY_CLASS(Auth::QueueNode);
+};
+
+MEMPROXY_CLASS_INLINE(Auth::QueueNode);
+
+} // namespace Auth
+
+#endif /* SQUID_SRC_AUTH_QUEUENODE_H */
index 0b598f6923c1460d7148c793a8a9b970793c4e7a..66320d2241f24ab05c68f729cf86682990e079b9 100644 (file)
@@ -8,7 +8,7 @@
 Auth::Basic::User::User(Auth::Config *aConfig) :
         Auth::User(aConfig),
         passwd(NULL),
-        auth_queue(NULL),
+        queue(NULL),
         currentRequest(NULL)
 {}
 
index c5d5fd2f36a030ff46d270b170fdfc7e21a0abbe..52ed43cfb5631d04622cd8b02c996be1b81edb60 100644 (file)
@@ -4,12 +4,11 @@
 #include "auth/User.h"
 #include "auth/UserRequest.h"
 
-class BasicAuthQueueNode;
-
 namespace Auth
 {
 
 class Config;
+class QueueNode;
 
 namespace Basic
 {
@@ -31,7 +30,7 @@ public:
 
     char *passwd;
 
-    BasicAuthQueueNode *auth_queue;
+    QueueNode *queue;
 
 private:
     Auth::UserRequest::Pointer currentRequest;
index 669c8beb7cef5550fb4e33ff1f5b6bc9ff9b9aae..c85830fc3d6d173195b0c4320b8201aa9d81349e 100644 (file)
@@ -2,6 +2,7 @@
 #include "auth/basic/auth_basic.h"
 #include "auth/basic/User.h"
 #include "auth/basic/UserRequest.h"
+#include "auth/QueueNode.h"
 #include "auth/State.h"
 #include "charset.h"
 #include "Debug.h"
@@ -96,15 +97,11 @@ Auth::Basic::UserRequest::module_start(AUTHCB * handler, void *data)
     if (user()->credentials() == Auth::Pending) {
         /* there is a request with the same credentials already being verified */
 
-        BasicAuthQueueNode *node = static_cast<BasicAuthQueueNode *>(xcalloc(1, sizeof(BasicAuthQueueNode)));
-        assert(node);
-        node->auth_user_request = this;
-        node->handler = handler;
-        node->data = cbdataReference(data);
+        Auth::QueueNode *node = new Auth::QueueNode(this, handler, data);
 
         /* queue this validation request to be infored of the pending lookup results */
-        node->next = basic_auth->auth_queue;
-        basic_auth->auth_queue = node;
+        node->next = basic_auth->queue;
+        basic_auth->queue = node;
         return;
     }
     // otherwise submit this request to the auth helper(s) for validation
@@ -139,7 +136,6 @@ void
 Auth::Basic::UserRequest::HandleReply(void *data, const HelperReply &reply)
 {
     Auth::StateData *r = static_cast<Auth::StateData *>(data);
-    BasicAuthQueueNode *tmpnode;
     void *cbdata;
     debugs(29, 5, HERE << "reply=" << reply);
 
@@ -168,15 +164,15 @@ Auth::Basic::UserRequest::HandleReply(void *data, const HelperReply &reply)
 
     cbdataReferenceDone(r->data);
 
-    while (basic_auth->auth_queue) {
-        tmpnode = basic_auth->auth_queue->next;
+    while (basic_auth->queue) {
+        if (cbdataReferenceValidDone(basic_auth->queue->data, &cbdata))
+            basic_auth->queue->handler(cbdata);
 
-        if (cbdataReferenceValidDone(basic_auth->auth_queue->data, &cbdata))
-            basic_auth->auth_queue->handler(cbdata);
+        Auth::QueueNode *tmpnode = basic_auth->queue->next;
+        basic_auth->queue->next = NULL;
+        delete basic_auth->queue;
 
-        xfree(basic_auth->auth_queue);
-
-        basic_auth->auth_queue = tmpnode;
+        basic_auth->queue = tmpnode;
     }
 
     delete r;
index e519fab8da91b3d02e6990912705ba1c11c52d58..3e10b21f6d3439315d64b8963a3f339f0e50ff60 100644 (file)
 
 #define DefaultAuthenticateChildrenMax  32     /* 32 processes */
 
-/** queue of auth requests waiting for verification to occur */
-class BasicAuthQueueNode
-{
-
-public:
-    BasicAuthQueueNode *next;
-    Auth::UserRequest::Pointer auth_user_request;
-    AUTHCB *handler;
-    void *data;
-};
-
 namespace Auth
 {
 namespace Basic