package CGI::Untaint::date; $VERSION = '1.00'; use strict; use base 'CGI::Untaint::printable'; use Date::Manip; use Date::Simple; sub is_valid { my $self = shift; local $SIG{__WARN__} = sub {}; local *Date::Manip::Date_TimeZone = sub { 'GMT' }; Date_Init(sprintf 'DateFormat=%s' => $self->date_format); my $date = ParseDate($self->value) or return; my @date = unpack "A4A2A2", $date; my $ds = eval { Date::Simple->new(@date) } or return; $self->value($ds); return $ds; } sub date_format { 'UK' } =head1 NAME CGI::Untaint::date - validate a date =head1 SYNOPSIS use CGI::Untaint; my $handler = CGI::Untaint->new($q->Vars); my $date = $handler->extract(-as_date => 'date'); =head1 DESCRIPTION =head2 is_valid This Input Handler verifies that it is dealing with a reasonable date. Reasonably means anything that Date::Manip thinks is sensible, so you could use any of (for example): "December 12, 2001" "12th December, 2001" "2001-12-12" "next Tuesday" "third Wednesday in March" See L for much more information on what date formats are acceptable. The resulting date will be a Date::Simple object. L for more information on this. =head2 date_format By default ambiguous dates of the format 08/09/2001 will be treated as UK style (i.e. 8th September rather than 9th August) If you want to change this, subclass it and override date_format() =head1 WARNING Date::Manip does not play nicely with taint mode. In order to work around this we locally clobber Date::Manip's 'timezone' code. As we're only interested in dates rather than times, this shouldn't be much of an issue. If it is, then please let me know! =head1 SEE ALSO L. L. =head1 AUTHOR Tony Bowden =head1 BUGS and QUERIES Please direct all correspondence regarding this module to: bug-CGI-Untaint-date@rt.cpan.org =head1 COPYRIGHT and LICENSE Copyright (C) 2001-2005 Tony Bowden. All rights reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut 1;