]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/acl/UserData.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / acl / UserData.cc
index eab9560cad707c16318a85b0b95c1786d1c11b7c..7b66a43c2f4a683acfd76d0e2182cf39a0339dd6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
  *
  * Squid software is distributed under GPLv2+ license and includes
  * contributions from numerous individuals and organizations.
 #include "acl/UserData.h"
 #include "ConfigParser.h"
 #include "Debug.h"
+#include "globals.h"
+#include "sbuf/Algorithms.h"
 #include "util.h"
 
-#include <algorithm>
-
-template<class T>
-inline void
-xRefFree(T &thing)
-{
-    xfree (thing);
-}
-
-ACLUserData::~ACLUserData()
-{
-}
-
 bool
 ACLUserData::match(char const *user)
 {
@@ -46,34 +35,46 @@ ACLUserData::match(char const *user)
     return result;
 }
 
-struct UserDataAclDumpVisitor {
-    SBufList contents;
-    void operator() (char * const & node_data) {
-        contents.push_back(SBuf(node_data));
-    }
-};
-
 SBufList
 ACLUserData::dump() const
 {
     SBufList sl;
 
-    if (flags.case_insensitive)
-        sl.push_back(SBuf("-i"));
-
     if (flags.required) {
         sl.push_back(SBuf("REQUIRED"));
-    } else {
-        sl.insert(sl.end(), userDataNames.begin(), userDataNames.end());
+        return sl;
     }
+
+    if (flags.case_insensitive)
+        sl.push_back(SBuf("-i"));
+
+    sl.insert(sl.end(), userDataNames.begin(), userDataNames.end());
+
+    debugs(28,5, "ACLUserData dump output: " <<
+           JoinContainerToSBuf(userDataNames.begin(), userDataNames.end(),
+                               SBuf(" ")));
     return sl;
 }
 
+static bool
+CaseSensitiveSBufCompare(const SBuf &lhs, const SBuf &rhs)
+{
+    return (lhs.cmp(rhs) < 0);
+}
+
 static bool
 CaseInsensitveSBufCompare(const SBuf &lhs, const SBuf &rhs)
 {
     return (lhs.caseCmp(rhs) < 0);
 }
+
+ACLUserData::ACLUserData() :
+    userDataNames(CaseSensitiveSBufCompare)
+{
+    flags.case_insensitive = false;
+    flags.required = false;
+}
+
 void
 ACLUserData::parse()
 {
@@ -81,9 +82,10 @@ ACLUserData::parse()
 
     char *t = NULL;
     if ((t = ConfigParser::strtokFile())) {
-        debugs(28, 5, "aclParseUserList: First token is " << t);
+        SBuf s(t);
+        debugs(28, 5, "first token is " << s);
 
-        if (strcmp("-i", t) == 0) {
+        if (s.cmp("-i",2) == 0) {
             debugs(28, 5, "Going case-insensitive");
             flags.case_insensitive = true;
             // due to how the std::set API work, if we want to change
@@ -91,44 +93,49 @@ ACLUserData::parse()
             UserDataNames_t newUdn(CaseInsensitveSBufCompare);
             newUdn.insert(userDataNames.begin(), userDataNames.end());
             swap(userDataNames,newUdn);
-        } else if (strcmp("REQUIRED", t) == 0) {
+        } else if (s.cmp("REQUIRED") == 0) {
             debugs(28, 5, "REQUIRED-type enabled");
             flags.required = true;
-            // empty already-accumulated values
-            userDataNames.clear();
         } else {
             if (flags.case_insensitive)
-                Tolower(t);
+                s.toLower();
 
-            if (!flags.required) { // don't add new users if acl is REQUIRED
-                //TODO: emit one DBG_PARSE_NOTE warning about incorrect config
-                userDataNames.insert(SBuf(t));
-            }
+            debugs(28, 6, "Adding user " << s);
+            userDataNames.insert(s);
         }
     }
 
     debugs(28, 3, "Case-insensitive-switch is " << flags.case_insensitive);
     /* we might inherit from a previous declaration */
 
-    debugs(28, 4, "parsing user list");
+    debugs(28, 4, "parsing following tokens");
 
     while ((t = ConfigParser::strtokFile())) {
-        debugs(28, 6, "aclParseUserList: Got token: " << t);
+        SBuf s(t);
+        debugs(28, 6, "Got token: " << s);
 
         if (flags.case_insensitive)
-            Tolower(t);
+            s.toLower();
 
-        if (!flags.required) { // don't add new users if acl is REQUIRED
-            //TODO: emit one DBG_PARSE_NOTE warning about incorrect config
-            userDataNames.insert(SBuf(t));
-        }
+        debugs(28, 6, "Adding user " << s);
+        userDataNames.insert(s);
     }
+
+    if (flags.required && !userDataNames.empty()) {
+        debugs(28, DBG_PARSE_NOTE(1), "WARNING: detected attempt to add usernames to an acl of type REQUIRED");
+        userDataNames.clear();
+    }
+
+    debugs(28,4, "ACL contains " << userDataNames.size() << " users");
 }
 
 bool
 ACLUserData::empty() const
 {
-    return userDataNames.empty() && !flags.required;
+    debugs(28,6,"required: " << flags.required << ", number of users: " << userDataNames.size());
+    if (flags.required)
+        return false;
+    return userDataNames.empty();
 }
 
 ACLData<char const *> *