]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Synced #includes after moving files around.
authorAlex Rousskov <rousskov@measurement-factory.com>
Sun, 8 Mar 2009 21:57:12 +0000 (15:57 -0600)
committerAlex Rousskov <rousskov@measurement-factory.com>
Sun, 8 Mar 2009 21:57:12 +0000 (15:57 -0600)
Use newly added ACLFilledChecklist for fast ACL checks. Its constructor locks
request and accessList, simplifying the caller code.

Use newly added ACLFilledChecklist for state-specific ACL code. Also, the
ACLChecklist::authenticated() method is now an AuthenticateAcl global
function. See ACLFilledChecklist addition log for rationale.

Context: SourceLayout: acl/, take 1

30 files changed:
src/DelayId.cc
src/HttpHeaderTools.cc
src/HttpReply.cc
src/acl/Arp.cc [moved from src/ACLARP.cc with 99% similarity]
src/acl/DestinationDomain.cc [moved from src/ACLDestinationDomain.cc with 92% similarity]
src/acl/DestinationIp.cc [moved from src/ACLDestinationIP.cc with 90% similarity]
src/acl/HttpStatus.cc [moved from src/ACLHTTPStatus.cc with 97% similarity]
src/acl/MaxConnection.cc [moved from src/ACLMaxConnection.cc with 95% similarity]
src/acl/MyIp.cc [moved from src/ACLMyIP.cc with 94% similarity]
src/acl/SourceDomain.cc [moved from src/ACLSourceDomain.cc with 90% similarity]
src/acl/SourceIp.cc [moved from src/ACLSourceIP.cc with 94% similarity]
src/acl/Strategised.cc [moved from src/ACLStrategised.cc with 91% similarity]
src/acl/Strategised.h [moved from src/ACLStrategised.h with 95% similarity]
src/acl/Strategy.h [moved from src/ACLStrategy.h with 92% similarity]
src/acl/Time.h [moved from src/ACLTime.h with 91% similarity]
src/auth/AclMaxUserIp.cc [moved from src/ACLMaxUserIP.cc with 95% similarity]
src/auth/AclMaxUserIp.h [moved from src/ACLMaxUserIP.h with 97% similarity]
src/auth/AclProxyAuth.cc [moved from src/ACLProxyAuth.cc with 90% similarity]
src/client_side.cc
src/client_side_request.cc
src/client_side_request.h
src/external_acl.cc
src/forward.cc
src/htcp.cc
src/http.cc
src/icp_v2.cc
src/neighbors.cc
src/snmp_core.cc
src/ssl_support.cc
src/tunnel.cc

index 986c1ec7a1739886f84d1d376ee7908b92d5417d..8337f37a5941ba6b40ce375c1241145a436f1c08 100644 (file)
@@ -47,7 +47,7 @@
 #include "squid.h"
 #include "DelayId.h"
 #include "client_side_request.h"
-#include "ACLChecklist.h"
+#include "acl/FilledChecklist.h"
 #include "DelayPools.h"
 #include "DelayPool.h"
 #include "HttpRequest.h"
@@ -114,7 +114,7 @@ DelayId::DelayClient(ClientHttpRequest * http)
             continue;
         }
 
-        ACLChecklist ch;
+        ACLFilledChecklist ch(DelayPools::delay_data[pool].access, r, NULL);
 #if FOLLOW_X_FORWARDED_FOR
         if (Config.onoff.delay_pool_uses_indirect_client)
             ch.src_addr = r->indirect_client_addr;
@@ -126,12 +126,6 @@ DelayId::DelayClient(ClientHttpRequest * http)
         if (http->getConn() != NULL)
             ch.conn(http->getConn());
 
-        ch.request = HTTPMSGLOCK(r);
-
-        ch.accessList = cbdataReference(DelayPools::delay_data[pool].access);
-
-        /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
-
         if (DelayPools::delay_data[pool].theComposite().getRaw() && ch.fastCheck()) {
 
             DelayId result (pool + 1);
index 33ac3d5712667cb5f4ceb503d1e75ba5dc786567..b9fd9f9f689d7df4213b8514592838168477a5d9 100644 (file)
@@ -36,7 +36,7 @@
 #include "squid.h"
 #include "HttpHeader.h"
 #include "HttpHdrContRange.h"
-#include "ACLChecklist.h"
+#include "acl/FilledChecklist.h"
 #include "MemBuf.h"
 
 static void httpHeaderPutStrvf(HttpHeader * hdr, http_hdr_type id, const char *fmt, va_list vargs);
@@ -372,7 +372,6 @@ httpHdrMangle(HttpHeaderEntry * e, HttpRequest * request, int req_or_rep)
 
     /* check with anonymizer tables */
     header_mangler *hm;
-    ACLChecklist *checklist;
     assert(e);
 
     if (ROR_REQUEST == req_or_rep) {
@@ -389,9 +388,9 @@ httpHdrMangle(HttpHeaderEntry * e, HttpRequest * request, int req_or_rep)
         return 1;
     }
 
-    checklist = aclChecklistCreate(hm->access_list, request, NULL);
+    ACLFilledChecklist checklist(hm->access_list, request, NULL);
 
-    if (checklist->fastCheck()) {
+    if (checklist.fastCheck()) {
         /* aclCheckFast returns true for allow. */
         retval = 1;
     } else if (NULL == hm->replacement) {
@@ -406,7 +405,6 @@ httpHdrMangle(HttpHeaderEntry * e, HttpRequest * request, int req_or_rep)
         retval = 1;
     }
 
-    delete checklist;
     return retval;
 }
 
index 42d0c21b1899a54f45f37a7a3f2b9971af0027fa..a6d42d35345dffacf5732f2c3874a05e77629d78 100644 (file)
@@ -39,7 +39,7 @@
 #include "HttpReply.h"
 #include "HttpHdrContRange.h"
 #include "HttpHdrSc.h"
-#include "ACLChecklist.h"
+#include "acl/FilledChecklist.h"
 #include "HttpRequest.h"
 #include "MemBuf.h"
 
@@ -538,11 +538,10 @@ HttpReply::calcMaxBodySize(HttpRequest& request)
         return;
     bodySizeMax = -1;
 
-    ACLChecklist ch;
+    ACLFilledChecklist ch(NULL, &request, NULL);
     ch.src_addr = request.client_addr;
     ch.my_addr = request.my_addr;
     ch.reply = HTTPMSGLOCK(this); // XXX: this lock makes method non-const
-    ch.request = HTTPMSGLOCK(&request);
     for (acl_size_t *l = Config.ReplyBodySize; l; l = l -> next) {
         /* if there is no ACL list or if the ACLs listed match use this size value */
         if (!l->aclList || ch.matchAclListFast(l->aclList)) {
similarity index 99%
rename from src/ACLARP.cc
rename to src/acl/Arp.cc
index 54ab4032f835e7225955b99a349d9cf820df58ae..0e6f891a63cc7e955bcfdee6e539aee1f6b8bcb8 100644 (file)
@@ -73,7 +73,8 @@ struct arpreq {
 #endif
 #endif
 
-#include "ACLARP.h"
+#include "acl/Arp.h"
+#include "acl/FilledChecklist.h"
 #include "wordlist.h"
 
 #if !USE_ARP_ACL
@@ -224,8 +225,10 @@ aclParseArpList(SplayNode<acl_arp_data *> **curlist)
 }
 
 int
-ACLARP::match(ACLChecklist *checklist)
+ACLARP::match(ACLChecklist *cl)
 {
+       ACLFilledChecklist *checklist = Filled(cl);
+
     /* IPv6 does not do ARP */
     if (!checklist->src_addr.IsIPv4()) {
         debugs(14, 3, "ACLARP::match: IPv4 Required for ARP Lookups. Skipping " << checklist->src_addr );
similarity index 92%
rename from src/ACLDestinationDomain.cc
rename to src/acl/DestinationDomain.cc
index d732bafbee9a73530767431f53147d5800fecf18..09aa9570ae13136781c84729882f72fdb02b2835 100644 (file)
  */
 
 #include "squid.h"
-#include "ACLDestinationDomain.h"
-#include "ACLChecklist.h"
-#include "ACLRegexData.h"
-#include "ACLDomainData.h"
+#include "acl/DestinationDomain.h"
+#include "acl/Checklist.h"
+#include "acl/RegexData.h"
+#include "acl/DomainData.h"
 #include "HttpRequest.h"
 
 DestinationDomainLookup DestinationDomainLookup::instance_;
@@ -50,8 +50,9 @@ DestinationDomainLookup::Instance()
 }
 
 void
-DestinationDomainLookup::checkForAsync(ACLChecklist *checklist) const
+DestinationDomainLookup::checkForAsync(ACLChecklist *cl) const
 {
+       ACLFilledChecklist *checklist = Filled(cl);
     checklist->asyncInProgress(true);
     fqdncache_nbgethostbyaddr(checklist->dst_addr, LookupDone, checklist);
 }
@@ -64,7 +65,7 @@ DestinationDomainLookup::LookupDone(const char *fqdn, void *data)
 
     checklist->asyncInProgress(false);
     checklist->changeState (ACLChecklist::NullState::Instance());
-    checklist->markDestinationDomainChecked();
+    Filled(checklist)->markDestinationDomainChecked();
     checklist->check();
 }
 
@@ -74,7 +75,7 @@ ACL::Prototype ACLDestinationDomain::RegexRegistryProtoype(&ACLDestinationDomain
 ACLStrategised<char const *> ACLDestinationDomain::RegexRegistryEntry_(new ACLRegexData,ACLDestinationDomainStrategy::Instance() ,"dstdom_regex");
 
 int
-ACLDestinationDomainStrategy::match (ACLData<MatchType> * &data, ACLChecklist *checklist)
+ACLDestinationDomainStrategy::match (ACLData<MatchType> * &data, ACLFilledChecklist *checklist)
 {
     assert(checklist != NULL && checklist->request != NULL);
 
similarity index 90%
rename from src/ACLDestinationIP.cc
rename to src/acl/DestinationIp.cc
index c04ad0e30d08d3551043119137f452915f7bafb2..925d518e92b79c52235dd9d589f120f55b67a44e 100644 (file)
@@ -34,8 +34,8 @@
  */
 
 #include "squid.h"
-#include "ACLDestinationIP.h"
-#include "ACLChecklist.h"
+#include "acl/DestinationIp.h"
+#include "acl/FilledChecklist.h"
 #include "HttpRequest.h"
 
 char const *
@@ -45,8 +45,9 @@ ACLDestinationIP::typeString() const
 }
 
 int
-ACLDestinationIP::match(ACLChecklist *checklist)
+ACLDestinationIP::match(ACLChecklist *cl)
 {
+       ACLFilledChecklist *checklist = Filled(cl);
     const ipcache_addrs *ia = ipcache_gethostbyname(checklist->request->GetHost(), IP_LOOKUP_IF_MISS);
 
     if (ia) {
@@ -77,8 +78,9 @@ DestinationIPLookup::Instance()
 }
 
 void
-DestinationIPLookup::checkForAsync(ACLChecklist *checklist)const
+DestinationIPLookup::checkForAsync(ACLChecklist *cl)const
 {
+       ACLFilledChecklist *checklist = Filled(cl);
     checklist->asyncInProgress(true);
     ipcache_nbgethostbyname(checklist->request->GetHost(), LookupDone, checklist);
 }
@@ -88,7 +90,7 @@ DestinationIPLookup::LookupDone(const ipcache_addrs * ia, void *data)
 {
     ACLChecklist *checklist = (ACLChecklist *)data;
     assert (checklist->asyncState() == DestinationIPLookup::Instance());
-    checklist->request->flags.destinationIPLookupCompleted();
+    Filled(checklist)->request->flags.destinationIPLookupCompleted();
     checklist->asyncInProgress(false);
     checklist->changeState (ACLChecklist::NullState::Instance());
     checklist->check();
similarity index 97%
rename from src/ACLHTTPStatus.cc
rename to src/acl/HttpStatus.cc
index bf043fdf0ac1adf3e6d6788f18fe177b30b12048..d7c97315003f386081f7454e66469ddf598c98e2 100644 (file)
@@ -40,7 +40,8 @@
 #endif
 #include "squid.h"
 
-#include "ACLHTTPStatus.h"
+#include "acl/HttpStatus.h"
+#include "acl/FilledChecklist.h"
 #include "HttpReply.h"
 #include "wordlist.h"
 
@@ -161,7 +162,7 @@ aclParseHTTPStatusList(SplayNode<acl_httpstatus_data *> **curlist)
 int
 ACLHTTPStatus::match(ACLChecklist *checklist)
 {
-    return aclMatchHTTPStatus(&data, checklist->reply->sline.status);
+    return aclMatchHTTPStatus(&data, Filled(checklist)->reply->sline.status);
 }
 
 int
similarity index 95%
rename from src/ACLMaxConnection.cc
rename to src/acl/MaxConnection.cc
index 274154ce0f7269f2f4a4a35f701312596690b9a8..5bc67fb5786bd92c3d9356eea7e6789e5a71d2da 100644 (file)
@@ -35,7 +35,8 @@
  */
 
 #include "squid.h"
-#include "ACLMaxConnection.h"
+#include "acl/FilledChecklist.h"
+#include "acl/MaxConnection.h"
 #include "wordlist.h"
 
 ACL::Prototype ACLMaxConnection::RegistryProtoype(&ACLMaxConnection::RegistryEntry_, "maxconn");
@@ -95,7 +96,7 @@ ACLMaxConnection::parse()
 int
 ACLMaxConnection::match(ACLChecklist *checklist)
 {
-    return (clientdbEstablished(checklist->src_addr, 0) > limit ? 1 : 0);
+    return clientdbEstablished(Filled(checklist)->src_addr, 0) > limit ? 1 : 0;
 }
 
 wordlist *
similarity index 94%
rename from src/ACLMyIP.cc
rename to src/acl/MyIp.cc
index fedb831315a4719877c910422b15ac8e366a9bd1..00729a99c4be0514f7d53b5f1cb05355c9608eaf 100644 (file)
@@ -34,8 +34,8 @@
  */
 
 #include "squid.h"
-#include "ACLMyIP.h"
-#include "ACLChecklist.h"
+#include "acl/MyIp.h"
+#include "acl/FilledChecklist.h"
 
 char const *
 ACLMyIP::typeString() const
@@ -46,7 +46,7 @@ ACLMyIP::typeString() const
 int
 ACLMyIP::match(ACLChecklist *checklist)
 {
-    return ACLIP::match (checklist->my_addr);
+    return ACLIP::match (Filled(checklist)->my_addr);
 }
 
 ACL::Prototype ACLMyIP::RegistryProtoype(&ACLMyIP::RegistryEntry(), "myip");
similarity index 90%
rename from src/ACLSourceDomain.cc
rename to src/acl/SourceDomain.cc
index bb8f52230580d3d4445683bcc21522ca26805172..997b1638cdf059164291484518c3428f28549a8b 100644 (file)
  */
 
 #include "squid.h"
-#include "ACLSourceDomain.h"
-#include "ACLChecklist.h"
-#include "ACLRegexData.h"
-#include "ACLDomainData.h"
+#include "acl/SourceDomain.h"
+#include "acl/Checklist.h"
+#include "acl/RegexData.h"
+#include "acl/DomainData.h"
 
 SourceDomainLookup SourceDomainLookup::instance_;
 
@@ -52,7 +52,7 @@ void
 SourceDomainLookup::checkForAsync(ACLChecklist *checklist) const
 {
     checklist->asyncInProgress(true);
-    fqdncache_nbgethostbyaddr(checklist->src_addr, LookupDone, checklist);
+    fqdncache_nbgethostbyaddr(Filled(checklist)->src_addr, LookupDone, checklist);
 }
 
 void
@@ -63,7 +63,7 @@ SourceDomainLookup::LookupDone(const char *fqdn, void *data)
 
     checklist->asyncInProgress(false);
     checklist->changeState (ACLChecklist::NullState::Instance());
-    checklist->markSourceDomainChecked();
+    Filled(checklist)->markSourceDomainChecked();
     checklist->check();
 }
 
@@ -73,7 +73,7 @@ ACL::Prototype ACLSourceDomain::RegexRegistryProtoype(&ACLSourceDomain::RegexReg
 ACLStrategised<char const *> ACLSourceDomain::RegexRegistryEntry_(new ACLRegexData,ACLSourceDomainStrategy::Instance() ,"srcdom_regex");
 
 int
-ACLSourceDomainStrategy::match (ACLData<MatchType> * &data, ACLChecklist *checklist)
+ACLSourceDomainStrategy::match (ACLData<MatchType> * &data, ACLFilledChecklist *checklist)
 {
     const char *fqdn = NULL;
     fqdn = fqdncache_gethostbyaddr(checklist->src_addr, FQDN_LOOKUP_IF_MISS);
similarity index 94%
rename from src/ACLSourceIP.cc
rename to src/acl/SourceIp.cc
index 0b4f939d79cd18fad257f20c06d332c7fd3730dd..3e275d6d79ad15c67fbfc91297774da17a7208f3 100644 (file)
@@ -34,8 +34,8 @@
  */
 
 #include "squid.h"
-#include "ACLSourceIP.h"
-#include "ACLChecklist.h"
+#include "acl/SourceIp.h"
+#include "acl/FilledChecklist.h"
 
 char const *
 ACLSourceIP::typeString() const
@@ -46,7 +46,7 @@ ACLSourceIP::typeString() const
 int
 ACLSourceIP::match(ACLChecklist *checklist)
 {
-    return ACLIP::match(checklist->src_addr);
+    return ACLIP::match(Filled(checklist)->src_addr);
 }
 
 ACL::Prototype ACLSourceIP::RegistryProtoype(&ACLSourceIP::RegistryEntry_, "src");
similarity index 91%
rename from src/ACLStrategised.cc
rename to src/acl/Strategised.cc
index 8f73e3b2e7f22a1130fce0062ab31a848f9e9945..bda36470b3dfc9ca28ae816eead62eec50fe37cf 100644 (file)
  */
 
 #include "squid.h"
-#include "ACLStrategised.h"
-#include "authenticate.h"
-#include "ACLChecklist.h"
-#include "ACLRegexData.h"
-#include "ACLDomainData.h"
+#include "acl/Strategised.h"
 
 /*
  *  moved template instantiation into ACLStrategized.cc
@@ -49,7 +45,7 @@
 
 /* explicit template instantiation required for some systems */
 
-/* ACLHTTPRepHeader + ACLHTTPReqHeader */
+/* XXX: move to ACLHTTPRepHeader or ACLHTTPReqHeader */
 template class ACLStrategised<HttpHeader*>;
 
 /* ACLMyPortName + ACLMyPeerName + ACLBrowser */
similarity index 95%
rename from src/ACLStrategised.h
rename to src/acl/Strategised.h
index 0e344645237cc5c58214731a7a64296badef1fc2..a46cfa3f951f22ef4535c5823f2681aa0c3b7a75 100644 (file)
 
 #ifndef SQUID_ACLSTRATEGISED_H
 #define SQUID_ACLSTRATEGISED_H
-#include "ACL.h"
-#include "ACLData.h"
-#include "ACLStrategy.h"
+#include "acl/Acl.h"
+#include "acl/Data.h"
+#include "acl/Strategy.h"
+#include "acl/FilledChecklist.h"
 
 template <class M>
 
@@ -147,8 +148,10 @@ ACLStrategised<MatchType>::empty() const
 
 template <class MatchType>
 int
-ACLStrategised<MatchType>::match(ACLChecklist *checklist)
+ACLStrategised<MatchType>::match(ACLChecklist *cl)
 {
+       ACLFilledChecklist *checklist = dynamic_cast<ACLFilledChecklist*>(cl);
+       assert(checklist);
     return matcher->match(data, checklist);
 }
 
similarity index 92%
rename from src/ACLStrategy.h
rename to src/acl/Strategy.h
index 89f6d40e848090912ff41d33eb6b6a1ac0262c84..106f800ef5fd6e909f608b3d5a51042c8505c976 100644 (file)
 
 #ifndef SQUID_ACLSTRATEGY_H
 #define SQUID_ACLSTRATEGY_H
-#include "ACL.h"
-#include "ACLData.h"
 
-/* Perhaps this should live in ACL? */
+#include "acl/Data.h"
+
+class ACLFilledChecklist;
 
 template<class M>
 
@@ -47,7 +47,7 @@ class ACLStrategy
 
 public:
     typedef M MatchType;
-    virtual int match (ACLData<M> * &, ACLChecklist *) = 0;
+    virtual int match (ACLData<M> * &, ACLFilledChecklist *) = 0;
     virtual bool requiresRequest() const {return false;}
 
     virtual bool requiresReply() const {return false;}
similarity index 91%
rename from src/ACLTime.h
rename to src/acl/Time.h
index dbaeb9e5fcec3f4871eb708a00645a5eddae059a..79284651d63689e159cc74ff7acf906126429715 100644 (file)
 
 #ifndef SQUID_ACLTIME_H
 #define SQUID_ACLTIME_H
-#include "ACL.h"
-#include "ACLData.h"
-#include "ACLChecklist.h"
-#include "ACLStrategised.h"
+#include "acl/Acl.h"
+#include "acl/Data.h"
+#include "acl/Strategised.h"
+
+class ACLChecklist; // XXX: we do not need it
 
 class ACLTimeStrategy : public ACLStrategy<time_t>
 {
 
 public:
-    virtual int match (ACLData<MatchType> * &, ACLChecklist *);
+    virtual int match (ACLData<MatchType> * &, ACLFilledChecklist *);
     static ACLTimeStrategy *Instance();
     /* Not implemented to prevent copies of the instance. */
     /* Not private to prevent brain dead g+++ warnings about
similarity index 95%
rename from src/ACLMaxUserIP.cc
rename to src/auth/AclMaxUserIp.cc
index 31aafc4212a1ce8949cf4c7bb0560fe82f649670..0326b8feb4f2038fae3c62627683a3e40bbd43e8 100644 (file)
  */
 
 #include "squid.h"
-#include "ACLMaxUserIP.h"
+#include "acl/FilledChecklist.h"
+#include "auth/Acl.h"
+#include "auth/AclMaxUserIp.h"
 #include "auth/UserRequest.h"
-#include "authenticate.h"
 #include "wordlist.h"
 #include "ConfigParser.h"
 
@@ -152,11 +153,12 @@ ACLMaxUserIP::match(AuthUserRequest * auth_user_request,
 }
 
 int
-ACLMaxUserIP::match(ACLChecklist *checklist)
+ACLMaxUserIP::match(ACLChecklist *cl)
 {
+    ACLFilledChecklist *checklist = Filled(cl);
     int ti;
 
-    if ((ti = checklist->authenticated()) != 1)
+    if ((ti = AuthenticateAcl(checklist)) != 1)
         return ti;
 
     ti = match(checklist->auth_user_request, checklist->src_addr);
similarity index 97%
rename from src/ACLMaxUserIP.h
rename to src/auth/AclMaxUserIp.h
index 903e2031ada225d8c08fae0ca1eadafd8bcf708c..dd9d08841645a96254f5508ce52f38a034fe73d3 100644 (file)
 #ifndef SQUID_ACLMAXUSERIP_H
 #define SQUID_ACLMAXUSERIP_H
 
-#include "ACL.h"
-#include "ACLChecklist.h"
+#include "acl/Acl.h"
+#include "acl/Checklist.h"
+
+class AuthUserRequest;
 
 /// \ingroup ACLAPI
 class ACLMaxUserIP : public ACL
similarity index 90%
rename from src/ACLProxyAuth.cc
rename to src/auth/AclProxyAuth.cc
index e8643cd38bab8be0ed3c84dd6da9c67e801e4d56..d4b574854430aed83c4052b79f5a2d2aa2903905 100644 (file)
  */
 
 #include "squid.h"
-#include "ACLProxyAuth.h"
-#include "authenticate.h"
-#include "ACLChecklist.h"
-#include "ACLUserData.h"
-#include "ACLRegexData.h"
+#include "auth/AclProxyAuth.h"
+#include "auth/Gadgets.h"
+#include "acl/FilledChecklist.h"
+#include "acl/UserData.h"
+#include "acl/RegexData.h"
 #include "client_side.h"
 #include "HttpRequest.h"
+#include "auth/Acl.h"
 #include "auth/User.h"
 #include "auth/UserRequest.h"
 
@@ -80,7 +81,7 @@ ACLProxyAuth::match(ACLChecklist *checklist)
 {
     int ti;
 
-    if ((ti = checklist->authenticated()) != 1)
+    if ((ti = AuthenticateAcl(checklist)) != 1)
         return ti;
 
     ti = matchProxyAuth(checklist);
@@ -133,8 +134,10 @@ ProxyAuthLookup::Instance()
 }
 
 void
-ProxyAuthLookup::checkForAsync(ACLChecklist *checklist)const
+ProxyAuthLookup::checkForAsync(ACLChecklist *cl)const
 {
+    ACLFilledChecklist *checklist = Filled(cl);
+
     checklist->asyncInProgress(true);
     debugs(28, 3, "ACLChecklist::checkForAsync: checking password via authenticator");
 
@@ -150,7 +153,8 @@ ProxyAuthLookup::checkForAsync(ACLChecklist *checklist)const
 void
 ProxyAuthLookup::LookupDone(void *data, char *result)
 {
-    ACLChecklist *checklist = (ACLChecklist *)data;
+    ACLFilledChecklist *checklist = Filled(static_cast<ACLChecklist*>(data));
+
     assert (checklist->asyncState() == ProxyAuthLookup::Instance());
 
     if (result != NULL)
@@ -198,8 +202,9 @@ ACLProxyAuth::clone() const
 }
 
 int
-ACLProxyAuth::matchForCache(ACLChecklist *checklist)
+ACLProxyAuth::matchForCache(ACLChecklist *cl)
 {
+    ACLFilledChecklist *checklist = Filled(cl);
     assert (checklist->auth_user_request);
     return data->match(checklist->auth_user_request->username());
 }
@@ -209,8 +214,9 @@ ACLProxyAuth::matchForCache(ACLChecklist *checklist)
  * 1 : Authorisation OK. (Matched)
  */
 int
-ACLProxyAuth::matchProxyAuth(ACLChecklist *checklist)
+ACLProxyAuth::matchProxyAuth(ACLChecklist *cl)
 {
+    ACLFilledChecklist *checklist = Filled(cl);
     checkAuthForCaching(checklist);
     /* check to see if we have matched the user-acl before */
     int result = cacheMatchAcl(&checklist->auth_user_request->user()->
@@ -224,7 +230,7 @@ ACLProxyAuth::checkAuthForCaching(ACLChecklist *checklist)const
 {
     /* for completeness */
     /* consistent parameters ? */
-    assert(authenticateUserAuthenticated(checklist->auth_user_request));
+    assert(authenticateUserAuthenticated(Filled(checklist)->auth_user_request));
     /* this check completed */
 }
 
index 4934d55126ae227d1084ca3d925d39f66b9067ca..4141f66c94bb93ec571563e6cb255490582bcc4c 100644 (file)
@@ -96,7 +96,7 @@
 #include "MemObject.h"
 #include "fde.h"
 #include "client_side_request.h"
-#include "ACLChecklist.h"
+#include "acl/FilledChecklist.h"
 #include "ConnectionDetail.h"
 #include "client_side_reply.h"
 #include "ClientRequestContext.h"
@@ -527,7 +527,7 @@ ClientHttpRequest::logRequest()
 
 #endif
 
-        ACLChecklist *checklist = clientAclChecklistCreate(Config.accessList.log, this);
+        ACLFilledChecklist *checklist = clientAclChecklistCreate(Config.accessList.log, this);
 
         if (al.reply)
             checklist->reply = HTTPMSGLOCK(al.reply);
@@ -2874,12 +2874,9 @@ httpAccept(int sock, int newfd, ConnectionDetail *details,
 #if USE_IDENT
 
     if (Config.accessList.identLookup) {
-        ACLChecklist identChecklist;
+        ACLFilledChecklist identChecklist(Config.accessList.identLookup, NULL, NULL);
         identChecklist.src_addr = details->peer;
         identChecklist.my_addr = details->me;
-        identChecklist.accessList = cbdataReference(Config.accessList.identLookup);
-
-        /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
         if (identChecklist.fastCheck())
             identStart(details->me, details->peer, clientIdentDone, connState);
     }
@@ -3089,12 +3086,9 @@ httpsAccept(int sock, int newfd, ConnectionDetail *details,
 #if USE_IDENT
 
     if (Config.accessList.identLookup) {
-        ACLChecklist identChecklist;
+        ACLFilledChecklist identChecklist(Config.accessList.identLookup, NULL, NULL);
         identChecklist.src_addr = details->peer;
         identChecklist.my_addr = details->me;
-        identChecklist.accessList = cbdataReference(Config.accessList.identLookup);
-
-        /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
         if (identChecklist.fastCheck())
             identStart(details->me, details->peer, clientIdentDone, connState);
     }
@@ -3345,12 +3339,12 @@ varyEvaluateMatch(StoreEntry * entry, HttpRequest * request)
     }
 }
 
-ACLChecklist *
+ACLFilledChecklist *
 clientAclChecklistCreate(const acl_access * acl, ClientHttpRequest * http)
 {
-    ACLChecklist *ch;
     ConnStateData * conn = http->getConn();
-    ch = aclChecklistCreate(acl, http->request, cbdataReferenceValid(conn) && conn != NULL ? conn->rfc931 : dash_str);
+    ACLFilledChecklist *ch = new ACLFilledChecklist(acl, http->request,
+        cbdataReferenceValid(conn) && conn != NULL ? conn->rfc931 : dash_str);
 
     /*
      * hack for ident ACL. It needs to get full addresses, and a place to store
@@ -3365,7 +3359,7 @@ clientAclChecklistCreate(const acl_access * acl, ClientHttpRequest * http)
      */
 
     if (conn != NULL)
-        ch->conn(conn);        /* unreferenced in acl.cc */
+        ch->conn(conn);        /* unreferenced in FilledCheckList.cc */
 
     return ch;
 }
index f59e386162208f1ba459b726d0cb91370c6745b5..39aec87431e6bcf1c308f21ab1779024d0c3b013 100644 (file)
@@ -48,8 +48,8 @@
 #include "auth/UserRequest.h"
 #include "HttpRequest.h"
 #include "ProtoPort.h"
-#include "ACLChecklist.h"
-#include "ACL.h"
+#include "acl/FilledChecklist.h"
+#include "acl/Gadgets.h"
 #include "client_side.h"
 #include "client_side_reply.h"
 #include "Store.h"
@@ -1113,12 +1113,9 @@ ClientHttpRequest::sslBumpNeeded() const
 
     debugs(85, 5, HERE << "SslBump possible, checking ACL");
 
-    ACLChecklist check;
+    ACLFilledChecklist check(Config.accessList.ssl_bump, request, NULL);
     check.src_addr = request->client_addr;
     check.my_addr = request->my_addr;
-    check.request = HTTPMSGLOCK(request);
-    check.accessList = cbdataReference(Config.accessList.ssl_bump);
-    /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
     return check.fastCheck() == 1;
 }
 
@@ -1285,10 +1282,9 @@ ClientHttpRequest::doCallouts()
     if (!calloutContext->clientside_tos_done) {
         calloutContext->clientside_tos_done = true;
         if (getConn() != NULL) {
-            ACLChecklist ch;
+            ACLFilledChecklist ch(NULL, request, NULL);
             ch.src_addr = request->client_addr;
             ch.my_addr = request->my_addr;
-            ch.request = HTTPMSGLOCK(request);
             int tos = aclMapTOS(Config.accessList.clientside_tos, &ch);
             if (tos)
                 comm_set_tos(getConn()->fd, tos);
index 0d1cd041c0b11fbc01f9ab495155d6c99da9bb2d..485a0a3cdc908c38532f494413bbb5dbaf3b3531 100644 (file)
@@ -187,7 +187,9 @@ private:
 
 /* client http based routines */
 SQUIDCEXTERN char *clientConstructTraceEcho(ClientHttpRequest *);
-SQUIDCEXTERN ACLChecklist *clientAclChecklistCreate(const acl_access * acl,ClientHttpRequest * http);
+
+class ACLFilledChecklist;
+SQUIDCEXTERN ACLFilledChecklist *clientAclChecklistCreate(const acl_access * acl,ClientHttpRequest * http);
 SQUIDCEXTERN int clientHttpRequestStatus(int fd, ClientHttpRequest const *http);
 SQUIDCEXTERN void clientAccessCheck(ClientHttpRequest *);
 
index 7948822189b75ad88674021bafe3937b26c657a1..afed604bb83686e3e87e73204fe99530981693a5 100644 (file)
 #include "SquidTime.h"
 #include "Store.h"
 #include "fde.h"
-#include "ACLChecklist.h"
-#include "ACL.h"
+#include "acl/FilledChecklist.h"
+#include "acl/Acl.h"
 #if USE_IDENT
-#include "ACLIdent.h"
+#include "acl/Ident.h"
 #endif
 #include "client_side.h"
 #include "HttpRequest.h"
 #include "HttpReply.h"
-#include "authenticate.h"
+#include "auth/Acl.h"
+#include "auth/Gadgets.h"
 #include "helper.h"
 #include "MemBuf.h"
 #include "URLScheme.h"
@@ -71,7 +72,7 @@
 
 typedef struct _external_acl_format external_acl_format;
 
-static char *makeExternalAclKey(ACLChecklist * ch, external_acl_data * acl_data);
+static char *makeExternalAclKey(ACLFilledChecklist * ch, external_acl_data * acl_data);
 static void external_acl_cache_delete(external_acl * def, external_acl_entry * entry);
 static int external_acl_entry_expired(external_acl * def, external_acl_entry * entry);
 static int external_acl_grace_expired(external_acl * def, external_acl_entry * entry);
@@ -677,9 +678,7 @@ ACLExternal::~ACLExternal()
 }
 
 static int
-aclMatchExternal(external_acl_data *acl, ACLChecklist * ch);
-static int
-aclMatchExternal(external_acl_data *acl, ACLChecklist * ch)
+aclMatchExternal(external_acl_data *acl, ACLFilledChecklist *ch)
 {
     int result;
     external_acl_entry *entry;
@@ -705,7 +704,7 @@ aclMatchExternal(external_acl_data *acl, ACLChecklist * ch)
             int ti;
             /* Make sure the user is authenticated */
 
-            if ((ti = ch->authenticated()) != 1) {
+            if ((ti = AuthenticateAcl(ch)) != 1) {
                 debugs(82, 2, "aclMatchExternal: " << acl->def->name << " user not authenticated (" << ti << ")");
                 return ti;
             }
@@ -777,7 +776,7 @@ aclMatchExternal(external_acl_data *acl, ACLChecklist * ch)
 int
 ACLExternal::match(ACLChecklist *checklist)
 {
-    return aclMatchExternal (data, checklist);
+    return aclMatchExternal (data, Filled(checklist));
 }
 
 wordlist *
@@ -811,7 +810,7 @@ external_acl_cache_touch(external_acl * def, external_acl_entry * entry)
 }
 
 static char *
-makeExternalAclKey(ACLChecklist * ch, external_acl_data * acl_data)
+makeExternalAclKey(ACLFilledChecklist * ch, external_acl_data * acl_data)
 {
     static MemBuf mb;
     char buf[256];
@@ -1216,7 +1215,7 @@ externalAclHandleReply(void *data, char *reply)
 }
 
 void
-ACLExternal::ExternalAclLookup(ACLChecklist * ch, ACLExternal * me, EAH * callback, void *callback_data)
+ACLExternal::ExternalAclLookup(ACLChecklist *checklist, ACLExternal * me, EAH * callback, void *callback_data)
 {
     MemBuf buf;
     external_acl_data *acl = me->data;
@@ -1226,11 +1225,12 @@ ACLExternal::ExternalAclLookup(ACLChecklist * ch, ACLExternal * me, EAH * callba
     externalAclState *oldstate = NULL;
     bool graceful = 0;
 
+    ACLFilledChecklist *ch = Filled(checklist);
     if (acl->def->require_auth) {
         int ti;
         /* Make sure the user is authenticated */
 
-        if ((ti = ch->authenticated()) != 1) {
+        if ((ti = AuthenticateAcl(ch)) != 1) {
             debugs(82, 1, "externalAclLookup: " << acl->def->name <<
                    " user authentication failure (" << ti << ", ch=" << ch << ")");
             callback(callback_data, NULL);
@@ -1434,7 +1434,7 @@ ExternalACLLookup::checkForAsync(ACLChecklist *checklist)const
 void
 ExternalACLLookup::LookupDone(void *data, void *result)
 {
-    ACLChecklist *checklist = (ACLChecklist *)data;
+    ACLFilledChecklist *checklist = Filled(static_cast<ACLChecklist*>(data));
     checklist->extacl_entry = cbdataReference((external_acl_entry *)result);
     checklist->asyncInProgress(false);
     checklist->changeState (ACLChecklist::NullState::Instance());
index 6cab0929fb263c4393a57c0c6fa2d5a33bdac39e..95f21431b6a407a1d151a5c81930aeed48d6e710 100644 (file)
@@ -33,8 +33,8 @@
 
 #include "squid.h"
 #include "forward.h"
-#include "ACLChecklist.h"
-#include "ACL.h"
+#include "acl/FilledChecklist.h"
+#include "acl/Gadgets.h"
 #include "CacheManager.h"
 #include "event.h"
 #include "errorpage.h"
@@ -205,12 +205,9 @@ FwdState::fwdStart(int client_fd, StoreEntry *entry, HttpRequest *request)
         /**
          * Check if this host is allowed to fetch MISSES from us (miss_access)
          */
-        ACLChecklist ch;
+        ACLFilledChecklist ch(Config.accessList.miss, request, NULL);
         ch.src_addr = request->client_addr;
         ch.my_addr = request->my_addr;
-        ch.request = HTTPMSGLOCK(request);
-        ch.accessList = cbdataReference(Config.accessList.miss);
-        /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
         int answer = ch.fastCheck();
 
         if (answer == 0) {
@@ -664,7 +661,7 @@ FwdState::initiateSSL()
     // Create the ACL check list now, while we have access to more info.
     // The list is used in ssl_verify_cb() and is freed in ssl_free().
     if (acl_access *acl = Config.ssl_client.cert_error) {
-        ACLChecklist *check = aclChecklistCreate(acl, request, dash_str);
+        ACLFilledChecklist *check = new ACLFilledChecklist(acl, request, dash_str);
         check->fd(fd);
         SSL_set_ex_data(ssl, ssl_ex_index_cert_error_check, check);
     }
@@ -1341,8 +1338,6 @@ aclMapTOS(acl_tos * head, ACLChecklist * ch)
 IpAddress
 getOutgoingAddr(HttpRequest * request, struct peer *dst_peer)
 {
-    ACLChecklist ch;
-
     if (request && request->flags.spoof_client_ip)
         return request->client_addr;
 
@@ -1350,12 +1345,12 @@ getOutgoingAddr(HttpRequest * request, struct peer *dst_peer)
         return IpAddress(); // anything will do.
     }
 
+    ACLFilledChecklist ch(NULL, request, NULL);
     ch.dst_peer = dst_peer;
 
     if (request) {
         ch.src_addr = request->client_addr;
         ch.my_addr = request->my_addr;
-        ch.request = HTTPMSGLOCK(request);
     }
 
     return aclMapAddr(Config.accessList.outgoing_address, &ch);
@@ -1364,12 +1359,11 @@ getOutgoingAddr(HttpRequest * request, struct peer *dst_peer)
 unsigned long
 getOutgoingTOS(HttpRequest * request)
 {
-    ACLChecklist ch;
+    ACLFilledChecklist ch(NULL, request, NULL);
 
     if (request) {
         ch.src_addr = request->client_addr;
         ch.my_addr = request->my_addr;
-        ch.request = HTTPMSGLOCK(request);
     }
 
     return aclMapTOS(Config.accessList.outgoing_tos, &ch);
index fe3bbf7b166579685e7dd37947e6bbf974db9fc0..ee54e9fae8c8b414343c0674475b41b75b6317f1 100644 (file)
@@ -35,8 +35,8 @@
 
 #include "squid.h"
 #include "htcp.h"
-#include "ACLChecklist.h"
-#include "ACL.h"
+#include "acl/FilledChecklist.h"
+#include "acl/Acl.h"
 #include "SquidTime.h"
 #include "Store.h"
 #include "StoreClient.h"
@@ -850,12 +850,9 @@ htcpAccessCheck(acl_access * acl, htcpSpecifier * s, IpAddress &from)
     if (!acl)
         return 0;
 
-    ACLChecklist checklist;
+    ACLFilledChecklist checklist(acl, s->request, NULL);
     checklist.src_addr = from;
     checklist.my_addr.SetNoAddr();
-    checklist.request = HTTPMSGLOCK(s->request);
-    checklist.accessList = cbdataReference(acl);
-    /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
     int result = checklist.fastCheck();
     return result;
 }
index f59de00b26b241556c3fef1f4df1bf25b95d41d4..9f445f4f69cfca0d5b92c49ec30daa89071356fb 100644 (file)
@@ -50,7 +50,7 @@
 #include "HttpHdrContRange.h"
 #include "HttpHdrSc.h"
 #include "HttpHdrScTarget.h"
-#include "ACLChecklist.h"
+#include "acl/FilledChecklist.h"
 #include "fde.h"
 #if DELAY_POOLS
 #include "DelayPools.h"
@@ -1974,13 +1974,8 @@ HttpStateData::doneSendingRequestBody()
     debugs(11,5, HERE << "doneSendingRequestBody: FD " << fd);
 
 #if HTTP_VIOLATIONS
-    ACLChecklist ch;
-    ch.request = HTTPMSGLOCK(request);
-
     if (Config.accessList.brokenPosts) {
-        ch.accessList = cbdataReference(Config.accessList.brokenPosts);
-        /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
-
+               ACLFilledChecklist ch(Config.accessList.brokenPosts, request, NULL);
         if (!ch.fastCheck()) {
             debugs(11, 5, "doneSendingRequestBody: didn't match brokenPosts");
             CommIoCbParams io(NULL);
index ec7d8c7f94238d4732124d8cbede959b9d0261d2..350c8f68f852b318c970d75dc9fa7235f6765753 100644 (file)
@@ -40,8 +40,8 @@
 #include "comm.h"
 #include "ICP.h"
 #include "HttpRequest.h"
-#include "ACLChecklist.h"
-#include "ACL.h"
+#include "acl/FilledChecklist.h"
+#include "acl/Acl.h"
 #include "AccessLogEntry.h"
 #include "wordlist.h"
 #include "SquidTime.h"
@@ -409,12 +409,9 @@ icpAccessAllowed(IpAddress &from, HttpRequest * icp_request)
     if (!Config.accessList.icp)
         return 0;
 
-    ACLChecklist checklist;
+    ACLFilledChecklist checklist(Config.accessList.icp, icp_request, NULL);
     checklist.src_addr = from;
     checklist.my_addr.SetNoAddr();
-    checklist.request = HTTPMSGLOCK(icp_request);
-    checklist.accessList = cbdataReference(Config.accessList.icp);
-    /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
     int result = checklist.fastCheck();
     return result;
 }
index f1f842c366ed6f212b35bab2d2743745c413b192..bfec5cc6e34f626f8a6382bf74f3e76ee63435bc 100644 (file)
@@ -32,7 +32,7 @@
 
 #include "squid.h"
 #include "ProtoPort.h"
-#include "ACLChecklist.h"
+#include "acl/FilledChecklist.h"
 #include "event.h"
 #include "CacheManager.h"
 #include "htcp.h"
@@ -175,18 +175,10 @@ peerAllowedToUse(const peer * p, HttpRequest * request)
     if (p->access == NULL)
         return do_ping;
 
-    ACLChecklist checklist;
-
+    ACLFilledChecklist checklist(p->access, request, NULL);
     checklist.src_addr = request->client_addr;
-
     checklist.my_addr = request->my_addr;
 
-    checklist.request = HTTPMSGLOCK(request);
-
-    checklist.accessList = cbdataReference(p->access);
-
-    /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
-
 #if 0 && USE_IDENT
     /*
      * this is currently broken because 'request->user_ident' has been
index 1a1fb2626f7602766bdfe40d44a19c893a19790b..e46cd49504ebae24177811fc3d325405c8e62868 100644 (file)
@@ -32,7 +32,7 @@
 #include "squid.h"
 #include "comm.h"
 #include "cache_snmp.h"
-#include "ACLChecklist.h"
+#include "acl/FilledChecklist.h"
 #include "ip/IpAddress.h"
 
 #define SNMP_REQUEST_SIZE 4096
@@ -530,11 +530,9 @@ snmpDecodePacket(snmp_request_t * rq)
     /* Check if we have explicit permission to access SNMP data.
      * default (set above) is to deny all */
     if (Community && Config.accessList.snmp) {
-        ACLChecklist checklist;
-        checklist.accessList = cbdataReference(Config.accessList.snmp);
+        ACLFilledChecklist checklist(Config.accessList.snmp, NULL, NULL);
         checklist.src_addr = rq->from;
         checklist.snmp_community = (char *) Community;
-        /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
         allow = checklist.fastCheck();
     }
 
@@ -1136,15 +1134,15 @@ oid2addr(oid * id, IpAddress &addr, u_int size)
 }
 
 /* SNMP checklists */
-#include "ACLStrategy.h"
-#include "ACLStrategised.h"
-#include "ACLStringData.h"
+#include "acl/Strategy.h"
+#include "acl/Strategised.h"
+#include "acl/StringData.h"
 
 class ACLSNMPCommunityStrategy : public ACLStrategy<char const *>
 {
 
 public:
-    virtual int match (ACLData<MatchType> * &, ACLChecklist *);
+    virtual int match (ACLData<MatchType> * &, ACLFilledChecklist *);
     static ACLSNMPCommunityStrategy *Instance();
     /* Not implemented to prevent copies of the instance. */
     /* Not private to prevent brain dead g+++ warnings about
@@ -1170,7 +1168,7 @@ ACL::Prototype ACLSNMPCommunity::RegistryProtoype(&ACLSNMPCommunity::RegistryEnt
 ACLStrategised<char const *> ACLSNMPCommunity::RegistryEntry_(new ACLStringData, ACLSNMPCommunityStrategy::Instance(), "snmp_community");
 
 int
-ACLSNMPCommunityStrategy::match (ACLData<MatchType> * &data, ACLChecklist *checklist)
+ACLSNMPCommunityStrategy::match (ACLData<MatchType> * &data, ACLFilledChecklist *checklist)
 {
     return data->match (checklist->snmp_community);
 }
index 2a824f1e87d449f9ffb913712afff6b797e77f2b..1563ee176c1d8ed27b797c0b42015317e57ea216 100644 (file)
@@ -41,7 +41,7 @@
 #if USE_SSL
 
 #include "fde.h"
-#include "ACLChecklist.h"
+#include "acl/FilledChecklist.h"
 
 /**
  \defgroup ServerProtocolSSLInternal Server-Side SSL Internals
@@ -182,7 +182,7 @@ ssl_verify_cb(int ok, X509_STORE_CTX * ctx)
                 debugs(83, 2, "SQUID_X509_V_ERR_DOMAIN_MISMATCH: Certificate " << buffer << " does not match domainname " << server);
                 ok = 0;
                 if (check)
-                    check->ssl_error = SQUID_X509_V_ERR_DOMAIN_MISMATCH;
+                    Filled(check)->ssl_error = SQUID_X509_V_ERR_DOMAIN_MISMATCH;
             }
         }
     } else {
@@ -216,7 +216,7 @@ ssl_verify_cb(int ok, X509_STORE_CTX * ctx)
         }
 
         if (check)
-            check->ssl_error = ctx->error;
+            Filled(check)->ssl_error = ctx->error;
     }
 
     if (!ok && check) {
index d2937c44f4bb74045543b120eb886fa4f6448451..5b6635fc4635b249e5646e2b664d34da2cc3abe7 100644 (file)
@@ -39,7 +39,7 @@
 #include "fde.h"
 #include "comm.h"
 #include "client_side_request.h"
-#include "ACLChecklist.h"
+#include "acl/FilledChecklist.h"
 #if DELAY_POOLS
 #include "DelayId.h"
 #endif
@@ -618,12 +618,9 @@ tunnelStart(ClientHttpRequest * http, int64_t * size_ptr, int *status_ptr)
          * Check if this host is allowed to fetch MISSES from us (miss_access)
          * default is to allow.
          */
-        ACLChecklist ch;
+        ACLFilledChecklist ch(Config.accessList.miss, request, NULL);
         ch.src_addr = request->client_addr;
         ch.my_addr = request->my_addr;
-        ch.request = HTTPMSGLOCK(request);
-        ch.accessList = cbdataReference(Config.accessList.miss);
-        /* cbdataReferenceDone() happens in either fastCheck() or ~ACLCheckList */
         answer = ch.fastCheck();
 
         if (answer == 0) {