Bug 287487: User with no privs can not add comments to bugs that have a deadline field set - Patch by Fr�d�ric Buclin <LpSolit@gmail.com> r=mkanat a=myk

This commit is contained in:
lpsolit%gmail.com 2005-05-10 20:30:13 +00:00
parent a6687db0f1
commit f2047798c9
3 changed files with 56 additions and 46 deletions

View File

@ -249,38 +249,44 @@ sub find_wrap_point ($$) {
return $wrappoint;
}
sub format_time {
my ($time) = @_;
sub format_time ($;$) {
my ($date, $format) = @_;
my ($year, $month, $day, $hour, $min, $sec);
if ($time =~ m/^\d{14}$/) {
# We appear to have a timestamp direct from MySQL
$year = substr($time,0,4);
$month = substr($time,4,2);
$day = substr($time,6,2);
$hour = substr($time,8,2);
$min = substr($time,10,2);
}
elsif ($time =~ m/^(\d{4})[-\.](\d{2})[-\.](\d{2}) (\d{2}):(\d{2})(:(\d{2}))?$/) {
$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$min = $5;
$sec = $7;
# If $format is undefined, try to guess the correct date format.
my $show_timezone;
if (!defined($format)) {
if ($date =~ m/^(\d{4})[-\.](\d{2})[-\.](\d{2}) (\d{2}):(\d{2})(:(\d{2}))?$/) {
my $sec = $7;
if (defined $sec) {
$format = "%Y-%m-%d %T";
} else {
$format = "%Y-%m-%d %R";
}
} else {
# Default date format. See Date::Format for other formats available.
$format = "%Y-%m-%d %R";
}
# By default, we want the timezone to be displayed.
$show_timezone = 1;
}
else {
warn "Date/Time format ($time) unrecogonzied";
# Search for %Z or %z, meaning we want the timezone to be displayed.
# Till bug 182238 gets fixed, we assume Param('timezone') is used.
$show_timezone = ($format =~ s/\s?%Z$//i);
}
if (defined $year) {
$time = "$year-$month-$day $hour:$min";
if (defined $sec) {
$time .= ":$sec";
}
$time .= " " . &::Param('timezone') if &::Param('timezone');
# str2time($date) is undefined if $date has an invalid date format.
my $time = str2time($date);
if (defined $time) {
$date = time2str($format, $time);
$date .= " " . &::Param('timezone') if $show_timezone;
}
return $time;
else {
# Don't let invalid (time) strings to be passed to templates!
$date = '';
}
return trim($date);
}
sub format_time_decimal {
@ -531,10 +537,15 @@ The search starts at $maxpos and goes back to the beginning of the string.
=item C<format_time($time)>
Takes a time and appends the timezone as defined in editparams.cgi. This routine
will be expanded in the future to adjust for user preferences regarding what
timezone to display times in. In the future, it may also allow for the time to be
shown in different formats.
Takes a time, converts it to the desired format and appends the timezone
as defined in editparams.cgi, if desired. This routine will be expanded
in the future to adjust for user preferences regarding what timezone to
display times in.
This routine is mainly called from templates to filter dates, see
"FILTER time" in Templates.pm. In this case, $format is undefined and
the routine has to "guess" the date format that was passed to $dbh->sql_date_format().
=item C<format_time_decimal($time)>

View File

@ -1185,7 +1185,13 @@ foreach my $id (@idlist) {
my %formhash;
foreach my $col (@::log_columns) {
# Consider NULL db entries to be equivalent to the empty string
$oldvalues[$i] = '' unless defined $oldvalues[$i];
$oldvalues[$i] = defined($oldvalues[$i]) ? $oldvalues[$i] : '';
# Convert the deadline taken from the DB into the YYYY-MM-DD format
# for consistency with the deadline provided by the user, if any.
# Else CheckCanChangeField() would see them as different in all cases.
if ($col eq 'deadline') {
$oldvalues[$i] = format_time($oldvalues[$i], "%Y-%m-%d");
}
$oldhash{$col} = $oldvalues[$i];
$formhash{$col} = $cgi->param($col) if defined $cgi->param($col);
$i++;
@ -1717,6 +1723,10 @@ foreach my $id (@idlist) {
foreach my $col (@::log_columns) {
# Consider NULL db entries to be equivalent to the empty string
$newvalues[$i] ||= '';
# Convert the deadline to the YYYY-MM-DD format.
if ($col eq 'deadline') {
$newvalues[$i] = format_time($newvalues[$i], "%Y-%m-%d");
}
$newhash{$col} = $newvalues[$i];
$i++;
}
@ -1779,16 +1789,6 @@ foreach my $id (@idlist) {
$check_dep_bugs = 1;
}
# Convert deadlines to the YYYY-MM-DD format. We use an
# intermediate $xxxtime to prevent errors in the web
# server log file when str2time($xxx) is undefined.
if ($col eq 'deadline') {
my $oldtime = str2time($old);
$old = ($oldtime) ? time2str("%Y-%m-%d", $oldtime) : '';
my $newtime = str2time($new);
$new = ($newtime) ? time2str("%Y-%m-%d", $newtime) : '';
}
LogActivityEntry($id,$col,$old,$new,$whoid,$timestamp);
$bug_changed = 1;
}

View File

@ -28,8 +28,8 @@ use lib 't';
use Support::Files;
BEGIN {
use Test::More tests => 13;
use_ok(Bugzilla::Util);
use Test::More tests => 14;
use_ok(Bugzilla::Util);
}
# We need to override the the Param() function so we can get an expected
@ -68,8 +68,7 @@ is(min(@list),2,'min()');
is(trim(" fg<*\$%>+=~~ "),'fg<*$%>+=~~','trim()');
#format_time();
is(format_time("20021123140436"),'2002-11-23 14:04 TEST','format_time("20021123140436")');
is(format_time("2002.11.24 00:05"),'2002-11-24 00:05 TEST','format_time("2002.11.24 00:05")');
is(format_time("2002.11.24 00:05:56"),'2002-11-24 00:05:56 TEST','format_time("2002.11.24 00:05:56")');
is(format_time("2002.11.24 00:05:56", "%Y-%m-%d %R"), '2002-11-24 00:05', 'format_time("2002.11.24 00:05:56", "%Y-%m-%d %R") (with no timezone)');
is(format_time("2002.11.24 00:05:56", "%Y-%m-%d %R %Z"), '2002-11-24 00:05 TEST', 'format_time("2002.11.24 00:05:56", "%Y-%m-%d %R %Z") (with timezone)');