aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/RestrictComments/Extension.pm')
-rw-r--r--extensions/RestrictComments/Extension.pm107
1 files changed, 107 insertions, 0 deletions
diff --git a/extensions/RestrictComments/Extension.pm b/extensions/RestrictComments/Extension.pm
new file mode 100644
index 000000000..71971079b
--- /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_BOOLEAN,
+ });
+ }
+
+ $dbh->bz_add_column('bugs', 'restrict_comments', {TYPE => 'BOOLEAN'});
+}
+
+__PACKAGE__->NAME;