]> git.ipfire.org Git - thirdparty/squid.git/blame - src/acl/SourceDomain.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / acl / SourceDomain.cc
CommitLineData
3841dd46 1/*
4ac4a490 2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
3841dd46 3 *
bbc27441
AJ
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.
3841dd46 7 */
8
bbc27441
AJ
9/* DEBUG: section 28 Access Control */
10
582c2af2 11#include "squid.h"
c0941a6a 12#include "acl/Checklist.h"
c0941a6a 13#include "acl/DomainData.h"
602d9612
A
14#include "acl/RegexData.h"
15#include "acl/SourceDomain.h"
95e6d864 16#include "fqdncache.h"
3ff65596 17#include "HttpRequest.h"
3841dd46 18
3841dd46 19SourceDomainLookup SourceDomainLookup::instance_;
20
21SourceDomainLookup *
22SourceDomainLookup::Instance()
23{
24 return &instance_;
25}
26
27void
077fe581 28SourceDomainLookup::checkForAsync(ACLChecklist *checklist) const
3841dd46 29{
c0941a6a 30 fqdncache_nbgethostbyaddr(Filled(checklist)->src_addr, LookupDone, checklist);
3841dd46 31}
32
33void
4a3b98d7 34SourceDomainLookup::LookupDone(const char *, const Dns::LookupDetails &details, void *data)
3841dd46 35{
3ff65596 36 ACLFilledChecklist *checklist = Filled((ACLChecklist*)data);
3ff65596
AR
37 checklist->markSourceDomainChecked();
38 checklist->request->recordLookup(details);
6f58d7d7 39 checklist->resumeNonBlockingCheck(SourceDomainLookup::Instance());
3841dd46 40}
41
5dee515e 42int
33810b1d 43ACLSourceDomainStrategy::match (ACLData<MatchType> * &data, ACLFilledChecklist *checklist, ACLFlags &)
3841dd46 44{
5dee515e 45 const char *fqdn = NULL;
46 fqdn = fqdncache_gethostbyaddr(checklist->src_addr, FQDN_LOOKUP_IF_MISS);
62e76326 47
5dee515e 48 if (fqdn) {
62e76326 49 return data->match(fqdn);
5dee515e 50 } else if (!checklist->sourceDomainChecked()) {
7660b45d 51 /* FIXME: Using AclMatchedName here is not OO correct. Should find a way to the current acl */
cc192b50 52 debugs(28, 3, "aclMatchAcl: Can't yet compare '" << AclMatchedName << "' ACL for '" << checklist->src_addr << "'");
6f58d7d7
AR
53 if (checklist->goAsync(SourceDomainLookup::Instance()))
54 return -1;
55 // else fall through to "none" match, hiding the lookup failure (XXX)
5dee515e 56 }
62e76326 57
5dee515e 58 return data->match("none");
3841dd46 59}
5dee515e 60
61ACLSourceDomainStrategy *
62ACLSourceDomainStrategy::Instance()
63{
64 return &Instance_;
65}
66
67ACLSourceDomainStrategy ACLSourceDomainStrategy::Instance_;
f53969cc 68