]>
Commit | Line | Data |
---|---|---|
5dee515e | 1 | /* |
4ac4a490 | 2 | * Copyright (C) 1996-2017 The Squid Software Foundation and contributors |
5dee515e | 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. | |
5dee515e | 7 | */ |
8 | ||
bbc27441 AJ |
9 | /* DEBUG: section 28 Access Control */ |
10 | ||
582c2af2 | 11 | #include "squid.h" |
3ad63615 | 12 | #include "acl/Checklist.h" |
602d9612 | 13 | #include "acl/TimeData.h" |
8a01b99e | 14 | #include "cache_cf.h" |
16c5ad96 | 15 | #include "ConfigParser.h" |
582c2af2 | 16 | #include "Debug.h" |
d295d770 | 17 | #include "wordlist.h" |
5dee515e | 18 | |
5dee515e | 19 | ACLTimeData::ACLTimeData () : weekbits (0), start (0), stop (0), next (NULL) {} |
62e76326 | 20 | |
21 | ACLTimeData::ACLTimeData(ACLTimeData const &old) : weekbits(old.weekbits), start (old.start), stop (old.stop), next (NULL) | |
5dee515e | 22 | { |
23 | if (old.next) | |
62e76326 | 24 | next = (ACLTimeData *)old.next->clone(); |
5dee515e | 25 | } |
26 | ||
27 | ACLTimeData& | |
28 | ACLTimeData::operator=(ACLTimeData const &old) | |
29 | { | |
30 | weekbits = old.weekbits; | |
31 | start = old.start; | |
32 | stop = old.stop; | |
33 | next = NULL; | |
62e76326 | 34 | |
5dee515e | 35 | if (old.next) |
62e76326 | 36 | next = (ACLTimeData *)old.next->clone(); |
37 | ||
5dee515e | 38 | return *this; |
39 | } | |
40 | ||
41 | ACLTimeData::~ACLTimeData() | |
42 | { | |
43 | if (next) | |
00d77d6b | 44 | delete next; |
62e76326 | 45 | } |
5dee515e | 46 | |
47 | bool | |
48 | ACLTimeData::match(time_t when) | |
49 | { | |
50 | static time_t last_when = 0; | |
62e76326 | 51 | |
5dee515e | 52 | static struct tm tm; |
53 | time_t t; | |
62e76326 | 54 | |
5dee515e | 55 | if (when != last_when) { |
62e76326 | 56 | last_when = when; |
41d00cd3 | 57 | memcpy(&tm, localtime(&when), sizeof(struct tm)); |
5dee515e | 58 | } |
62e76326 | 59 | |
5dee515e | 60 | t = (time_t) (tm.tm_hour * 60 + tm.tm_min); |
61 | ACLTimeData *data = this; | |
62e76326 | 62 | |
5dee515e | 63 | while (data) { |
4a7a3d56 | 64 | debugs(28, 3, "aclMatchTime: checking " << t << " in " << |
65 | data->start << "-" << data->stop << ", weekbits=" << | |
bf8fe701 | 66 | std::hex << data->weekbits); |
5dee515e | 67 | |
62e76326 | 68 | if (t >= data->start && t <= data->stop && (data->weekbits & (1 << tm.tm_wday))) |
69 | return 1; | |
70 | ||
71 | data = data->next; | |
5dee515e | 72 | } |
62e76326 | 73 | |
5dee515e | 74 | return 0; |
75 | } | |
76 | ||
8966008b | 77 | SBufList |
4f8ca96e | 78 | ACLTimeData::dump() const |
5dee515e | 79 | { |
8966008b | 80 | SBufList sl; |
4f8ca96e | 81 | const ACLTimeData *t = this; |
62e76326 | 82 | |
5dee515e | 83 | while (t != NULL) { |
8966008b FC |
84 | SBuf s; |
85 | s.Printf("%c%c%c%c%c%c%c %02d:%02d-%02d:%02d", | |
62e76326 | 86 | t->weekbits & ACL_SUNDAY ? 'S' : '-', |
87 | t->weekbits & ACL_MONDAY ? 'M' : '-', | |
88 | t->weekbits & ACL_TUESDAY ? 'T' : '-', | |
89 | t->weekbits & ACL_WEDNESDAY ? 'W' : '-', | |
90 | t->weekbits & ACL_THURSDAY ? 'H' : '-', | |
91 | t->weekbits & ACL_FRIDAY ? 'F' : '-', | |
92 | t->weekbits & ACL_SATURDAY ? 'A' : '-', | |
93 | t->start / 60, t->start % 60, t->stop / 60, t->stop % 60); | |
8966008b | 94 | sl.push_back(s); |
62e76326 | 95 | t = t->next; |
5dee515e | 96 | } |
62e76326 | 97 | |
8966008b | 98 | return sl; |
5dee515e | 99 | } |
100 | ||
101 | void | |
102 | ACLTimeData::parse() | |
103 | { | |
104 | ACLTimeData **Tail; | |
3c98d5a8 | 105 | long parsed_weekbits = 0; |
62e76326 | 106 | |
3d0ac046 | 107 | for (Tail = &next; *Tail; Tail = &((*Tail)->next)); |
5dee515e | 108 | ACLTimeData *q = NULL; |
62e76326 | 109 | |
5dee515e | 110 | int h1, m1, h2, m2; |
62e76326 | 111 | |
16c5ad96 | 112 | while (char *t = ConfigParser::strtokFile()) { |
62e76326 | 113 | if (*t < '0' || *t > '9') { |
114 | /* assume its day-of-week spec */ | |
115 | ||
116 | while (*t) { | |
117 | switch (*t++) { | |
118 | ||
119 | case 'S': | |
3c98d5a8 | 120 | parsed_weekbits |= ACL_SUNDAY; |
62e76326 | 121 | break; |
122 | ||
123 | case 'M': | |
3c98d5a8 | 124 | parsed_weekbits |= ACL_MONDAY; |
62e76326 | 125 | break; |
126 | ||
127 | case 'T': | |
3c98d5a8 | 128 | parsed_weekbits |= ACL_TUESDAY; |
62e76326 | 129 | break; |
130 | ||
131 | case 'W': | |
3c98d5a8 | 132 | parsed_weekbits |= ACL_WEDNESDAY; |
62e76326 | 133 | break; |
134 | ||
135 | case 'H': | |
3c98d5a8 | 136 | parsed_weekbits |= ACL_THURSDAY; |
62e76326 | 137 | break; |
138 | ||
139 | case 'F': | |
3c98d5a8 | 140 | parsed_weekbits |= ACL_FRIDAY; |
62e76326 | 141 | break; |
142 | ||
143 | case 'A': | |
3c98d5a8 | 144 | parsed_weekbits |= ACL_SATURDAY; |
62e76326 | 145 | break; |
146 | ||
147 | case 'D': | |
3c98d5a8 | 148 | parsed_weekbits |= ACL_WEEKDAYS; |
62e76326 | 149 | break; |
150 | ||
151 | case '-': | |
152 | /* ignore placeholder */ | |
153 | break; | |
154 | ||
155 | default: | |
fa84c01d | 156 | debugs(28, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << |
bf8fe701 | 157 | ": " << config_input_line); |
fa84c01d | 158 | debugs(28, DBG_CRITICAL, "aclParseTimeSpec: Bad Day '" << *t << "'" ); |
62e76326 | 159 | break; |
160 | } | |
161 | } | |
162 | } else { | |
163 | /* assume its time-of-day spec */ | |
164 | ||
6494b68a | 165 | if ((sscanf(t, "%d:%d-%d:%d", &h1, &m1, &h2, &m2) < 4) || (!((h1 >= 0 && h1 < 24) && ((h2 >= 0 && h2 < 24) || (h2 == 24 && m2 == 0)) && (m1 >= 0 && m1 < 60) && (m2 >= 0 && m2 < 60)))) { |
fa84c01d | 166 | debugs(28, DBG_CRITICAL, "aclParseTimeSpec: Bad time range '" << t << "'"); |
4b0f5de8 | 167 | self_destruct(); |
62e76326 | 168 | |
169 | if (q != this) | |
00d77d6b | 170 | delete q; |
62e76326 | 171 | |
172 | return; | |
173 | } | |
174 | ||
3c98d5a8 | 175 | if ((parsed_weekbits == 0) && (start == 0) && (stop == 0)) |
3f7580f9 | 176 | q = this; |
177 | else | |
178 | q = new ACLTimeData; | |
179 | ||
62e76326 | 180 | q->start = h1 * 60 + m1; |
3f7580f9 | 181 | |
62e76326 | 182 | q->stop = h2 * 60 + m2; |
183 | ||
3c98d5a8 | 184 | q->weekbits = parsed_weekbits; |
3f7580f9 | 185 | |
3c98d5a8 | 186 | parsed_weekbits = 0; |
3f7580f9 | 187 | |
62e76326 | 188 | if (q->start > q->stop) { |
fa84c01d | 189 | debugs(28, DBG_CRITICAL, "aclParseTimeSpec: Reversed time range"); |
4b0f5de8 | 190 | self_destruct(); |
62e76326 | 191 | |
192 | if (q != this) | |
00d77d6b | 193 | delete q; |
62e76326 | 194 | |
195 | return; | |
196 | } | |
3f7580f9 | 197 | |
198 | if (q->weekbits == 0) | |
199 | q->weekbits = ACL_ALLWEEK; | |
200 | ||
201 | if (q != this) { | |
202 | *(Tail) = q; | |
203 | Tail = &q->next; | |
204 | } | |
62e76326 | 205 | } |
5dee515e | 206 | } |
62e76326 | 207 | |
3c98d5a8 | 208 | if (parsed_weekbits) { |
3f7580f9 | 209 | |
3c98d5a8 | 210 | q = new ACLTimeData; |
3f7580f9 | 211 | |
212 | q->start = 0 * 60 + 0; | |
62e76326 | 213 | |
3f7580f9 | 214 | q->stop = 24 * 60 + 0; |
62e76326 | 215 | |
3c98d5a8 | 216 | q->weekbits = parsed_weekbits; |
3f7580f9 | 217 | |
3c98d5a8 FC |
218 | *(Tail) = q; |
219 | Tail = &q->next; | |
3f7580f9 | 220 | } |
5dee515e | 221 | } |
222 | ||
65092baf | 223 | bool |
224 | ACLTimeData::empty() const | |
225 | { | |
226 | return false; | |
227 | } | |
5dee515e | 228 | |
229 | ACLData<time_t> * | |
230 | ACLTimeData::clone() const | |
231 | { | |
232 | return new ACLTimeData(*this); | |
233 | } | |
f53969cc | 234 |