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 
23 ACLEui64::ACLEui64 (char const *theClass) : class_ (theClass)
24 {}
25 
26 char const *
28 {
29  return class_;
30 }
31 
32 bool
34 {
35  return eui64Data.empty();
36 }
37 
38 static Eui::Eui64 *
39 aclParseEuiData(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 /*******************/
65 void
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 
76 int
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 
#define DBG_CRITICAL
Definition: Stream.h:37
Ip::Address src_addr
static char * strtokFile()
Definition: ConfigParser.cc:65
std::list< SBuf > SBufList
Definition: forward.h:22
Definition: SBuf.h:93
int match(ACLChecklist *checklist) override
Matches the actual data in checklist against this Acl::Node.
Definition: Eui64.cc:77
const char * typeString() const override
Definition: Eui64.cc:27
void parse() override
parses node representation in squid.conf; dies on failures
Definition: Eui64.cc:66
static Eui::Eui64 * aclParseEuiData(const char *t)
Definition: Eui64.cc:39
ACLFilledChecklist * Filled(ACLChecklist *checklist)
convenience and safety wrapper for dynamic_cast<ACLFilledChecklist*>
bool isIPv6() const
Definition: Address.cc:184
bool decode(const char *asc)
Definition: Eui64.cc:22
const char * cfg_filename
Definition: cache_cf.cc:270
bool empty() const override
Definition: Eui64.cc:33
int config_lineno
Definition: cache_cf.cc:271
SBufList dump() const override
Definition: Eui64.cc:99
ACLEui64(char const *)
Definition: Eui64.cc:23
char config_input_line[BUFSIZ]
Definition: cache_cf.cc:272
#define debugs(SECTION, LEVEL, CONTENT)
Definition: Stream.h:192
const char * class_
Definition: Eui64.h:34
Eui64Data_t eui64Data
Definition: Eui64.h:33
bool lookup(const Ip::Address &c)
Definition: Eui64.cc:47

 

Introduction

Documentation

Support

Miscellaneous