Squid Web Cache master
Loading...
Searching...
No Matches
Eui64.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/* DEBUG: section 28 Access Control */
10
11#include "squid.h"
12
13#if USE_SQUID_EUI
14
15#include "acl/Eui64.h"
16#include "acl/FilledChecklist.h"
17#include "cache_cf.h"
18#include "debug/Stream.h"
19#include "eui/Eui64.h"
20#include "globals.h"
21#include "ip/Address.h"
22
23ACLEui64::ACLEui64 (char const *theClass) : class_ (theClass)
24{}
25
26char const *
28{
29 return class_;
30}
31
32bool
34{
35 return eui64Data.empty();
36}
37
38static Eui::Eui64 *
39aclParseEuiData(const char *t)
40{
41 char buf[256];
42 Eui::Eui64 *q = new Eui::Eui64;
43 debugs(28, 5, "aclParseEuiData: " << t);
44
45 int n = 0;
46 if (sscanf(t, "%255[0-9a-fA-F:]%n", buf, &n) != 1 || t[n] != '\0') {
47 debugs(28, DBG_CRITICAL, "ERROR: aclParseEuiData: Bad EUI-64 address: '" << t << "'");
48 delete q;
49 return nullptr;
50 }
51
52 if (!q->decode(buf)) {
53 debugs(28, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line);
54 debugs(28, DBG_CRITICAL, "ERROR: aclParseEuiData: Ignoring invalid EUI-64 acl entry: cannot parse '" << buf << "'");
55 delete q;
56 return nullptr;
57 }
58
59 return q;
60}
61
62/*******************/
63/* aclParseEuiList */
64/*******************/
65void
67{
68 while (const char * t = ConfigParser::strtokFile()) {
69 if (Eui::Eui64 * q = aclParseEuiData(t)) {
70 eui64Data.insert(*q);
71 delete q;
72 }
73 }
74}
75
76int
78{
79 ACLFilledChecklist *checklist = Filled(cl);
80
81 /* IPv4 does not do EUI-64 (yet) */
82 if (!checklist->src_addr.isIPv6()) {
83 debugs(14, 3, "ACLEui64::match: IPv6 Required for EUI-64 Lookups. Skipping " << checklist->src_addr );
84 return 0;
85 }
86
87 Eui::Eui64 lookingFor;
88 if (lookingFor.lookup(checklist->src_addr)) {
89 bool found = (eui64Data.find(lookingFor) != eui64Data.end());
90 debugs(28, 3, checklist->src_addr << "' " << (found ? "found" : "NOT found"));
91 return found;
92 }
93
94 debugs(28, 3, checklist->src_addr << " NOT found");
95 return 0;
96}
97
100{
101 SBufList sl;
102 for (auto i = eui64Data.begin(); i != eui64Data.end(); ++i) {
103 static char buf[48];
104 i->encode(buf,48);
105 sl.push_back(SBuf(buf));
106 }
107 return sl;
108}
109
110#endif /* USE_SQUID_EUI */
111
ACLFilledChecklist * Filled(ACLChecklist *checklist)
convenience and safety wrapper for dynamic_cast<ACLFilledChecklist*>
static Eui::Eui64 * aclParseEuiData(const char *t)
Definition Eui64.cc:39
char config_input_line[BUFSIZ]
Definition cache_cf.cc:272
const char * cfg_filename
Definition cache_cf.cc:270
int config_lineno
Definition cache_cf.cc:271
char const * typeString() const override
Definition Eui64.cc:27
bool empty() const override
Definition Eui64.cc:33
int match(ACLChecklist *checklist) override
Matches the actual data in checklist against this Acl::Node.
Definition Eui64.cc:77
void parse() override
parses node representation in squid.conf; dies on failures
Definition Eui64.cc:66
Eui64Data_t eui64Data
Definition Eui64.h:33
SBufList dump() const override
Definition Eui64.cc:99
ACLEui64(char const *)
Definition Eui64.cc:23
char const * class_
Definition Eui64.h:34
static char * strtokFile()
bool decode(const char *asc)
Definition Eui64.cc:22
bool lookup(const Ip::Address &c)
Definition Eui64.cc:47
bool isIPv6() const
Definition Address.cc:184
Definition SBuf.h:94
#define debugs(SECTION, LEVEL, CONTENT)
Definition Stream.h:192
#define DBG_CRITICAL
Definition Stream.h:37
std::list< SBuf > SBufList
Definition forward.h:23