summaryrefslogtreecommitdiffstats
path: root/extensions/MozProjectReview/Extension.pm
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/MozProjectReview/Extension.pm')
-rw-r--r--extensions/MozProjectReview/Extension.pm253
1 files changed, 253 insertions, 0 deletions
diff --git a/extensions/MozProjectReview/Extension.pm b/extensions/MozProjectReview/Extension.pm
new file mode 100644
index 000000000..4bf71188f
--- /dev/null
+++ b/extensions/MozProjectReview/Extension.pm
@@ -0,0 +1,253 @@
+# 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.
+package Bugzilla::Extension::MozProjectReview;
+
+use strict;
+
+use base qw(Bugzilla::Extension);
+
+use Bugzilla::User;
+use Bugzilla::Group;
+use Bugzilla::Error;
+use Bugzilla::Constants;
+
+our $VERSION = '0.01';
+
+sub post_bug_after_creation {
+ my ($self, $args) = @_;
+ my $vars = $args->{vars};
+ my $bug = $vars->{bug};
+
+ my $user = Bugzilla->user;
+ my $params = Bugzilla->input_params;
+ my $template = Bugzilla->template;
+
+ return if !($params->{format}
+ && $params->{format} eq 'moz-project-review'
+ && $bug->component eq 'Project Review');
+
+ my $error_mode_cache = Bugzilla->error_mode;
+ Bugzilla->error_mode(ERROR_MODE_DIE);
+
+ # do a match if applicable
+ Bugzilla::User::match_field({
+ 'legal_cc' => { 'type' => 'multi' }
+ });
+
+ my ($do_sec_review, $do_legal, $do_finance, $do_privacy_vendor,
+ $do_data_safety, $do_privacy_tech, $do_privacy_policy);
+
+ if ($params->{mozilla_data} eq 'Yes') {
+ $do_legal = 1;
+ $do_privacy_policy = 1;
+ $do_privacy_tech = 1;
+ $do_sec_review = 1;
+ }
+
+ if ($params->{mozilla_data} eq 'Yes'
+ && $params->{data_safety_user_data} eq 'Yes')
+ {
+ $do_data_safety = 1;
+ }
+
+ if ($params->{new_or_change} eq 'New') {
+ $do_legal = 1;
+ $do_privacy_policy = 1;
+ }
+ elsif ($params->{new_or_change} eq 'Existing') {
+ $do_legal = 1;
+ }
+
+ if ($params->{separate_party} eq 'Yes') {
+ $do_legal = 1;
+ }
+
+ if ($params->{data_access} eq 'Yes') {
+ $do_privacy_policy = 1;
+ $do_sec_review = 1;
+ }
+
+ if ($params->{data_access} eq 'Yes'
+ && $params->{'privacy_policy_vendor_user_data'} eq 'Yes')
+ {
+ $do_privacy_vendor = 1;
+ }
+
+ if ($params->{vendor_cost} eq '> $25,000') {
+ $do_finance = 1;
+ }
+
+ my ($sec_review_bug, $legal_bug, $finance_bug, $privacy_vendor_bug,
+ $data_safety_bug, $privacy_tech_bug, $privacy_policy_bug);
+
+ eval {
+ if ($do_sec_review) {
+ my $bug_data = {
+ short_desc => 'Security Review for ' . $bug->short_desc,
+ product => 'mozilla.org',
+ component => 'Security Assurance: Review Request',
+ bug_severity => 'normal',
+ groups => [ 'mozilla-corporation-confidential' ],
+ keywords => 'sec-review-needed',
+ op_sys => 'All',
+ rep_platform => 'All',
+ version => 'other',
+ blocked => $bug->bug_id,
+ };
+ $sec_review_bug = _file_child_bug($bug, $vars, 'sec-review', $bug_data);
+ }
+
+ if ($do_legal) {
+ my $component;
+ if ($params->{new_or_change} eq 'New') {
+ $component = 'General';
+ }
+ elsif ($params->{new_or_change} eq 'Existing') {
+ $component = $params->{mozilla_project};
+ }
+
+ if ($params->{separate_party} eq 'Yes'
+ && $params->{relationship_type})
+ {
+ $component = $params->{relationship_type} eq 'unspecified'
+ ? 'General'
+ : $params->{relationship_type};
+ }
+
+ my $bug_data = {
+ short_desc => 'Complete Legal Review for ' . $bug->short_desc,
+ product => 'Legal',
+ component => $component,
+ bug_severity => 'normal',
+ priority => '--',
+ groups => [ 'legal' ],
+ op_sys => 'All',
+ rep_platform => 'All',
+ version => 'unspecified',
+ blocked => $bug->bug_id,
+ cc => $params->{'legal_cc'},
+ };
+ $legal_bug = _file_child_bug($bug, $vars, 'legal', $bug_data);
+
+ }
+
+ if ($do_finance) {
+ my $bug_data = {
+ short_desc => 'Complete Finance Review for ' . $bug->short_desc,
+ product => 'Finance',
+ component => 'Purchase Request Form',
+ bug_severity => 'normal',
+ priority => '--',
+ groups => [ 'finance' ],
+ op_sys => 'All',
+ rep_platform => 'All',
+ version => 'unspecified',
+ blocked => $bug->bug_id,
+ };
+ $finance_bug = _file_child_bug($bug, $vars, 'finance', $bug_data);
+ }
+
+ if ($do_data_safety) {
+ my $bug_data = {
+ short_desc => 'Data Safety Review for ' . $bug->short_desc,
+ product => 'Data Safety',
+ component => 'General',
+ bug_severity => 'normal',
+ priority => '--',
+ op_sys => 'All',
+ rep_platform => 'All',
+ version => 'unspecified',
+ blocked => $bug->bug_id,
+ };
+ $data_safety_bug = _file_child_bug($bug, $vars, 'data-safety', $bug_data);
+ }
+
+ if ($do_privacy_tech) {
+ my $bug_data = {
+ short_desc => 'Complete Privacy-Technical Review for ' . $bug->short_desc,
+ product => 'mozilla.org',
+ component => 'Security Assurance: Review Request',
+ bug_severity => 'normal',
+ priority => '--',
+ keywords => 'privacy-review-needed',
+ groups => [ 'mozilla-corporation-confidential' ],
+ op_sys => 'All',
+ rep_platform => 'All',
+ version => 'other',
+ blocked => $bug->bug_id,
+ };
+ $privacy_tech_bug = _file_child_bug($bug, $vars, 'privacy-tech', $bug_data);
+ }
+
+ if ($do_privacy_policy) {
+ my $bug_data = {
+ short_desc => 'Complete Privacy-Policy Review for ' . $bug->short_desc,
+ product => 'Privacy',
+ component => 'Privacy Review',
+ bug_severity => 'normal',
+ priority => '--',
+ op_sys => 'All',
+ rep_platform => 'All',
+ version => 'unspecified',
+ blocked => $bug->bug_id,
+ };
+ $privacy_policy_bug = _file_child_bug($bug, $vars, 'privacy-policy', $bug_data);
+ }
+
+ if ($do_privacy_vendor) {
+ my $bug_data = {
+ short_desc => 'Complete Privacy / Vendor Review for ' . $bug->short_desc,
+ product => 'Privacy',
+ component => 'Vendor Review',
+ bug_severity => 'normal',
+ priority => '--',
+ op_sys => 'All',
+ rep_platform => 'All',
+ version => 'unspecified',
+ blocked => $bug->bug_id,
+ };
+ $privacy_vendor_bug = _file_child_bug($bug, $vars, 'privacy-vendor', $bug_data);
+ }
+ };
+
+ my $error = $@;
+ Bugzilla->error_mode($error_mode_cache);
+
+ if ($error
+ || ($do_legal && !$legal_bug)
+ || ($do_sec_review && !$sec_review_bug)
+ || ($do_finance && !$finance_bug)
+ || ($do_data_safety && !$data_safety_bug)
+ || ($do_privacy_tech && !$privacy_tech_bug)
+ || ($do_privacy_policy && !$privacy_policy_bug)
+ || ($do_privacy_vendor && !$privacy_vendor_bug))
+ {
+ warn "Failed to create additional moz-project-review bugs: $error" if $error;
+ $vars->{message} = 'moz_project_review_creation_failed';
+ $vars->{message_error} = $error;
+ }
+}
+
+sub _file_child_bug {
+ my ($parent_bug, $vars, $template_suffix, $bug_data) = @_;
+ my $template = Bugzilla->template;
+ my $comment = "";
+
+ my $full_template = "bug/create/comment-moz-project-review-$template_suffix.txt.tmpl";
+ $template->process($full_template, $vars, \$comment)
+ || ThrowTemplateError($template->error());
+
+ $bug_data->{comment} = $comment;
+ my $new_bug = Bugzilla::Bug->create($bug_data);
+
+ $parent_bug->set_all({ dependson => { add => [ $new_bug->bug_id ] }});
+ Bugzilla::BugMail::Send($new_bug->id, { changer => Bugzilla->user });
+
+ return $new_bug;
+}
+
+__PACKAGE__->NAME;