Upgrade to Bugzilla 4.2.11.
authorddkilzer@apple.com <ddkilzer@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Oct 2014 16:01:32 +0000 (16:01 +0000)
committerddkilzer@apple.com <ddkilzer@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Oct 2014 16:01:32 +0000 (16:01 +0000)
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@174779 268f45cc-cd09-0410-ab3c-d52691b4dbfc

31 files changed:
Websites/bugs.webkit.org/.gitignore [new file with mode: 0644]
Websites/bugs.webkit.org/.travis.yml [new file with mode: 0644]
Websites/bugs.webkit.org/Bugzilla/Attachment.pm
Websites/bugs.webkit.org/Bugzilla/Auth/Persist/Cookie.pm
Websites/bugs.webkit.org/Bugzilla/Bug.pm
Websites/bugs.webkit.org/Bugzilla/Chart.pm
Websites/bugs.webkit.org/Bugzilla/Constants.pm
Websites/bugs.webkit.org/Bugzilla/DB/Sqlite.pm
Websites/bugs.webkit.org/Bugzilla/Flag.pm
Websites/bugs.webkit.org/Bugzilla/Install/Requirements.pm
Websites/bugs.webkit.org/Bugzilla/Template.pm
Websites/bugs.webkit.org/Bugzilla/Util.pm
Websites/bugs.webkit.org/Bugzilla/WebService/Bug.pm
Websites/bugs.webkit.org/Bugzilla/WebService/Server/JSONRPC.pm
Websites/bugs.webkit.org/Build.PL [new file with mode: 0644]
Websites/bugs.webkit.org/MANIFEST.SKIP [new file with mode: 0644]
Websites/bugs.webkit.org/attachment.cgi
Websites/bugs.webkit.org/buglist.cgi
Websites/bugs.webkit.org/docs/en/xml/Bugzilla-Guide.xml
Websites/bugs.webkit.org/editflagtypes.cgi
Websites/bugs.webkit.org/editgroups.cgi
Websites/bugs.webkit.org/post_bug.cgi
Websites/bugs.webkit.org/relogin.cgi
Websites/bugs.webkit.org/t/002goodperl.t
Websites/bugs.webkit.org/template/en/default/email/bugmail.txt.tmpl
Websites/bugs.webkit.org/template/en/default/filterexceptions.pl
Websites/bugs.webkit.org/template/en/default/global/messages.html.tmpl
Websites/bugs.webkit.org/template/en/default/pages/release-notes.html.tmpl
Websites/bugs.webkit.org/template/en/default/reports/report-table.csv.tmpl
Websites/bugs.webkit.org/template/en/default/request/email.txt.tmpl
Websites/bugs.webkit.org/token.cgi

diff --git a/Websites/bugs.webkit.org/.gitignore b/Websites/bugs.webkit.org/.gitignore
new file mode 100644 (file)
index 0000000..7ab83e7
--- /dev/null
@@ -0,0 +1,32 @@
+.htaccess
+/lib/*
+/template/en/custom
+/docs/bugzilla.ent
+/docs/en/xml/bugzilla.ent
+/docs/en/txt
+/docs/en/html
+/docs/en/pdf
+/skins/custom
+/graphs
+/data
+/localconfig
+/index.html
+
+/skins/contrib/Dusk/IE-fixes.css
+/skins/contrib/Dusk/admin.css
+/skins/contrib/Dusk/attachment.css
+/skins/contrib/Dusk/create_attachment.css
+/skins/contrib/Dusk/dependency-tree.css
+/skins/contrib/Dusk/duplicates.css
+/skins/contrib/Dusk/editusers.css
+/skins/contrib/Dusk/enter_bug.css
+/skins/contrib/Dusk/help.css
+/skins/contrib/Dusk/panel.css
+/skins/contrib/Dusk/page.css
+/skins/contrib/Dusk/params.css
+/skins/contrib/Dusk/reports.css
+/skins/contrib/Dusk/show_bug.css
+/skins/contrib/Dusk/search_form.css
+/skins/contrib/Dusk/show_multiple.css
+/skins/contrib/Dusk/summarize-time.css
+.DS_Store
diff --git a/Websites/bugs.webkit.org/.travis.yml b/Websites/bugs.webkit.org/.travis.yml
new file mode 100644 (file)
index 0000000..68e2b47
--- /dev/null
@@ -0,0 +1,48 @@
+language: perl
+perl:
+  - 5.10
+  - 5.12
+
+env:
+  - TEST_SUITE=sanity
+  - TEST_SUITE=docs
+  - TEST_SUITE=webservices DB=mysql
+  - TEST_SUITE=selenium DB=mysql
+  - TEST_SUITE=webservices DB=pg
+  - TEST_SUITE=selenium DB=pg
+
+matrix:
+  exclude:
+    - perl: 5.12
+      env: TEST_SUITE=docs
+    - perl: 5.10
+      env: TEST_SUITE=webservices DB=mysql
+    - perl: 5.12
+      env: TEST_SUITE=selenium DB=mysql
+    - perl: 5.10
+      env: TEST_SUITE=webservices DB=pg
+    - perl: 5.12
+      env: TEST_SUITE=selenium DB=pg
+
+before_install:
+  - git clone https://github.com/bugzilla/qa.git -b 4.2 qa
+
+install: true
+
+script: ./qa/travis.sh
+
+after_failure:
+  - sudo cat /var/log/apache2/error.log
+
+notifications:
+  irc:
+    channels:
+      - "irc.mozilla.org#qa-bugzilla"
+      - "irc.mozilla.org#bugzilla"
+    template:
+      - "Bugzilla %{branch} : %{author} : %{message}"
+      - "Commit Message : %{commit_message}"
+      - "Commit Link : %{compare_url}"
+      - "Build Link : %{build_url}"
+  on_success: change
+  on_failure: always
index 69939a6..fa88453 100644 (file)
@@ -911,10 +911,12 @@ sub get_content_type {
     return 'text/plain' if ($cgi->param('ispatch') || $cgi->param('attach_text'));
 
     my $content_type;
-    if (!defined $cgi->param('contenttypemethod')) {
+    my $method = $cgi->param('contenttypemethod');
+
+    if (!defined $method) {
         ThrowUserError("missing_content_type_method");
     }
-    elsif ($cgi->param('contenttypemethod') eq 'autodetect') {
+    elsif ($method eq 'autodetect') {
         defined $cgi->upload('data') || ThrowUserError('file_not_specified');
         # The user asked us to auto-detect the content type, so use the type
         # specified in the HTTP request headers.
@@ -935,18 +937,17 @@ sub get_content_type {
             $content_type = 'image/png';
         }
     }
-    elsif ($cgi->param('contenttypemethod') eq 'list') {
+    elsif ($method eq 'list') {
         # The user selected a content type from the list, so use their
         # selection.
         $content_type = $cgi->param('contenttypeselection');
     }
-    elsif ($cgi->param('contenttypemethod') eq 'manual') {
+    elsif ($method eq 'manual') {
         # The user entered a content type manually, so use their entry.
         $content_type = $cgi->param('contenttypeentry');
     }
     else {
-        ThrowCodeError("illegal_content_type_method",
-                       { contenttypemethod => $cgi->param('contenttypemethod') });
+        ThrowCodeError("illegal_content_type_method", { contenttypemethod => $method });
     }
     return $content_type;
 }
index 57fa962..ace4746 100644 (file)
@@ -127,7 +127,7 @@ sub logout {
         $login_cookie = $cookie->value;
     }
     else {
-        $login_cookie = $cgi->cookie("Bugzilla_logincookie");
+        $login_cookie = $cgi->cookie("Bugzilla_logincookie") || '';
     }
     trick_taint($login_cookie);
 
index 7b86ab2..90bd8b6 100644 (file)
@@ -908,12 +908,6 @@ sub update {
                                    join(', ', @added_names)];
     }
 
-    # Flags
-    my ($removed, $added) = Bugzilla::Flag->update_flags($self, $old_bug, $delta_ts);
-    if ($removed || $added) {
-        $changes->{'flagtypes.name'} = [$removed, $added];
-    }
-
     # Comments
     foreach my $comment (@{$self->{added_comments} || []}) {
         # Override the Comment's timestamp to be identical to the update
@@ -936,6 +930,9 @@ sub update {
                          Bugzilla->user->id, $delta_ts, $comment->id);
     }
 
+    # Clear the cache of comments
+    delete $self->{comments};
+
     # Insert the values into the multiselect value tables
     my @multi_selects = grep {$_->type == FIELD_TYPE_MULTI_SELECT}
                              Bugzilla->active_custom_fields;
@@ -971,6 +968,12 @@ sub update {
     $_->update foreach @{ $self->{_update_ref_bugs} || [] };
     delete $self->{_update_ref_bugs};
 
+    # Flags
+    my ($removed, $added) = Bugzilla::Flag->update_flags($self, $old_bug, $delta_ts);
+    if ($removed || $added) {
+        $changes->{'flagtypes.name'} = [$removed, $added];
+    }
+
     # Log bugs_activity items
     # XXX Eventually, when bugs_activity is able to track the dupe_id,
     # this code should go below the duplicates-table-updating code below.
index dfbf32a..8fd4706 100644 (file)
@@ -110,10 +110,9 @@ sub init {
     if ($self->{'datefrom'} && $self->{'dateto'} && 
         $self->{'datefrom'} > $self->{'dateto'}) 
     {
-          ThrowUserError("misarranged_dates", 
-                                         {'datefrom' => $cgi->param('datefrom'),
-                                          'dateto' => $cgi->param('dateto')});
-    }    
+          ThrowUserError('misarranged_dates', { 'datefrom' => scalar $cgi->param('datefrom'),
+                                                'dateto' => scalar $cgi->param('dateto') });
+    }
 }
 
 # Alter Chart so that the selected series are added to it.
index 065be0a..abc3ca0 100644 (file)
@@ -203,7 +203,7 @@ use Memoize;
 # CONSTANTS
 #
 # Bugzilla version
-use constant BUGZILLA_VERSION => "4.2.7";
+use constant BUGZILLA_VERSION => "4.2.11";
 
 # Location of the remote and local XML files to track new releases.
 use constant REMOTE_FILE => 'http://updates.bugzilla.org/bugzilla-update.xml';
@@ -604,6 +604,13 @@ use constant AUDIT_CREATE => '__create__';
 use constant AUDIT_REMOVE => '__remove__';
 
 sub bz_locations {
+    # Force memoize() to re-compute data per project, to avoid
+    # sharing the same data across different installations.
+    return _bz_locations($ENV{'PROJECT'});
+}
+
+sub _bz_locations {
+    my $project = shift;
     # We know that Bugzilla/Constants.pm must be in %INC at this point.
     # So the only question is, what's the name of the directory
     # above it? This is the most reliable way to get our current working
@@ -620,12 +627,13 @@ sub bz_locations {
     $libpath =~ /(.*)/;
     $libpath = $1;
 
-    my ($project, $localconfig, $datadir);
-    if ($ENV{'PROJECT'} && $ENV{'PROJECT'} =~ /^(\w+)$/) {
+    my ($localconfig, $datadir);
+    if ($project && $project =~ /^(\w+)$/) {
         $project = $1;
         $localconfig = "localconfig.$project";
         $datadir = "data/$project";
     } else {
+        $project = undef;
         $localconfig = "localconfig";
         $datadir = "data";
     }
@@ -660,6 +668,6 @@ sub bz_locations {
 
 # This makes us not re-compute all the bz_locations data every time it's
 # called.
-BEGIN { memoize('bz_locations') };
+BEGIN { memoize('_bz_locations') };
 
 1;
index e13fd18..ee92909 100644 (file)
@@ -226,7 +226,7 @@ sub sql_to_days {
 
 sub sql_date_format {
     my ($self, $date, $format) = @_;
-    $format = "%Y.%m.%d %H:%M:%s" if !$format;
+    $format = "%Y.%m.%d %H:%M:%S" if !$format;
     $format =~ s/\%i/\%M/g;
     return "STRFTIME(" . $self->quote($format) . ", $date)";
 }
index a727532..b687532 100644 (file)
@@ -975,18 +975,32 @@ sub notify {
         $default_lang = Bugzilla::User->new()->setting('lang');
     }
 
+    # Get comments on the bug
+    my $all_comments = $bug->comments({ after => $bug->lastdiffed });
+    @$all_comments   = grep { $_->type || $_->body =~ /\S/ } @$all_comments;
+
+    # Get public only comments
+    my $public_comments = [ grep { !$_->is_private } @$all_comments ];
+
     foreach my $to (keys %recipients) {
         # Add threadingmarker to allow flag notification emails to be the
         # threaded similar to normal bug change emails.
         my $thread_user_id = $recipients{$to} ? $recipients{$to}->id : 0;
 
-        my $vars = { 'flag'            => $flag,
-                     'old_flag'        => $old_flag,
-                     'to'              => $to,
-                     'date'            => $timestamp,
-                     'bug'             => $bug,
-                     'attachment'      => $attachment,
-                     'threadingmarker' => build_thread_marker($bug->id, $thread_user_id) };
+        # We only want to show private comments to users in the is_insider group
+        my $comments = $recipients{$to} && $recipients{$to}->is_insider
+            ? $all_comments : $public_comments;
+
+        my $vars = {
+            flag            => $flag,
+            old_flag        => $old_flag,
+            to              => $to,
+            date            => $timestamp,
+            bug             => $bug,
+            attachment      => $attachment,
+            threadingmarker => build_thread_marker($bug->id, $thread_user_id),
+            new_comments    => $comments,
+        };
 
         my $lang = $recipients{$to} ?
           $recipients{$to}->setting('lang') : $default_lang;
index 83723b3..2e67457 100644 (file)
@@ -24,6 +24,7 @@ package Bugzilla::Install::Requirements;
 # MUST NOT "use."
 
 use strict;
+use version;
 
 use Bugzilla::Constants;
 use Bugzilla::Install::Util qw(vers_cmp install_string bin_loc 
@@ -206,7 +207,9 @@ sub OPTIONAL_MODULES {
         package => 'Chart',
         module  => 'Chart::Lines',
         # Versions below 2.1 cannot be detected accurately.
-        version => '2.1',
+        # There is no 2.1.0 release (it was 2.1), but .0 is required to fix
+        # https://rt.cpan.org/Public/Bug/Display.html?id=28218.
+        version => '2.1.0',
         feature => [qw(new_charts old_charts)],
     },
     {
@@ -640,8 +643,8 @@ sub check_graphviz {
     return $return;
 }
 
-# This was originally clipped from the libnet Makefile.PL, adapted here to
-# use the below vers_cmp routine for accurate version checking.
+# This was originally clipped from the libnet Makefile.PL, adapted here for
+# accurate version checking.
 sub have_vers {
     my ($params, $output) = @_;
     my $module  = $params->{module};
@@ -659,21 +662,24 @@ sub have_vers {
     Bugzilla::Install::Util::set_output_encoding();
 
     # VERSION is provided by UNIVERSAL::, and can be called even if
-    # the module isn't loaded.
-    my $vnum = $module->VERSION || -1;
-
-    # CGI's versioning scheme went 2.75, 2.751, 2.752, 2.753, 2.76
-    # That breaks the standard version tests, so we need to manually correct
-    # the version
-    if ($module eq 'CGI' && $vnum =~ /(2\.7\d)(\d+)/) {
-        $vnum = $1 . "." . $2;
-    }
-    # CPAN did a similar thing, where it has versions like 1.9304.
-    if ($module eq 'CPAN' and $vnum =~ /^(\d\.\d{2})\d{2}$/) {
-        $vnum = $1;
+    # the module isn't loaded. We eval'uate ->VERSION because it can die
+    # when the version is not valid (yes, this happens from time to time).
+    # In that case, we use an uglier method to get the version.
+    my $vnum = eval { $module->VERSION };
+    if ($@) {
+        no strict 'refs';
+        $vnum = ${"${module}::VERSION"};
+
+        # If we come here, then the version is not a valid one.
+        # We try to sanitize it.
+        if ($vnum =~ /^((\d+)(\.\d+)*)/) {
+            $vnum = $1;
+        }
     }
+    $vnum ||= -1;
 
-    my $vok = (vers_cmp($vnum,$wanted) > -1);
+    # Must do a string comparison as $vnum may be of the form 5.10.1.
+    my $vok = ($vnum ne '-1' && version->new($vnum) >= version->new($wanted)) ? 1 : 0;
     my $blacklisted;
     if ($vok && $params->{blacklist}) {
         $blacklisted = grep($vnum =~ /$_/, @{$params->{blacklist}});
index cd75079..7fd3f0e 100644 (file)
@@ -162,13 +162,11 @@ sub quoteUrls {
     # (http://foo/bug#3 for example). Filtering that out filters valid
     # bug refs out, so we have to do replacements.
     # mailto can't contain space or #, so we don't have to bother for that
-    # Do this by escaping \0 to \1\0, and replacing matches with \0\0$count\0\0
-    # \0 is used because it's unlikely to occur in the text, so the cost of
-    # doing this should be very small
-
-    # escape the 2nd escape char we're using
-    my $chr1 = chr(1);
-    $text =~ s/\0/$chr1\0/g;
+    # Do this by replacing matches with \x{FDD2}$count\x{FDD3}
+    # \x{FDDx} is used because it's unlikely to occur in the text
+    # and are reserved unicode characters. We disable warnings for now
+    # until we require Perl 5.13.9 or newer.
+    no warnings 'utf8';
 
     # However, note that adding the title (for buglinks) can affect things
     # In particular, attachment matches go before bug titles, so that titles
@@ -195,11 +193,11 @@ sub quoteUrls {
                                                                $1, $2, $3, $4,
                                                                $5, $6, $7, $8, 
                                                                $9, $10]}))
-                               && ("\0\0" . ($count-1) . "\0\0")/egx;
+                               && ("\x{FDD2}" . ($count-1) . "\x{FDD3}")/egx;
         }
         else {
             $text =~ s/$match/($things[$count++] = $replace) 
-                              && ("\0\0" . ($count-1) . "\0\0")/egx;
+                              && ("\x{FDD2}" . ($count-1) . "\x{FDD3}")/egx;
         }
     }
 
@@ -209,7 +207,7 @@ sub quoteUrls {
                             Bugzilla->params->{'sslbase'})) . ')';
     $text =~ s~\b(${urlbase_re}\Qshow_bug.cgi?id=\E([0-9]+)(\#c([0-9]+))?)\b
               ~($things[$count++] = get_bug_link($3, $1, { comment_num => $5, user => $user })) &&
-               ("\0\0" . ($count-1) . "\0\0")
+               ("\x{FDD2}" . ($count-1) . "\x{FDD3}")
               ~egox;
 
     # non-mailto protocols
@@ -217,7 +215,7 @@ sub quoteUrls {
     $text =~ s~\b($safe_protocols)
               ~($tmp = html_quote($1)) &&
                ($things[$count++] = "<a href=\"$tmp\">$tmp</a>") &&
-               ("\0\0" . ($count-1) . "\0\0")
+               ("\x{FDD2}" . ($count-1) . "\x{FDD3}")
               ~egox;
 
     # We have to quote now, otherwise the html itself is escaped
@@ -238,7 +236,7 @@ sub quoteUrls {
     # attachment links
     $text =~ s~\b(attachment\s*\#?\s*(\d+)(?:\s+\[details\])?)
               ~($things[$count++] = get_attachment_link($2, $1, $user)) &&
-               ("\0\0" . ($count-1) . "\0\0")
+               ("\x{FDD2}" . ($count-1) . "\x{FDD3}")
               ~egmxi;
 
     # Current bug ID this comment belongs to
@@ -268,9 +266,8 @@ sub quoteUrls {
 
     # Now remove the encoding hacks in reverse order
     for (my $i = $#things; $i >= 0; $i--) {
-        $text =~ s/\0\0($i)\0\0/$things[$i]/eg;
+        $text =~ s/\x{FDD2}($i)\x{FDD3}/$things[$i]/eg;
     }
-    $text =~ s/$chr1\0/\0/g;
 
     return $text;
 }
@@ -672,6 +669,17 @@ sub create {
                 my ($data) = @_;
                 return encode_base64($data);
             },
+
+            # Strips out control characters excepting whitespace
+            strip_control_chars => sub {
+                my ($data) = @_;
+                # Only run for utf8 to avoid issues with other multibyte encodings 
+                # that may be reassigning meaning to ascii characters.
+                if (Bugzilla->params->{'utf8'}) {
+                    $data =~ s/(?![\t\r\n])[[:cntrl:]]//g;
+                }
+                return $data;
+            },
             
             # HTML collapses newlines in element attributes to a single space,
             # so form elements which may have whitespace (ie comments) need
@@ -730,10 +738,12 @@ sub create {
             },
 
             # In CSV, quotes are doubled, and any value containing a quote or a
-            # comma is enclosed in quotes.
+            # comma is enclosed in quotes. If a field starts with an equals
+            # sign, it is proceed by a space.
             csv => sub
             {
                 my ($var) = @_;
+                $var = ' ' . $var if substr($var, 0, 1) eq '=';
                 $var =~ s/\"/\"\"/g;
                 if ($var !~ /^-?(\d+\.)?\d*$/) {
                     $var = "\"$var\"";
index f43c9af..1fad4c6 100644 (file)
@@ -91,6 +91,10 @@ sub html_quote {
     # Obscure '@'.
     $var =~ s/\@/\&#64;/g;
     if (Bugzilla->params->{'utf8'}) {
+        # Remove control characters if the encoding is utf8.
+        # Other multibyte encodings may be using this range; so ignore if not utf8.
+        $var =~ s/(?![\t\r\n])[[:cntrl:]]//g;
+
         # Remove the following characters because they're
         # influencing BiDi:
         # --------------------------------------------------------
index 9ccd84c..eb76b41 100644 (file)
@@ -2037,7 +2037,7 @@ narrowed down to specific products.
 =item C<summary> (string) B<Required> - A string of keywords defining
 the type of bug you are trying to report.
 
-=item C<products> (array) - One or more product names to narrow the
+=item C<product> (array) - One or more product names to narrow the
 duplicate search to. If omitted, all bugs are searched.
 
 =back
index cec1c29..373aa4f 100644 (file)
@@ -91,8 +91,9 @@ sub response {
     # Implement JSONP.
     if (my $callback = $self->_bz_callback) {
         my $content = $response->content;
-        $response->content("$callback($content)");
-
+        # Prepend the JSONP response with /**/ in order to protect
+        # against possible encoding attacks (e.g., affecting Flash).
+        $response->content("/**/$callback($content)");
     }
 
     # Use $cgi->header properly instead of just printing text directly.
diff --git a/Websites/bugs.webkit.org/Build.PL b/Websites/bugs.webkit.org/Build.PL
new file mode 100644 (file)
index 0000000..024a560
--- /dev/null
@@ -0,0 +1,61 @@
+#!/usr/bin/perl
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+use 5.10.1;
+use strict;
+use warnings;
+
+use FindBin qw($RealBin);
+use lib ($RealBin, "$RealBin/lib");
+
+use Module::Build 0.36_14;
+
+use Bugzilla::Install::Requirements qw(REQUIRED_MODULES OPTIONAL_MODULES);
+use Bugzilla::Constants qw(BUGZILLA_VERSION);
+
+sub requires {
+    my $requirements = REQUIRED_MODULES();
+    my $hrequires = {};
+    foreach my $module (@$requirements) {
+        $hrequires->{$module->{module}} = $module->{version};
+    }
+    return $hrequires;
+};
+
+sub build_requires {
+    return requires();
+}
+
+sub recommends {
+    my $recommends = OPTIONAL_MODULES();
+    my @blacklist = ('Apache-SizeLimit', 'mod_perl'); # Does not compile properly on Travis
+    my $hrecommends = {};
+    foreach my $module (@$recommends) {
+        next if grep($_ eq $module->{package}, @blacklist);
+        $hrecommends->{$module->{module}} = $module->{version};
+    }
+    return $hrecommends;
+}
+
+my $build = Module::Build->new(
+    module_name        => 'Bugzilla',
+    dist_abstract      => <<END,
+Bugzilla is a free bug-tracking system that is developed by an active
+community of volunteers. You can install and use it without having to
+pay any license fee.
+END
+    dist_version_from  => 'Bugzilla/Constants.pm',
+    dist_version       => BUGZILLA_VERSION,
+    requires           => requires(),
+    recommends         => recommends(),
+    license            => 'Mozilla_2_0',
+    create_readme      => 0,
+    create_makefile_pl => 0
+);
+
+$build->create_build_script;
diff --git a/Websites/bugs.webkit.org/MANIFEST.SKIP b/Websites/bugs.webkit.org/MANIFEST.SKIP
new file mode 100644 (file)
index 0000000..69204e6
--- /dev/null
@@ -0,0 +1,53 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+#!start included /usr/share/perl5/ExtUtils/MANIFEST.SKIP
+# Avoid version control files.
+\B\.git\b
+\B\.bzr\b
+\B\.bzrignore\b
+\B\.gitignore\b
+\B\.gitrev\b
+\B\.patch\b
+
+# Avoid Makemaker generated and utility files.
+\bMANIFEST\.bak
+\bMakefile$
+\bblib/
+\bMakeMaker-\d
+\bpm_to_blib\.ts$
+\bpm_to_blib$
+\bblibdirs\.ts$         # 6.18 through 6.25 generated this
+
+# Avoid Module::Build generated and utility files.
+\bBuild$
+\b_build/
+
+# Avoid temp and backup files.
+~$
+\.old$
+\#$
+\b\.#
+\.bak$
+\.swp$
+
+#!end included /usr/share/perl5/ExtUtils/MANIFEST.SKIP
+
+# Avoid Module::Build generated and utility files.
+\bBuild$
+\bBuild.bat$
+\b_build
+\bBuild.COM$
+\bBUILD.COM$
+\bbuild.com$
+
+# Avoid archives of this distribution
+\bBugzilla-[\d\.\_]+
+
+# Bugzilla specific avoids
+\bdata\/\b
+\blocalconfig$
index 50e9da9..253fc33 100755 (executable)
@@ -248,8 +248,9 @@ sub validateContext
 {
   my $context = $cgi->param('context') || "patch";
   if ($context ne "file" && $context ne "patch") {
-    detaint_natural($context)
-      || ThrowUserError("invalid_context", { context => $cgi->param('context') });
+      my $orig_context = $context;
+      detaint_natural($context)
+        || ThrowUserError("invalid_context", { context => $orig_context });
   }
 
   return $context;
@@ -591,13 +592,14 @@ sub insert {
 
     # Get the filehandle of the attachment.
     my $data_fh = $cgi->upload('data');
+    my $attach_text = $cgi->param('attach_text');
 
     my $attachment = Bugzilla::Attachment->create(
         {bug           => $bug,
          creation_ts   => $timestamp,
-         data          => scalar $cgi->param('attach_text') || $data_fh,
+         data          => $attach_text || $data_fh,
          description   => scalar $cgi->param('description'),
-         filename      => $cgi->param('attach_text') ? "file_$bugid.txt" : scalar $cgi->upload('data'),
+         filename      => $attach_text ? "file_$bugid.txt" : $data_fh,
          ispatch       => scalar $cgi->param('ispatch'),
          isprivate     => scalar $cgi->param('isprivate'),
          mimetype      => $content_type,
index eeb9b88..8af1380 100755 (executable)
@@ -1014,7 +1014,7 @@ if (scalar(@products) == 1) {
 # This is used in the "Zarroo Boogs" case.
 elsif (my @product_input = $cgi->param('product')) {
     if (scalar(@product_input) == 1 and $product_input[0] ne '') {
-        $one_product = new Bugzilla::Product({ name => $cgi->param('product') });
+        $one_product = new Bugzilla::Product({ name => $product_input[0] });
     }
 }
 # We only want the template to use it if the user can actually 
index d207963..d77d14e 100644 (file)
      For a devel release, simple bump bz-ver and bz-date
 -->
 
-<!ENTITY bz-ver "4.2.7">
+<!ENTITY bz-ver "4.2.11">
 <!ENTITY bz-nextver "4.4">
-<!ENTITY bz-date "2013-10-16">
-<!ENTITY current-year "2013">
+<!ENTITY bz-date "2014-10-06">
+<!ENTITY current-year "2014">
 
 <!ENTITY landfillbase "http://landfill.bugzilla.org/bugzilla-4.2-branch/">
 <!ENTITY bz "http://www.bugzilla.org/">
index d433ca9..f1837b5 100755 (executable)
@@ -59,23 +59,24 @@ my @products = @{$vars->{products}};
 
 my $action = $cgi->param('action') || 'list';
 my $token  = $cgi->param('token');
-my $product = $cgi->param('product');
-my $component = $cgi->param('component');
+my $prod_name = $cgi->param('product');
+my $comp_name = $cgi->param('component');
 my $flag_id = $cgi->param('id');
 
-if ($product) {
+my ($product, $component);
+
+if ($prod_name) {
     # Make sure the user is allowed to view this product name.
     # Users with global editcomponents privs can see all product names.
-    ($product) = grep { lc($_->name) eq lc($product) } @products;
-    $product || ThrowUserError('product_access_denied', { name => $cgi->param('product') });
+    ($product) = grep { lc($_->name) eq lc($prod_name) } @products;
+    $product || ThrowUserError('product_access_denied', { name => $prod_name });
 }
 
-if ($component) {
-    ($product && $product->id)
-      || ThrowUserError('flag_type_component_without_product');
-    ($component) = grep { lc($_->name) eq lc($component) } @{$product->components};
+if ($comp_name) {
+    $product || ThrowUserError('flag_type_component_without_product');
+    ($component) = grep { lc($_->name) eq lc($comp_name) } @{$product->components};
     $component || ThrowUserError('product_unknown_component', { product => $product->name,
-                                                                comp => $cgi->param('component') });
+                                                                comp => $comp_name });
 }
 
 # If 'categoryAction' is set, it has priority over 'action'.
index 8e58f54..ccf5eee 100755 (executable)
@@ -242,7 +242,7 @@ if ($action eq 'new') {
 
 if ($action eq 'del') {
     # Check that an existing group ID is given
-    my $group = Bugzilla::Group->check({ id => $cgi->param('group') });
+    my $group = Bugzilla::Group->check({ id => scalar $cgi->param('group') });
     $group->check_remove({ test_only => 1 });
     $vars->{'shared_queries'} =
         $dbh->selectrow_array('SELECT COUNT(*)
@@ -266,7 +266,7 @@ if ($action eq 'del') {
 if ($action eq 'delete') {
     check_token_data($token, 'delete_group');
     # Check that an existing group ID is given
-    my $group = Bugzilla::Group->check({ id => $cgi->param('group') });
+    my $group = Bugzilla::Group->check({ id => scalar $cgi->param('group') });
     $vars->{'name'} = $group->name;
     $group->remove_from_db({
         remove_from_users => scalar $cgi->param('removeusers'),
index 8df79d2..159b8bd 100755 (executable)
@@ -168,7 +168,10 @@ if (defined $cgi->param('version')) {
 # after the bug is filed.
 
 # Add an attachment if requested.
-if (defined($cgi->upload('data')) || $cgi->param('attach_text')) {
+my $data_fh = $cgi->upload('data');
+my $attach_text = $cgi->param('attach_text');
+
+if ($data_fh || $attach_text) {
     $cgi->param('isprivate', $cgi->param('comment_is_private'));
 
     # Must be called before create() as it may alter $cgi->param('ispatch').
@@ -183,9 +186,9 @@ if (defined($cgi->upload('data')) || $cgi->param('attach_text')) {
         $attachment = Bugzilla::Attachment->create(
             {bug           => $bug,
              creation_ts   => $timestamp,
-             data          => scalar $cgi->param('attach_text') || $cgi->upload('data'),
+             data          => $attach_text || $data_fh,
              description   => scalar $cgi->param('description'),
-             filename      => $cgi->param('attach_text') ? "file_$id.txt" : scalar $cgi->upload('data'),
+             filename      => $attach_text ? "file_$id.txt" : $data_fh,
              ispatch       => scalar $cgi->param('ispatch'),
              isprivate     => scalar $cgi->param('isprivate'),
              mimetype      => $content_type,
index 04042c3..b9436d1 100755 (executable)
@@ -87,19 +87,21 @@ elsif ($action eq 'begin-sudo') {
     {
         $credentials_provided = 1;
     }
-    
+
     # Next, log in the user
     my $user = Bugzilla->login(LOGIN_REQUIRED);
-    
+
+    my $target_login = $cgi->param('target_login');
+    my $reason = $cgi->param('reason') || '';
+
     # At this point, the user is logged in.  However, if they used a method
     # where they could have provided a username/password (i.e. CGI), but they 
     # did not provide a username/password, then throw an error.
     if ($user->authorizer->can_login && !$credentials_provided) {
         ThrowUserError('sudo_password_required',
-                       { target_login => $cgi->param('target_login'),
-                               reason => $cgi->param('reason')});
+                       { target_login => $target_login, reason => $reason });
     }
-    
+
     # The user must be in the 'bz_sudoers' group
     unless ($user->in_group('bz_sudoers')) {
         ThrowUserError('auth_failure', {  group => 'bz_sudoers',
@@ -123,30 +125,22 @@ elsif ($action eq 'begin-sudo') {
             && ($token_data eq 'sudo_prepared'))
     {
         ThrowUserError('sudo_preparation_required', 
-                       { target_login => scalar $cgi->param('target_login'),
-                               reason => scalar $cgi->param('reason')});
+                       { target_login => $target_login, reason => $reason });
     }
     delete_token($cgi->param('token'));
 
     # Get & verify the target user (the user who we will be impersonating)
-    my $target_user = 
-        new Bugzilla::User({ name => $cgi->param('target_login') });
+    my $target_user = new Bugzilla::User({ name => $target_login });
     unless (defined($target_user)
             && $target_user->id
             && $user->can_see_user($target_user))
     {
-        ThrowUserError('user_match_failed',
-                       { 'name' => $cgi->param('target_login') }
-        );
+        ThrowUserError('user_match_failed', { name => $target_login });
     }
     if ($target_user->in_group('bz_sudo_protect')) {
         ThrowUserError('sudo_protected', { login => $target_user->login });
     }
 
-    # If we have a reason passed in, keep it under 200 characters
-    my $reason = $cgi->param('reason') || '';
-    $reason = substr($reason, 0, 200);
-    
     # Calculate the session expiry time (T + 6 hours)
     my $time_string = time2str('%a, %d-%b-%Y %T %Z', time + MAX_SUDO_TOKEN_AGE, 'GMT');
 
@@ -159,9 +153,12 @@ elsif ($action eq 'begin-sudo') {
     
     # For the present, change the values of Bugzilla::user & Bugzilla::sudoer
     Bugzilla->sudo_request($target_user, $user);
-    
+
     # NOTE: If you want to log the start of an sudo session, do it here.
 
+    # If we have a reason passed in, keep it under 200 characters
+    $reason = substr($reason, 0, 200);
+
     # Go ahead and send out the message now
     my $message;
     my $mail_template = Bugzilla->template_inner($target_user->setting('lang'));
index 2fc0d4a..cde4a3b 100644 (file)
@@ -32,7 +32,7 @@ use lib 't';
 
 use Support::Files;
 
-use Test::More tests => (scalar(@Support::Files::testitems) * 3);
+use Test::More tests => (scalar(@Support::Files::testitems) * 4);
 
 my @testitems = @Support::Files::testitems; # get the files to test.
 
@@ -126,4 +126,35 @@ foreach my $file (@testitems) {
     
     close(FILE);
 }
+
+# Forbird the { foo => $cgi->param() } syntax, for security reasons.
+foreach my $file (@testitems) {
+    $file =~ s/\s.*$//; # nuke everything after the first space (#comment)
+    next unless $file; # skip null entries
+    if (!open(FILE, $file)) {
+        ok(0, "could not open $file --WARNING");
+        next;
+    }
+    my $lineno = 0;
+    my @unsafe_args;
+
+    while (my $file_line = <FILE>) {
+        $lineno++;
+        $file_line =~ s/^\s*(.+)\s*$/$1/; # Remove leading and trailing whitespaces.
+        if ($file_line =~ /^[^#]+=> \$cgi\->param/) {
+            push(@unsafe_args, "$file_line on line $lineno");
+        }
+    }
+
+    if (@unsafe_args) {
+        ok(0, "$file incorrectly passes a CGI argument to a hash --ERROR\n" .
+              join("\n", @unsafe_args));
+    }
+    else {
+        ok(1, "$file has no vulnerable hash syntax");
+    }
+
+    close(FILE);
+}
+
 exit 0;
index 0b349fb..a3a0b87 100644 (file)
@@ -32,7 +32,7 @@
 [%- IF comment.count %]
 --- Comment #[% comment.count %] from [% comment.author.identity %] ---
 [% END %]
-[%+ comment.body_full({ is_bugmail => 1, wrap => 1 }) %]
+[%+ comment.body_full({ is_bugmail => 1, wrap => 1 }) FILTER strip_control_chars %]
 [% END %]
 
 -- [%# Protect the trailing space of the signature marker %]
index 2567d4a..6cc15cc 100644 (file)
 [% IF !message %]
   [% message = BLOCK %]
     You are using [% terms.Bugzilla %]'s messaging functions incorrectly. You
-    passed in the string '[% message_tag %]'. The correct use is to pass
+    passed in the string '[% message_tag FILTER html %]'. The correct use is to pass
     in a tag, and define that tag in the file messages.html.tmpl.<br>
     <br>
     If you are a [% terms.Bugzilla %] end-user seeing this message, please
index ebc08af..690d334 100644 (file)
 
 <h2 id="v42_point">Updates in this 4.2.x Release</h2>
 
+<h3>4.2.11</h3>
+
+<p>This release fixes several security issues. See the
+  <a href="http://www.bugzilla.org/security/4.0.14/">Security Advisory</a>
+    for details.</p>
+
+<h3>4.2.10</h3>
+
+<p>This release fixes one security issue. See the
+  <a href="http://www.bugzilla.org/security/4.0.13/">Security Advisory</a>
+    for details.</p>
+
+<h3>4.2.9</h3>
+
+<p>This release fixes one regression introduced in [% terms.Bugzilla %] 4.2.8 by
+  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=968576">security [% terms.bug %] 968576</a>:
+  URLs in [% terms.bug %] comments are displayed correctly again.
+  (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=998323">[% terms.Bug %] 998323</a>)</p>
+
+<h3>4.2.8</h3>
+
+<p>This release fixes one minor security issue. See the
+  <a href="http://www.bugzilla.org/security/4.0.11/">Security Advisory</a>
+  for details.</p>
+
+<p>In addition, the following [% terms.bugs %] have been fixed in this release:</p>
+
+<ul>
+  <li><kbd>checksetup.pl</kbd> was incorrectly reporting DBI 1.630 (1.63) as
+    being older than 1.614, preventing the upgrade to complete.
+    If you still use Perl 5.10.0 or older, make sure you have the
+    <a href="http://search.cpan.org/~jpeacock/version/lib/version.pod">version</a>
+    module installed before running <kbd>checksetup.pl</kbd>.
+    If you use Perl 5.10.1 or newer, this module is already available and
+    no special action is required.
+    (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=938300">[% terms.Bug %] 938300</a>)</li>
+  <li><kbd>checksetup.pl</kbd> no longer fails with "Invalid version format (non-numeric data)"
+    when a Perl module contains an invalid version number.
+    (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=781672">[% terms.Bug %] 781672</a>)</li>
+  <li>The PROJECT environment variable is now correctly taken into account
+    when mod_perl is enabled (this variable allows several installations to
+    share the same codebase).
+    (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=843457">[% terms.Bug %] 843457</a>)</li>
+  <li>[% terms.Bugzilla %] no longer crashes when the <kbd>shutdownhtml</kbd>
+    parameter is set and using a non-cookie based authentication method.
+    (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=748095">[% terms.Bug %] 748095</a>)</li>
+  <li>The default date and time format used for SQLite has been fixed.
+    (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=938161">[% terms.Bug %] 938161</a>)</li>
+</ul>
+
 <h3>4.2.7</h3>
 
 <p>This release fixes several security issues. See the
index 4d8b50a..c978cf9 100644 (file)
   [% END %]
   [% tbl_field_disp FILTER csv %]: [% tbl_disp FILTER csv %]
 [% END %]
-[% IF row_field %]
+[% IF row_field && col_field %]
+  [% row_field_disp _ ' / ' _ col_field_disp FILTER csv %]
+[% ELSIF row_field %]
   [% row_field_disp FILTER csv %]
+[% ELSE %]
+  [% col_field_disp FILTER csv %]
 [% END %]
-[% " / " IF col_field AND row_field %]
-[% col_field_disp FILTER csv %]
 [% IF col_field -%]
   [% FOREACH col = col_names -%]
     [% colsepchar %]
index 408ad63..6c33119 100644 (file)
@@ -82,11 +82,14 @@ Attachment [% attidsummary %]
 
 [%- FILTER bullet = wrap(80) %]
 
-[% USE Bugzilla %]
-[%-# .defined is necessary to avoid a taint issue in Perl < 5.10.1, see bug 509794. %]
-[% IF Bugzilla.cgi.param("comment").defined && Bugzilla.cgi.param("comment").length > 0 %]
-------- Additional Comments from [% user.identity %]
-[%+ Bugzilla.cgi.param("comment") %]
+[% FOREACH comment = new_comments %]
+
+[%- IF comment.count %]
+--- Comment #[% comment.count %] from [% comment.author.identity %] ---
+[% ELSE %]
+--- Description ---
+[% END %]
+[%+ comment.body_full({ is_bugmail => 1, wrap => 1 }) FILTER strip_control_chars %]
 [% END %]
 
 [%- END %]
index 5c2c88c..1ce72b6 100755 (executable)
@@ -382,7 +382,7 @@ sub confirm_create_account {
 
     my $otheruser = Bugzilla::User->create({
         login_name => $login_name, 
-        realname   => $cgi->param('realname'), 
+        realname   => scalar $cgi->param('realname'),
         cryptpassword => $password});
 
     # Now delete this token.