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