]> git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/Strategised.h
Source Format Enforcement (#763)
[thirdparty/squid.git] / src / acl / Strategised.h
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_ACLSTRATEGISED_H
10 #define SQUID_ACLSTRATEGISED_H
11
12 #include "acl/Acl.h"
13 #include "acl/Data.h"
14 #include "acl/FilledChecklist.h"
15 #include "acl/Strategy.h"
16
17 // XXX: Replace with a much simpler abstract ACL child class without the
18 // ACLStrategy parameter (and associated call forwarding). Duplicating key
19 // portions of the ACL class API in ACLStrategy is not needed because
20 // ACLStrategy is unused outside the ACLStrategised context. Existing classes
21 // like ACLExtUser, ACLProxyAuth, and ACLIdent seem to confirm this assertion.
22 // It also requires forwarding ACL info to ACLStrategy as method parameters.
23
24 /// Splits the ACL API into two individually configurable components:
25 /// * ACLStrategy that usually extracts information from the current transaction
26 /// * ACLData that usually matches information against admin-configured values
27 template <class M>
28 class ACLStrategised : public ACL
29 {
30 MEMPROXY_CLASS(ACLStrategised);
31
32 public:
33 typedef M MatchType;
34
35 ~ACLStrategised();
36 ACLStrategised(ACLData<MatchType> *, ACLStrategy<MatchType> *, char const *);
37 ACLStrategised(ACLStrategised const &&) = delete;
38
39 virtual char const *typeString() const;
40 virtual void parseFlags();
41
42 virtual bool requiresRequest() const {return matcher->requiresRequest();}
43
44 virtual bool requiresReply() const {return matcher->requiresReply();}
45
46 virtual void prepareForUse() { data->prepareForUse();}
47 virtual const Acl::Options &options() { return matcher->options(); }
48 virtual void parse();
49 virtual int match(ACLChecklist *checklist);
50 virtual int match (M const &);
51 virtual SBufList dump() const;
52 virtual bool empty () const;
53 virtual bool valid () const;
54
55 private:
56 ACLData<MatchType> *data;
57 char const *type_;
58 ACLStrategy<MatchType> *matcher;
59 };
60
61 /* implementation follows */
62
63 template <class MatchType>
64 ACLStrategised<MatchType>::~ACLStrategised()
65 {
66 delete data;
67 }
68
69 template <class MatchType>
70 ACLStrategised<MatchType>::ACLStrategised(ACLData<MatchType> *newData, ACLStrategy<MatchType> *theStrategy, char const *theType): data(newData), type_(theType), matcher(theStrategy)
71 {}
72
73 template <class MatchType>
74 char const *
75 ACLStrategised<MatchType>::typeString() const
76 {
77 return type_;
78 }
79
80 template <class MatchType>
81 void
82 ACLStrategised<MatchType>::parseFlags()
83 {
84 ParseFlags(options(), data->supportedFlags());
85 }
86
87 template <class MatchType>
88 void
89 ACLStrategised<MatchType>::parse()
90 {
91 data->parse();
92 }
93
94 template <class MatchType>
95 bool
96 ACLStrategised<MatchType>::empty() const
97 {
98 return data->empty();
99 }
100
101 template <class MatchType>
102 int
103 ACLStrategised<MatchType>::match(ACLChecklist *cl)
104 {
105 ACLFilledChecklist *checklist = dynamic_cast<ACLFilledChecklist*>(cl);
106 assert(checklist);
107 return matcher->match(data, checklist);
108 }
109
110 template <class MatchType>
111 int
112 ACLStrategised<MatchType>::match(MatchType const &toFind)
113 {
114 return data->match(toFind);
115 }
116
117 template <class MatchType>
118 SBufList
119 ACLStrategised<MatchType>::dump() const
120 {
121 return data->dump();
122 }
123
124 template <class MatchType>
125 bool
126 ACLStrategised<MatchType>::valid () const
127 {
128 return matcher->valid();
129 }
130
131 #endif /* SQUID_ACLSTRATEGISED_H */
132