#!/usr/bin/perl -wT # The contents of this file are subject to the Mozilla Public # License Version 1.1 (the "License"); you may not use this file # except in compliance with the License. You may obtain a copy of # the License at http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing # rights and limitations under the License. # # The Original Code is the Bugzilla Bug Tracking System. # # The Initial Developer of the Original Code is Netscape Communications # Corporation. Portions created by Netscape are # Copyright (C) 1998 Netscape Communications Corporation. All # Rights Reserved. # # Contributor(s): Terry Weissman # J. Paul Reed # Frédéric Buclin 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 $ARGS = Bugzilla->input_params; my $user = Bugzilla->login(LOGIN_REQUIRED); my $template = Bugzilla->template; my $vars = {}; $user->in_group('tweakparams') || ThrowUserError("auth_failure", { group => "tweakparams", action => "access", object => "parameters", }); my $action = trim($ARGS->{action} || ''); my $token = $ARGS->{token}; my $current_panel = $ARGS->{section} || 'core'; $current_panel =~ /^([A-Za-z0-9_-]+)$/; $current_panel = $1; my $panels = Bugzilla::Config::param_panel_props(); $current_panel = undef if !$panels->{$current_panel}; $panels->{$current_panel}->{current} = 1 if $current_panel; $vars->{panels} = [ values %$panels ]; if ($action eq 'save' && $current_panel) { check_token_data($token, 'edit_parameters'); my @changes = (); my @module_param_list = @{ $panels->{$current_panel}->{params} }; foreach my $i (@module_param_list) { my $name = $i->{name}; my $value = $ARGS->{$name}; if ($ARGS->{"reset-$name"} && !$i->{no_reset}) { $value = $i->{default}; } else { if ($i->{type} eq 'm') { # This simplifies the code below $value = [ list $ARGS->{$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$//; } } 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)) { unless (Bugzilla::User::login_to_id($watcher)) { ThrowUserError('invalid_parameter', { name => $name, err => "no such user $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()); exit;