]> git.ipfire.org Git - thirdparty/squid.git/blame - src/acl/BoolOps.cc
Source Format Enforcement (#532)
[thirdparty/squid.git] / src / acl / BoolOps.cc
CommitLineData
bbc27441 1/*
77b1029d 2 * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
bbc27441
AJ
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
b6095d3e
AR
9#include "squid.h"
10#include "acl/BoolOps.h"
11#include "acl/Checklist.h"
12#include "Debug.h"
4eac3407 13#include "sbuf/SBuf.h"
b6095d3e 14
b6095d3e
AR
15/* Acl::NotNode */
16
17Acl::NotNode::NotNode(ACL *acl)
18{
19 assert(acl);
b56b37cf 20 Must(strlen(acl->name) <= sizeof(name)-2);
b6095d3e 21 name[0] = '!';
428cf7bc 22 name[1] = '\0';
b56b37cf 23 xstrncpy(&name[1], acl->name, sizeof(name)-1); // -1 for '!'
b6095d3e
AR
24 add(acl);
25}
26
27void
28Acl::NotNode::parse()
29{
30 // Not implemented: by the time an upper level parser discovers
31 // an '!' operator, there is nothing left for us to parse.
e936c41c 32 assert(false);
b6095d3e
AR
33}
34
35int
36Acl::NotNode::doMatch(ACLChecklist *checklist, Nodes::const_iterator start) const
37{
38 assert(start == nodes.begin()); // we only have one node
39
40 if (checklist->matchChild(this, start, *start))
41 return 0; // converting match into mismatch
42
43 if (!checklist->keepMatching())
44 return -1; // suspend on async calls and stop on failures
45
46 return 1; // converting mismatch into match
47}
48
49char const *
50Acl::NotNode::typeString() const
51{
52 return "!";
53}
54
55ACL *
56Acl::NotNode::clone() const
57{
58 // Not implemented: we are not a named ACL type in squid.conf so nobody
59 // should try to create a NotNode instance by ACL type name (which is
60 // what clone() API is for -- it does not really clone anything).
61 assert(false);
62 return NULL;
63}
64
8966008b 65SBufList
b6095d3e
AR
66Acl::NotNode::dump() const
67{
8966008b
FC
68 SBufList text;
69 text.push_back(SBuf(name));
b6095d3e
AR
70 return text;
71}
72
b6095d3e
AR
73/* Acl::AndNode */
74
75char const *
76Acl::AndNode::typeString() const
77{
78 return "and";
79}
80
81ACL *
82Acl::AndNode::clone() const
83{
84 return new AndNode;
85}
86
87int
88Acl::AndNode::doMatch(ACLChecklist *checklist, Nodes::const_iterator start) const
89{
90 // find the first node that does not match
91 for (Nodes::const_iterator i = start; i != nodes.end(); ++i) {
92 if (!checklist->matchChild(this, i, *i))
93 return checklist->keepMatching() ? 0 : -1;
94 }
95
96 // one and not zero on empty because in math empty product equals identity
97 return 1; // no mismatches found (i.e., all kids matched)
98}
99
100void
101Acl::AndNode::parse()
102{
103 // Not implemented: AndNode cannot be configured directly. See Acl::AllOf.
e936c41c 104 assert(false);
b6095d3e
AR
105}
106
b6095d3e
AR
107/* Acl::OrNode */
108
109char const *
110Acl::OrNode::typeString() const
111{
112 return "any-of";
113}
114
115ACL *
116Acl::OrNode::clone() const
117{
118 return new OrNode;
119}
120
640fe8fb
CT
121bool
122Acl::OrNode::bannedAction(ACLChecklist *, Nodes::const_iterator) const
123{
124 return false;
125}
126
b6095d3e
AR
127int
128Acl::OrNode::doMatch(ACLChecklist *checklist, Nodes::const_iterator start) const
129{
130 lastMatch_ = nodes.end();
131
132 // find the first node that matches, but stop if things go wrong
133 for (Nodes::const_iterator i = start; i != nodes.end(); ++i) {
640fe8fb
CT
134 if (bannedAction(checklist, i))
135 continue;
b6095d3e
AR
136 if (checklist->matchChild(this, i, *i)) {
137 lastMatch_ = i;
138 return 1;
139 }
140
141 if (!checklist->keepMatching())
142 return -1; // suspend on async calls and stop on failures
143 }
144
145 // zero and not one on empty because in math empty sum equals zero
146 return 0; // all nodes mismatched
147}
148
149void
150Acl::OrNode::parse()
151{
152 // Not implemented: OrNode cannot be configured directly. See Acl::AnyOf.
153 assert(false);
154}
f53969cc 155