aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extensions/RestrictComments/Config.pm18
-rw-r--r--extensions/RestrictComments/Extension.pm107
-rw-r--r--extensions/RestrictComments/lib/Config.pm49
-rw-r--r--extensions/RestrictComments/template/en/default/admin/params/restrictcomments.html.tmpl23
-rw-r--r--extensions/RestrictComments/template/en/default/hook/bug/edit-after_comment_commit_button.html.tmpl35
-rw-r--r--extensions/RestrictComments/template/en/default/pages/restrict_comments_guidelines.html.tmpl62
-rw-r--r--template/en/default/bug/edit.html.tmpl7
-rw-r--r--template/en/default/pages/fields.html.tmpl3
8 files changed, 302 insertions, 2 deletions
diff --git a/extensions/RestrictComments/Config.pm b/extensions/RestrictComments/Config.pm
new file mode 100644
index 000000000..eb99e5a94
--- /dev/null
+++ b/extensions/RestrictComments/Config.pm
@@ -0,0 +1,18 @@
+# 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::RestrictComments;
+
+use 5.10.1;
+use strict;
+use warnings;
+
+use constant NAME => 'RestrictComments';
+use constant REQUIRED_MODULES => [];
+use constant OPTIONAL_MODULES => [];
+
+__PACKAGE__->NAME;
diff --git a/extensions/RestrictComments/Extension.pm b/extensions/RestrictComments/Extension.pm
new file mode 100644
index 000000000..9f2afde6a
--- /dev/null
+++ b/extensions/RestrictComments/Extension.pm
@@ -0,0 +1,107 @@
+# 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::RestrictComments;
+
+use 5.10.1;
+use strict;
+use warnings;
+
+use base qw(Bugzilla::Extension);
+
+use Bugzilla::Constants;
+use Bugzilla::Util qw(i_am_webservice);
+
+BEGIN {
+ *Bugzilla::Bug::restrict_comments = \&_bug_restrict_comments;
+}
+
+sub _bug_restrict_comments {
+ my ($self) = @_;
+ return $self->{restrict_comments};
+}
+
+sub bug_check_can_change_field {
+ my ($self, $args) = @_;
+ my ($bug, $priv_results) = @$args{qw(bug priv_results)};
+ my $user = Bugzilla->user;
+
+ if ( $user->id
+ && $bug->restrict_comments
+ && !$user->in_group(Bugzilla->params->{'restrict_comments_group'}))
+ {
+ push @$priv_results,
+ {
+ result => PRIVILEGES_REQUIRED_EMPOWERED,
+ reason => 'Specific permissions are required to make this change',
+ };
+ return;
+ }
+}
+
+sub _can_restrict_comments {
+ my ($self, $object) = @_;
+ return unless $object->isa('Bugzilla::Bug');
+ return Bugzilla->user->in_group(
+ Bugzilla->params->{'restrict_comments_enable_group'});
+}
+
+sub object_end_of_set_all {
+ my ($self, $args) = @_;
+ my $object = $args->{object};
+ my $input = Bugzilla->input_params;
+ my $update_restrict_comments
+ = !i_am_webservice() || exists $input->{restrict_comments};
+ if ($update_restrict_comments && $self->_can_restrict_comments($object)) {
+ $object->set('restrict_comments', $input->{restrict_comments} ? 1 : undef);
+ }
+}
+
+sub object_update_columns {
+ my ($self, $args) = @_;
+ my ($object, $columns) = @$args{qw(object columns)};
+ if ($self->_can_restrict_comments($object)) {
+ push(@$columns, 'restrict_comments');
+ }
+}
+
+sub object_columns {
+ my ($self, $args) = @_;
+ my ($class, $columns) = @$args{qw(class columns)};
+ if ($class->isa('Bugzilla::Bug')) {
+ push(@$columns, 'restrict_comments');
+ }
+}
+
+sub bug_fields {
+ my ($self, $args) = @_;
+ my $fields = $args->{'fields'};
+ push(@$fields, 'restrict_comments');
+}
+
+sub config_add_panels {
+ my ($self, $args) = @_;
+ my $modules = $args->{panel_modules};
+ $modules->{RestrictComments} = "Bugzilla::Extension::RestrictComments::Config";
+}
+
+sub install_update_db {
+ my $dbh = Bugzilla->dbh;
+
+ my $field = new Bugzilla::Field({name => 'restrict_comments'});
+ if (!$field) {
+ Bugzilla::Field->create({
+ name => 'restrict_comments',
+ description => 'Restrict Comments',
+ type => FIELD_TYPE_INTEGER,
+ });
+ }
+
+ $dbh->bz_add_column('bugs', 'restrict_comments', {TYPE => 'INT2'});
+}
+
+__PACKAGE__->NAME;
diff --git a/extensions/RestrictComments/lib/Config.pm b/extensions/RestrictComments/lib/Config.pm
new file mode 100644
index 000000000..f91676ef3
--- /dev/null
+++ b/extensions/RestrictComments/lib/Config.pm
@@ -0,0 +1,49 @@
+# 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::RestrictComments::Config;
+
+use 5.10.1;
+use strict;
+use warnings;
+
+use Bugzilla::Config::Common;
+use Bugzilla::Group;
+
+our $sortkey = 510;
+
+sub get_param_list {
+ my ($class) = @_;
+
+ my @param_list = (
+ {
+ name => 'restrict_comments_group',
+ type => 's',
+ choices => \&_get_all_group_names,
+ default => '',
+ checker => \&check_group
+ },
+ {
+ name => 'restrict_comments_enable_group',
+ type => 's',
+ choices => \&_get_all_group_names,
+ default => '',
+ checker => \&check_group
+ },
+ );
+
+ return @param_list;
+}
+
+# Copied from Bugzilla/Config/GroupSecurity.pm for older BZ
+sub _get_all_group_names {
+ my @group_names = map { $_->name } Bugzilla::Group->get_all;
+ unshift(@group_names, '');
+ return \@group_names;
+}
+
+1;
diff --git a/extensions/RestrictComments/template/en/default/admin/params/restrictcomments.html.tmpl b/extensions/RestrictComments/template/en/default/admin/params/restrictcomments.html.tmpl
new file mode 100644
index 000000000..d2a050563
--- /dev/null
+++ b/extensions/RestrictComments/template/en/default/admin/params/restrictcomments.html.tmpl
@@ -0,0 +1,23 @@
+[%# 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.
+ #%]
+
+[%
+ title = "Restrict Comments"
+ desc = "Edit Restrict Comments Configuration"
+%]
+
+[% param_descs =
+{
+ restrict_comments_group => "Users must be a member of this group to " _
+ "comment on bug with restricted commenting " _
+ "enabled."
+
+ restrict_comments_enable_group => "Members of this group can toggle " _
+ "'restrict comments' on bugs."
+}
+%]
diff --git a/extensions/RestrictComments/template/en/default/hook/bug/edit-after_comment_commit_button.html.tmpl b/extensions/RestrictComments/template/en/default/hook/bug/edit-after_comment_commit_button.html.tmpl
new file mode 100644
index 000000000..f458e982d
--- /dev/null
+++ b/extensions/RestrictComments/template/en/default/hook/bug/edit-after_comment_commit_button.html.tmpl
@@ -0,0 +1,35 @@
+[%# 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.
+ #%]
+
+
+[% RETURN UNLESS user.in_group(Param('restrict_comments_enable_group')) %]
+
+[%# using a table to match alignment of the needinfo checkboxes %]
+<table [%= IF bug_modal %]class="edit-show" style="display:none"[% END %]>
+<tr>
+ <td>
+ <input type="checkbox" name="restrict_comments" id="restrict_comments"
+ [% " checked" IF bug.restrict_comments %]>
+ <label for="restrict_comments">
+ Restrict commenting on this [% terms.bug %] to users in the
+ <b>[% Param('restrict_comments_group') FILTER html %]</b> group.
+ </label>
+ (<a href="[% basepath FILTER none %]page.cgi?id=restrict_comments_guidelines.html"
+ target="_blank">guidelines</a>)
+ </td>
+</tr>
+</table>
+[% IF bug_modal && bug.restrict_comments %]
+ <table class="edit-hide">
+ <tr>
+ <td>
+ <i>Commenting restricted to members of the <b>[% Param('restrict_comments_group') FILTER html %]</b> group.</i>
+ </td>
+ </tr>
+ </table>
+[% END %]
diff --git a/extensions/RestrictComments/template/en/default/pages/restrict_comments_guidelines.html.tmpl b/extensions/RestrictComments/template/en/default/pages/restrict_comments_guidelines.html.tmpl
new file mode 100644
index 000000000..11c669580
--- /dev/null
+++ b/extensions/RestrictComments/template/en/default/pages/restrict_comments_guidelines.html.tmpl
@@ -0,0 +1,62 @@
+[%# 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 Bugzilla %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Restrict Comments - Guidelines"
+%]
+
+<h3>Restricting Comments</h3>
+
+<p>
+ Some [% terms.bug %] reports are inundated with comments that make it
+ difficult for developers to conduct technical discussions. Restricting
+ comments provides the ability for users in the
+ [%+ Param('restrict_comments_enable_group') FILTER html %] group to prevent
+ users who are not in the [% Param('restrict_comments_group') FILTER html %]
+ from making additional comments.
+</p>
+
+<h3>Guidelines</h3>
+
+<ul>
+ <li>
+ Restrictions may be applied to [% terms.bugs %] which are subject to high
+ volumes of off topic comments, or [% terms.bugs %] which contain high volumes
+ of violations of [% terms.Bugzilla %]
+ <a href="[% basepath FILTER none %]page.cgi?id=etiquette.html">etiquette guidelines</a>.
+ </li>
+ <li>
+ Restrictions should not be used as a preemptive measure against comments
+ which have not yet occurred.
+ </li>
+ <li>
+ Restrictions should not be used to privilege
+ [%+ Param('restrict_comments_group') FILTER html %] users over other users
+ in valid disputes/discussions.
+ </li>
+</ul>
+
+<h3>Impact</h3>
+
+<ul>
+ <li>
+ Users who are not in the [% Param('restrict_comments_group') FILTER html %]
+ group will not be able to comment on the [% terms.bug %], nor will they be
+ able to change the value of any field.
+ </li>
+ <li>
+ All users will still be able to CC themselves to the [% terms.bug %].
+ </li>
+ <li>
+ All users will still be able to vote for the [% terms.bug %].
+ </li>
+</ul>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
index dcadb89d1..b016d8ef7 100644
--- a/template/en/default/bug/edit.html.tmpl
+++ b/template/en/default/bug/edit.html.tmpl
@@ -1152,7 +1152,12 @@
[% END %]
[% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %]
[% ELSE %]
- You are not allowed to make an additional comment on this [% terms.bug %].
+ [% INCLUDE global/textarea.html.tmpl
+ minrows = 10
+ cols = constants.COMMENT_COLS
+ disabled = 1
+ defaultcontent = "You are not allowed to make an additional comment on this bug."
+ %]
[% END %]
<br>
[% PROCESS commit_button id=""%]
diff --git a/template/en/default/pages/fields.html.tmpl b/template/en/default/pages/fields.html.tmpl
index 0c2c81d8c..849160044 100644
--- a/template/en/default/pages/fields.html.tmpl
+++ b/template/en/default/pages/fields.html.tmpl
@@ -228,7 +228,8 @@
</dt>
<dd class="pkgremoved">
The [% terms.bug %] is no longer relevant because the affected
- package was removed from the tree.
+ package was removed from the tree. However, it may become
+ relevant again if the package is reintroduced.
</dd>
[% Hook.process('resolution') %]