1 /* 2 * Copyright (C) 1996-2021 The Squid Software Foundation and contributors 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 9 #ifndef SQUID_ACL_LOGIC_H 10 #define SQUID_ACL_LOGIC_H 11 12 #include "acl/InnerNode.h" 13 14 /* ACLs defined here are used internally to construct an ACL expression tree. 15 * They cannot be specified directly in squid.conf because squid.conf ACLs are 16 * more complex than (and are implemented using) these operator-like classes.*/ 17 18 namespace Acl 19 { 20 21 /// Implements the "not" or "!" operator. 22 class NotNode: public InnerNode 23 { 24 MEMPROXY_CLASS(NotNode); 25 26 public: 27 explicit NotNode(ACL *acl); 28 29 private: 30 /* ACL API */ 31 virtual char const *typeString() const; 32 virtual ACL *clone() const; 33 virtual void parse(); 34 virtual SBufList dump() const; 35 36 /* Acl::InnerNode API */ 37 virtual int doMatch(ACLChecklist *checklist, Nodes::const_iterator start) const; 38 }; 39 40 /// An inner ACL expression tree node representing a boolean conjuction (AND) 41 /// operator applied to a list of child tree nodes. 42 /// For example, conditions expressed on a single http_access line are ANDed. 43 class AndNode: public InnerNode 44 { 45 MEMPROXY_CLASS(AndNode); 46 47 public: 48 /* ACL API */ 49 virtual char const *typeString() const; 50 virtual ACL *clone() const; 51 virtual void parse(); 52 53 private: 54 virtual int doMatch(ACLChecklist *checklist, Nodes::const_iterator start) const; 55 }; 56 57 /// An inner ACL expression tree node representing a boolean disjuction (OR) 58 /// operator applied to a list of child tree nodes. 59 /// For example, conditions expressed by multiple http_access lines are ORed. 60 class OrNode: public InnerNode 61 { 62 MEMPROXY_CLASS(OrNode); 63 64 public: 65 /// whether the given rule should be excluded from matching tests based 66 /// on its action 67 virtual bool bannedAction(ACLChecklist *, Nodes::const_iterator) const; 68 69 /* ACL API */ 70 virtual char const *typeString() const; 71 virtual ACL *clone() const; 72 virtual void parse(); 73 74 protected: 75 mutable Nodes::const_iterator lastMatch_; 76 77 private: 78 virtual int doMatch(ACLChecklist *checklist, Nodes::const_iterator start) const; 79 }; 80 81 } // namespace Acl 82 83 #endif /* SQUID_ACL_LOGIC_H */ 84 85