EWS for security bugs
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Jun 2018 20:35:03 +0000 (20:35 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Jun 2018 20:35:03 +0000 (20:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=186291
<rdar://problem/40829658>

Reviewed by Lucas Forschler

Part 2 of 2.

Adds a new Bugzilla extension that will automatically CC the EWS feeder queue
on each bug that has a patch up for review, including security bugs. This allows
the WebKit OpenSource Project to use an unprivileged Bugzilla account for the
EWS feeder queue.

* extensions/EWS/Config.pm: Added.
* extensions/EWS/Extension.pm: Added.
(new): Initialize some bookkeeping variables we use to track whether we have seen
a value change event for the review flag and whether we need to CC the feeder. The latter
we need to track because we can only make changes to the CC list in the callback
bug_start_of_update().
(object_before_set): This callback is called each time a setter is called on a Bugzilla
object. Check if the review flag was set to ? and do some bookkeeping. Although tempting
to do such work in the callback flag_end_of_update() instead of object_before_set() doing
such work would come AFTER we get callback bug_start_of_update() and hence after we have
committed the CC list of the bug to the database. Moreover, the "interface to [flag_end_of_update()]
is UNSTABLE and it may change in the future" according to <https://github.com/bugzilla/bugzilla/blob/d7cf1c91949248222806f5a32f485b12eab8806f/Bugzilla/Hook.pm#L797>.
(bug_start_of_update): Add the EWS feeder queue to the list of CC members of the bug, if needed.
(config_add_panels): Adds a new panel to the Administration Parameters screen.
(isReviewFlag): Helper function that returns whether the specified Bugzilla::Object represents
the review flag.
* extensions/EWS/docs/en/rst/index-admin.rst: Added.
* extensions/EWS/lib/ParamsPanelUI.pm: Added.
(checkUser): Helper function to determine if there exists a Bugzilla user corresponding to
the specified login name.
(get_param_list): Add configurable field to the Administration Parameters screen to specify
the login name of the EWS feeder queue.
* extensions/EWS/template/en/default/admin/params/ews.html.tmpl: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@232980 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/Scripts/webkitpy/common/net/statusserver.py
Websites/bugs.webkit.org/ChangeLog
Websites/bugs.webkit.org/extensions/EWS/Config.pm [new file with mode: 0644]
Websites/bugs.webkit.org/extensions/EWS/Extension.pm [new file with mode: 0644]
Websites/bugs.webkit.org/extensions/EWS/docs/en/rst/index-admin.rst [new file with mode: 0644]
Websites/bugs.webkit.org/extensions/EWS/lib/ParamsPanelUI.pm [new file with mode: 0644]
Websites/bugs.webkit.org/extensions/EWS/template/en/default/admin/params/ews.html.tmpl [new file with mode: 0644]

index ab504a1..857ea5d 100644 (file)
@@ -145,7 +145,8 @@ class StatusServer:
 
     def upload_attachment(self, attachment):
         _log.info('Uploading attachment {} to status server'.format(attachment.id()))
-        return NetworkTransaction().run(lambda: self._upload_attachment_to_server(attachment.id(), attachment.to_json(), attachment.contents()))
+        # FIXME: Remove argument convert_404_to_None once we update AppEngine to support uploading attachments.
+        return NetworkTransaction(convert_404_to_None=True).run(lambda: self._upload_attachment_to_server(attachment.id(), attachment.to_json(), attachment.contents()))
 
     def _post_work_item_to_ews(self, attachment_id):
         submit_to_ews_url = '{}/submit-to-ews'.format(self._server_url())
index 832b1f5..3e13989 100644 (file)
@@ -1,3 +1,42 @@
+2018-06-19  Daniel Bates  <dabates@apple.com>
+
+        EWS for security bugs
+        https://bugs.webkit.org/show_bug.cgi?id=186291
+        <rdar://problem/40829658>
+
+        Reviewed by Lucas Forschler
+
+        Part 2 of 2.
+
+        Adds a new Bugzilla extension that will automatically CC the EWS feeder queue
+        on each bug that has a patch up for review, including security bugs. This allows
+        the WebKit OpenSource Project to use an unprivileged Bugzilla account for the
+        EWS feeder queue.
+
+        * extensions/EWS/Config.pm: Added.
+        * extensions/EWS/Extension.pm: Added.
+        (new): Initialize some bookkeeping variables we use to track whether we have seen
+        a value change event for the review flag and whether we need to CC the feeder. The latter
+        we need to track because we can only make changes to the CC list in the callback
+        bug_start_of_update().
+        (object_before_set): This callback is called each time a setter is called on a Bugzilla
+        object. Check if the review flag was set to ? and do some bookkeeping. Although tempting
+        to do such work in the callback flag_end_of_update() instead of object_before_set() doing
+        such work would come AFTER we get callback bug_start_of_update() and hence after we have
+        committed the CC list of the bug to the database. Moreover, the "interface to [flag_end_of_update()]
+        is UNSTABLE and it may change in the future" according to <https://github.com/bugzilla/bugzilla/blob/d7cf1c91949248222806f5a32f485b12eab8806f/Bugzilla/Hook.pm#L797>.
+        (bug_start_of_update): Add the EWS feeder queue to the list of CC members of the bug, if needed.
+        (config_add_panels): Adds a new panel to the Administration Parameters screen.
+        (isReviewFlag): Helper function that returns whether the specified Bugzilla::Object represents
+        the review flag.
+        * extensions/EWS/docs/en/rst/index-admin.rst: Added.
+        * extensions/EWS/lib/ParamsPanelUI.pm: Added.
+        (checkUser): Helper function to determine if there exists a Bugzilla user corresponding to
+        the specified login name.
+        (get_param_list): Add configurable field to the Administration Parameters screen to specify
+        the login name of the EWS feeder queue.
+        * extensions/EWS/template/en/default/admin/params/ews.html.tmpl: Added.
+
 2018-05-22  Roy Reapor  <rreapor@apple.com>
 
         Host jquery on webkit.org instead of 3rd party
diff --git a/Websites/bugs.webkit.org/extensions/EWS/Config.pm b/Websites/bugs.webkit.org/extensions/EWS/Config.pm
new file mode 100644 (file)
index 0000000..4a7343b
--- /dev/null
@@ -0,0 +1,32 @@
+# Copyright (C) 2018 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package Bugzilla::Extension::EWS;
+
+use strict;
+use warnings;
+
+use constant NAME => "EWS";
+use constant REQUIRED_MODULES => [];
+use constant OPTIONAL_MODULES => [];
+
+__PACKAGE__->NAME;
diff --git a/Websites/bugs.webkit.org/extensions/EWS/Extension.pm b/Websites/bugs.webkit.org/extensions/EWS/Extension.pm
new file mode 100644 (file)
index 0000000..b4214ac
--- /dev/null
@@ -0,0 +1,92 @@
+# Copyright (C) 2018 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package Bugzilla::Extension::EWS;
+
+use strict;
+use warnings;
+
+use parent qw(Bugzilla::Extension);
+
+use Bugzilla::Constants;
+use Bugzilla::Group;
+use Bugzilla::User;
+
+our $VERSION = "1.0.0";
+
+sub isReviewFlag($);
+
+sub new
+{
+    my ($class, @args) = @_;
+    my $self = $class->SUPER::new(@args);
+    $self->{shouldCCFeeder} = 0;
+    $self->{reviewFlagSeen} = 0;
+    return $self;
+}
+
+sub object_before_set
+{
+    my ($self, $args) = @_;
+
+    return if $self->{reviewFlagSeen};
+    return if !isReviewFlag($args->{object});
+
+    my $willChangeValue = defined($args->{field}) && $args->{field} eq "status";
+    return if !$willChangeValue;
+
+    my $reviewRequested = $args->{value} eq "?";
+    $self->{shouldCCFeeder} = 1 if $reviewRequested;
+    $self->{reviewFlagSeen} = 1;
+}
+
+sub bug_start_of_update
+{
+    my ($self, $args) = @_;
+
+    return if !$self->{shouldCCFeeder};
+
+    my $feeder = new Bugzilla::User({name => Bugzilla->params->{"ews_feeder_login"}});
+    return if !$feeder || $feeder->can_see_bug($args->{bug}->id());
+
+    $args->{bug}->add_cc($feeder);
+}
+
+sub config_add_panels
+{
+    my ($self, $args) = @_;
+
+    my $modules = $args->{panel_modules};
+    $modules->{EWS} = "Bugzilla::Extension::EWS::ParamsPanelUI";
+}
+
+###
+# Helper functions
+##
+
+sub isReviewFlag($)
+{
+    my ($mayBeFlag) = @_;
+    return $mayBeFlag->isa("Bugzilla::Flag") && $mayBeFlag->name() eq "r";
+}
+
+__PACKAGE__->NAME;
diff --git a/Websites/bugs.webkit.org/extensions/EWS/docs/en/rst/index-admin.rst b/Websites/bugs.webkit.org/extensions/EWS/docs/en/rst/index-admin.rst
new file mode 100644 (file)
index 0000000..a9ec498
--- /dev/null
@@ -0,0 +1,24 @@
+EWS
+#########
+
+The EWS extension provides a mechanism to automatically CC the feeder EWS on restricted bugs
+(e.g. security bugs) that have unreviewed patches. In this way the feeder EWS account can be
+unprivileged. That is, it only needs to have access to publicly visible bugs.
+
+===================================================
+Installing this extension
+===================================================
+
+Copy the directory that contains the docs subdirectory that this file is under into the Bugzilla
+extension directory. Then run ./checksetup.pl from the top-level Bugzilla installation directory.
+
+===================================================
+Configuring the feeder EWS account to use
+===================================================
+
+Login to Bugzilla as an administrator, click Administration in the header, then Parameters, and
+then EWS. Set the parameter ews_feeder_login to the login name of the feeder EWS account. Then
+click Save Changes.
+
+Note that setting ews_feeder_login to the empty string will effectively disable the extension
+though the extension will still be loaded.
diff --git a/Websites/bugs.webkit.org/extensions/EWS/lib/ParamsPanelUI.pm b/Websites/bugs.webkit.org/extensions/EWS/lib/ParamsPanelUI.pm
new file mode 100644 (file)
index 0000000..cbd997a
--- /dev/null
@@ -0,0 +1,59 @@
+# Copyright (C) 2018 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package Bugzilla::Extension::EWS::ParamsPanelUI;
+
+use strict;
+use warnings;
+
+use Bugzilla::Config::Common;
+use Bugzilla::User;
+
+our $sortkey = 5000;
+
+sub checkUser($)
+{
+    my ($name) = @_;
+    if (!$name) {
+        return "";
+    }
+    my $user = new Bugzilla::User({ name => $name });
+    if (!defined($user)) {
+        return "Must be an existing login name";
+    }
+    return "";
+}
+
+sub get_param_list
+{
+    my ($class) = @_;
+
+    my @parameters = ({
+        name => "ews_feeder_login",
+        type => "t",
+        default => "",
+        checker => \&checkUser,
+    });
+    return @parameters;
+}
+
+1;
diff --git a/Websites/bugs.webkit.org/extensions/EWS/template/en/default/admin/params/ews.html.tmpl b/Websites/bugs.webkit.org/extensions/EWS/template/en/default/admin/params/ews.html.tmpl
new file mode 100644 (file)
index 0000000..c56d063
--- /dev/null
@@ -0,0 +1,36 @@
+[%
+# Copyright (C) 2018 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+%]
+[%
+title = "EWS"
+desc = "Configure EWS"
+%]
+
+[%
+param_descs = {
+    ews_feeder_login =>
+        "The login of the feeder EWS queue."
+      _ "<p>This account will be added to the CC list of each bug that has a patch up for review, including bugs "
+      _ "that would normally be inaccessible from this account.</p>",
+}
+%]