@@ -173,6 +173,31 @@ def check_embargo(self, url, ts):
173173 actual = datetime .now (timezone .utc ) - older
174174 return access if actual > dt else None
175175
176+ def check_date_access (
177+ self , ts , access , default_access , rule
178+ ):
179+ """Return access based on date fields in access rule
180+
181+ If a date-based rule exists and condition is not met, return default rule
182+ If no date-based rule exists, return access
183+ """
184+ if not rule :
185+ return access
186+
187+ dt = timestamp_to_datetime (ts , tz_aware = True )
188+
189+ before_ts = rule .get ('before' )
190+ if before_ts :
191+ before = timestamp_to_datetime (before_ts , tz_aware = True )
192+ return access if dt < before else default_access
193+
194+ after_ts = rule .get ('after' )
195+ if after_ts :
196+ after = timestamp_to_datetime (after_ts , tz_aware = True )
197+ return access if dt > after else default_access
198+
199+ return access
200+
176201 def create_access_aggregator (self , source_files ):
177202 """Creates a new AccessRulesAggregator using the supplied list
178203 of access control file names
@@ -300,10 +325,7 @@ def wrap_iter(self, cdx_iter, acl_user):
300325 :param str acl_user: The user associated with this request (optional)
301326 :return: The wrapped cdx object iterator
302327 """
303- last_rule = None
304- last_url = None
305- last_user = None
306- rule = None
328+ default_access = self .default_rule ['access' ]
307329
308330 for cdx in cdx_iter :
309331 url = cdx .get ('url' )
@@ -314,16 +336,17 @@ def wrap_iter(self, cdx_iter, acl_user):
314336 yield cdx
315337 continue
316338
339+ rule = None
317340 access = None
341+
318342 if self .aggregator :
319- # TODO: optimization until date range support is included
320- if url == last_url and acl_user == last_user :
321- rule = last_rule
322- else :
323- rule = self .find_access_rule (url , timestamp ,
324- cdx .get ('urlkey' ),
325- cdx .get ('source-coll' ),
326- acl_user )
343+ rule = self .find_access_rule (
344+ url ,
345+ timestamp ,
346+ cdx .get ('urlkey' ),
347+ cdx .get ('source-coll' ),
348+ acl_user
349+ )
327350
328351 access = rule .get ('access' , 'exclude' )
329352
@@ -332,18 +355,20 @@ def wrap_iter(self, cdx_iter, acl_user):
332355 if embargo_access and embargo_access != 'allow' :
333356 access = embargo_access
334357
358+ # Allow more specific rules to override embargoes
359+ if access != 'exclude' :
360+ access = self .check_date_access (
361+ timestamp , access , default_access , rule
362+ )
363+
335364 if access == 'exclude' :
336365 continue
337366
338367 if not access :
339- access = self . default_rule [ 'access' ]
368+ access = default_access
340369
341370 if access == 'allow_ignore_embargo' :
342371 access = 'allow'
343372
344373 cdx ['access' ] = access
345374 yield cdx
346-
347- last_rule = rule
348- last_url = url
349- last_user = acl_user
0 commit comments