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_EXTERNALACL_H
10 #define SQUID_EXTERNALACL_H
11 
12 #include "acl/Checklist.h"
13 #include "base/RefCount.h"
14 
15 class external_acl;
16 class external_acl_data;
17 class StoreEntry;
18 
19 class ExternalACLLookup : public ACLChecklist::AsyncState
20 {
21 
22 public:
23     static ExternalACLLookup *Instance();
24     virtual void checkForAsync(ACLChecklist *)const;
25 
26     // If possible, starts an asynchronous lookup of an external ACL.
27     // Otherwise, asserts (or bails if background refresh is requested).
28     static void Start(ACLChecklist *checklist, external_acl_data *acl, bool bg);
29 
30 private:
31     static ExternalACLLookup instance_;
32     static void LookupDone(void *data, const ExternalACLEntryPointer &result);
33 };
34 
35 #include "acl/Acl.h"
36 
37 class ACLExternal : public ACL
38 {
39     MEMPROXY_CLASS(ACLExternal);
40 
41 public:
42     static void ExternalAclLookup(ACLChecklist * ch, ACLExternal *);
43 
44     ACLExternal(char const *);
45     ACLExternal(ACLExternal const &);
46     ~ACLExternal();
47     ACLExternal&operator=(ACLExternal const &);
48 
49     virtual ACL *clone()const;
50     virtual char const *typeString() const;
51     virtual void parse();
52     virtual int match(ACLChecklist *checklist);
53     /* This really should be dynamic based on the external class defn */
requiresAle()54     virtual bool requiresAle() const {return true;}
requiresRequest()55     virtual bool requiresRequest() const {return true;}
56 
57     /* when requiresRequest is made dynamic, review this too */
58     //    virtual bool requiresReply() const {return true;}
59     virtual bool isProxyAuth() const;
60     virtual SBufList dump() const;
61     virtual bool valid () const;
62     virtual bool empty () const;
63 
64 protected:
65     external_acl_data *data;
66     char const *class_;
67 };
68 
69 void parse_externalAclHelper(external_acl **);
70 void dump_externalAclHelper(StoreEntry * sentry, const char *name, const external_acl *);
71 void free_externalAclHelper(external_acl **);
72 typedef void EAH(void *data, const ExternalACLEntryPointer &result);
73 void externalAclLookup(ACLChecklist * ch, void *acl_data, EAH * handler, void *data);
74 void externalAclInit(void);
75 void externalAclShutdown(void);
76 
77 #endif /* SQUID_EXTERNALACL_H */
78 
79