From c5bf1c88b9cb072f7d00df6f3ded9280b5b85f56 Mon Sep 17 00:00:00 2001 From: Dan Scott Date: Mon, 8 Oct 2012 11:25:41 -0400 Subject: [PATCH] TPAC: Invalid due dates cause 500 server error CStore appears to return dates with leading 0s (such as '0212-10-08 23:59:59-05:17:32') with the leading 0s stripped off, resulting in cases with 1-digit or 3-digit years for which DateTime::Format::ISO8601 returns an error. We can protect against this problem by adding some defensive code to the TPAC utility method to add the 0s back to the start of the year. We can also log the problem when it occurs so that administrators can fix the problem dates in the database. Signed-off-by: Dan Scott Signed-off-by: Lebbeous Fogle-Weekley --- .../src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm index 5f27425c27..54ad3ff74f 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm @@ -167,7 +167,22 @@ sub init_ro_object_cache { # turns an ISO date into something TT can understand $ro_object_subs->{parse_datetime} = sub { my $date = shift; - $date = DateTime::Format::ISO8601->new->parse_datetime(cleanse_ISO8601($date)); + + # Probably an accidental entry like '0212' instead of '2012', + # but 1) the leading 0 gets stripped in CStoreEditor and + # 2) DateTime::Format::ISO8601 returns an error as years + # must be 2 or 4 digits + if ($date =~ m/^\d{3}-/) { + $logger->warn("Invalid date had a 3-digit year: $date"); + $date = '0' . $date; + } elsif ($date =~ m/^\d{1}-/) { + $logger->warn("Invalid date had a 1-digit year: $date"); + $date = '000' . $date; + } + + my $cleansed_date = cleanse_ISO8601($date); + + $date = DateTime::Format::ISO8601->new->parse_datetime($cleansed_date); return sprintf( "%0.2d:%0.2d:%0.2d %0.2d-%0.2d-%0.4d", $date->hour, -- 2.11.0