aboutsummaryrefslogtreecommitdiff
path: root/editparams.cgi
diff options
context:
space:
mode:
Diffstat (limited to 'editparams.cgi')
-rwxr-xr-xeditparams.cgi151
1 files changed, 151 insertions, 0 deletions
diff --git a/editparams.cgi b/editparams.cgi
new file mode 100755
index 0000000..b522fd4
--- /dev/null
+++ b/editparams.cgi
@@ -0,0 +1,151 @@
+#!/usr/bin/perl -wT
+# 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 strict;
+use lib qw(. lib);
+
+use Bugzilla;
+use Bugzilla::Constants;
+use Bugzilla::Config qw(:admin);
+use Bugzilla::Config::Common;
+use Bugzilla::Hook;
+use Bugzilla::Util;
+use Bugzilla::Error;
+use Bugzilla::Token;
+use Bugzilla::User;
+use Bugzilla::User::Setting;
+use Bugzilla::Status;
+
+my $user = Bugzilla->login(LOGIN_REQUIRED);
+my $cgi = Bugzilla->cgi;
+my $template = Bugzilla->template;
+my $vars = {};
+
+print $cgi->header();
+
+$user->in_group('tweakparams')
+ || ThrowUserError("auth_failure", {group => "tweakparams",
+ action => "access",
+ object => "parameters"});
+
+my $action = trim($cgi->param('action') || '');
+my $token = $cgi->param('token');
+my $current_panel = $cgi->param('section') || 'core';
+$current_panel =~ /^([A-Za-z0-9_-]+)$/;
+$current_panel = $1;
+
+my $current_module;
+my @panels = ();
+my $param_panels = Bugzilla::Config::param_panels();
+foreach my $panel (keys %$param_panels) {
+ my $module = $param_panels->{$panel};
+ eval("require $module") || die $@;
+ my @module_param_list = "$module"->get_param_list();
+ my $item = { name => lc($panel),
+ current => ($current_panel eq lc($panel)) ? 1 : 0,
+ param_list => \@module_param_list,
+ sortkey => eval "\$${module}::sortkey;"
+ };
+ defined($item->{'sortkey'}) || ($item->{'sortkey'} = 100000);
+ push(@panels, $item);
+ $current_module = $panel if ($current_panel eq lc($panel));
+}
+
+my %hook_panels = map { $_->{name} => { params => $_->{param_list} } }
+ @panels;
+# Note that this hook is also called in Bugzilla::Config.
+Bugzilla::Hook::process('config_modify_panels', { panels => \%hook_panels });
+
+$vars->{panels} = \@panels;
+
+if ($action eq 'save' && $current_module) {
+ check_token_data($token, 'edit_parameters');
+ my @changes = ();
+ my @module_param_list = @{ $hook_panels{lc($current_module)}->{params} };
+
+ foreach my $i (@module_param_list) {
+ my $name = $i->{'name'};
+ my $value = $cgi->param($name);
+
+ if (defined $cgi->param("reset-$name") && !$i->{'no_reset'}) {
+ $value = $i->{'default'};
+ } else {
+ if ($i->{'type'} eq 'm') {
+ # This simplifies the code below
+ $value = [ $cgi->param($name) ];
+ } else {
+ # Get rid of windows/mac-style line endings.
+ $value =~ s/\r\n?/\n/g;
+ # assume single linefeed is an empty string
+ $value =~ s/^\n$//;
+ }
+ # Stop complaining if the URL has no trailing slash.
+ # XXX - This hack can go away once bug 303662 is implemented.
+ if ($name =~ /(?<!webdot)base$/) {
+ $value = "$value/" if ($value && $value !~ m#/$#);
+ }
+ }
+
+ my $changed;
+ if ($i->{'type'} eq 'm') {
+ my @old = sort @{Bugzilla->params->{$name}};
+ my @new = sort @$value;
+ if (scalar(@old) != scalar(@new)) {
+ $changed = 1;
+ } else {
+ $changed = 0; # Assume not changed...
+ for (my $cnt = 0; $cnt < scalar(@old); ++$cnt) {
+ if ($old[$cnt] ne $new[$cnt]) {
+ # entry is different, therefore changed
+ $changed = 1;
+ last;
+ }
+ }
+ }
+ } else {
+ $changed = ($value eq Bugzilla->params->{$name})? 0 : 1;
+ }
+
+ if ($changed) {
+ if (exists $i->{'checker'}) {
+ my $ok = $i->{'checker'}->($value, $i);
+ if ($ok ne "") {
+ ThrowUserError('invalid_parameter', { name => $name, err => $ok });
+ }
+ } elsif ($name eq 'globalwatchers') {
+ # can't check this as others, as Bugzilla::Config::Common
+ # cannot use Bugzilla::User
+ foreach my $watcher (split(/[,\s]+/, $value)) {
+ ThrowUserError(
+ 'invalid_parameter',
+ { name => $name, err => "no such user $watcher" }
+ ) unless login_to_id($watcher);
+ }
+ }
+ push(@changes, $name);
+ SetParam($name, $value);
+ if (($name eq "shutdownhtml") && ($value ne "")) {
+ $vars->{'shutdown_is_active'} = 1;
+ }
+ if ($name eq 'duplicate_or_move_bug_status') {
+ Bugzilla::Status::add_missing_bug_status_transitions($value);
+ }
+ }
+ }
+
+ $vars->{'message'} = 'parameters_updated';
+ $vars->{'param_changed'} = \@changes;
+
+ write_params();
+ delete_token($token);
+}
+
+$vars->{'token'} = issue_session_token('edit_parameters');
+
+$template->process("admin/params/editparams.html.tmpl", $vars)
+ || ThrowTemplateError($template->error());