/*
- * 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)
{
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()
{
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
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 *> *