зеркало из https://github.com/mozilla/pjs.git
Bug 352608: Make checksetup more localizable
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> (module owner) a=myk
This commit is contained in:
Родитель
db66e79273
Коммит
3a58b68103
|
@ -338,7 +338,11 @@ sub switch_to_main_db {
|
|||
sub get_fields {
|
||||
my $class = shift;
|
||||
my $criteria = shift;
|
||||
return @{Bugzilla::Field->match($criteria)};
|
||||
# This function may be called during installation, and Field::match
|
||||
# may fail at that time. so we want to return an empty list in that
|
||||
# case.
|
||||
my $fields = eval { Bugzilla::Field->match($criteria) } || [];
|
||||
return @$fields;
|
||||
}
|
||||
|
||||
sub custom_field_names {
|
||||
|
|
|
@ -424,9 +424,8 @@ sub bz_add_column {
|
|||
if ( $new_def->{NOTNULL} && !exists $new_def->{DEFAULT}
|
||||
&& !defined $init_value && $new_def->{TYPE} !~ /SERIAL/)
|
||||
{
|
||||
die "Failed adding the column ${table}.${name}:\n You cannot add"
|
||||
. " a NOT NULL column with no default to an existing table,\n"
|
||||
. " unless you specify something for \$init_value."
|
||||
ThrowCodeError('column_not_null_without_default',
|
||||
{ name => "$table.$name" });
|
||||
}
|
||||
|
||||
my $current_def = $self->bz_column_info($table, $name);
|
||||
|
@ -435,8 +434,9 @@ sub bz_add_column {
|
|||
my @statements = $self->_bz_real_schema->get_add_column_ddl(
|
||||
$table, $name, $new_def,
|
||||
defined $init_value ? $self->quote($init_value) : undef);
|
||||
print "Adding new column $name to table $table ...\n"
|
||||
unless i_am_cgi();
|
||||
print get_text('install_column_add',
|
||||
{ column => $name, table => $table }) . "\n"
|
||||
if Bugzilla->usage_mode == USAGE_MODE_CMDLINE;
|
||||
foreach my $sql (@statements) {
|
||||
$self->do($sql);
|
||||
}
|
||||
|
@ -460,12 +460,8 @@ sub bz_alter_column {
|
|||
# Check for NULLs
|
||||
my $any_nulls = $self->selectrow_array(
|
||||
"SELECT 1 FROM $table WHERE $name IS NULL");
|
||||
if ($any_nulls) {
|
||||
die "You cannot alter the ${table}.${name} column to be"
|
||||
. " NOT NULL without\nspecifying a default or"
|
||||
. " something for \$set_nulls_to, because"
|
||||
. " there are\nNULL values currently in it.";
|
||||
}
|
||||
ThrowCodeError('column_not_null_no_default_alter',
|
||||
{ name => "$table.$name" }) if ($any_nulls);
|
||||
}
|
||||
$self->bz_alter_column_raw($table, $name, $new_def, $current_def,
|
||||
$set_nulls_to);
|
||||
|
@ -604,7 +600,9 @@ sub bz_drop_column {
|
|||
if ($current_def) {
|
||||
my @statements = $self->_bz_real_schema->get_drop_column_ddl(
|
||||
$table, $column);
|
||||
print "Deleting unused column $column from table $table ...\n";
|
||||
print get_text('install_column_drop',
|
||||
{ table => $table, column => $column }) . "\n"
|
||||
if Bugzilla->usage_mode == USAGE_MODE_CMDLINE;
|
||||
foreach my $sql (@statements) {
|
||||
# Because this is a deletion, we don't want to die hard if
|
||||
# we fail because of some local customization. If something
|
||||
|
@ -664,7 +662,8 @@ sub bz_drop_table {
|
|||
|
||||
if ($table_exists) {
|
||||
my @statements = $self->_bz_schema->get_drop_table_ddl($name);
|
||||
print "Dropping table $name...\n";
|
||||
print get_text('install_table_drop', { name => $name }) . "\n"
|
||||
if Bugzilla->usage_mode == USAGE_MODE_CMDLINE;
|
||||
foreach my $sql (@statements) {
|
||||
# Because this is a deletion, we don't want to die hard if
|
||||
# we fail because of some local customization. If something
|
||||
|
@ -683,13 +682,16 @@ sub bz_rename_column {
|
|||
|
||||
if ($old_col_exists) {
|
||||
my $already_renamed = $self->bz_column_info($table, $new_name);
|
||||
die "Name conflict: Cannot rename ${table}.${old_name} to"
|
||||
. " ${table}.${new_name},\nbecause ${table}.${new_name}"
|
||||
. " already exists." if $already_renamed;
|
||||
ThrowCodeError('column_rename_conflict',
|
||||
{ old => "$table.$old_name",
|
||||
new => "$table.$new_name" }) if $already_renamed;
|
||||
my @statements = $self->_bz_real_schema->get_rename_column_ddl(
|
||||
$table, $old_name, $new_name);
|
||||
print "Changing column $old_name in table $table to"
|
||||
. " be named $new_name...\n";
|
||||
|
||||
print get_text('install_column_rename',
|
||||
{ old => "$table.$old_name", new => "$table.$new_name" })
|
||||
. "\n" if Bugzilla->usage_mode == USAGE_MODE_CMDLINE;
|
||||
|
||||
foreach my $sql (@statements) {
|
||||
$self->do($sql);
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ use strict;
|
|||
package Bugzilla::Group;
|
||||
|
||||
use base qw(Bugzilla::Object);
|
||||
|
||||
use Bugzilla::Constants;
|
||||
use Bugzilla::Util;
|
||||
use Bugzilla::Error;
|
||||
|
@ -84,7 +85,8 @@ sub create {
|
|||
my ($params) = @_;
|
||||
my $dbh = Bugzilla->dbh;
|
||||
|
||||
print "Creating group $params->{name}...\n" unless i_am_cgi();
|
||||
print get_text('install_group_create', { name => $params->{name} }) . "\n"
|
||||
if Bugzilla->usage_mode == USAGE_MODE_CMDLINE;
|
||||
|
||||
my $group = $class->SUPER::create(@_);
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ use Bugzilla::Group;
|
|||
use Bugzilla::Product;
|
||||
use Bugzilla::User;
|
||||
use Bugzilla::User::Setting;
|
||||
use Bugzilla::Util qw(get_text);
|
||||
use Bugzilla::Version;
|
||||
|
||||
use constant SETTINGS => {
|
||||
|
@ -210,7 +211,8 @@ sub create_default_product {
|
|||
# Make the default Classification if it doesn't already exist.
|
||||
if (!$dbh->selectrow_array('SELECT 1 FROM classifications')) {
|
||||
my $class = DEFAULT_CLASSIFICATION;
|
||||
print "Creating default classification '$class->{name}'...\n";
|
||||
print get_text('install_default_classification',
|
||||
{ name => $class->{name} }) . "\n";
|
||||
$dbh->do('INSERT INTO classifications (name, description)
|
||||
VALUES (?, ?)',
|
||||
undef, $class->{name}, $class->{description});
|
||||
|
@ -219,7 +221,8 @@ sub create_default_product {
|
|||
# And same for the default product/component.
|
||||
if (!$dbh->selectrow_array('SELECT 1 FROM products')) {
|
||||
my $default_prod = DEFAULT_PRODUCT;
|
||||
print "Creating initial dummy product '$default_prod->{name}'...\n";
|
||||
print get_text('install_default_product',
|
||||
{ name => $default_prod->{name} }) . "\n";
|
||||
|
||||
$dbh->do(q{INSERT INTO products (name, description)
|
||||
VALUES (?,?)},
|
||||
|
@ -367,19 +370,6 @@ sub _create_admin_exit {
|
|||
exit 1;
|
||||
}
|
||||
|
||||
sub get_text {
|
||||
my ($name, $vars) = @_;
|
||||
my $template = Bugzilla->template;
|
||||
$vars ||= {};
|
||||
$vars->{'message'} = $name;
|
||||
my $message;
|
||||
$template->process('global/message.txt.tmpl', $vars, \$message)
|
||||
|| ThrowTemplateError($template->error());
|
||||
# Remove the indenting that exists in messages.html.tmpl.
|
||||
$message =~ s/^ //gm;
|
||||
return $message;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
|
|
@ -27,7 +27,9 @@ package Bugzilla::Install::Filesystem;
|
|||
use strict;
|
||||
|
||||
use Bugzilla::Constants;
|
||||
use Bugzilla::Error;
|
||||
use Bugzilla::Install::Localconfig;
|
||||
use Bugzilla::Util;
|
||||
|
||||
use File::Find;
|
||||
use File::Path;
|
||||
|
@ -484,6 +486,9 @@ sub _update_old_charts {
|
|||
sub fix_all_file_permissions {
|
||||
my ($output) = @_;
|
||||
|
||||
my $ws_group = Bugzilla->localconfig->{'webservergroup'};
|
||||
my $group_id = _check_web_server_group($ws_group, $output);
|
||||
|
||||
return if ON_WINDOWS;
|
||||
|
||||
my $fs = FILESYSTEM();
|
||||
|
@ -491,17 +496,10 @@ sub fix_all_file_permissions {
|
|||
my %dirs = %{$fs->{all_dirs}};
|
||||
my %recurse_dirs = %{$fs->{recurse_dirs}};
|
||||
|
||||
print "Fixing file permissions...\n" if $output;
|
||||
print get_text('install_file_perms_fix') . "\n" if $output;
|
||||
|
||||
my $owner_id = POSIX::getuid();
|
||||
my $group_id = POSIX::getgid();
|
||||
my $ws_group = Bugzilla->localconfig->{'webservergroup'};
|
||||
if ($ws_group) {
|
||||
my $ws_group_id = getgrnam($ws_group);
|
||||
die "There is no such group: $ws_group. Check your \$webservergroup"
|
||||
. " setting in localconfig" unless defined $ws_group_id;
|
||||
$group_id = $ws_group_id;
|
||||
}
|
||||
$group_id = POSIX::getgid() unless defined $group_id;
|
||||
|
||||
foreach my $dir (sort keys %dirs) {
|
||||
next unless -d $dir;
|
||||
|
@ -561,6 +559,40 @@ sub _fix_perms {
|
|||
|| warn "Failed to change permissions of $name: $!";
|
||||
}
|
||||
|
||||
sub _check_web_server_group {
|
||||
my ($group, $output) = @_;
|
||||
|
||||
my $filename = bz_locations()->{'localconfig'};
|
||||
my $group_id;
|
||||
|
||||
# If we are on Windows, webservergroup does nothing
|
||||
if (ON_WINDOWS && $group && $output) {
|
||||
print "\n\n" . get_text('install_webservergroup_windows') . "\n\n";
|
||||
}
|
||||
|
||||
# If we're not on Windows, make sure that webservergroup isn't
|
||||
# empty.
|
||||
elsif (!ON_WINDOWS && !$group && $output) {
|
||||
print "\n\n" . get_text('install_webservergroup_empty') . "\n\n";
|
||||
}
|
||||
|
||||
# If we're not on Windows, make sure we are actually a member of
|
||||
# the webservergroup.
|
||||
elsif (!ON_WINDOWS && $group) {
|
||||
$group_id = getgrnam($group);
|
||||
ThrowCodeError('invalid_webservergroup', { group => $group })
|
||||
unless defined $group_id;
|
||||
|
||||
# If on unix, see if we need to print a warning about a webservergroup
|
||||
# that we can't chgrp to
|
||||
if ($output && $< != 0 && !grep($_ eq $group_id, split(" ", $)))) {
|
||||
print "\n\n" . get_text('install_webservergroup_not_in') . "\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
return $group_id;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
|
|
@ -339,9 +339,6 @@ EOT
|
|||
exit;
|
||||
}
|
||||
|
||||
# Now we do some checks on localconfig values.
|
||||
_check_web_server_group($localconfig->{'webservergroup'}) if $output;
|
||||
|
||||
# Reset the cache for Bugzilla->localconfig so that it will be re-read
|
||||
delete Bugzilla->request_cache->{localconfig};
|
||||
|
||||
|
@ -388,68 +385,6 @@ sub _get_default_diffpath {
|
|||
return $diff_binaries;
|
||||
}
|
||||
|
||||
sub _check_web_server_group {
|
||||
my ($group) = @_;
|
||||
|
||||
my $filename = bz_locations()->{'localconfig'};
|
||||
|
||||
# If we are on Windows, webservergroup does nothing
|
||||
if (ON_WINDOWS && $group) {
|
||||
print <<EOT
|
||||
|
||||
Warning: You have set webservergroup in $filename
|
||||
Please understand that this does not bring you any security when
|
||||
running under Windows.
|
||||
Verify that the file permissions in your Bugzilla directory are
|
||||
suitable for your system. Avoid unnecessary write access.
|
||||
|
||||
EOT
|
||||
}
|
||||
|
||||
# If we're not on Windows, make sure that webservergroup isn't
|
||||
# empty.
|
||||
elsif (!ON_WINDOWS && !$group) {
|
||||
print <<EOT;
|
||||
|
||||
********************************************************************************
|
||||
WARNING! You have not entered a value for the "webservergroup" parameter
|
||||
in localconfig. This means that certain files and directories which need
|
||||
to be editable by both you and the webserver must be world writable, and
|
||||
other files (including the localconfig file which stores your database
|
||||
password) must be world readable. This means that _anyone_ who can obtain
|
||||
local access to this machine can do whatever they want to your Bugzilla
|
||||
installation, and is probably also able to run arbitrary Perl code as the
|
||||
user that the webserver runs as.
|
||||
|
||||
You really, really, really need to change this setting.
|
||||
********************************************************************************
|
||||
EOT
|
||||
}
|
||||
|
||||
# If we're not on Windows, make sure we are actually a member of
|
||||
# the webservergroup.
|
||||
elsif (!ON_WINDOWS && $group) {
|
||||
# If on unix, see if we need to print a warning about a webservergroup
|
||||
# that we can't chgrp to
|
||||
my $webservergid = (getgrnam($group))[2]
|
||||
or die("no such group: $group");
|
||||
if ($< != 0 && !grep($_ eq $webservergid, split(" ", $)))) {
|
||||
my $root = ROOT_USER;
|
||||
print <<EOT;
|
||||
|
||||
Warning: you have entered a value for the "webservergroup" parameter in
|
||||
localconfig, but you are not either a) running this script as $root; or b) a
|
||||
member of this group. This can cause permissions problems and decreased
|
||||
security. If you experience problems running Bugzilla scripts, log in as
|
||||
$root and re-run this script, become a member of the group, or remove the
|
||||
value of the "webservergroup" parameter. Note that any warnings about
|
||||
"uninitialized values" that you may see below are caused by this.
|
||||
|
||||
EOT
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
|
|
@ -864,6 +864,9 @@ sub precompile_templates {
|
|||
$template->context->template($file);
|
||||
}
|
||||
}
|
||||
|
||||
# If anything created a Template object before now, clear it out.
|
||||
delete Bugzilla->request_cache->{template};
|
||||
}
|
||||
|
||||
# Helper for precompile_templates
|
||||
|
|
|
@ -23,12 +23,13 @@ package Bugzilla::User::Setting;
|
|||
use strict;
|
||||
use base qw(Exporter);
|
||||
|
||||
|
||||
# Module stuff
|
||||
@Bugzilla::User::Setting::EXPORT = qw(get_all_settings get_defaults
|
||||
add_setting);
|
||||
|
||||
use Bugzilla::Error;
|
||||
use Bugzilla::Util qw{trick_taint};
|
||||
use Bugzilla::Util qw(trick_taint get_text);
|
||||
|
||||
###############################
|
||||
### Module Initialization ###
|
||||
|
@ -135,7 +136,7 @@ sub add_setting {
|
|||
($name && $default_value)
|
||||
|| ThrowCodeError("setting_info_invalid");
|
||||
|
||||
print "Adding a new user setting called '$name'\n";
|
||||
print get_text('install_setting_new', { name => $name }) . "\n";
|
||||
$dbh->do(q{INSERT INTO setting (name, default_value, is_enabled, subclass)
|
||||
VALUES (?, ?, 1, ?)},
|
||||
undef, ($name, $default_value, $subclass));
|
||||
|
|
|
@ -43,7 +43,8 @@ use base qw(Exporter);
|
|||
format_time format_time_decimal validate_date
|
||||
file_mod_time is_7bit_clean
|
||||
bz_crypt generate_random_password
|
||||
validate_email_syntax clean_text);
|
||||
validate_email_syntax clean_text
|
||||
get_text);
|
||||
|
||||
use Bugzilla::Constants;
|
||||
|
||||
|
@ -397,6 +398,20 @@ sub clean_text {
|
|||
return trim($dtext);
|
||||
}
|
||||
|
||||
sub get_text {
|
||||
my ($name, $vars) = @_;
|
||||
my $template = Bugzilla->template;
|
||||
$vars ||= {};
|
||||
$vars->{'message'} = $name;
|
||||
my $message;
|
||||
$template->process('global/message.txt.tmpl', $vars, \$message)
|
||||
|| ThrowTemplateError($template->error());
|
||||
# Remove the indenting that exists in messages.html.tmpl.
|
||||
$message =~ s/^ //gm;
|
||||
return $message;
|
||||
}
|
||||
|
||||
|
||||
sub get_netaddr {
|
||||
my $ipaddr = shift;
|
||||
|
||||
|
@ -683,6 +698,34 @@ ASCII 10 (LineFeed) and ASCII 13 (Carrage Return).
|
|||
Returns the parameter "cleaned" by exchanging non-printable characters with spaces.
|
||||
Specifically characters (ASCII 0 through 31) and (ASCII 127) will become ASCII 32 (Space).
|
||||
|
||||
=item C<get_text>
|
||||
|
||||
=over
|
||||
|
||||
=item B<Description>
|
||||
|
||||
This is a method of getting localized strings within Bugzilla code.
|
||||
Use this when you don't want to display a whole template, you just
|
||||
want a particular string.
|
||||
|
||||
It uses the F<global/message.txt.tmpl> template to return a string.
|
||||
|
||||
=item B<Params>
|
||||
|
||||
=over
|
||||
|
||||
=item C<$message> - The identifier for the message.
|
||||
|
||||
=item C<$vars> - A hashref. Any variables you want to pass to the template.
|
||||
|
||||
=back
|
||||
|
||||
=item B<Returns>
|
||||
|
||||
A string.
|
||||
|
||||
=back
|
||||
|
||||
=back
|
||||
|
||||
=head2 Formatting Time
|
||||
|
|
|
@ -47,6 +47,7 @@ use 5.008;
|
|||
use File::Basename;
|
||||
use Getopt::Long qw(:config bundling);
|
||||
use Pod::Usage;
|
||||
use POSIX qw(setlocale LC_CTYPE);
|
||||
use Safe;
|
||||
|
||||
BEGIN { chdir dirname($0); }
|
||||
|
@ -130,6 +131,10 @@ require Bugzilla::Install;
|
|||
|
||||
Bugzilla->usage_mode(USAGE_MODE_CMDLINE);
|
||||
|
||||
# When we're running at the command line, we need to pick the right
|
||||
# language before ever creating a template object.
|
||||
$ENV{'HTTP_ACCEPT_LANGUAGE'} ||= setlocale(LC_CTYPE);
|
||||
|
||||
###########################################################################
|
||||
# Check and update --LOCAL-- configuration
|
||||
###########################################################################
|
||||
|
|
|
@ -108,6 +108,20 @@
|
|||
Charts will not work without the Chart::Lines Perl module being installed.
|
||||
Run checksetup.pl for installation instructions.
|
||||
|
||||
[% ELSIF error == "column_not_null_without_default" %]
|
||||
Failed adding the column [% name FILTER html %]:
|
||||
You cannot add a NOT NULL column with no default to an existing table
|
||||
unless you specify something for the <code>$init_value</code> argument.
|
||||
|
||||
[% ELSIF error == "column_not_null_no_default_alter" %]
|
||||
You cannot alter the [% name FILTER html %] column to be NOT NULL
|
||||
without specifying a default or something for $set_nulls_to, because
|
||||
there are NULL values currently in it.
|
||||
|
||||
[% ELSIF error == "column_rename_conflict" %]
|
||||
Name conflict: Cannot rename [% old FILTER html %] to
|
||||
[% new FILTER html %] because [% new FILTER html %] already exists.
|
||||
|
||||
[% ELSIF error == "cookies_need_value" %]
|
||||
Every cookie must have a value.
|
||||
|
||||
|
@ -192,6 +206,10 @@
|
|||
The series_id [% series_id FILTER html %] is not valid. It may be that
|
||||
this series has been deleted.
|
||||
|
||||
[% ELSIF error == "invalid_webservergroup" %]
|
||||
There is no such group: [% group FILTER html %]. Check your $webservergroup
|
||||
setting in [% constants.bz_locations.localconfig FILTER html %].
|
||||
|
||||
[% ELSIF error == "list_comparison_error" %]
|
||||
Unexpected error in list comparing code.
|
||||
|
||||
|
|
|
@ -282,12 +282,68 @@
|
|||
Either this is your first time using [% terms.Bugzilla %], or your
|
||||
administrator's privileges might have accidentally been deleted.
|
||||
|
||||
[% ELSIF message_tag == "install_column_add" %]
|
||||
Adding new column '[% column FILTER html %]' to the '[% table FILTER html %]' table...
|
||||
|
||||
[% ELSIF message_tag == "install_column_drop" %]
|
||||
Deleting the '[% column FILTER html %]' column from the '[% table FILTER html %]' table...
|
||||
|
||||
[% ELSIF message_tag == "install_column_rename" %]
|
||||
Renaming column '[% old FILTER html %]' to '[% new FILTER html %]'...
|
||||
|
||||
[% ELSIF message_tag == "install_default_classification" %]
|
||||
Creating default classification '[% name FILTER html %]'...
|
||||
|
||||
[% ELSIF message_tag == "install_default_product" %]
|
||||
Creating initial dummy product '[% name FILTER html %]'...
|
||||
|
||||
[% ELSIF message_tag == "install_file_perms_fix" %]
|
||||
Fixing file permissions...
|
||||
|
||||
[% ELSIF message_tag == "install_group_create" %]
|
||||
Creating group [% name FILTER html %]...
|
||||
|
||||
[% ELSIF message_tag == "install_setting_new" %]
|
||||
Adding a new user setting called '[% name FILTER html %]'
|
||||
|
||||
[% ELSIF message_tag == "install_table_drop" %]
|
||||
Dropping the '[% name FILTER html %]' table...
|
||||
|
||||
[% ELSIF message_tag == "install_urlbase_default" %]
|
||||
Now that you have installed [% terms.Bugzilla %], you should visit the
|
||||
'Parameters' page (linked in the footer of the Administrator
|
||||
account) to ensure it is set up as you wish - this includes
|
||||
setting the 'urlbase' option to the correct url.
|
||||
|
||||
[% ELSIF message_tag == "install_webservergroup_empty" %]
|
||||
****************************************************************************
|
||||
WARNING! You have not entered a value for the "webservergroup" parameter
|
||||
in localconfig. This means that certain files and directories which need
|
||||
to be editable by both you and the webserver must be world writable, and
|
||||
other files (including the localconfig file which stores your database
|
||||
password) must be world readable. This means that _anyone_ who can obtain
|
||||
local access to this machine can do whatever they want to your
|
||||
[%+ terms.Bugzilla %] installation, and is probably also able to run
|
||||
arbitrary Perl code as the user that the webserver runs as.
|
||||
|
||||
You really, really, really need to change this setting.
|
||||
****************************************************************************
|
||||
|
||||
[% ELSIF message_tag == "install_webservergroup_not_in" %]
|
||||
Warning: you have entered a value for the "webservergroup" parameter in
|
||||
localconfig, but you are not either a) running this script as [% constants.ROOT_USER FILTER html %];
|
||||
or b) a member of this group. This can cause permissions problems and
|
||||
decreased security. If you experience problems running [% terms.Bugzilla %]
|
||||
scripts, log in as [% constants.ROOT_USER FILTER html %] and re-run this script, become a
|
||||
member of the group, or remove the value of the "webservergroup" parameter.
|
||||
|
||||
[% ELSIF message_tag == "install_webservergroup_windows" %]
|
||||
Warning: You have set webservergroup in [% constants.bz_locations.localconfig FILTER html %]
|
||||
Please understand that this does not bring you any security when
|
||||
running under Windows.
|
||||
Verify that the file permissions in your [% terms.Bugzilla %] directory are
|
||||
suitable for your system. Avoid unnecessary write access.
|
||||
|
||||
[% ELSIF message_tag == "product_invalid" %]
|
||||
[% title = "$terms.Bugzilla Component Descriptions" %]
|
||||
The product <em>[% product FILTER html %]</em> does not exist
|
||||
|
|
Загрузка…
Ссылка в новой задаче