Squid Web Cache master
Loading...
Searching...
No Matches
AclRegs.cc
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2025 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#include "squid.h"
10
11#if USE_ADAPTATION
14#endif
15#include "acl/AllOf.h"
16#include "acl/AnnotateClient.h"
18#include "acl/AnnotationData.h"
19#include "acl/AnyOf.h"
20#if USE_SQUID_EUI
21#include "acl/Arp.h"
22#include "acl/Eui64.h"
23#endif
24#if USE_OPENSSL
25#include "acl/AtStep.h"
26#include "acl/AtStepData.h"
27#endif
28#include "acl/Checklist.h"
30#include "acl/Data.h"
32#include "acl/DestinationIp.h"
33#include "acl/DomainData.h"
34#if USE_LIBNETFILTERCONNTRACK
35#include "acl/ConnMark.h"
36#endif
37#if USE_AUTH
38#include "acl/ExtUser.h"
39#endif
40#include "acl/FilledChecklist.h"
41#include "acl/forward.h"
42#include "acl/Gadgets.h"
43#include "acl/HasComponent.h"
45#include "acl/HierCode.h"
46#include "acl/HierCodeData.h"
47#include "acl/HttpHeaderData.h"
48#include "acl/HttpRepHeader.h"
49#include "acl/HttpReqHeader.h"
50#include "acl/HttpStatus.h"
51#include "acl/IntRange.h"
52#include "acl/Ip.h"
53#include "acl/LocalIp.h"
54#include "acl/LocalPort.h"
55#include "acl/MaxConnection.h"
56#include "acl/Method.h"
57#include "acl/MethodData.h"
58#include "acl/MyPortName.h"
59#include "acl/Node.h"
60#include "acl/Note.h"
61#include "acl/NoteData.h"
62#include "acl/PeerName.h"
63#include "acl/Protocol.h"
64#include "acl/ProtocolData.h"
65#include "acl/Random.h"
66#include "acl/RegexData.h"
68#include "acl/ReplyMimeType.h"
70#include "acl/RequestMimeType.h"
71#include "acl/SourceDomain.h"
72#include "acl/SourceIp.h"
73#include "acl/SquidError.h"
74#include "acl/SquidErrorData.h"
75#if USE_OPENSSL
76#include "acl/Certificate.h"
77#include "acl/CertificateData.h"
78#include "acl/ServerName.h"
79#include "acl/SslError.h"
80#include "acl/SslErrorData.h"
81#endif
82#include "acl/StringData.h"
83#if USE_OPENSSL
85#endif
86#include "acl/Tag.h"
87#include "acl/Time.h"
88#include "acl/TimeData.h"
90#include "acl/Url.h"
91#include "acl/UrlLogin.h"
92#include "acl/UrlPath.h"
93#include "acl/UrlPort.h"
94#include "acl/UserData.h"
95#if USE_AUTH
96#include "auth/AclMaxUserIp.h"
97#include "auth/AclProxyAuth.h"
98#endif
99#include "base/RegexPattern.h"
100#include "ExternalACL.h"
101#if SQUID_SNMP
102#include "snmp_core.h"
103#endif
104#include "sbuf/Stream.h"
105
106namespace Acl
107{
108
113template <class Parent>
115{
117
118public:
119 using Parameters = typename Parent::Parameters;
120 using Parent::data;
121
130 static void PreferAllocatorLabelPrefix(const char * const suffix)
131 {
132 assert(!PreferredAllocatorLabelSuffix); // must be called at most once
133 assert(!FinalPoolLabel); // must be called before the class constructor
134 assert(suffix);
136 }
137
139 typeName_(typeName)
140 {
141 Assure(!data); // base classes never set this data member
142 data.reset(params);
143 Assure(data); // ... but we always do
144
145 FinalizePoolLabel(typeName);
146 }
147
148 ~FinalizedParameterizedNode() override = default;
149
150 /* ACL API */
151 const char *typeString() const override { return typeName_; }
152
153private:
160 static void FinalizePoolLabel(const TypeName typeName)
161 {
162 if (FinalPoolLabel)
163 return; // the label has been finalized already
164
165 assert(typeName);
166 const auto label = ToSBuf("acltype=", PreferredAllocatorLabelSuffix ? PreferredAllocatorLabelSuffix : typeName);
168 Pool().relabel(FinalPoolLabel);
169 }
170
172 inline static const char *PreferredAllocatorLabelSuffix = nullptr;
173
175 inline static const char *FinalPoolLabel = nullptr;
176
177 // TODO: Consider storing the spelling used by the admin instead.
180};
181
182} // namespace Acl
183
184// Not in src/acl/ because some of the ACLs it registers are not in src/acl/.
185void
187{
188 /* the registration order does not matter */
189
190 // The explicit return type (Acl::Node*) for lambdas is needed because the type
191 // of the return expression inside lambda is not Node* but AclFoo* while
192 // Maker is defined to return Node*.
193
194 RegisterMaker("all-of", [](TypeName)->Node* { return new AllOf; }); // XXX: Add name parameter to ctor
195 RegisterMaker("any-of", [](TypeName)->Node* { return new AnyOf; }); // XXX: Add name parameter to ctor
196 RegisterMaker("random", [](TypeName name)->Node* { return new ACLRandom(name); });
197 RegisterMaker("time", [](TypeName name)->Node* { return new FinalizedParameterizedNode<CurrentTimeCheck>(name, new ACLTimeData); });
199
200 RegisterMaker("dstdomain", [](TypeName name)->Node* { return new FinalizedParameterizedNode<DestinationDomainCheck>(name, new ACLDomainData); });
201 RegisterMaker("dstdom_regex", [](TypeName name)->Node* { return new FinalizedParameterizedNode<DestinationDomainCheck>(name, new ACLRegexData); });
203
204 RegisterMaker("dst", [](TypeName)->Node* { return new ACLDestinationIP; }); // XXX: Add name parameter to ctor
205 RegisterMaker("hier_code", [](TypeName name)->Node* { return new FinalizedParameterizedNode<HierCodeCheck>(name, new ACLHierCodeData); });
206 RegisterMaker("rep_header", [](TypeName name)->Node* { return new FinalizedParameterizedNode<HttpRepHeaderCheck>(name, new ACLHTTPHeaderData); });
207 RegisterMaker("req_header", [](TypeName name)->Node* { return new FinalizedParameterizedNode<HttpReqHeaderCheck>(name, new ACLHTTPHeaderData); });
208 RegisterMaker("http_status", [](TypeName name)->Node* { return new ACLHTTPStatus(name); });
209 RegisterMaker("maxconn", [](TypeName name)->Node* { return new ACLMaxConnection(name); });
210 RegisterMaker("method", [](TypeName name)->Node* { return new FinalizedParameterizedNode<MethodCheck>(name, new ACLMethodData); });
211 RegisterMaker("localip", [](TypeName)->Node* { return new ACLLocalIP; }); // XXX: Add name parameter to ctor
212 RegisterMaker("localport", [](TypeName name)->Node* { return new FinalizedParameterizedNode<LocalPortCheck>(name, new ACLIntRange); });
213 RegisterMaker("myportname", [](TypeName name)->Node* { return new FinalizedParameterizedNode<MyPortNameCheck>(name, new ACLStringData); });
214
215 RegisterMaker("peername", [](TypeName name)->Node* { return new FinalizedParameterizedNode<PeerNameCheck>(name, new ACLStringData); });
216 RegisterMaker("peername_regex", [](TypeName name)->Node* { return new FinalizedParameterizedNode<PeerNameCheck>(name, new ACLRegexData); });
218
219 RegisterMaker("proto", [](TypeName name)->Node* { return new FinalizedParameterizedNode<ProtocolCheck>(name, new ACLProtocolData); });
223
224 RegisterMaker("srcdomain", [](TypeName name)->Node* { return new FinalizedParameterizedNode<SourceDomainCheck>(name, new ACLDomainData); });
225 RegisterMaker("srcdom_regex", [](TypeName name)->Node* { return new FinalizedParameterizedNode<SourceDomainCheck>(name, new ACLRegexData); });
227
228 RegisterMaker("src", [](TypeName)->Node* { return new ACLSourceIP; }); // XXX: Add name parameter to ctor
229 RegisterMaker("url_regex", [](TypeName name)->Node* { return new FinalizedParameterizedNode<UrlCheck>(name, new ACLRegexData); });
230 RegisterMaker("urllogin", [](TypeName name)->Node* { return new FinalizedParameterizedNode<UrlLoginCheck>(name, new ACLRegexData); });
231 RegisterMaker("urlpath_regex", [](TypeName name)->Node* { return new FinalizedParameterizedNode<UrlPathCheck>(name, new ACLRegexData); });
232 RegisterMaker("port", [](TypeName name)->Node* { return new FinalizedParameterizedNode<UrlPortCheck>(name, new ACLIntRange); });
233 RegisterMaker("external", [](TypeName name)->Node* { return new ACLExternal(name); });
234 RegisterMaker("squid_error", [](TypeName name)->Node* { return new FinalizedParameterizedNode<SquidErrorCheck>(name, new ACLSquidErrorData); });
235 RegisterMaker("connections_encrypted", [](TypeName name)->Node* { return new ConnectionsEncrypted(name); });
236 RegisterMaker("tag", [](TypeName name)->Node* { return new FinalizedParameterizedNode<TagCheck>(name, new ACLStringData); });
237 RegisterMaker("note", [](TypeName name)->Node* { return new FinalizedParameterizedNode<NoteCheck>(name, new ACLNoteData); });
238 RegisterMaker("annotate_client", [](TypeName name)->Node* { return new FinalizedParameterizedNode<AnnotateClientCheck>(name, new ACLAnnotationData); });
239 RegisterMaker("annotate_transaction", [](TypeName name)->Node* { return new FinalizedParameterizedNode<AnnotateTransactionCheck>(name, new ACLAnnotationData); });
241 RegisterMaker("transaction_initiator", [](TypeName name)->Node* {return new TransactionInitiator(name);});
242
243#if USE_LIBNETFILTERCONNTRACK
244 RegisterMaker("clientside_mark", [](TypeName)->Node* { return new ConnMark; }); // XXX: Add name parameter to ctor
245 RegisterMaker("client_connection_mark", [](TypeName)->Node* { return new ConnMark; }); // XXX: Add name parameter to ctor
246#endif
247
248#if USE_OPENSSL
249 RegisterMaker("ssl_error", [](TypeName name)->Node* { return new FinalizedParameterizedNode<CertificateErrorCheck>(name, new ACLSslErrorData); });
250
254
255 RegisterMaker("server_cert_fingerprint", [](TypeName name)->Node* { return new FinalizedParameterizedNode<ServerCertificateCheck>(name, new ACLCertificateData(Ssl::GetX509Fingerprint, nullptr, true)); });
256 RegisterMaker("at_step", [](TypeName name)->Node* { return new FinalizedParameterizedNode<AtStepCheck>(name, new ACLAtStepData); });
257
258 RegisterMaker("ssl::server_name", [](TypeName name)->Node* { return new FinalizedParameterizedNode<ServerNameCheck>(name, new ACLServerNameData); });
259 RegisterMaker("ssl::server_name_regex", [](TypeName name)->Node* { return new FinalizedParameterizedNode<ServerNameCheck>(name, new ACLRegexData); });
261#endif
262
263#if USE_SQUID_EUI
264 RegisterMaker("arp", [](TypeName name)->Node* { return new ACLARP(name); });
265 RegisterMaker("eui64", [](TypeName name)->Node* { return new ACLEui64(name); });
266#endif
267
268#if USE_AUTH
269 RegisterMaker("ext_user", [](TypeName name)->Node* { return new ACLExtUser(new ACLUserData, name); });
270 RegisterMaker("ext_user_regex", [](TypeName name)->Node* { return new ACLExtUser(new ACLRegexData, name); });
271 RegisterMaker("proxy_auth", [](TypeName name)->Node* { return new ACLProxyAuth(new ACLUserData, name); });
272 RegisterMaker("proxy_auth_regex", [](TypeName name)->Node* { return new ACLProxyAuth(new ACLRegexData, name); });
273 RegisterMaker("max_user_ip", [](TypeName name)->Node* { return new ACLMaxUserIP(name); });
274#endif
275
276#if USE_ADAPTATION
277 RegisterMaker("adaptation_service", [](TypeName name)->Node* { return new FinalizedParameterizedNode<AdaptationServiceCheck>(name, new ACLAdaptationServiceData); });
278#endif
279
280#if SQUID_SNMP
281 RegisterMaker("snmp_community", [](TypeName name)->Node* { return new FinalizedParameterizedNode<SnmpCommunityCheck>(name, new ACLStringData); });
282#endif
283}
284
#define Assure(condition)
Definition Assure.h:35
void SBufToCstring(char *d, const SBuf &s)
Definition SBuf.h:756
#define assert(EX)
Definition assert.h:17
Definition Arp.h:19
Configurable any-of ACL. Each ACL line is a disjuction of ACLs.
Definition AnyOf.h:19
~FinalizedParameterizedNode() override=default
MEMPROXY_CLASS(FinalizedParameterizedNode< Parent >)
static const char * PreferredAllocatorLabelSuffix
if set, overrules FinalizePoolLabel() argument
Definition AclRegs.cc:172
typename Parent::Parameters Parameters
Definition AclRegs.cc:119
static void FinalizePoolLabel(const TypeName typeName)
Definition AclRegs.cc:160
static const char * FinalPoolLabel
custom allocator label set by FinalizePoolLabel()
Definition AclRegs.cc:175
const char * typeString() const override
Definition AclRegs.cc:151
FinalizedParameterizedNode(TypeName typeName, Parameters *const params)
Definition AclRegs.cc:138
static void PreferAllocatorLabelPrefix(const char *const suffix)
Definition AclRegs.cc:130
TypeName typeName_
the "acltype" name in its canonical spelling
Definition AclRegs.cc:179
transaction_initiator ACL
GETX509ATTRIBUTE GetX509Fingerprint
Definition support.h:124
GETX509ATTRIBUTE GetX509UserAttribute
Definition support.h:115
GETX509ATTRIBUTE GetX509CAAttribute
Definition support.h:118
#define Parent(x)
Definition heap.c:57
Definition Acl.cc:33
void Init(void)
prepares to parse ACLs configuration
Definition AclRegs.cc:186
void RegisterMaker(TypeName typeName, Maker maker)
use the given Acl::Node Maker for all ACLs of the named type
Definition Acl.cc:92
const char * TypeName
the ACL type name known to admins
Definition Acl.h:24
SBuf ToSBuf(Args &&... args)
slowly stream-prints all arguments into a freshly allocated SBuf
Definition Stream.h:63