/*
- * $Id: ACLDestinationDomain.cc,v 1.10 2005/05/08 06:53:58 hno Exp $
+ * $Id: ACLDestinationDomain.cc,v 1.11 2005/05/09 01:41:25 hno Exp $
*
* DEBUG: section 28 Access Control
* AUTHOR: Duane Wessels
#include "squid.h"
#include "ACLDestinationDomain.h"
-#include "authenticate.h"
#include "ACLChecklist.h"
#include "ACLRegexData.h"
#include "ACLDomainData.h"
#include "HttpRequest.h"
-ACLDestinationDomain::~ACLDestinationDomain()
-{
- delete data;
-}
-
-ACLDestinationDomain::ACLDestinationDomain(ACLData<char const *> *newData, char const *theType) : data (newData), type_(theType) {}
-
-ACLDestinationDomain::ACLDestinationDomain (ACLDestinationDomain const &old) : data (old.data->clone()), type_(old.type_)
-{}
+DestinationDomainLookup DestinationDomainLookup::instance_;
-ACLDestinationDomain &
-ACLDestinationDomain::operator= (ACLDestinationDomain const &rhs)
+DestinationDomainLookup *
+DestinationDomainLookup::Instance()
{
- data = rhs.data->clone();
- type_ = rhs.type_;
- return *this;
+ return &instance_;
}
-char const *
-ACLDestinationDomain::typeString() const
+void
+DestinationDomainLookup::checkForAsync(ACLChecklist *checklist)const
{
- return type_;
+ checklist->asyncInProgress(true);
+ fqdncache_nbgethostbyaddr(checklist->src_addr, LookupDone, checklist);
}
void
-ACLDestinationDomain::parse()
+DestinationDomainLookup::LookupDone(const char *fqdn, void *data)
{
- data->parse();
+ ACLChecklist *checklist = (ACLChecklist *)data;
+ assert (checklist->asyncState() == DestinationDomainLookup::Instance());
+
+ checklist->asyncInProgress(false);
+ checklist->changeState (ACLChecklist::NullState::Instance());
+ checklist->markDestinationDomainChecked();
+ checklist->check();
}
+ACL::Prototype ACLDestinationDomain::LiteralRegistryProtoype(&ACLDestinationDomain::LiteralRegistryEntry_, "dstdomain");
+ACLStrategised<char const *> ACLDestinationDomain::LiteralRegistryEntry_(new ACLDomainData, ACLDestinationDomainStrategy::Instance(), "dstdomain");
+ACL::Prototype ACLDestinationDomain::RegexRegistryProtoype(&ACLDestinationDomain::RegexRegistryEntry_, "dstdom_regex");
+ACLStrategised<char const *> ACLDestinationDomain::RegexRegistryEntry_(new ACLRegexData,ACLDestinationDomainStrategy::Instance() ,"dstdom_regex");
+
int
-ACLDestinationDomain::match(ACLChecklist *checklist)
+ACLDestinationDomainStrategy::match (ACLData<MatchType> * &data, ACLChecklist *checklist)
{
const ipcache_addrs *ia = NULL;
+ if (data->match(checklist->request->host))
+ return 1;
+
if ((ia = ipcacheCheckNumeric(checklist->request->host)) == NULL)
- return data->match(checklist->request->host);
+ return 0;
const char *fqdn = NULL;
fqdn = fqdncache_gethostbyaddr(ia->in_addrs[0], FQDN_LOOKUP_IF_MISS);
- if (fqdn)
+ if (fqdn) {
return data->match(fqdn);
-
- if (!checklist->destinationDomainChecked()) {
+ } else if (!checklist->destinationDomainChecked()) {
+ /* FIXME: Using AclMatchedName here is not OO correct. Should find a way to the current acl */
debug(28, 3) ("aclMatchAcl: Can't yet compare '%s' ACL for '%s'\n",
- name, inet_ntoa(ia->in_addrs[0]));
+ AclMatchedName, checklist->request->host);
checklist->changeState(DestinationDomainLookup::Instance());
return 0;
}
return data->match("none");
}
-wordlist *
-ACLDestinationDomain::dump() const
-{
- return data->dump();
-}
-
-bool
-ACLDestinationDomain::empty () const
+ACLDestinationDomainStrategy *
+ACLDestinationDomainStrategy::Instance()
{
- return data->empty();
+ return &Instance_;
}
-DestinationDomainLookup DestinationDomainLookup::instance_;
-
-DestinationDomainLookup *
-DestinationDomainLookup::Instance()
-{
- return &instance_;
-}
-
-void
-DestinationDomainLookup::checkForAsync(ACLChecklist *checklist)const
-{
-
- ipcache_addrs *ia;
- ia = ipcacheCheckNumeric(checklist->request->host);
-
- if (ia == NULL) {
- /* Make fatal? XXX this is checked during match() */
- checklist->markDestinationDomainChecked();
- checklist->changeState (ACLChecklist::NullState::Instance());
- } else {
- checklist->asyncInProgress(true);
- checklist->dst_addr = ia->in_addrs[0];
- fqdncache_nbgethostbyaddr(checklist->dst_addr,
- LookupDone, checklist);
- }
-}
-
-void
-DestinationDomainLookup::LookupDone(const char *fqdn, void *data)
-{
- ACLChecklist *checklist = (ACLChecklist *)data;
- assert (checklist->asyncState() == DestinationDomainLookup::Instance());
-
- checklist->asyncInProgress(false);
- checklist->changeState (ACLChecklist::NullState::Instance());
- checklist->markDestinationDomainChecked();
- checklist->check();
-}
-
-ACL::Prototype ACLDestinationDomain::LiteralRegistryProtoype(&ACLDestinationDomain::LiteralRegistryEntry_, "dstdomain");
-ACL::Prototype ACLDestinationDomain::LegacyRegistryProtoype(&ACLDestinationDomain::LiteralRegistryEntry_, "domain");
-ACLDestinationDomain ACLDestinationDomain::LiteralRegistryEntry_(new ACLDomainData, "dstdomain");
-ACL::Prototype ACLDestinationDomain::RegexRegistryProtoype(&ACLDestinationDomain::RegexRegistryEntry_, "dstdom_regex");
-ACLDestinationDomain ACLDestinationDomain::RegexRegistryEntry_(new ACLRegexData, "dstdom_regex");
-
-ACL *
-ACLDestinationDomain::clone() const
-{
- return new ACLDestinationDomain(*this);
-}
+ACLDestinationDomainStrategy ACLDestinationDomainStrategy::Instance_;
/*
- * $Id: ACLDestinationDomain.h,v 1.7 2005/05/06 01:57:55 hno Exp $
+ * $Id: ACLDestinationDomain.h,v 1.8 2005/05/09 01:41:25 hno Exp $
*
*
* SQUID Web Proxy Cache http://www.squid-cache.org/
* Copyright (c) 2003, Robert Collins <robertc@squid-cache.org>
*/
-#ifndef SQUID_ACLDESTINATIONDOMAIN_H
-#define SQUID_ACLDESTINATIONDOMAIN_H
+#ifndef SQUID_ACLSOURCEDOMAIN_H
+#define SQUID_ACLSOURCEDOMAIN_H
#include "ACL.h"
#include "ACLData.h"
#include "ACLChecklist.h"
+#include "ACLStrategised.h"
+
+class ACLDestinationDomainStrategy : public ACLStrategy<char const *>
+{
+
+public:
+ virtual int match (ACLData<MatchType> * &, ACLChecklist *);
+ static ACLDestinationDomainStrategy *Instance();
+ /* Not implemented to prevent copies of the instance. */
+ /* Not private to prevent brain dead g+++ warnings about
+ * private constructors with no friends */
+ ACLDestinationDomainStrategy(ACLDestinationDomainStrategy const &);
+
+private:
+ static ACLDestinationDomainStrategy Instance_;
+ ACLDestinationDomainStrategy(){}
+
+ ACLDestinationDomainStrategy&operator=(ACLDestinationDomainStrategy const &);
+};
class DestinationDomainLookup : public ACLChecklist::AsyncState
{
static void LookupDone(const char *, void *);
};
-class ACLDestinationDomain : public ACL
+class ACLDestinationDomain
{
-public:
- MEMPROXY_CLASS(ACLDestinationDomain);
-
- ~ACLDestinationDomain();
- ACLDestinationDomain(ACLData<char const *> *, char const *);
- ACLDestinationDomain (ACLDestinationDomain const &);
- ACLDestinationDomain &operator= (ACLDestinationDomain const &);
-
- virtual char const *typeString() const;
- virtual void parse();
- virtual int match(ACLChecklist *checklist);
- virtual wordlist *dump() const;
- virtual bool empty () const;
- virtual bool requiresRequest() const {return true;}
-
- virtual ACL *clone()const;
-
private:
- static Prototype LiteralRegistryProtoype;
- static Prototype LegacyRegistryProtoype;
- static ACLDestinationDomain LiteralRegistryEntry_;
- static Prototype RegexRegistryProtoype;
- static ACLDestinationDomain RegexRegistryEntry_;
- ACLData<char const *> *data;
- char const *type_;
+ static ACL::Prototype LiteralRegistryProtoype;
+ static ACLStrategised<char const *> LiteralRegistryEntry_;
+ static ACL::Prototype RegexRegistryProtoype;
+ static ACLStrategised<char const *> RegexRegistryEntry_;
};
-MEMPROXY_CLASS_INLINE(ACLDestinationDomain)
-
-#endif /* SQUID_ACLDESTINATIONDOMAIN_H */
+#endif /* SQUID_ACLSOURCEDOMAIN_H */