]> git.ipfire.org Git - thirdparty/squid.git/blame - src/acl/TimeData.cc
Boilerplate: update copyright blurbs on src/
[thirdparty/squid.git] / src / acl / TimeData.cc
CommitLineData
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 18ACLTimeData::ACLTimeData () : weekbits (0), start (0), stop (0), next (NULL) {}
62e76326 19
20ACLTimeData::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
26ACLTimeData&
27ACLTimeData::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
40ACLTimeData::~ACLTimeData()
41{
42 if (next)
00d77d6b 43 delete next;
62e76326 44}
5dee515e 45
46bool
47ACLTimeData::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 76SBufList
4f8ca96e 77ACLTimeData::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
100void
101ACLTimeData::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 224bool
225ACLTimeData::empty() const
226{
227 return false;
228}
5dee515e 229
230ACLData<time_t> *
231ACLTimeData::clone() const
232{
233 return new ACLTimeData(*this);
234}