summaryrefslogtreecommitdiffstats
path: root/editparams.cgi
diff options
context:
space:
mode:
Diffstat (limited to 'editparams.cgi')
-rwxr-xr-xeditparams.cgi231
1 files changed, 120 insertions, 111 deletions
diff --git a/editparams.cgi b/editparams.cgi
index 2dd9ff08d..01e824d55 100755
--- a/editparams.cgi
+++ b/editparams.cgi
@@ -25,148 +25,157 @@ use Bugzilla::User::Setting;
use Bugzilla::Status;
use Module::Runtime qw(require_module);
-my $user = Bugzilla->login(LOGIN_REQUIRED);
-my $cgi = Bugzilla->cgi;
+my $user = Bugzilla->login(LOGIN_REQUIRED);
+my $cgi = Bugzilla->cgi;
my $template = Bugzilla->template;
-my $vars = {};
+my $vars = {};
print $cgi->header();
$user->in_group('tweakparams')
- || ThrowUserError("auth_failure", {group => "tweakparams",
- action => "access",
- object => "parameters"});
+ || ThrowUserError("auth_failure",
+ {group => "tweakparams", action => "access", object => "parameters"});
-my $action = trim($cgi->param('action') || '');
-my $token = $cgi->param('token');
+my $action = trim($cgi->param('action') || '');
+my $token = $cgi->param('token');
my $current_panel = $cgi->param('section') || 'general';
$current_panel =~ /^([A-Za-z0-9_-]+)$/;
$current_panel = $1;
my $current_module;
-my @panels = ();
+my @panels = ();
my $param_panels = Bugzilla::Config::param_panels();
-my $override = Bugzilla->localconfig->{param_override};
+my $override = Bugzilla->localconfig->{param_override};
foreach my $panel (keys %$param_panels) {
- my $module = $param_panels->{$panel};
- require_module($module);
- 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,
- param_override => { map { $_->{name} => $override->{$_->{name}} } @module_param_list },
- sortkey => eval "\$${module}::sortkey;",
- module => $module,
- };
- $item->{sortkey} //= 100000;
- push(@panels, $item);
- $current_module = $panel if ($current_panel eq lc($panel));
+ my $module = $param_panels->{$panel};
+ require_module($module);
+ 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,
+ param_override =>
+ {map { $_->{name} => $override->{$_->{name}} } @module_param_list},
+ sortkey => eval "\$${module}::sortkey;",
+ module => $module,
+ };
+ $item->{sortkey} //= 100000;
+ push(@panels, $item);
+ $current_module = $panel if ($current_panel eq lc($panel));
}
-my %hook_panels = map { $_->{name} => { params => $_->{param_list} } }
- @panels;
+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 });
+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} };
-
- my $any_changed = 0;
- 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#/$#);
- }
- }
+ check_token_data($token, 'edit_parameters');
+ my @changes = ();
+ my @module_param_list = @{$hook_panels{lc($current_module)}->{params}};
- 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;
- }
+ my $any_changed = 0;
+ foreach my $i (@module_param_list) {
+ my $name = $i->{'name'};
+ my $value = $cgi->param($name);
- 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
- # can not 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 'duplicate_or_move_bug_status') {
- Bugzilla::Status::add_missing_bug_status_transitions($value);
- }
- $any_changed = 1;
- }
+ 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#/$#);
+ }
}
- # allow panels to check inter-dependent params
- if ($any_changed) {
- foreach my $panel (@panels) {
- next unless $panel->{name} eq lc($current_module);
- my $module = $panel->{module};
- next unless $module->can('check_params');
- my $err = $module->check_params(Bugzilla->params);
- if ($err ne '') {
- ThrowUserError('invalid_parameters', { err => $err });
- }
+ 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
+ # can not 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 'duplicate_or_move_bug_status') {
+ Bugzilla::Status::add_missing_bug_status_transitions($value);
+ }
+ $any_changed = 1;
+ }
+ }
+
+ # allow panels to check inter-dependent params
+ if ($any_changed) {
+ foreach my $panel (@panels) {
+ next unless $panel->{name} eq lc($current_module);
+ my $module = $panel->{module};
+ next unless $module->can('check_params');
+ my $err = $module->check_params(Bugzilla->params);
+ if ($err ne '') {
+ ThrowUserError('invalid_parameters', {err => $err});
+ }
+ last;
}
+ }
- $vars->{'message'} = 'parameters_updated';
- $vars->{'param_changed'} = \@changes;
+ $vars->{'message'} = 'parameters_updated';
+ $vars->{'param_changed'} = \@changes;
- write_params();
- delete_token($token);
+ write_params();
+ delete_token($token);
}
$vars->{'token'} = issue_session_token('edit_parameters');
$template->process("admin/params/editparams.html.tmpl", $vars)
- || ThrowTemplateError($template->error());
+ || ThrowTemplateError($template->error());