]> git.ipfire.org Git - thirdparty/squid.git/blame_incremental - src/acl/Strategised.h
Source Format Enforcement (#532)
[thirdparty/squid.git] / src / acl / Strategised.h
... / ...
CommitLineData
1/*
2 * Copyright (C) 1996-2020 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
27template <class M>
28class ACLStrategised : public ACL
29{
30 MEMPROXY_CLASS(ACLStrategised);
31
32public:
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
55private:
56 ACLData<MatchType> *data;
57 char const *type_;
58 ACLStrategy<MatchType> *matcher;
59};
60
61/* implementation follows */
62
63template <class MatchType>
64ACLStrategised<MatchType>::~ACLStrategised()
65{
66 delete data;
67}
68
69template <class MatchType>
70ACLStrategised<MatchType>::ACLStrategised(ACLData<MatchType> *newData, ACLStrategy<MatchType> *theStrategy, char const *theType): data(newData), type_(theType), matcher(theStrategy)
71{}
72
73template <class MatchType>
74char const *
75ACLStrategised<MatchType>::typeString() const
76{
77 return type_;
78}
79
80template <class MatchType>
81void
82ACLStrategised<MatchType>::parseFlags()
83{
84 ParseFlags(options(), data->supportedFlags());
85}
86
87template <class MatchType>
88void
89ACLStrategised<MatchType>::parse()
90{
91 data->parse();
92}
93
94template <class MatchType>
95bool
96ACLStrategised<MatchType>::empty() const
97{
98 return data->empty();
99}
100
101template <class MatchType>
102int
103ACLStrategised<MatchType>::match(ACLChecklist *cl)
104{
105 ACLFilledChecklist *checklist = dynamic_cast<ACLFilledChecklist*>(cl);
106 assert(checklist);
107 return matcher->match(data, checklist);
108}
109
110template <class MatchType>
111int
112ACLStrategised<MatchType>::match(MatchType const &toFind)
113{
114 return data->match(toFind);
115}
116
117template <class MatchType>
118SBufList
119ACLStrategised<MatchType>::dump() const
120{
121 return data->dump();
122}
123
124template <class MatchType>
125bool
126ACLStrategised<MatchType>::valid () const
127{
128 return matcher->valid();
129}
130
131#endif /* SQUID_ACLSTRATEGISED_H */
132