[Pkg-shadow-devel] [Git][debian/adduser][wip-exp] 45 commits: update German translation of man page
Marc Haber (@zugschlus)
gitlab at salsa.debian.org
Tue Feb 18 14:25:51 GMT 2025
Marc Haber pushed to branch wip-exp at Debian / adduser
Commits:
47c0575e by Marc Haber at 2024-11-16T15:59:46+01:00
update German translation of man page
Thanks: Helge Kreutzmann
- - - - -
43a40e9d by Marc Haber at 2024-11-18T15:40:34+01:00
Formatting improvements to manual pages
Thanks: Helge Kreutzmann
Closes: 1087703
- - - - -
da92f716 by Marc Haber at 2025-02-18T15:25:26+01:00
add trace output to sanitize_string
- - - - -
d2b0dc56 by Marc Haber at 2025-02-18T15:25:26+01:00
remove po/Makefile, see discussion in #1031081
- - - - -
62ef2079 by Marc Haber at 2025-02-18T15:25:26+01:00
modernize default use clauses at the beginning
- - - - -
5c9c3388 by Marc Haber at 2025-02-18T15:25:26+01:00
use Encode and define $charset, set binmode for standard output and error
- - - - -
7b5d9e5e by Marc Haber at 2025-02-18T15:25:26+01:00
define and export egetgrnam and egetpwnam
- - - - -
f1fb125a by Marc Haber at 2025-02-18T15:25:26+01:00
more debug output in sanitize_string
- - - - -
cb5b231e by Marc Haber at 2025-02-18T15:25:26+01:00
more logging
Git-Dch: ignore
- - - - -
aaa779cc by Marc Haber at 2025-02-18T15:25:26+01:00
use eget(gr|pw)nam in Tests
Git-Dch: ignore
- - - - -
0fea87ed by Marc Haber at 2025-02-18T15:25:26+01:00
encode username according to charset
Git-Dch: ignore
- - - - -
43b09b35 by Marc Haber at 2025-02-18T15:25:26+01:00
use more speaking names than "foo", yielding readable logs
Git-Dch: ignore
- - - - -
e7b37199 by Marc Haber at 2025-02-18T15:25:26+01:00
encode UTF-8 data handed in from external
- - - - -
27b69c30 by Marc Haber at 2025-02-18T15:25:26+01:00
use eget(gr|pw)nam in adduser and deluser
- - - - -
c1148cd3 by Marc Haber at 2025-02-18T15:25:26+01:00
sanitize $PATH
Git-Dch: ignore
- - - - -
1d6219b3 by Marc Haber at 2025-02-18T15:25:26+01:00
sanitize command line data
- - - - -
13b29e4c by Marc Haber at 2025-02-18T15:25:26+01:00
modernize perl (new operator), better logging
Git-Dch: ignore
- - - - -
8aa14ddf by Marc Haber at 2025-02-18T15:25:26+01:00
move validity checks of parameters to a different place
Git-Dch: ignore
- - - - -
3563d31e by Marc Haber at 2025-02-18T15:25:26+01:00
decode configuration data
Git-Dch: ignore
- - - - -
9832fabc by Marc Haber at 2025-02-18T15:25:26+01:00
decode data read from pool
Git-Dch: ignore
- - - - -
4e16c60c by Marc Haber at 2025-02-18T15:25:26+01:00
use eget(pw|gr)nam in AdduserCommon
Git-Dch: ignore
- - - - -
be974297 by Marc Haber at 2025-02-18T15:25:26+01:00
decode file names read from directory
Git-Dch: ignore
- - - - -
8d94169c by Marc Haber at 2025-02-18T15:25:26+01:00
allow namere to be used in sanitizing
Git-Dch: ignore
- - - - -
d8575ba8 by Marc Haber at 2025-02-18T15:25:26+01:00
introduce anynamere which is used at the beginning of sanitation
Git-Dch: ignore
- - - - -
d8736525 by Marc Haber at 2025-02-18T15:25:26+01:00
sanitize name against anynamere
Git-Dch: ignore
- - - - -
be0b05b3 by Marc Haber at 2025-02-18T15:25:26+01:00
improve logging around name sanitazion
Git-Dch: ignore
- - - - -
fb0bad58 by Marc Haber at 2025-02-18T15:25:26+01:00
sanitize_name explicitly returns "" if sanitazion fails
Git-Dch: ignore
- - - - -
bda2076d by Marc Haber at 2025-02-18T15:25:26+01:00
add invalid name test that would traverse directories
- - - - -
71d1081d by Marc Haber at 2025-02-18T15:25:26+01:00
adapt valid_username.t to new useradd behavior
Git-Dch: ignore
The old settings so that they are at least preserved in git history.
- - - - -
21da6fab by Marc Haber at 2025-02-18T15:25:26+01:00
remove commented out tests again
Git-Dch: ignore
- - - - -
0c9431b2 by Marc Haber at 2025-02-18T15:25:26+01:00
intermediate commit of regexp constants that work
Git-Dch: ignore
- - - - -
2e95b4e2 by Marc Haber at 2025-02-18T15:25:26+01:00
add last touched date to README
Git-Dch: ignore
- - - - -
db8c01d7 by Marc Haber at 2025-02-18T15:25:26+01:00
fix typos in README
Git-Dch: ignore
- - - - -
7a5687ee by Marc Haber at 2025-02-18T15:25:26+01:00
reword logging paragraph
- - - - -
a1bd8b5a by Marc Haber at 2025-02-18T15:25:26+01:00
make it clear that we want you to join the team
Git-Dch: ignore
- - - - -
f6151d43 by Marc Haber at 2025-02-18T15:25:26+01:00
re-word the declarative paragraph
Git-Dch: ignore
- - - - -
85b3eea5 by Marc Haber at 2025-02-18T15:25:26+01:00
make clear that we consider directory service code to be gone
Git-Dch: ignore
- - - - -
7cc13cf3 by Marc Haber at 2025-02-18T15:25:26+01:00
re-word the DIR_MODE paragraph
Git-Dch: ignore
- - - - -
4094ae95 by Marc Haber at 2025-02-18T15:25:26+01:00
Add UTF-8 paragraph
Git-Dch: ignore
- - - - -
a06166b6 by Marc Haber at 2025-02-18T15:25:26+01:00
update the Security paragraph
Git-Dch: ignore
- - - - -
854efaa3 by Marc Haber at 2025-02-18T15:25:26+01:00
update code age
Git-Dch: ignore
- - - - -
7a435db2 by Marc Haber at 2025-02-18T15:25:26+01:00
add more docs paragraph
Git-Dch: ignore
- - - - -
94e7df9c by Marc Haber at 2025-02-18T15:25:26+01:00
add versioned dependency on new passwd
that's the version we have been testing with
- - - - -
6a980715 by Marc Haber at 2025-02-18T15:25:26+01:00
send useradd --badname's warning to /dev/null in test
Git-Dch: ignore
- - - - -
28f610f9 by Marc Haber at 2025-02-18T15:25:26+01:00
don't run testsuite with shadow off, no longer supported upstream
- - - - -
18 changed files:
- AdduserCommon.pm
- AdduserLogging.pm
- AdduserRetvalues.pm
- adduser
- debian/README
- debian/control
- debian/rules
- debian/tests/f/cronjack.t
- debian/tests/f/deluser_files.t
- debian/tests/f/valid_username.t
- debian/tests/lib/AdduserTestsCommon.pm
- deluser
- doc/adduser.8
- doc/deluser.8
- doc/deluser.conf.5
- doc/po4a/po/de.po
- − po/Makefile
- testsuite/runsuite.sh
Changes:
=====================================
AdduserCommon.pm
=====================================
@@ -1,7 +1,8 @@
package Debian::AdduserCommon 3.138;
-use 5.32.0;
-use strict;
-use warnings;
+use 5.40.0;
+use utf8;
+use Encode;
+use I18N::Langinfo qw(langinfo CODESET);
# Subroutines shared by the "adduser" and "deluser" utilities.
#
@@ -39,6 +40,7 @@ BEGIN {
}
use vars qw(@EXPORT $VAR1);
+my $charset = langinfo(CODESET);
BEGIN {
local $ENV{PERL_DL_NONLAZY}=1;
@@ -57,13 +59,14 @@ my $lockfile;
my $lockfile_path = '/run/adduser';
use constant {
- filenamere => qr/[-_\.+!\$%&()\]\[;0-9a-zA-Z]*/,
- simplefilenamere => qr/[-_\.0-9a-zA-Z]*/,
- pathre => qr/[-_\.+!\$%&()\]\[;0-9a-zA-Z\/{}>*'@]*/,
- simplepathre => qr/[-_\.0-9a-zA-Z\/]*/,
+ filenamere => qr/[-_\.+!\$%&()\]\[;0-9a-zA-Z]+/,
+ simplefilenamere => qr/[-_\.0-9a-zA-Z]+/,
+ pathre => qr/[-\p{Graph}_\.+!\$%&()\]\[;0-9a-zA-Z\/{}>*'@]+/,
+ simplepathre => qr/[-_\.0-9a-zA-Z\/]+/,
commentre => qr/["-_\.+!\$%&()\]\[;0-9a-zA-Z\/ ]*/,
numberre => qr/[0-9]+/,
- namere => qr/[^-+~:,\s\/][^:,\s\/]*/,
+ namere => qr/^([^-+~:,\s\/][^:,\s\/]*)$/aa,
+ anynamere => qr/^([^-+~:,\s\/][^:,\s\/]*)$/aa,
};
@EXPORT = (
@@ -77,9 +80,12 @@ use constant {
'acquire_lock',
'release_lock',
'sanitize_string',
+ 'egetgrnam',
+ 'egetpwnam',
'preseed_config',
'which',
'namere',
+ 'anynamere',
"filenamere",
"simplefilenamere",
"pathre",
@@ -94,15 +100,33 @@ sub sanitize_string {
# Set a default pattern to allow alphanumeric characters,
# spaces, and underscores.
$pattern //= qr/[a-zA-Z0-9 _]*/;
+ log_trace("sanitize_string %s against %s", $input, $pattern);
- # If the input matches the pattern, extract and return the untainted value.
+ # If the input matches the pattern,
+ # extract and return the untainted value.
if ($input =~ qr/^($pattern)$/ ) {
+ log_trace("sanitize_string returning %s", "$1");
return $1; # $1 is the captured, untainted portion of the string.
} else {
- die "Input $input contains invalid characters and could not be untainted.";
+ die "invalid characters in $input";
}
}
+
+sub egetgrnam {
+ my ($name) = @_;
+ log_trace("egetgrnam called with %s", $name);
+ $name = encode($charset, $name);
+ return getgrnam($name);
+}
+
+sub egetpwnam {
+ my ($name) = @_;
+ log_trace("egetpwnam called with %s", $name);
+ $name = encode($charset, $name);
+ return getpwnam($name);
+}
+
# parse the configuration file
# parameters:
# -- filename of the configuration file
@@ -124,6 +148,7 @@ sub read_config {
}
while (<$conffh>) {
chomp;
+ $_ = decode($charset, $_);
next if /^#/ || /^\s*$/;
log_trace("read from config file: %s", $_);
@@ -162,6 +187,7 @@ sub read_pool {
my %ids = ();
my %new;
+ $pool_file = decode($charset, $pool_file);
if (-d $pool_file) {
my $dir;
unless( opendir( $dir, $pool_file) ) {
@@ -190,6 +216,7 @@ sub read_pool {
}
while (<$pool>) {
chomp;
+ $_ = decode($charset, $_);
next if /^#/ || /^\s*$/;
my $new;
@@ -263,8 +290,8 @@ sub get_group_members
my @members;
- foreach my $member (split(/ /, (getgrnam($group))[3])) {
- push(@members, $member) if defined(getpwnam($member));
+ foreach my $member (split(/ /, (egetgrnam($group))[3])) {
+ push(@members, $member) if defined(egetpwnam($member));
}
return @members;
=====================================
AdduserLogging.pm
=====================================
@@ -1,7 +1,6 @@
package Debian::AdduserLogging 3.138;
-use 5.32.0;
-use strict;
-use warnings;
+use 5.40.0;
+use utf8;
# Adduser logging Subroutines
#
=====================================
AdduserRetvalues.pm
=====================================
@@ -1,7 +1,6 @@
package Debian::AdduserRetvalues 3.138;
-use 5.32.0;
-use strict;
-use warnings;
+use 5.40.0;
+use utf8;
# Adduser definitions of return values
#
=====================================
adduser
=====================================
@@ -22,9 +22,9 @@
#
# License: GPL-2+
-use 5.32.0;
-use strict;
-use warnings;
+use 5.40.0;
+use utf8;
+use Encode;
use Getopt::Long;
@@ -40,7 +40,6 @@ BEGIN {
}
my $version = "DVERSION";
-$ENV{"PATH"} = sanitize_string( $ENV{"PATH"}, qr/[-_a-zA-Z0-9_:.\/]*/ );
BEGIN {
local $ENV{PERL_DL_NONLAZY}=1;
@@ -49,7 +48,7 @@ BEGIN {
## no critic
eval "
require POSIX;
- import POSIX qw(setlocale);
+ POSIX->import(qw(setlocale));
";
## use critic
if ($@) {
@@ -60,7 +59,7 @@ BEGIN {
## no critic
eval "
require I18N::Langinfo;
- import I18N::Langinfo qw(langinfo YESEXPR NOEXPR);
+ I18N::Langinfo->import(qw(langinfo CODESET YESEXPR NOEXPR))
";
## use critic
if ($@) {
@@ -71,10 +70,13 @@ BEGIN {
}
my $yesexpr = langinfo(YESEXPR());
+my $charset = langinfo(CODESET);
+binmode(STDOUT, ":encoding($charset)");
+binmode(STDERR, ":encoding($charset)");
my %config; # configuration hash
-my $nogroup_id = getgrnam("nogroup") || 65534;
+my $nogroup_id = egetgrnam("nogroup") || 65534;
$0 =~ s+.*/++;
our $action;
@@ -129,6 +131,7 @@ my %reserved_gid_pool;
our @names;
+log_trace("ARGV %s", join(@ARGV,"-"));
GetOptions(
'add-extra-groups' => \$add_extra_groups,
'add_extra_groups' => \$add_extra_groups_old,
@@ -162,11 +165,12 @@ GetOptions(
'verbose' => sub { $verbose = 1; },
'version|v' => sub { &version; exit },
) or &usage_error;
+log_trace("ARGV %s", join(@ARGV,"-"));
if (!@configfiles) {
@defaults = ("/etc/adduser.conf");
} else {
- @defaults = (@configfiles);
+ @defaults = decode($charset, $_) for @configfiles;
}
# make sure that message levels apply for reading configuration
@@ -175,6 +179,10 @@ $stdoutmsglevel = sanitize_string($stdoutmsglevel);
$stderrmsglevel = sanitize_string($stderrmsglevel);
$logmsglevel = sanitize_string($logmsglevel);
set_msglevel( $stderrmsglevel, $stdoutmsglevel, $logmsglevel );
+log_trace("ARGV %s", join(@ARGV,"-"));
+log_trace("special_home %s", $special_home);
+log_trace("special_home %s", encode($charset, $special_home));
+log_trace("special_home %s", decode($charset, $special_home));
##########################################################
# (1) preseed the config
@@ -225,11 +233,15 @@ $ENV{"IFS"}=" \t\n";
# checks related to @names #
############################
+log_trace("ARGV %s", join(@ARGV,"-"));
while (defined(my $arg = shift(@ARGV))) {
- if (defined($names[0]) && $arg =~ /^--/) {
+ $arg = decode($charset, $arg);
+ log_trace("process argument %s", $arg);
+ if (defined($names[0]) && $arg =~ /^--/) {
log_fatal( mtx("No options allowed after names.") );
exit( RET_INVALID_CALL );
} else { # it's a username
+ log_trace("add argument %s to \@names", $arg);
push (@names, $arg);
}
}
@@ -255,6 +267,7 @@ if (@names == 2) { # must be addusertogroup
}
else { # 1 parameter, must be adduser
$new_name = sanitize_name( shift (@names) );
+ log_trace("sanitized new_name %s", $new_name);
}
undef(@names);
@@ -282,21 +295,6 @@ if ($action ne "addgroup" &&
}
-if ((defined($special_home)) && ($special_home !~ m+^/+ )) {
- log_fatal( mtx("The home dir must be an absolute path.") );
- exit( RET_INVALID_HOME_DIRECTORY );
-}
-
-if (defined($special_home)) {
- if (!defined($no_create_home) && -d $special_home) {
- log_warn( mtx("The home dir %s you specified already exists.\n"), $special_home );
- }
- if (defined($no_create_home) && ! -d $special_home) {
- log_warn( mtx("The home dir %s you specified can't be accessed: %s\n"), $special_home, $! );
- }
-}
-
-
if ($found_group_opt) {
if ($action eq "addsysuser") {
$make_group_also = 1;
@@ -324,50 +322,71 @@ if ($config{"gid_pool"}) {
}
}
-if( defined $new_name ) {
- $new_name = sanitize_name($new_name);
-}
-
if( defined $ingroup_name ) {
- $ingroup_name = sanitize_name($ingroup_name);
+ log_trace("sanitize ingroup_name");
+ $ingroup_name = sanitize_name( decode($charset, $ingroup_name));
}
if( defined $special_home ) {
- $special_home = sanitize_string($special_home, pathre);
+ log_trace("sanitize special_home %s", $special_home);
+ $special_home = sanitize_string( decode($charset, $special_home), pathre);
}
if( defined $special_shell ) {
- $special_shell = sanitize_string($special_shell, simplepathre);
+ log_trace("sanitize special_shell");
+ $special_shell = sanitize_string( decode($charset, $special_shell), simplepathre);
}
if( defined $new_comment ) {
- $new_comment = sanitize_string($new_comment, commentre);
+ log_trace("sanitize new_comment");
+ $new_comment = sanitize_string( decode($charset, $new_comment), commentre);
}
if( defined $new_firstgid ) {
+ log_trace("sanitize new_firstgid");
$new_firstgid = sanitize_string($new_firstgid, numberre);
}
if( defined $new_lastgid ) {
+ log_trace("sanitize new_lastgid");
$new_lastgid = sanitize_string($new_lastgid, numberre);
}
if( defined $new_firstuid ) {
+ log_trace("sanitize new_firstuid");
$new_firstuid = sanitize_string($new_firstuid, numberre);
}
if( defined $new_lastuid ) {
+ log_trace("sanitize new_lastgud");
$new_lastuid = sanitize_string($new_lastuid, numberre);
}
if( defined $new_uid ) {
+ log_trace("sanitize new_uid");
$new_uid = sanitize_string($new_uid, numberre);
}
if( defined $gid_option ) {
+ log_trace("sanitize gid_option");
$gid_option = sanitize_string($gid_option, numberre);
}
+if ((defined($special_home)) && ($special_home !~ m+^/+ )) {
+ log_fatal( mtx("The home dir must be an absolute path.") );
+ exit( RET_INVALID_HOME_DIRECTORY );
+}
+
+if (defined($special_home)) {
+ if (!defined($no_create_home) && -d $special_home) {
+ log_warn( mtx("The home dir %s you specified already exists.\n"), $special_home );
+ }
+ if (defined($no_create_home) && ! -d $special_home) {
+ log_warn( mtx("The home dir %s you specified can't be accessed: %s\n"), $special_home, $! );
+ }
+}
+
+
$SIG{'INT'} = $SIG{'QUIT'} = $SIG{'HUP'} = 'handler';
#####
@@ -451,7 +470,7 @@ if ($action eq "addsysgroup") {
##############
if ($action eq "addgroup") {
acquire_lock();
- if (defined getgrnam($new_name)) {
+ if (defined egetgrnam(encode($charset, $new_name))) {
log_fatal( mtx("The group `%s' already exists."), $new_name);
exit( RET_OBJECT_EXISTS );
}
@@ -493,11 +512,11 @@ if ($action eq "addgroup") {
####################
if ($action eq 'addusertogroup') {
- if (!defined getpwnam($existing_user)) {
+ if (!defined egetpwnam($existing_user)) {
log_fatal( mtx("The user `%s' does not exist."), $existing_user );
exit( RET_OBJECT_DOES_NOT_EXIST );
}
- if (!defined getgrnam($existing_group)) {
+ if (!defined egetgrnam($existing_group)) {
log_fatal( mtx("The group `%s' does not exist."), $existing_group );
exit( RET_OBJECT_DOES_NOT_EXIST );
}
@@ -524,7 +543,7 @@ if ($action eq "addsysuser") {
if (existing_user_ok($new_name, $new_uid) == 1) {
# a user with this name already exists; it's a problem when it's not a system user
- my $tmp_u = getpwnam($new_name);
+ my $tmp_u = egetpwnam($new_name);
if (($tmp_u >= $config{"first_system_uid"}) and ($tmp_u <= $config{"last_system_uid"})) {
log_fatal( mtx("The system user `%s' already exists. Exiting.\n"), $new_name );
exit( RET_OK );
@@ -572,7 +591,7 @@ if ($action eq "addsysuser") {
if (defined($gid_option)) {
$ingroup_name = getgrgid($gid_option);
} elsif ($ingroup_name) {
- $gid_option = getgrnam($ingroup_name);
+ $gid_option = egetgrnam($ingroup_name);
} else {
log_fatal( mtx("Neither ingroup option nor gid given.") );
exit( RET_NO_PRIMARY_GROUP );
@@ -582,7 +601,7 @@ if ($action eq "addsysuser") {
if (defined($gid_option)) {
$ingroup_name = getgrgid($gid_option);
} elsif ($ingroup_name) {
- $gid_option = getgrnam($ingroup_name);
+ $gid_option = egetgrnam($ingroup_name);
} elsif ($make_group_also) {
$gid_option=$new_uid; $ingroup_name=$new_name;
} else {
@@ -593,7 +612,7 @@ if ($action eq "addsysuser") {
log_info( mtx("Adding system user `%s' (UID %d) ..."), $new_name, $new_uid );
# if we reach this point, and the group does already exist, we can use it.
- if ($make_group_also && !getgrnam($new_name)) {
+ if ($make_group_also && !egetgrnam($new_name)) {
log_info( mtx("Adding new group `%s' (GID %d) ..."), $new_name, $gid_option );
$undogroup = $new_name;
my $groupadd = &which('groupadd');
@@ -662,7 +681,7 @@ if ($action eq "adduser") {
}
if( $ingroup_name ) {
$make_group_also = 0;
- $primary_gid = getgrnam($ingroup_name);
+ $primary_gid = egetgrnam($ingroup_name);
log_trace( "ingroup_name defined %s, make_group_also 0, primary_gid %s", $gid_option, $primary_gid );
}
log_trace( "make_group_also %s, primary_gid %s", $make_group_also, $primary_gid );
@@ -679,7 +698,7 @@ if ($action eq "adduser") {
if (defined($config{"users_group"})) {
$primary_group=$config{"users_group"};
}
- $primary_gid=getgrnam($primary_group);
+ $primary_gid=egetgrnam($primary_group);
log_debug( "set primary_gid to users_group %s %s", $primary_gid, $primary_group);
}
} else {
@@ -702,13 +721,13 @@ if ($action eq "adduser") {
} else {
log_debug( "config usergroups != yes code path" );
if( defined($ingroup_name) ) {
- $primary_gid=getgrnam($ingroup_name);
+ $primary_gid=egetgrnam($ingroup_name);
} elsif (defined($config{"users_gid"})) {
log_trace( "primary_gid = users_gid = %d", $primary_gid );
$primary_gid = $config{"users_gid"};
} else {
if (defined($config{"users_group"})) {
- my @grgid=getgrnam($config{"users_group"});
+ my @grgid=egetgrnam($config{"users_group"});
my $grgid=$grgid[2];
log_trace( "primary_gid = users_group %s %s", $config{"users_group"}, $grgid);
$primary_gid = $grgid;
@@ -775,7 +794,7 @@ if ($action eq "adduser") {
$primary_gid = $gid_option;
log_debug( "gid_option defined and not -1, ingroup_name %s, primary_gid %d", $ingroup_name, $primary_gid );
} elsif ($ingroup_name) {
- $primary_gid = getgrnam($ingroup_name);
+ $primary_gid = egetgrnam($ingroup_name);
log_debug( "ingroup_name defined %s, primary_gid %d", $ingroup_name, $primary_gid );
} elsif ( defined( $primary_gid ) ) {
$ingroup_name = getgrgid($primary_gid);
@@ -800,7 +819,7 @@ if ($action eq "adduser") {
$ingroup_name = getgrgid($primary_gid);
log_debug( "primary_gid defined %s, ingroup_name %s", $primary_gid, $ingroup_name );
} elsif ($ingroup_name) {
- $primary_gid = getgrnam($ingroup_name);
+ $primary_gid = egetgrnam($ingroup_name);
log_debug( "ingroup_name defined %s, primary_gid %s", $ingroup_name, $primary_gid );
} elsif ($make_group_also) {
$primary_gid=$new_uid; $ingroup_name=$new_name;
@@ -822,7 +841,7 @@ if ($action eq "adduser") {
} else {
log_info( mtx("Adding new group `%s' (new group ID) ..."), $new_name);
&systemcall($groupadd, $new_name);
- $primary_gid = getgrnam($new_name);
+ $primary_gid = egetgrnam($new_name);
log_info( mtx("new group '%s' created with GID %d"), $new_name, $primary_gid );
}
}
@@ -838,7 +857,7 @@ if ($action eq "adduser") {
} else {
$shell = $special_shell || $uid_pool{$new_name}{'shell'} || "/usr/sbin/nologin";
}
- log_debug( "creating new user with home_dir %s and shell %s", $home_dir, $shell );
+ log_debug( "creating new user %s with home_dir %s and shell %s", $new_name, $home_dir, $shell );
$undouser = $new_name;
my $useradd = &which('useradd');
&systemcall($useradd, '-d', $home_dir, '-g', $primary_gid, '-s',
@@ -913,7 +932,7 @@ if ($action eq "adduser") {
log_info( mtx("Adding new user `%s' to supplemental / extra groups `%s' ..."), $new_name, join(", ", @supplemental_groups) );
foreach my $newgrp ( @supplemental_groups ) {
log_trace( "newgrp %s", $newgrp );
- if (!defined getgrnam($newgrp)) {
+ if (!defined egetgrnam($newgrp)) {
log_warn( mtx("The group `%s' does not exist."), $newgrp);
next;
}
@@ -1056,8 +1075,10 @@ sub mktree {
# 2 if the user already exists, but $new_uid does not match its uid
sub existing_user_ok {
my($new_name,$new_uid) = @_;
+ log_trace( "existing_user_ok called with new_name %s, new_uid %s", $new_name, $new_uid );
my ($dummy1,$dummy2,$uid);
- if (($dummy1,$dummy2,$uid) = getpwnam($new_name)) {
+ log_trace( "new_name %s", $new_name);
+ if (($dummy1,$dummy2,$uid) = egetpwnam($new_name)) {
if( defined($new_uid) && $uid == $new_uid ) {
return 1;
}
@@ -1088,7 +1109,7 @@ sub existing_user_ok {
sub existing_group_ok {
my($new_name,$new_gid) = @_;
my ($dummy1,$dummy2,$gid);
- if (($dummy1,$dummy2,$gid) = getgrnam($new_name)) {
+ if (($dummy1,$dummy2,$gid) = egetgrnam($new_name)) {
# TODO: is this check required? There should not be any
# gid outside of our allowed range anyways ...
@@ -1122,7 +1143,7 @@ sub check_user_group {
my ($system) = @_;
log_debug( "check_user_group %s called, make_group_also %s", $system, $make_group_also );
if( !$system || !existing_user_ok($new_name, $new_uid) ) {
- if( defined getpwnam($new_name) ) {
+ if( defined egetpwnam($new_name) ) {
if( $system ) {
log_fatal( mtx("The user `%s' already exists, and is not a system user."), $new_name);
exit( RET_WRONG_OBJECT_PROPERTIES );
@@ -1139,7 +1160,7 @@ sub check_user_group {
if ($make_group_also) {
log_trace( "make_group_also 1, new_name %s, new_uid %s", $new_name, $new_uid );
if( !$system || !existing_group_ok($new_name, $new_uid) ) {
- if (defined getgrnam($new_name)) {
+ if (defined egetgrnam($new_name)) {
log_fatal( mtx("The group `%s' already exists."),$new_name );
exit( RET_OBJECT_EXISTS );
}
@@ -1149,7 +1170,7 @@ sub check_user_group {
}
}
} else {
- if ($ingroup_name && !defined(getgrnam($ingroup_name))) {
+ if ($ingroup_name && !defined(egetgrnam($ingroup_name))) {
log_fatal( mtx("The group `%s' does not exist."), $ingroup_name);
exit( RET_OBJECT_DOES_NOT_EXIST );
}
@@ -1266,7 +1287,7 @@ sub sanitize_name {
}
log_trace("sanitize_name testing > 32 chars");
- if (length $name > 32) {
+ if (length( encode($charset, $name) ) > 32) {
# this check cannot be turned off
log_err( mtx("Usernames must be no more than 32 bytes in length;
note that if you are using Unicode characters, the character
@@ -1311,11 +1332,13 @@ sub sanitize_name {
exit( RET_INVALID_CHARS_IN_NAME );
}
- log_trace("sanitize_name checking %s against .*", $name);
- if ($name =~ qr/(.*)/) {
+ log_trace("sanitize_name checking %s against %s", $name, anynamere);
+ if ($name =~ anynamere) {
log_trace("sanitize_name passed. returning %s", $1);
return $1;
};
+ log_fatal("sanitize_name failed. invalid user name %s", $name);
+ return "";
}
# first_avail_uid: return the first available uid in given range
@@ -1411,7 +1434,7 @@ sub ch_comment {
# user is member of group?
sub user_is_member {
my($user, $group) = @_;
- for (split(/ /, (getgrnam($group))[3])) {
+ for (split(/ /, (egetgrnam($group))[3])) {
return 1 if ($user eq $_);
}
return 0;
=====================================
debian/README
=====================================
@@ -1,3 +1,5 @@
+This document was last touched in Februar 2025.
+
adduser in Debian
=================
@@ -59,10 +61,10 @@ even log in as your user and configure it appropriately.
Adduser's logging subsystem has been re-worked since the release of
Debian 12. Adduser should now be silent especially in maintainer scripts
-if everthing regarding the new user is reasonably correct. If you want
-report of what adduser does, please consider changing the log levels in
-/etc/adduser.conf. You can set different log levels for the system log,
-for standard output and standard error.
+if everything regarding the new user is reasonably correct. If you want
+adduser to report what it does, please consider changing the log levels
+in /etc/adduser.conf. You can set different log levels for the system
+log, for standard output and standard error.
It might be advisable to not delete your users on purge of your package
since there might still be files belonging to the user. Instead, lock
@@ -105,24 +107,25 @@ find an explanation to only give these limited choices in debconf. To
be consistent, we would have to add many more questions. This does not
seem to be a realistic endeavor given the available personpower.
-Consequently, debconf support was removed complete, making
+Consequently, debconf support was removed completely, making
/etc/adduser.conf a regular dpkg-conffile.
We might be willing to reintroduce more elaborate debconf support in the
future if somebody volunteers to write the code, documentation and
tests, and to actually maintain it for the foreseeable future. Please
-get in touch with the adduser team if you're willing to help.
+get in touch with the adduser team if you're willing to help and join
+the team.
Why not declarative?
--------------------
-Adduser is intended to be used in maintainer scripts. While there are
+Adduser is intended to be used in maintainer scripts. There are
approaches in Debian to move more and more functionality away from
-maintainer scripts to a more declarative approach. The current form of
-adduser is used in hundreds of packages.
+maintainer scripts to a more declarative approach. However, the current
+form of adduser is used in hundreds of packages.
-It is fine to use a more declarative approach to define system users in
+It is fine to use the declarative approach to define system users in
Debian packages. There is nothing that forces package maintainers to use
adduser to create their package-related users. The packages dh-sysuser,
opensysusers, and systemd-sysusers already offer a declarative approach
@@ -140,11 +143,10 @@ allowing adduser to be used to create users in a directory service such
as NIS, NIS+ and LDAP, for more than two decades. It is not realistic to
expect this to happen any time soon.
-For the time being, any support to have adduser write to directory
-services that might still exist in the code is official deprecated. An
-arbitrary server in an organization that uses a directory service is
-unlikely to have enough privileges to write to a directory service
-anyway.
+Adduser does not support writing to directory services. The only
+interface to any user database is the use of the tools that the passwd
+package offers. Please file a bug if you find any code that still tries
+to support directory services. We might have forgotten to remove it.
It might be possible, to add the desired support via an adduser.local
hook. If you need more hooks to locally implement what you need, let us
@@ -154,7 +156,8 @@ might be implemented in the nearer future.
We might be willing to reintroduce support for directory services in the
future if somebody volunteers to write the code, documentation and
tests, and to actually maintain it for the foreseeable future. Please
-get in touch with the adduser team if you're willing to help.
+get in touch with the adduser team if you're willing to help and join
+the team.
@@ -179,29 +182,31 @@ has oscillated back and forth in adduser multiple times since the 1990s,
because both ways to set this bit by default have advantages and
disadvantages. After a preliminary request for comment (see
https://lists.debian.org/debian-devel/2022/03/msg00098.html), the
-default value for DIR_MODE was changed to 2700 in Debian 12. Sadly,
-though the technical reasoning for NOT setting the bit did largely not
-survive the last two decades, some use cases that we were not fully
-aware of were adversely impacted by this change.
+default value for DIR_MODE was eventually changed to 2700 at some point.
+Sadly, the technical reasoning for NOT setting the bit did largely not
+survive the last two decades. However, some use cases that we were not
+fully aware of were adversely impacted by this change.
Promptly, #1014901 was filed, requesting that DIR_MODE be changed to
0700, effectively causing home directories of non-system users to be
-created without the setgid bit. The biggest point in the reasoning is that
-having the setgid bit set will need special measures to keep the home
-directory's group ownership from propagating to file system images,
+created without the setgid bit. The biggest point in the reasoning is
+that having the setgid bit set will need special measures to keep the
+home directory's group ownership from propagating to file system images,
chroots, and archives, causing wrong file ownership/permissions in those
-entities, which in turn might propagate to different systems and cause
-security-related effects there. The bug report gives instructions to
-reproduce the behavior.
-
-System administrators who run multi-user environments which require
-shared workspaces have tools at their disposal to change the default
-behavior as their individual needs require, and likely are aware of how
-to work around any issues that arise as part of that configuration; it
-is also very possible that such systems may be managed using
-configuration management software. In an age of general purpose use on
-one end, and single purpose containers on the other, this is unlikely to
-be the majority of newly installed systems.
+collections of files, which in turn might propagate to different systems
+and cause security-related effects there. The bug report gives
+instructions to reproduce the behavior.
+
+System administrators who run multi-user environments might appreciate
+the sgid bit set on home directories since this makes it easier to
+manage file ownership in collaborative environments such as shared
+workspaces. Those administrators have tools at their disposal to change
+the default behavior as their individual needs require, and likely are
+aware of how to work around any issues that arise as part of that
+configuration. It is also very possible that such systems may be managed
+using configuration management software. In an age of general purpose
+use on one end, and single purpose containers on the other, this is
+unlikely to be the majority of newly installed systems.
So what remains is the decision to provide a sane default for a system
that is installed by an end-user, who may not understand or be aware of
@@ -218,7 +223,7 @@ flipping the default for the setgid bit one last time to the value we
had for the majority of Debian's existence period. With this change,
Debian is re-joining ranks again with ALL other major Linux
distributions, none of which setting the setgid bit on home directories
-to 1 (research done in July 2022).
+to 1 (research done in July 2022, prove us wrong today if you want to).
This primarily affects the one user that can be created in the Installer
before there is any possibility to configure adduser. Those users will
@@ -236,12 +241,24 @@ discussion period.
+UTF-8 User Names
+----------------
+It used to be possible to create UTF-8 encoded user names with adduser
+and passwd. While you have possibly considered this a feeature, it never
+was intended to be a feature, just an accident. Debian had a discussion
+about UTF-8 user names in November 2024, while shadow/passwd upstream
+decided to explicitly disallow non-ASCII characters in user names. This
+version of adduser follows along, so UTF-8 encoded user names cannot be
+created any more with adduser. It never fully worked anyway, and
+introuced some nasty side effects, possibly security relevant. So you
+might want to revisit any non-ASCII user names you have ever created.
+
+
+
Security
--------
-We habe beem working on adduser being able to run with the -T switch
-set. This has made it impossible to test for strange unicode characters.
-If you know how to write a perl regexp that includes possibly all
-printable unicode characters, please file a bug and help us.
+Adduser now runs with perl in tainted mode. This has introduced a
+significant raise in security.
@@ -249,7 +266,8 @@ Rewrite
-------
adduser needs a rewrite. The code base was started in the 1990s and
this fact can easily be seen. The introduction of our test suite has
-made changes to adduser much easier, but the code is still 25 years old.
+made changes to adduser much easier, but the code is still more than 25
+years old.
We support any effort for a rewrite, but we strongly believe that this
should be done in a dedicated project with a new name, such as
@@ -290,6 +308,18 @@ characters per level, using spaces, not tabs.
+More Docs?
+----------
+See:
+ * RFC8264 "PRECIS Framework: Preparation, Enforcement, and Comparison of
+ Internationalized Strings in Application Protocols"
+ * RFC8265 "PRECIS Representing Usernames and Passwords"
+ * https://systemd.io/USER_NAMES/
+ * https://wiki.debian.org/UserAccounts
+ * https://wiki.debian.org/Unicode
+
+
+
Credits
-------
This document was compiled by the adduser maintainers. Ximon Eighteen
=====================================
debian/control
=====================================
@@ -14,7 +14,7 @@ Package: adduser
Architecture: all
Multi-Arch: foreign
Pre-Depends: ${misc:Pre-Depends}
-Depends: passwd, ${misc:Depends}
+Depends: passwd (>= 1:4.17.2-5), ${misc:Depends}
Suggests: liblocale-gettext-perl, perl, cron, quota
Description: add and remove users and groups
This package includes the 'adduser' and 'deluser' commands for creating
=====================================
debian/rules
=====================================
@@ -17,9 +17,6 @@ override_dh_auto_clean:
cd doc/po4a && po4a --keep 95 --previous --rm-translations po4a.conf
rm -f po/*.mo
-override_dh_auto_install:
- $(MAKE) -C po install DESTDIR=`pwd`/debian/adduser
-
override_dh_install:
dh_install
sed -e s/DVERSION/$(version)/g adduser > debian/adduser/usr/sbin/adduser
=====================================
debian/tests/f/cronjack.t
=====================================
@@ -15,7 +15,7 @@ END {
remove_tree('/home/bob');
}
-assert_command_success('/usr/sbin/useradd', '--badname', '-d', '/home/bob', '-m', 'bob;>/hacked');
+assert_command_success('sh', '-c', q{/usr/sbin/useradd --badname -d /home/bob -m 'bob;>/hacked' 2>/dev/null});
assert_path_does_not_exist('/hacked');
=====================================
debian/tests/f/deluser_files.t
=====================================
@@ -13,8 +13,8 @@ sub create_files_in_homedir{
mkdir ("/home/$acct/mnt", 0777);
mkdir ("/home/$acct/dir", 0777);
mkdir ("/tmp/$acct", 0777);
- unlink("/tmp/foo.txt");
- for ("/home/$acct/extra.txt", "/tmp/$acct/extra2.txt", "/tmp/foo.txt") {
+ unlink("/tmp/deluserfiles.txt");
+ for ("/home/$acct/extra.txt", "/tmp/$acct/extra2.txt", "/tmp/deluserfiles.txt") {
open (XTRA, '>', $_) || die ("could not open file $_: $!");
print XTRA "extra file";
close (XTRA) || die ('could not close file!');
@@ -26,31 +26,31 @@ sub create_files_in_homedir{
"/tmp/$acct/extra2.txt",
"/home/$acct/mnt",
"/home/$acct/dir",
- "/tmp/foo.txt",
+ "/tmp/deluserfiles.txt",
"/home/$acct/pipe");
assert_command_success('mount','-o','bind',"/tmp/$acct","/home/$acct/mnt");
}
END {
- # remove_tree('/home/foo');
- # remove_tree('/var/mail/foo');
- system("umount /home/foo-extra/mnt >/dev/null 2>/dev/null");
- remove_tree('/home/foo-extra');
- remove_tree('/tmp/foo-extra');
- unlink('/tmp/foo.tar.gz');
- unlink('/tmp/foo.txt');
+ # remove_tree('/home/deluserfiles');
+ # remove_tree('/var/mail/deluserfiles');
+ system("umount /home/deluserfiles-extra/mnt >/dev/null 2>/dev/null");
+ remove_tree('/home/deluserfiles-extra');
+ remove_tree('/tmp/deluserfiles-extra');
+ unlink('/tmp/deluserfiles.tar.gz');
+ unlink('/tmp/deluserfiles.txt');
}
-assert_user_does_not_exist('foo');
+assert_user_does_not_exist('deluserfiles');
assert_command_success('/usr/sbin/adduser',
'--stdoutmsglevel=error', '--stderrmsglevel=error',
'--system',
- '--home', '/home/foo',
- 'foo');
-assert_user_exists('foo');
+ '--home', '/home/deluserfiles',
+ 'deluserfiles');
+assert_user_exists('deluserfiles');
-my ($login, $pass, $uid, $gid) = getpwnam('foo');
-create_files_in_homedir("foo-extra", $uid, $gid);
+my ($login, $pass, $uid, $gid) = getpwnam('deluserfiles');
+create_files_in_homedir("deluserfiles-extra", $uid, $gid);
assert_command_success('/usr/sbin/deluser',
'--stdoutmsglevel=error', '--stderrmsglevel=error',
@@ -58,74 +58,78 @@ assert_command_success('/usr/sbin/deluser',
'--backup-suffix', 'gz',
'--remove-all-files',
'--backup-to', '/tmp',
- 'foo');
-system("umount /home/foo-extra/mnt >/dev/null 2>/dev/null");
-assert_user_does_not_exist('foo');
-assert_path_does_not_exist('/home/foo');
-assert_path_does_not_exist('/home/foo-extra/extra.txt');
-assert_path_does_not_exist('/home/foo-extra/pipe');
+ 'deluserfiles');
+system("umount /home/deluserfiles-extra/mnt >/dev/null 2>/dev/null");
+assert_user_does_not_exist('deluserfiles');
+assert_path_does_not_exist('/home/deluserfiles');
+assert_path_does_not_exist('/home/deluserfiles-extra/extra.txt');
+assert_path_does_not_exist('/home/deluserfiles-extra/pipe');
#FIXME
-#assert_path_does_not_exist('/tmp/foo-extra/extra2.txt');
-assert_path_exists('/tmp/foo.txt');
-assert_path_exists('/home/foo-extra/mnt');
-assert_path_does_not_exist('/home/foo-extra/dir');
+#assert_path_does_not_exist('/tmp/deluserfiles-extra/extra2.txt');
+assert_path_exists('/tmp/deluserfiles.txt');
+assert_path_exists('/home/deluserfiles-extra/mnt');
+assert_path_does_not_exist('/home/deluserfiles-extra/dir');
# check backup archive
-assert_path_exists('/tmp/foo.tar.gz');
-my $tar_files = `tar tf /tmp/foo.tar.gz`;
+assert_path_exists('/tmp/deluserfiles.tar.gz');
+my $tar_files = `tar tf /tmp/deluserfiles.tar.gz`;
is($? >> 8, 0, 'successfully listed backup files');
-like($tar_files, qr{home/foo-extra/extra.txt}, 'archive contains expected file: extra.txt');
+like($tar_files, qr{home/deluserfiles-extra/extra.txt}, 'archive contains expected file: extra.txt');
+# create new user and delete again, backing up to /nonexistent
+# this succeeds when there are no files to back up
assert_command_success('/usr/sbin/adduser',
'--stdoutmsglevel=error', '--stderrmsglevel=error',
'--system',
- '--home', '/home/foo',
- 'foo');
-assert_user_exists('foo', $uid, $gid);
+ '--home', '/home/deluserfiles',
+ 'deluserfiles');
+assert_user_exists('deluserfiles', $uid, $gid);
assert_command_success('/usr/sbin/deluser',
'--stdoutmsglevel=error', '--stderrmsglevel=error',
'--system',
'--remove-all-files',
'--backup-to', '/nonexistent',
- 'foo');
+ 'deluserfiles');
+# create new user, put files in and delete again, backing up to /nonexistent
+# this must fail
assert_command_success('/usr/sbin/adduser',
'--stdoutmsglevel=error', '--stderrmsglevel=error',
'--system',
- '--home', '/home/foo',
- 'foo');
-assert_user_exists('foo', $uid, $gid);
-($login, $pass, $uid, $gid) = getpwnam('foo');
-create_files_in_homedir("foo-extra", $uid, $gid);
+ '--home', '/home/deluserfiles',
+ 'deluserfiles');
+assert_user_exists('deluserfiles', $uid, $gid);
+($login, $pass, $uid, $gid) = getpwnam('deluserfiles');
+create_files_in_homedir("deluserfiles-extra", $uid, $gid);
assert_command_failure_silent('/usr/sbin/deluser',
'--stdoutmsglevel=error', '--stderrmsglevel=error',
'--system',
'--remove-all-files',
'--backup-to', '/nonexistent',
- 'foo');
-assert_user_exists('foo');
-assert_path_exists('/home/foo');
-assert_path_exists('/home/foo-extra/extra.txt');
-assert_path_exists('/home/foo-extra/pipe');
+ 'deluserfiles');
+assert_user_exists('deluserfiles');
+assert_path_exists('/home/deluserfiles');
+assert_path_exists('/home/deluserfiles-extra/extra.txt');
+assert_path_exists('/home/deluserfiles-extra/pipe');
#FIXME
-#assert_path_does_not_exist('/tmp/foo-extra/extra2.txt');
-assert_path_exists('/tmp/foo.txt');
-assert_path_exists('/home/foo-extra/mnt');
-assert_path_exists('/home/foo-extra/dir');
+#assert_path_does_not_exist('/tmp/deluserfiles-extra/extra2.txt');
+assert_path_exists('/tmp/deluserfiles.txt');
+assert_path_exists('/home/deluserfiles-extra/mnt');
+assert_path_exists('/home/deluserfiles-extra/dir');
assert_command_success('/usr/sbin/deluser',
'--stdoutmsglevel=error', '--stderrmsglevel=error',
'--system',
'--remove-all-files',
'--backup-to', '/tmp',
- 'foo');
-system("umount /home/foo-extra/mnt >/dev/null 2>/dev/null");
-assert_user_does_not_exist('foo');
-assert_path_does_not_exist('/home/foo');
-assert_path_does_not_exist('/home/foo-extra/extra.txt');
-assert_path_does_not_exist('/home/foo-extra/pipe');
+ 'deluserfiles');
+system("umount /home/deluserfiles-extra/mnt >/dev/null 2>/dev/null");
+assert_user_does_not_exist('deluserfiles');
+assert_path_does_not_exist('/home/deluserfiles');
+assert_path_does_not_exist('/home/deluserfiles-extra/extra.txt');
+assert_path_does_not_exist('/home/deluserfiles-extra/pipe');
#FIXME
-#assert_path_does_not_exist('/tmp/foo-extra/extra2.txt');
-assert_path_exists('/tmp/foo.txt');
-assert_path_exists('/home/foo-extra/mnt');
-assert_path_does_not_exist('/home/foo-extra/dir');
+#assert_path_does_not_exist('/tmp/deluserfiles-extra/extra2.txt');
+assert_path_exists('/tmp/deluserfiles.txt');
+assert_path_exists('/home/deluserfiles-extra/mnt');
+assert_path_does_not_exist('/home/deluserfiles-extra/dir');
# vim: tabstop=4 shiftwidth=4 expandtab
=====================================
debian/tests/f/valid_username.t
=====================================
@@ -5,8 +5,16 @@
use diagnostics;
use strict;
use warnings;
+use utf8;
+use Encode;
+use I18N::Langinfo qw(langinfo CODESET);
+
+my $charset = langinfo(CODESET);
+binmode(STDOUT, ":encoding($charset)");
+binmode(STDERR, ":encoding($charset)");
use AdduserTestsCommon;
+ok("$charset", "charset $charset");
# from the useradd manual
# --
@@ -65,26 +73,34 @@ test_name('user$', PASS,
test_name('_', PASS,
$pat{ieee}, PASS,
$pat{min}, PASS);
+# directory traversal
+test_name('../bin/foo', FAIL,
+ $pat{ieee}, FAIL,
+ $pat{min}, FAIL);
# this test is to see what backslash does
# unfortunately unpredictable
-test_name("\}a", FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, PASS|ALL,
- $pat{min}, PASS);
+# useradd 4.17.2 doesn't accept } any more
+test_name("\}a", FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL,
+ $pat{min}, FAIL);
test_name("\\}b", FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL,
$pat{min}, FAIL);
# windows conventions
test_name('machine$', PASS,
$pat{ieee}, PASS);
-# useradd doesnt accept \ at this time, #1074306
-#test_name('DOMAIN\user', FAIL, FAIL|BAD, FAIL|FBAD, FAIL|ABAD, PASS|ALL,
-# $pat{min}, PASS);
-test_name('user at email.example.com', FAIL, PASS|BAD, PASS|FBAD, PASS|ABAD, PASS|ALL,
- $pat{min}, PASS);
+# useradd 4.17.2 doesnt accept \ any more
+test_name('DOMAIN\user', FAIL, FAIL|BAD, FAIL|FBAD, FAIL|ABAD, FAIL|ALL,
+ $pat{min}, FAIL);
+
+# useradd 4.17.2 doesn't accept @ any more
+test_name('user at email.example.com', FAIL, FAIL|BAD, FAIL|FBAD, FAIL|ABAD, FAIL|ALL,
+ $pat{min}, FAIL);
# test alternate escaping
-test_name("'duke'", FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, PASS|ALL);
+# useradd 4.17.2 does not accept ' any more
+test_name("'duke'", FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL);
# the worst username possible
-# useradd doesn't accept that any more, #1086225
-#test_name("'c4\$h\\M0n3y\"'==>@", FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, PASS|ALL);
+# useradd doesn't accept that any more
+test_name("'c4\$h\\M0n3y\"'==>@", FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL);
# should always fail any regex
my @fails = ('12345', 'root:root', 'test space', "test\nwhite\tspace",
@@ -92,20 +108,26 @@ my @fails = ('12345', 'root:root', 'test space', "test\nwhite\tspace",
test_name($_, FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL,
$pat{all}, FAIL, FAIL|ALL) for @fails;
-# imho this should continue to fail; it may need
+# #1086785 imho this should continue to fail; it may need
# special casing in creating home dirs if allowed
test_name("test/slash", FAIL,
$pat{min}, FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL);
# some stranger choices
-test_name('*', FAIL|BAD, FAIL|ABAD, FAIL|FBAD, PASS|ALL, $pat{min}, PASS);
-test_name('3>6', FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, PASS|ALL, $pat{min}, PASS);
+# useradd 4.17.2 does not acccept *, > and % any more
+test_name('*', FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL, $pat{min}, FAIL);
+test_name('3>6', FAIL, FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL, $pat{min}, FAIL);
test_name('.com', FAIL, PASS|BAD, PASS|ABAD, PASS|FBAD, PASS|ALL, $pat{min}, PASS);
-test_name('user%', FAIL|BAD, FAIL|ABAD, FAIL|FBAD, PASS|ALL, $pat{min}, PASS);
+test_name('user%', FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL, $pat{min}, FAIL);
# comment those because I don't know how to include unicode characters
# in a perl regexp. If you know how to do this, please file a bug.
-# test_name("ÿar", FAIL|BAD, FAIL|ABAD, FAIL|FBAD, PASS|ALL, $pat{min}, PASS);
-# test_name('˄ʙɄȘ˳', FAIL|BAD, FAIL|ABAD, FAIL|FBAD, PASS|ALL, $pat{min}, PASS);
+# useradd 4.17.2 does not accept Unicode any more
+test_name("ÿar", FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL, $pat{min}, FAIL);
+test_name('˄ʙɄȘ˳', FAIL|BAD, FAIL|ABAD, FAIL|FBAD, FAIL|ALL, $pat{min}, FAIL);
+# how would I test for invalid UTF-8?
+# perl -e 'print "\xc0\n";' | tee /dev/fd/2 | hexdump
+# 0xFFFE is not supposed to be in input streams, 0xFEFF is BOM which we dont accept
+# \N{WHITE SMILING FACE}
# system users with leading underscores
test_name('_foo', PASS);
@@ -130,7 +152,7 @@ sub mode_string {
# The mode defaults to FAIL. The regex defaults to the adduser default for
# the SYS_NAME_REGEX setting.
sub test_name {
- my $username = shift;
+ my $username = Encode::encode($charset, shift);
my $regex = (@_ && $_[0] !~ /^\d+$/) ? shift : undef;
my $username_esc = $username;
my $homedir = qq{/home/$username};
=====================================
debian/tests/lib/AdduserTestsCommon.pm
=====================================
@@ -1,7 +1,9 @@
use diagnostics;
use strict;
use warnings;
-
+use Encode;
+use utf8;
+use I18N::Langinfo qw(langinfo CODESET);
use File::Path qw(remove_tree);
use Test::More qw(no_plan);
@@ -28,6 +30,22 @@ END {
if (-f '/var/cache/adduser/tests/state.tar');
}
+my $charset = langinfo(CODESET);
+binmode(STDOUT, ":encoding($charset)");
+binmode(STDERR, ":encoding($charset)");
+
+sub egetgrnam {
+ my ($name) = @_;
+ $name = encode($charset, $name);
+ return getgrnam($name);
+}
+
+sub egetpwnam {
+ my ($name) = @_;
+ $name = encode($charset, $name);
+ return getpwnam($name);
+}
+
sub assert_command_success {
system(@_);
is($? >> 8, 0, "command success: @_");
@@ -59,7 +77,7 @@ sub assert_command_match_output {
sub assert_group_does_not_exist {
my $group = shift;
- is(getgrnam($group), undef, "group does not exist: $group");
+ is(egetgrnam($group), undef, "group does not exist: $group");
}
sub assert_gid_does_not_exist {
@@ -69,7 +87,7 @@ sub assert_gid_does_not_exist {
sub assert_group_exists {
my $group = shift;
- isnt(getgrnam($group), undef, "group exists: $group");
+ isnt(egetgrnam($group), undef, "group exists: $group");
}
sub assert_gid_exists {
@@ -85,8 +103,8 @@ sub assert_group_gid_exists {
sub group_gid_exists {
my ($group, $gid) = @_;
- isnt(getgrnam($group), undef, "group exists: $group");
- my @group_info = getgrnam($group);
+ isnt(egetgrnam($group), undef, "group exists: $group");
+ my @group_info = egetgrnam($group);
if (defined($group_info[2])) {
return 1 if $group_info[2] == $gid;
@@ -108,8 +126,8 @@ sub assert_group_membership_exists {
sub group_membership_exists {
my ($user, $group) = @_;
- my @user_info = getpwnam($user);
- my @group_info = getgrnam($group);
+ my @user_info = egetpwnam($user);
+ my @group_info = egetgrnam($group);
if (defined($user_info[3]) && defined($group_info[2])) {
return 1 if $user_info[3] == $group_info[2];
@@ -132,8 +150,8 @@ sub assert_primary_group_membership_exists {
sub primary_group_membership_exists {
my ($user, $group) = @_;
- my @user_info = getpwnam($user);
- my @group_info = getgrnam($group);
+ my @user_info = egetpwnam($user);
+ my @group_info = egetgrnam($group);
if (defined($user_info[3]) && defined($group_info[2])) {
return 1 if $user_info[3] == $group_info[2];
@@ -155,7 +173,7 @@ sub assert_supplementary_group_membership_does_not_exist {
sub supplementary_group_membership_exists {
my ($user, $group) = @_;
- my @group_info = getgrnam($group);
+ my @group_info = egetgrnam($group);
if (defined($group_info[3])) {
foreach (split(/ /, $group_info[3])) {
@@ -239,12 +257,12 @@ sub assert_path_is_an_empty_directory {
sub assert_user_does_not_exist {
my $user = shift;
- is(getpwnam($user), undef, "user does not exist: $user");
+ is(egetpwnam($user), undef, "user does not exist: $user");
}
sub assert_user_exists {
my $user = shift;
- isnt(getpwnam($user), undef, "user exists: $user");
+ isnt(egetpwnam($user), undef, "user exists: $user");
}
sub assert_uid_does_not_exist {
@@ -265,8 +283,8 @@ sub assert_user_uid_exists {
sub user_uid_exists {
my ($user, $uid) = @_;
- isnt(getpwnam($user), undef, "user exists: $user");
- my @user_info = getpwnam($user);
+ isnt(egetpwnam($user), undef, "user exists: $user");
+ my @user_info = egetpwnam($user);
if (defined($user_info[2])) {
return 1 if $user_info[2] == $uid;
@@ -299,13 +317,13 @@ sub assert_user_has_disabled_password {
sub assert_user_has_home_directory {
my ($user, $home) = @_;
- is((getpwnam($user))[7], $home, "user has home directory: ~$user is $home");
+ is((egetpwnam($user))[7], $home, "user has home directory: ~$user is $home");
}
sub assert_user_has_comment {
my ($user, $comment) = @_;
$comment .= ',,,';
- is((getpwnam($user))[6], $comment, "user has comment: ~$user is $comment");
+ is((egetpwnam($user))[6], $comment, "user has comment: ~$user is $comment");
}
sub assert_dir_group_owner {
@@ -316,15 +334,15 @@ sub assert_dir_group_owner {
sub assert_user_has_login_shell {
my ($user, $shell) = @_;
- is((getpwnam($user))[8], $shell, "user has login shell: $user runs $shell");
+ is((egetpwnam($user))[8], $shell, "user has login shell: $user runs $shell");
}
sub assert_user_has_uid {
my ($user, $uid) = @_;
- if (getpwnam($user)) {
- my @pwnam=getpwnam($user);
+ if (egetpwnam($user)) {
+ my @pwnam=egetpwnam($user);
my $isuid=$pwnam[2];
- is(getpwnam($user), $uid, "user has uid: uid of $user is $isuid (expected $uid)");
+ is(egetpwnam($user), $uid, "user has uid: uid of $user is $isuid (expected $uid)");
} else {
fail( "user has uid: user $user does not exist" );
}
@@ -332,10 +350,10 @@ sub assert_user_has_uid {
sub assert_group_has_gid {
my ($group, $gid) = @_;
- if (getgrnam($group)) {
- my @grnam=getgrnam($group);
+ if (egetgrnam($group)) {
+ my @grnam=egetgrnam($group);
my $isgid=$grnam[2];
- is(getgrnam($group), $gid, "group has gid: gid of $group is $isgid (expected $gid)");
+ is(egetgrnam($group), $gid, "group has gid: gid of $group is $isgid (expected $gid)");
} else {
fail( "group has gid: group $group does not exist" );
}
=====================================
deluser
=====================================
@@ -20,9 +20,10 @@
#
# License: GPL-2+
-use 5.32.0;
-use strict;
-use warnings;
+use 5.40.0;
+use utf8;
+use Encode;
+use I18N::Langinfo qw(langinfo CODESET);
use Getopt::Long;
@@ -38,7 +39,6 @@ BEGIN {
}
my $version = "DVERSION";
-$ENV{"PATH"} = sanitize_string( $ENV{"PATH"}, qr/[-_a-zA-Z0-9_:.\/]*/ );
my $install_more_packages;
@@ -64,7 +64,7 @@ BEGIN {
## no critic
eval "
require POSIX;
- import POSIX qw(setlocale);
+ POSIX->import(qw(setlocale));
";
## use critic
if ($@) {
@@ -74,6 +74,10 @@ BEGIN {
}
}
+my $charset = langinfo(CODESET);
+binmode(STDOUT, ":encoding($charset)");
+binmode(STDERR, ":encoding($charset)");
+
our $action;
our $verbose;
our $stdoutmsglevel = "warn";
@@ -113,7 +117,7 @@ GetOptions (
if (!@configfiles) {
@defaults = ("/etc/adduser.conf", "/etc/deluser.conf");
} else {
- @defaults = (@configfiles);
+ @defaults = decode($charset, $_) for @configfiles;
}
# make sure that message levels apply for reading configuration
@@ -157,8 +161,6 @@ if( defined $verbose ) {
# detect the operation mode
$action = $0 =~ /delgroup$/ ? "delgroup" : "deluser";
-log_trace("action $action");
-
# explicitly set PATH, because super (1) cleans up the path and makes deluser unusable;
# this is also a good idea for sudo (which doesn't clean up)
$ENV{"PATH"}="/bin:/usr/bin:/sbin:/usr/sbin";
@@ -169,7 +171,9 @@ $ENV{"IFS"}=" \t\n";
############################
while (defined(my $arg = shift(@ARGV))) {
- if (defined($names[0]) && $arg =~ /^--/) {
+ $arg = decode($charset, $arg);
+ log_trace("process names %s", $arg);
+ if (defined($names[0]) && $arg =~ /^--/) {
log_fatal( mtx("No options allowed after names.") );
exit( RET_INVALID_CALL );
} else { # it's a username
@@ -195,6 +199,8 @@ if(@names == 2) { # must be deluserfromgroup
}
}
+log_trace("action $action");
+
undef(@names);
# TODO: map this to log levels
@@ -202,7 +208,7 @@ $ENV{"VERBOSE"} = $verbose;
$ENV{"DEBUG"} = $verbose;
foreach(keys(%pconfig)) {
- $config{$_} = $pconfig{$_} if ($pconfig{$_});
+ $config{$_} = decode($charset, $pconfig{$_}) if ($pconfig{$_});
}
if (($config{remove_home} || $config{remove_all_files} || $config{backup}) && ($install_more_packages)) {
@@ -211,20 +217,17 @@ if (($config{remove_home} || $config{remove_all_files} || $config{backup}) && ($
}
-my ($pw_uid, $pw_gid, $pw_homedir, $gr_gid, $maingroup);
+my ($name, $passwd, $pw_uid, $pw_gid, $quota, $comment, $gcos, $pw_homedir, $shell, $expire, $maingroup);
if(defined($user)) {
- my @passwd = getpwnam($user);
- $pw_uid = $passwd[2];
- $pw_gid = $passwd[3];
- $pw_homedir = $passwd[7];
+ ($name, $passwd, $pw_uid, $pw_gid, $quota, $comment, $gcos, $pw_homedir, $shell, $expire) = egetpwnam(encode($charset, $user));
+ $pw_homedir = encode($charset, $pw_homedir);
- $maingroup = $pw_gid ? getgrgid($pw_gid) : "";
+ $maingroup = $pw_gid ? decode($charset, getgrgid($pw_gid)) : "";
}
+log_trace("from getpwnam: pw_homedir %s, maingroup %s", $pw_homedir, $maingroup);
if(defined($group)) {
- #($gr_name,$gr_passwd,$gr_gid,$gr_members) = getgrnam($group);
- my @group = getgrnam($group);
- $gr_gid = $group[2];
+ my ($name, $passwd, $uid, $gr_gid, $quota, $comment, $gcos, $dir, $shell, $expire) = egetgrnam(encode($charset, $group));
}
# arguments are processed:
@@ -241,13 +244,13 @@ if(defined($group)) {
if($action eq "deluser") {
- my($dummy1,$dummy2,$uid);
+ my($name, $passwd, ,$uid, $rest);
# Don't allow a non-system user to be deleted when --system is given
# Also, "user does not exist" is only a warning with --system, but an
# error without --system.
if( $config{"system"} ) {
- if( ($dummy1,$dummy2,$uid) = getpwnam($user) ) {
+ if( ($name, $passwd, $uid, $rest) = egetpwnam(encode($charset, $user)) ) {
if ( ($uid < $config{"first_system_uid"} ||
$uid > $config{"last_system_uid" } ) ) {
log_warn( mtx("The user `%s' is not a system user. Exiting."), $user);
@@ -273,10 +276,12 @@ if($action eq "deluser") {
# consistency check
# if --backup-to is specified, --backup should be set too
if ($pconfig{"backup_to"}) {
+ log_trace("backup_to is set, setting backup as well");
$config{"backup"} = 1;
}
if($config{"remove_home"} || $config{"remove_all_files"}) {
+ log_trace( mtx("remove_home or remove_all_files beginning") );
log_info( mtx("Looking for files to backup/remove ...") );
my @mountpoints;
my $exclude_fstypes = $config{"exclude_fstypes"};
@@ -321,7 +326,7 @@ if($action eq "deluser") {
sub find_match {
my ($dev,$ino,$mode,$nlink,$uid,$gid) = lstat;
log_trace("find_match %s", $_);
- my $name = sanitize_string( $File::Find::name, simplepathre );
+ my $name = sanitize_string( decode($charset, $File::Find::name), pathre );
log_trace("find_match sanitized %s", $name);
foreach my $mount (@mountpoints) {
if( $name eq $mount ) {
@@ -337,7 +342,7 @@ if($action eq "deluser") {
return;
}
}
- log_trace("uid %s, pw_uid %s", $uid, $pw_uid);
+ log_trace("name %s, uid %s, pw_uid %s", $name, $uid, $pw_uid);
(defined($uid) && ($uid == $pw_uid)) &&
(
(-f $name && push(@files, $name)) ||
@@ -346,7 +351,6 @@ if($action eq "deluser") {
(-S $name && push(@files, $name)) ||
(-p $name && push(@files, $name))
);
- log_trace("names: %s", $#names);
if ( -b $name || -c $name ) {
log_warn( mtx("Cannot handle special file %s"), $name );
}
@@ -355,9 +359,10 @@ if($action eq "deluser") {
File::Find::find({wanted => \&find_match, untaint => 1, no_chdir => 1}, '/');
}
+ log_trace("%d files in list to backup/remove", scalar(@files) );
if($config{"backup"} && (@files)) {
- log_info( mtx("Backing up files to be removed to %s ..."), $config{"backup_to"} );
- my $filesfile = new File::Temp(TEMPLATE=>"deluser.XXXXX", DIR=>"/tmp");
+ log_info( mtx("Backing up %d files to be removed to %s ..."), scalar(@files), $config{"backup_to"} );
+ my $filesfile = File::Temp->new(TEMPLATE=>"deluser.XXXXX", DIR=>"/tmp");
my $filesfilename = $filesfile->filename;
my $backup_name = sanitize_string( $config{"backup_to"} . "/$user.tar", simplepathre );
log_trace("filesfilename %s, backup_to %s", $filesfilename, $config{"backup_to"});
@@ -422,7 +427,7 @@ if ($action eq 'delgroup') {
}
my($dummy,$gid,$members);
- unless( (($dummy, $dummy, $gid, $members ) = getgrnam($group)) ) {
+ unless( (($dummy, $dummy, $gid, $members ) = egetgrnam($group)) ) {
log_fatal( mtx("getgrnam `%s' failed: %s. This shouldn't happen."), $group, $! );
exit( RET_SYSTEM_ERROR );
}
@@ -537,12 +542,12 @@ sub usage_error {
sub exist_user {
my $exist_user = shift;
- return(defined getpwnam($exist_user));
+ return(defined egetpwnam($exist_user));
}
sub exist_group {
my $exist_group = shift;
- return(defined getgrnam($exist_group));
+ return(defined egetgrnam($exist_group));
}
sub check_backup_suffix {
=====================================
doc/adduser.8
=====================================
@@ -324,7 +324,8 @@ Use \fIfile\fP instead of \fI/etc/adduser.conf\fP.
Multiple \fB\-\-conf\fR options can be given.
.TP
.B \-\-debug
-Synonymous to --stdoutmsglevel=debug.
+Synonymous to
+.B \-\-stdoutmsglevel=debug.
Deprecated.
.TP
.B \-\-disabled\-login
@@ -424,7 +425,8 @@ for initializing the new user's home directory.
Valid modes: \fBadduser\fP, \fBadduser \-\-system\fP.
.TP
.B \-\-quiet
-Synonymous to \-\-stdoutmsglevel=warn.
+Synonymous to
+.B \-\-stdoutmsglevel=warn.
Deprecated.
.TP
.BI \-\-shell " shell"
@@ -448,7 +450,8 @@ Force the new userid to be the given number.
Valid modes: \fBadduser\fP, \fBadduser \-\-system\fP.
.TP
.B \-\-verbose
-Synonymous to \-\-stdoutmsglevel=info.
+Synonymous to
+.B \-\-stdoutmsglevel=info.
Deprecated.
.TP
.BI \-\-stdoutmsglevel " prio"
@@ -474,7 +477,8 @@ Display version and copyright information.
.SH LOGGING
-Adduser uses extensive and configurable logging to tailor its verbosity to
+.B Adduser
+uses extensive and configurable logging to tailor its verbosity to
the needs of the system administrator.
Every message that \fBadduser\fR print has a priority value
@@ -533,19 +537,19 @@ does not exist.
.TP
.B 13
The object that \fBadduser\fP or \fBdeluser\fP was asked to operate on
-does ont have the properties
+does not have the properties
that are required to complete the operation:
A user (a group) that was requested to be created
as a system user (group)
does already exist and
is not a system user (group),
or
-A user (group) that was requested to be created
+a user (group) that was requested to be created
with a certain UID (GID)
does already exist and
has a different UID (GID),
or
-A system user (group) that was requested to be deleted
+a system user (group) that was requested to be deleted
does exist, but is not a system user (group).
.TP
.B 21
@@ -598,11 +602,14 @@ A function was requested that needs more packages to be installed.
See Recommends: and Suggests: of the adduser package.
.TP
.B 61
-Adduser was aborted for some reason and
+.B Adduser
+was aborted for some reason and
tried to roll back the changes that were done during execution.
.TP
.B 62
-Internal adduser error.
+Internal
+.B adduser
+error.
This should not happen.
Please try to reproduce the issue and file a bug report.
.TP
@@ -709,7 +716,7 @@ the plethora of directory services that need support.
.PP
\fBadduser\fP will constrict itself to being a policy layer
for the management of local system accounts,
-using the tools from the \fBpassword\fP package for the actual work.
+using the tools from the \fBpasswd\fP package for the actual work.
.SH BUGS
Inconsistent use of terminology around the term \fIsystem account\fP
=====================================
doc/deluser.8
=====================================
@@ -201,7 +201,8 @@ Use \fIfile\fP instead of the default files
Multiple \-\-conf options may be given.
.TP
.B \-\-debug
-Synonymous to \-\-stdoutmsglevel=debug.
+Synonymous to
+.B \-\-stdoutmsglevel=debug.
Deprecated.
.TP
.B \-\-group
@@ -218,7 +219,8 @@ Only remove if no members are left.
Valid modes: \fBdeluser \-\-group\fP, \fBdelgroup\fP.
.TP
.B \-\-quiet
-Synonymous to \-\-stdoutmsglevel=warn.
+Synonymous to
+.B \-\-stdoutmsglevel=warn.
Deprecated.
.TP
.B \-\-remove\-all\-files
@@ -240,14 +242,15 @@ If the user does not exist, no error value is returned.
Valid modes: \fBdeluser\fP, \fBdeluser \-\-system\fP.
.TP
.B \-\-verbose
-Synonymous to \-\-stdoutmsglevel=info.
+Synonymous to
+.B \-\-stdoutmsglevel=info.
Deprecated.
.TP
-.BI \-\-stdoutmsglevel " prio "
+.BI \-\-stdoutmsglevel " prio"
.TQ
-.BI \-\-stderrmsglevel " prio "
+.BI \-\-stderrmsglevel " prio"
.TQ
-.BI \-\-logmsglevel " prio "
+.BI \-\-logmsglevel " prio"
Minimum priority for messages logged to syslog/journal and the console,
respectively.
Values are
@@ -267,7 +270,7 @@ Display version and copyright information.
\fBdeluser\fR uses extensive and configurable logging to tailor its verbosity
to the needs and wishes of the system administrator.
-This works similar to \fBadduser\fR. See adduser(8) for all the details.
+This works similar to \fBadduser\fR. See \fBadduser\fR(8) for all the details.
.SH EXIT VALUES
=====================================
doc/deluser.conf.5
=====================================
@@ -24,7 +24,7 @@ as is whitespace around the equals sign.
Comment lines must have a hash sign (#) in the first column.
.PP
\fBdeluser\fR(8) and \fBdelgroup\fR(8)
-also read \fI/etc/adduser.conf\fR(5), see
+also read \fI/etc/adduser.conf\fR, see
.BR adduser.conf (5);
settings in \fIdeluser.conf\fR may overwrite settings made in
\fIadduser.conf\fP.
=====================================
doc/po4a/po/de.po
=====================================
@@ -7,8 +7,8 @@
msgid ""
msgstr ""
"Project-Id-Version: adduser 3.138\n"
-"POT-Creation-Date: 2024-10-31 21:46+0100\n"
-"PO-Revision-Date: 2024-11-01 11:00+0100\n"
+"POT-Creation-Date: 2024-11-03 21:29+0100\n"
+"PO-Revision-Date: 2024-11-10 15:06+0100\n"
"Last-Translator: Helge Kreutzmann <debian at helgefjell.de>\n"
"Language-Team: German <debian-l10n-german at lists.debian.org>\n"
"Language: de\n"
@@ -339,7 +339,7 @@ msgstr ""
"Die Befehle B<adduser> und B<addgroup> fügen im System Benutzer und Gruppen "
"unter Berücksichtigung der Befehlszeilen-Optionen und der "
"Konfigurationsinformationen in I</etc/adduser.conf> hinzu. Sie sind "
-"freundlichere Oberflächen für systemnahe Werkzeuge wie die Programme "
+"benutzerfreundlichere Oberflächen für systemnahe Werkzeuge wie die Programme "
"B<useradd>, B<groupadd> und B<usermod>. Standardmäßig werden zu der Debian-"
"Richtlinie konforme Werte für UID und GID gewählt, ein Home-Verzeichnis mit "
"einer Gerüstkonfiguration eingerichtet, ein benutzerdefiniertes Skript und "
@@ -356,7 +356,7 @@ msgid ""
"maintainer scripts without any conditional wrappers, error suppression or "
"other scaffolding."
msgstr ""
-"B<adduser> und B<addgroup> sind als Schicht für Richtlinien gedacht und "
+"B<adduser> und B<addgroup> sind als Schicht für Richtlinien gedacht. Sie "
"erleichtern Paketbetreuern und lokalen Administratoren die Erstellung "
"lokaler Systemkonten auf eine Art, wie Debian deren Erstellung erwartet. Sie "
"übernehmen dabei die Last, sich an die möglicherweise ändernden "
@@ -438,11 +438,10 @@ msgstr ""
"Standardmäßig erhält jeder Benutzer eine entsprechende Gruppe mit dem "
"gleichen Namen. Dies wird typischerweise I<Benutzergruppen> genannt und "
"erlaubt die leichte Verwaltung von gruppenbeschreibbaren Verzeichnissen, "
-"indem die geeigneten Benutzer in die neue Gruppe abgelegt, das Bit set-group-"
+"indem die entsprechenden Benutzer in die neue Gruppe abgelegt, das Bit set-group-"
"ID im Verzeichnis gesetzt und sichergestellt wird, dass alle Benutzer über "
"die Umask 002 verfügen."
-# FIXME Finally → Furthermore?
#. type: Plain text
#: ../adduser.8:185
msgid ""
@@ -455,7 +454,7 @@ msgstr ""
"Für eine Benutzergruppe wird B<adduser> die erste noch freie GID aus dem in "
"der Konfigurationsdatei durch B<FIRST_GID> und B<LAST_GID> festgelegten "
"Bereich auswählen. Der Bereich kann mit den Optionen B<--firstgid> und B<--"
-"lastgid> außer Kraft gesetzt werden. Des Weiteren kann die GID mit der "
+"lastgid> außer Kraft gesetzt werden. Schließlich kann die GID mit der "
"Option B<--gid> vollständig manuell gesetzt werden."
#. type: Plain text
@@ -481,9 +480,8 @@ msgstr ""
"Befehlszeile auch mit B<--gid> und einer Gruppenkennung oder B<--ingroup> "
"und einem Gruppenamen außer Kraft gesetzt werden. Auch können Benutzer zu "
"ergänzenden Gruppen hinzugefügt werden, die als B<EXTRA_GROUPS> in der "
-"Konfigurationsdatei entweder durch Setzen von B<ADD_EXTRA_GROUPS> auf 1 "
-"oder durch Angabe von B<--add-extra-groups> auf der "
-"Befehlszeile angegeben wurden."
+"Konfigurationsdatei entweder durch Setzen von B<ADD_EXTRA_GROUPS> auf 1 oder "
+"durch Angabe von B<--add-extra-groups> auf der Befehlszeile angegeben wurden."
#. type: Plain text
#: ../adduser.8:209
@@ -580,7 +578,7 @@ msgid ""
"referenced by B<UID_POOL> and B<GID_POOL> are also honored."
msgstr ""
"Andere Optionen verhalten sich wie bei der Erstellung normaler Benutzer. Die "
-"von B<UID_POOL> und B<GID_POOL> referenzierten Dateien werden auch "
+"von B<UID_POOL> und B<GID_POOL> referenzierten Dateien werden ebenfalls "
"berücksichtigt."
#. type: SS
@@ -651,7 +649,7 @@ msgid ""
"If called with two non-option arguments, B<adduser> will add an existing "
"user to an existing group."
msgstr ""
-"Wird B<adduser> mit zwei Argumenten, die keine Option sind, aufgerufen, wird "
+"Wird B<adduser> mit zwei Argumenten, die keine Optionen sind, aufgerufen, wird "
"ein bestehender Benutzer zu einer bestehenden Gruppe hinzugefügt."
#. type: SH
@@ -854,7 +852,7 @@ msgstr ""
"Setzt die erste UID / letzte UID / erste GID / letzte GID für den Bereich, "
"aus dem die Benutzerkennung gewählt wird (B<FIRST_UID>, B<LAST_UID>, "
"B<FIRST_GID> und B<LAST_GID>, B<FIRST_SYSTEM_UID>, B<LAST_SYSTEM_UID>, "
-"B<FIRST_SYSTEM_GID> und B<LAST_SYSTEM_GID> in der Konfigurationsdatei). "
+"B<FIRST_SYSTEM_GID> und B<LAST_SYSTEM_GID> in der Konfigurationsdatei) außer Kraft. "
"Falls eine Gruppe als Benutzergruppe erstellt wird, werden B<--firstgid> und "
"B<--lastgid> ignoriert. Die Gruppe erhält die gleiche Kennung wie der "
"Benutzer. Gültige Modi: B<adduser>, B<adduser --system>, für B<--firstgid> "
@@ -879,8 +877,7 @@ msgid ""
"removed during the release cycle of Debian 13."
msgstr ""
"Dies sind veraltete Formen für B<--allow-bad-names>. Sie werden während des "
-"Veröffentlichungszyklus der Debian-Veröffentlichung 13 "
-"entfernt."
+"Veröffentlichungszyklus der Debian-Veröffentlichung 13 entfernt."
#. type: TP
#: ../adduser.8:368
@@ -1050,8 +1047,8 @@ msgid ""
"Force the new userid to be the given number. B<adduser> will fail if the "
"userid is already taken. Valid modes: B<adduser>, B<adduser --system>."
msgstr ""
-"Die Option soll die Kennung des neuen Benutzers auf die angegebene Zahl "
-"setzen. B<Adduser> wird fehlschlagen, wenn die Benutzerkennung bereits "
+"Erzwingt, dass die Kennung des neuen Benutzers auf die angegebene Zahl gesetzt wird. "
+"B<Adduser> wird fehlschlagen, wenn die Benutzerkennung bereits "
"vergeben ist. Gültige Modi: B<adduser>, B<adduser --system>."
#. type: TP
@@ -1097,6 +1094,17 @@ msgid ""
"stdoutmsglevel, stderrmsglevel, and logmsglevel default to warn, warn, info, "
"respectively."
msgstr ""
+"Minimale Priorität für Meldungen, die im Syslog/Journal bzw. auf der Konsole "
+"protokolliert werden. Werte sind I<trace>, I<debug>, I<info>, I<warn>, "
+"I<err> und I<fatal>. Meldungen mit der hier gesetzten oder einer höheren "
+"Priorität werden auf das entsprechende Medium protokolliert. Meldungen, die "
+"auf der Standardfehlerausgabe ausgegeben werden, werden nicht auf der "
+"Standardausgabe wiederholt. Dies ermöglicht es dem lokalen Administrator, "
+"die Gesprächigkeit von B<adduser> auf der Konsole und im Protokoll "
+"voneinander unabhängig zu steuern sowie möglicherweise verwirrende "
+"Information bei sich selbst zu behalten, und dennoch hilfreiche "
+"Informationen in dem Protokoll zu hinterlassen. stdoutmsglevel, "
+"stderrmsglevel und logmsglevel sind standardmäßig warn, warn bzw. info."
#. type: TP
#: ../adduser.8:471
@@ -1107,22 +1115,85 @@ msgstr "B<-v> , B<--version>"
#. type: Plain text
#: ../adduser.8:474 ../deluser.8:264
msgid "Display version and copyright information."
-msgstr "Anzeige der Version und von Copyright-Informationen"
+msgstr "Anzeige der Version und von Copyright-Informationen."
#. type: SH
-#: ../adduser.8:475 ../deluser.8:264
+#: ../adduser.8:475
+#, no-wrap
+msgid "LOGGING"
+msgstr "PROTOKOLLIERUNG"
+
+# FIXME Adduser → B<adduser>
+#. type: Plain text
+#: ../adduser.8:479
+msgid ""
+"Adduser uses extensive and configurable logging to tailor its verbosity to "
+"the needs of the system administrator."
+msgstr ""
+"Adduser verwendet umfangreiche und konfigurierbare Protokollierung, um seine "
+"Ausführlichkeit an die Bedürfnisse des Systemadministrators anzupassen."
+
+#. type: Plain text
+#: ../adduser.8:491
+msgid ""
+"Every message that B<adduser> print has a priority value assigned by the "
+"authors. This priority can not be changed at run time. Available priority "
+"values are B<crit>, B<error>, B<warning>, B<info>, B<debug>, and B<trace>."
+msgstr ""
+"Jede Meldung, die B<adduser> ausgibt, hat von den Autoren einen "
+"Prioritätswert zugewiesen bekommen. Diese Priorität kann zur Laufzeit nicht geändert "
+"werden. Verfügbare Prioritätswerte sind B<crit>, B<error>, B<warning>, "
+"B<info>, B<debug> und B<trace>."
+
+#. type: Plain text
+#: ../adduser.8:494
+msgid "If you find that a message has the wrong priority, please file a bug."
+msgstr ""
+"Falls Sie eine Meldung mit einer falschen Priorität finden, reichen Sie "
+"bitte (auf Englisch) einen Fehlerbericht ein."
+
+#. type: Plain text
+#: ../adduser.8:508
+msgid ""
+"Every time a message is generated, the code decides whether to print the "
+"message to standard output, standard error, or syslog. This is mainly and "
+"independently controlled by the configuration settings B<STDOUTMSGLEVEL>, "
+"B<STDERRMSGLEVEL>, and B<LOGMSGLEVEL>. For testing purposes, these settings "
+"can be overridden on the command line."
+msgstr ""
+"Jedes Mal, wenn eine Meldung erzeugt wird, entscheidet der Code, ob die "
+"Meldung auf der Standardausgabe, der Standardfehlerausgabe oder dem Syslog "
+"ausgegeben werden soll. Dies wird hauptsächlich und unabhängig voneinander "
+"durch die Konfigurationseinstellungen B<STDOUTMSGLEVEL>, B<STDERRMSGLEVEL> "
+"und B<LOGMSGLEVEL> gesteuert. Zu Testzwecken können diese Einstellungen auf "
+"der Befehlszeile außer Kraft gesetzt werden."
+
+#. type: Plain text
+#: ../adduser.8:513
+msgid ""
+"Only messages with a priority higher or equal to the respective message "
+"level are logged to the respective output medium. A message that was "
+"written to standard error is not written a second time to standard output."
+msgstr ""
+"Nur Meldungen mit einer Priorität höher oder gleich der entsprechenden "
+"Meldungsstufe werden in das entsprechende Ausgabemedium protokolliert. Eine "
+"Meldung, die auf die Standardfehlerausgabe geschrieben wurde, wird nicht ein "
+"zweites Mal auf die Standardausgabe geschrieben."
+
+#. type: SH
+#: ../adduser.8:514 ../deluser.8:272
#, no-wrap
msgid "EXIT VALUES"
msgstr "RÜCKGABEWERTE"
#. type: TP
-#: ../adduser.8:477
+#: ../adduser.8:516
#, no-wrap
msgid "B<0>"
msgstr "B<0>"
#. type: Plain text
-#: ../adduser.8:487
+#: ../adduser.8:526
msgid ""
"Success: The user or group exists as specified. This can have 2 causes: The "
"user or group was created by this call to B<adduser> or the user or group "
@@ -1134,29 +1205,30 @@ msgstr ""
"kann zwei Gründe haben: Der Benutzer oder die Gruppe wurde von diesem Aufruf "
"von B<adduser> erzeugt oder der angegebene Benutzer oder die angegebene "
"Gruppe war schon vor dem Aufruf von B<adduser> im System eingerichtet. Wird "
-"B<adduser --system> für einen bereits bestehenden "
-"Benutzer aufgerufen, der über die angeforderten oder kompatible Attribute verfügt, dann wird es auch 0 zurückliefern."
+"B<adduser --system> für einen bereits bestehenden Benutzer aufgerufen, der "
+"über die angeforderten oder kompatible Attribute verfügt, dann wird es auch "
+"0 zurückliefern."
#. type: TP
-#: ../adduser.8:487
+#: ../adduser.8:526
#, no-wrap
msgid "B<11>"
msgstr "B<11>"
#. type: Plain text
-#: ../adduser.8:490
+#: ../adduser.8:529
msgid "The object that B<adduser> was asked to create does already exist."
msgstr "Das Objekt, das B<adduser> erstellen soll, existiert bereits."
#. type: TP
-#: ../adduser.8:490
+#: ../adduser.8:529
#, no-wrap
msgid "B<12>"
msgstr "B<12>"
# FIXME B<deluser> → B<deluser>(8)
#. type: Plain text
-#: ../adduser.8:494
+#: ../adduser.8:533
msgid ""
"The object that B<adduser> or B<deluser> was asked to operate on does not "
"exist."
@@ -1165,13 +1237,17 @@ msgstr ""
"nicht."
#. type: TP
-#: ../adduser.8:494
+#: ../adduser.8:533
#, no-wrap
msgid "B<13>"
msgstr "B<13>"
+# FIXME B<deluser> → B<deluser>(8)
+# FIXME ont → not
+# FIXME or A user → or a user
+# FIXME or A system user → or a system user
#. type: Plain text
-#: ../adduser.8:511
+#: ../adduser.8:550
msgid ""
"The object that B<adduser> or B<deluser> was asked to operate on does ont "
"have the properties that are required to complete the operation: A user (a "
@@ -1181,15 +1257,24 @@ msgid ""
"a different UID (GID), or A system user (group) that was requested to be "
"deleted does exist, but is not a system user (group)."
msgstr ""
+"Das Objekt, auf dem B<adduser> oder B<deluser>(8) agieren soll, verfügt "
+"nicht über die Eigenschaften, die für den Abschluss der Aktion notwendig "
+"sind: Ein Benutzer (eine Gruppe), der als ein Systembenutzer (eine "
+"Systemgruppe) erstellt werden sollte, existiert bereits und ist kein "
+"Systembenutzer (keine Systemgruppe) oder ein Benutzer (eine Gruppe), die mit "
+"einer bestimmten UID (GID) erstellt werden sollte, existiert breits und hat "
+"eine andere UID (GID), oder ein Systembenutzer (eine Systemgruppe), die "
+"gelöscht werden sollte, existiert, aber nicht als Systembenutzer "
+"(Systemgruppe)."
#. type: TP
-#: ../adduser.8:511
+#: ../adduser.8:550
#, no-wrap
msgid "B<21>"
msgstr "B<21>"
#. type: Plain text
-#: ../adduser.8:515
+#: ../adduser.8:554
msgid ""
"The UID (GID) that was explicitly requested for a new user (group) is "
"already in use."
@@ -1198,24 +1283,24 @@ msgstr ""
"erbeten wurde, wird bereits verwandt."
#. type: TP
-#: ../adduser.8:515
+#: ../adduser.8:554
#, no-wrap
msgid "B<22>"
msgstr "B<22>"
#. type: Plain text
-#: ../adduser.8:518
+#: ../adduser.8:557
msgid "There is no available UID (GID) in the requested range."
msgstr "Es gibt in dem angeforderten Bereich keine verfügbare UID (GID)."
#. type: TP
-#: ../adduser.8:518
+#: ../adduser.8:557
#, no-wrap
msgid "B<23>"
msgstr "B<23>"
#. type: Plain text
-#: ../adduser.8:522
+#: ../adduser.8:561
msgid ""
"There is no group with the requested GID for the primary group for a new "
"user."
@@ -1224,13 +1309,13 @@ msgstr ""
"einen neuen Benutzer."
#. type: TP
-#: ../adduser.8:522
+#: ../adduser.8:561
#, no-wrap
msgid "B<31>"
msgstr "B<31>"
#. type: Plain text
-#: ../adduser.8:526
+#: ../adduser.8:565
msgid ""
"The chosen name for a new user or a new group does not conform to the "
"selected naming rules."
@@ -1239,35 +1324,36 @@ msgstr ""
"den ausgewählten Namensregeln."
#. type: TP
-#: ../adduser.8:526
+#: ../adduser.8:565
#, no-wrap
msgid "B<32>"
msgstr "B<32>"
#. type: Plain text
-#: ../adduser.8:529
+#: ../adduser.8:568
msgid "The home directory of a new user must be an absolute path."
-msgstr "Das Home-Verzeichnis eines neuen Benutzers muss ein absoluter Pfad sein."
+msgstr ""
+"Das Home-Verzeichnis eines neuen Benutzers muss ein absoluter Pfad sein."
#. type: TP
-#: ../adduser.8:529
+#: ../adduser.8:568
#, no-wrap
msgid "B<41>"
msgstr "B<41>"
#. type: Plain text
-#: ../adduser.8:532
+#: ../adduser.8:571
msgid "The group that was requested to be deleted is not empty."
msgstr "Die zum Löschen angeforderte Gruppe ist nicht leer."
#. type: TP
-#: ../adduser.8:532
+#: ../adduser.8:571
#, no-wrap
msgid "B<42>"
msgstr "B<42>"
#. type: Plain text
-#: ../adduser.8:536
+#: ../adduser.8:575
msgid ""
"The user that was requested to be removed from a group is not a member in "
"the first place."
@@ -1276,88 +1362,88 @@ msgstr ""
"Mitglied darin."
#. type: TP
-#: ../adduser.8:536
+#: ../adduser.8:575
#, no-wrap
msgid "B<43>"
msgstr "B<43>"
#. type: Plain text
-#: ../adduser.8:541
+#: ../adduser.8:580
msgid ""
"It is not possible to remove a user from its primary group, or no primary "
"group selected for a new user by any method."
msgstr ""
-"Es ist nicht möglich, einen Benutzer aus seiner primären Gruppe zu entferen "
+"Es ist nicht möglich, einen Benutzer aus seiner primären Gruppe zu entfernen "
"oder es wurde keine primäre Gruppe für einen Benutzer mittels irgendeiner "
"Methode ausgewählt."
#. type: TP
-#: ../adduser.8:541
+#: ../adduser.8:580
#, no-wrap
msgid "B<51>"
msgstr "B<51>"
#. type: Plain text
-#: ../adduser.8:544
+#: ../adduser.8:583
msgid "Incorrect number or order of command line parameters detected."
msgstr ""
-"Nicht korrekte Anzahl oder Reihenfolge der Befehlszeilenparameter erkannt."
+"Falsche Anzahl oder Reihenfolge der Befehlszeilenparameter erkannt."
#. type: TP
-#: ../adduser.8:544
+#: ../adduser.8:583
#, no-wrap
msgid "B<52>"
msgstr "B<52>"
#. type: Plain text
-#: ../adduser.8:547
+#: ../adduser.8:586
msgid "Incompatible options set in configuration file."
msgstr "In der Konfigurationsdatei wurden inkompatible Optionen gesetzt."
#. type: TP
-#: ../adduser.8:547
+#: ../adduser.8:586
#, no-wrap
msgid "B<53>"
msgstr "B<53>"
#. type: Plain text
-#: ../adduser.8:550
+#: ../adduser.8:589
msgid "Mutually incompatible command line options detected."
msgstr "Gegenseitige inkompatible Befehlsoptionen erkannt."
#. type: TP
-#: ../adduser.8:550
+#: ../adduser.8:589
#, no-wrap
msgid "B<54>"
msgstr "B<54>"
# FIXME B<deluser> → B<deluser>(8)
#. type: Plain text
-#: ../adduser.8:553
+#: ../adduser.8:592
msgid "B<adduser> and B<deluser> invoked as non-root and thus cannot work."
msgstr ""
"B<adduser> und B<deluser>(8) wurden als ein von root verschiedener Benutzer "
"aufgerufen und können daher nicht funktionieren."
#. type: TP
-#: ../adduser.8:553
+#: ../adduser.8:592
#, no-wrap
msgid "B<55>"
msgstr "B<55>"
#. type: Plain text
-#: ../adduser.8:556
+#: ../adduser.8:595
msgid "B<deluser> will refuse to delete the I<root> account."
msgstr "B<deluser> wird die Löschung des Kontos von I<root> ablehnen."
#. type: TP
-#: ../adduser.8:556
+#: ../adduser.8:595
#, no-wrap
msgid "B<56>"
msgstr "B<56>"
#. type: Plain text
-#: ../adduser.8:560
+#: ../adduser.8:599
msgid ""
"A function was requested that needs more packages to be installed. See "
"Recommends: and Suggests: of the adduser package."
@@ -1366,14 +1452,14 @@ msgstr ""
"müssen. Siehe die Recommends: und Suggests: des Pakets »adduser«."
#. type: TP
-#: ../adduser.8:560
+#: ../adduser.8:599
#, no-wrap
msgid "B<61>"
msgstr "B<61>"
# FIXME Adduser → B<adduser>
#. type: Plain text
-#: ../adduser.8:564
+#: ../adduser.8:603
msgid ""
"Adduser was aborted for some reason and tried to roll back the changes that "
"were done during execution."
@@ -1382,129 +1468,129 @@ msgstr ""
"Änderungen zurückzunehmen, die während der Ausführung erfolgt sind."
#. type: TP
-#: ../adduser.8:564
+#: ../adduser.8:603
#, no-wrap
msgid "B<62>"
msgstr "B<62>"
# FIXME adduser → B<adduser>
#. type: Plain text
-#: ../adduser.8:569
+#: ../adduser.8:608
msgid ""
"Internal adduser error. This should not happen. Please try to reproduce "
"the issue and file a bug report."
msgstr ""
"Interner Fehler von B<adduser>. Dies sollte nicht passieren. Bitte versuchen "
"Sie, das Problem zu reproduzieren und reichen Sie (auf Englisch) einen "
-"Fehler ein."
+"Fehlerbericht ein."
#. type: TP
-#: ../adduser.8:569
+#: ../adduser.8:608
#, no-wrap
msgid "B<71>"
msgstr "B<71>"
#. type: Plain text
-#: ../adduser.8:572
+#: ../adduser.8:611
msgid "Error creating and handling the lock."
msgstr "Fehler beim Erstellen und Handhaben der Sperre."
#. type: TP
-#: ../adduser.8:572
+#: ../adduser.8:611
#, no-wrap
msgid "B<72>"
msgstr "B<72>"
#. type: Plain text
-#: ../adduser.8:575
+#: ../adduser.8:614
msgid "Error accessing the configuration file(s)."
msgstr "Fehler beim Zugriff auf die Konfigurationsdatei(en)."
#. type: TP
-#: ../adduser.8:575
+#: ../adduser.8:614
#, no-wrap
msgid "B<73>"
msgstr "B<73>"
#. type: Plain text
-#: ../adduser.8:578
+#: ../adduser.8:617
msgid "Error accessing a pool file."
-msgstr ""
+msgstr "Fehler beim Zugriff auf eine Vorratsdatei."
#. type: TP
-#: ../adduser.8:578
+#: ../adduser.8:617
#, no-wrap
msgid "B<74>"
msgstr "B<74>"
#. type: Plain text
-#: ../adduser.8:581
+#: ../adduser.8:620
msgid "Error reading a pool file, syntax error in file."
-msgstr ""
+msgstr "Fehler beim Lesen einer Vorratsdatei, Syntaxfehler in der Datei."
#. type: TP
-#: ../adduser.8:581
+#: ../adduser.8:620
#, no-wrap
msgid "B<75>"
msgstr "B<75>"
#. type: Plain text
-#: ../adduser.8:584
+#: ../adduser.8:623
msgid "Error accessing auxiliary files."
-msgstr ""
+msgstr "Fehler beim Zugriff auf Hilfsdateien."
#. type: TP
-#: ../adduser.8:584
+#: ../adduser.8:623
#, no-wrap
msgid "B<81>"
msgstr "B<81>"
# FIXME B<deluser> → B<deluser>(8)
#. type: Plain text
-#: ../adduser.8:588
+#: ../adduser.8:627
msgid ""
"An executable that is needed by B<adduser> or B<deluser> cannot be found. "
"Check your installation and dependencies."
msgstr ""
"Ein Programm, das von B<adduser> oder B<deluser>(8) benötigt wird, kann "
-"nicht gefunden werden. Prüfen Sie Ihre Installation und Abhängigkeiten."
+"nicht gefunden werden. Prüfen Sie Ihre Installation und die Abhängigkeiten."
#. type: TP
-#: ../adduser.8:588
+#: ../adduser.8:627
#, no-wrap
msgid "B<82>"
msgstr "B<82>"
#. type: Plain text
-#: ../adduser.8:591
+#: ../adduser.8:630
msgid "Executing an external command returned some unexpected error."
msgstr ""
"Die Ausführung eines externen Befehls lieferte einen unerwarteten Fehler."
#. type: TP
-#: ../adduser.8:591
+#: ../adduser.8:630
#, no-wrap
msgid "B<83>"
msgstr "B<83>"
#. type: Plain text
-#: ../adduser.8:594
+#: ../adduser.8:633
msgid "An external command was terminated with a signal."
msgstr "Ein externer Befehl wurde mit einem Signal beendet."
#. type: TP
-#: ../adduser.8:594
+#: ../adduser.8:633
#, no-wrap
msgid "B<84>"
msgstr "B<84>"
#. type: Plain text
-#: ../adduser.8:597
+#: ../adduser.8:636
msgid "A syscall terminated with unexpected error."
msgstr "Ein Systemaufruf beendete sich mit einem unerwarteten Fehler."
#. type: Plain text
-#: ../adduser.8:602
+#: ../adduser.8:641
msgid ""
"Or for many other yet undocumented reasons which are printed to console "
"then. You may then consider to remove B<--quiet> to make B<adduser> more "
@@ -1515,13 +1601,13 @@ msgstr ""
"B<adduser> ohne B<--quiet> aufrufen, um mehr Einzelheiten auszugeben."
#. type: SH
-#: ../adduser.8:603 ../deluser.8:268
+#: ../adduser.8:642 ../deluser.8:276
#, no-wrap
msgid "SECURITY"
msgstr "SICHERHEIT"
#. type: Plain text
-#: ../adduser.8:615
+#: ../adduser.8:654
msgid ""
"B<adduser> needs root privileges and offers, via the B<--conf> command line "
"option to use different configuration files. Do not use B<sudo>(8) or "
@@ -1534,47 +1620,47 @@ msgstr ""
"Befehlszeilenoption B<--conf> die Möglichkeit, verschiedene "
"Konfigurationsdateien zu verwenden. Verwenden Sie nicht B<sudo>(8) oder "
"ähnliche Befehle, um Teilprivilegien an B<adduser> mit beschränkten "
-"Befehlszeilenparameter zu geben. Dies kann leicht umgangen werden und könnte "
+"Befehlszeilenparametern zu geben. Dies kann leicht umgangen werden und könnte "
"Benutzern erlauben, beliebige Konten zu erstellen. Falls Sie dies erreichen "
"wollen, entwickeln Sie Ihr eigenes Skript, das B<adduser> kapselt, und "
-"vergeben Sie Privilegien, um diese Skript aufzurufen."
+"vergeben Sie Privilegien, um dieses Skript aufzurufen."
#. type: SH
-#: ../adduser.8:616 ../adduser.conf.5:276 ../deluser.8:281 ../deluser.conf.5:82
+#: ../adduser.8:655 ../adduser.conf.5:284 ../deluser.8:289 ../deluser.conf.5:82
#, no-wrap
msgid "FILES"
msgstr "DATEIEN"
#. type: Plain text
-#: ../adduser.8:617 ../adduser.conf.5:278
+#: ../adduser.8:656 ../adduser.conf.5:286
#, no-wrap
msgid "I</etc/adduser.conf>"
msgstr "I</etc/adduser.conf>"
#. type: Plain text
-#: ../adduser.8:620
+#: ../adduser.8:659
msgid "Default configuration file for B<adduser>(8) and B<addgroup>(8)"
msgstr "Standard-Konfigurationsdatei für B<adduser>(8) und B<addgroup>(8)"
#. type: TP
-#: ../adduser.8:620
+#: ../adduser.8:659
#, no-wrap
msgid "I</usr/local/sbin/adduser.local>"
msgstr "I</usr/local/sbin/adduser.local>"
#. type: Plain text
-#: ../adduser.8:624
+#: ../adduser.8:663
msgid "Optional custom add-ons, see B<adduser.local>(8)"
msgstr "Optionale benutzerspezifische Erweiterungen, siehe B<adduser.local>(8)"
#. type: SH
-#: ../adduser.8:626 ../adduser.conf.5:207
+#: ../adduser.8:665 ../adduser.conf.5:205
#, no-wrap
msgid "NOTES"
msgstr "ANMERKUNGEN"
#. type: Plain text
-#: ../adduser.8:653
+#: ../adduser.8:692
msgid ""
"Unfortunately, the term I<system account> suffers from double use in "
"Debian. It both means an account for the actual Debian system, "
@@ -1601,7 +1687,7 @@ msgstr ""
"verfügt über die Möglichkeit, sich am tatsächlichen System anzumelden, hat "
"eine UID, kann Mitglied in Systemgruppen sein, kann Dateien und Prozesse "
"besitzen. Im Gegensatz dazu unterscheiden die Debian-Richtlinien in Kapitel "
-"9.2.2 zwischen I<dynamisch zugewiesenen Systembenutzern -und -gruppen> und "
+"9.2.2 zwischen I<dynamisch zugewiesenen Systembenutzern und -gruppen> und "
"I<dynamisch zugewiesenen Benutzerkonten>. Beides sind Sonderfälle eines "
"I<Systemkontos>. Die beiden Begriffswelten dürfen nicht durcheinander "
"gebracht werden. Da B<adduser> und B<deluser>(8) niemals I<Anwendungskonten> "
@@ -1613,7 +1699,7 @@ msgstr ""
"Verzeichnisdienste verwaltet werden, benötigt wird."
#. type: Plain text
-#: ../adduser.8:670
+#: ../adduser.8:709
msgid ""
"B<adduser> used to have the vision to be the universal front end to the "
"various directory services for creation and deletion of regular and system "
@@ -1639,8 +1725,9 @@ msgstr ""
"groß sein wird, um die Unterstützung für die Vielzahl an "
"Verzeichnisdiensten, die das benötigen, zu schreiben und zu betreuen."
+# FIXME B<password> → B<passwd>(1)
#. type: Plain text
-#: ../adduser.8:674
+#: ../adduser.8:713
msgid ""
"B<adduser> will constrict itself to being a policy layer for the management "
"of local system accounts, using the tools from the B<password> package for "
@@ -1651,13 +1738,13 @@ msgstr ""
"Pakets B<password> für die eigentliche Arbeit verwandt."
#. type: SH
-#: ../adduser.8:675
+#: ../adduser.8:714
#, no-wrap
msgid "BUGS"
msgstr "FEHLER"
#. type: Plain text
-#: ../adduser.8:679
+#: ../adduser.8:718
msgid ""
"Inconsistent use of terminology around the term I<system account> in docs "
"and code is a bug. Please report this and allow us to improve our docs."
@@ -1667,7 +1754,7 @@ msgstr ""
"dies, um uns zu ermöglichen, die Dokumentation zu verbessern."
#. type: Plain text
-#: ../adduser.8:689
+#: ../adduser.8:728
msgid ""
"B<adduser> takes special attention to be directly usable in Debian "
"maintainer scripts without conditional wrappers, error suppression and other "
@@ -1683,23 +1770,24 @@ msgstr ""
"werden sollte, ist eine Prüfung auf das Vorhandensein des Programms im "
"Skript postrm. Die Betreuer von B<adduser> betrachten die Notwendigkeit für "
"zusätzliches Rüstwerk als einen Fehler und ermutigen ihre Mit-Debian-"
-"Paketbetreuer, in diesem Fall Fehler gegen das Paket B<adduser> einzureichen."
+"Paketbetreuer, in diesem Fall Fehlerberichte gegen das Paket B<adduser> einzureichen."
#. type: SH
-#: ../adduser.8:690 ../adduser.conf.5:278 ../deluser.8:290 ../deluser.conf.5:84
+#: ../adduser.8:729 ../adduser.conf.5:286 ../deluser.8:298 ../deluser.conf.5:84
#, no-wrap
msgid "SEE ALSO"
msgstr "SIEHE AUCH"
#. type: Plain text
-#: ../adduser.8:698
+#: ../adduser.8:737
msgid ""
"B<adduser.conf>(5), B<deluser>(8), B<groupadd>(8), B<useradd>(8), "
"B<usermod>(8), B</usr/share/doc/base-passwd/users-and-groups.html> on any "
"Debian system, Debian Policy 9.2.2."
msgstr ""
"B<adduser.conf>(5), B<deluser>(8), B<groupadd>(8), B<useradd>(8), "
-"B<usermod>(8), B</usr/share/doc/base-passwd/users-and-groups.html> auf jedem Debian-System, Debian-Richtlinien 9.2.2."
+"B<usermod>(8), B</usr/share/doc/base-passwd/users-and-groups.html> auf jedem "
+"Debian-System, Debian-Richtlinien 9.2.2."
#. type: TH
#: ../adduser.conf.5:13
@@ -1712,7 +1800,7 @@ msgstr "ADDUSER.CONF"
msgid ""
"/etc/adduser.conf - configuration file for B<adduser>(8) and B<addgroup>(8)"
msgstr ""
-"/etc/adduser.conf - Konfigurationsdatei für B<adduser>(8) und B<addgroup>(8)."
+"/etc/adduser.conf - Konfigurationsdatei für B<adduser>(8) und B<addgroup>(8)"
#. type: Plain text
#: ../adduser.conf.5:30
@@ -1725,7 +1813,7 @@ msgid ""
msgstr ""
"Die Datei I</etc/adduser.conf> enthält Vorgabewerte für die Programme "
"B<adduser>(8), B<addgroup>(8), B<deluser>(8) und B<delgroup>(8). Jede Zeile "
-"enthält eine Option in der Form I<Option> = I<Wert>. Die Werte können von "
+"enthält ein einzelnes Wertepaar in der Form I<Option> = I<Wert>. Die Werte können von "
"einfachen oder doppelten Anführungszeichen, das Gleichheitszeichen von "
"Leerraum eingeschlossen werden. Kommentarzeilen müssen mit dem Raute-Zeichen "
"(#) beginnen."
@@ -1741,27 +1829,27 @@ msgstr "Die gültigen Konfigurationsoptionen sind:"
msgid "B<STDERRMSGLEVEL , STDOUTMSGLEVEL , and LOGMSGLEVEL>"
msgstr "B<STDERRMSGLEVEL, STDOUTMSGLEVEL und LOGMSGLEVEL>"
+# adduser(8) → B<adduser>(8)
#. type: Plain text
-#: ../adduser.conf.5:46
+#: ../adduser.conf.5:38
msgid ""
"Minimum priority for messages logged to syslog/journal and the console, "
-"respectively. Values are I<trace>, I<debug>, I<info>, I<warn>, I<err>, and "
-"I<fatal>. Messages with the priority set here or higher get printed to the "
-"respective medium. Messages printed to stderr are not repeated on stdout. "
-"That allows the local admin to control B<adduser>s chattiness on the console "
-"and in the log independently, keeping probably confusing information to "
-"itself while still leaving helpful information in the log. Defaults to "
-"I<info> for STDOUTMSGLEVEL and LOGMSGLEVEL and I<warn> for STDERRMSGLEVEL."
+"respectively. See B<LOGGING> in adduser(8). Defaults to I<warn> for "
+"STDOUTMSGLEVEL and STDERRMSGLEVEL and I<info> for LOGMSGLEVEL."
msgstr ""
+"Minimale Priorität für Meldungen, die in Syslog/Journal bzw. auf die Konsole "
+"protokolliert werden. Siehe B<PROTOKOLLIERUNG> in B<adduser>(8). "
+"Standardmäßig I<warn> für STDOUTMSGLEVEL und STDERRMSGLEVEL und I<info> für "
+"LOGMSGLEVEL."
#. type: TP
-#: ../adduser.conf.5:46
+#: ../adduser.conf.5:38
#, no-wrap
msgid "B<ADD_EXTRA_GROUPS>"
msgstr "B<ADD_EXTRA_GROUPS>"
#. type: Plain text
-#: ../adduser.conf.5:53
+#: ../adduser.conf.5:45
msgid ""
"Setting this to something other than 0 will cause B<adduser> to add newly "
"created non-system users to the list of groups defined by B<EXTRA_GROUPS> "
@@ -1772,13 +1860,13 @@ msgstr ""
"(siehe unten) angegebenen Gruppen machen. Die Vorgabe ist I<0>."
#. type: TP
-#: ../adduser.conf.5:53
+#: ../adduser.conf.5:45
#, no-wrap
msgid "B<DIR_MODE>"
msgstr "B<DIR_MODE>"
#. type: Plain text
-#: ../adduser.conf.5:62
+#: ../adduser.conf.5:54
msgid ""
"The permissions mode for home directories of non-system users that are "
"created by B<adduser>(8). Defaults to I<0700>. Note that there are "
@@ -1793,13 +1881,13 @@ msgstr ""
"benötigen. Siehe auch B<SYS_DIR_MODE>."
#. type: TP
-#: ../adduser.conf.5:62
+#: ../adduser.conf.5:54
#, no-wrap
msgid "B<DHOME>"
msgstr "B<DHOME>"
#. type: Plain text
-#: ../adduser.conf.5:66
+#: ../adduser.conf.5:58
msgid ""
"The directory in which new home directories should be created. Defaults to "
"I</home>."
@@ -1808,13 +1896,13 @@ msgstr ""
"(Standard ist I<home>)."
#. type: TP
-#: ../adduser.conf.5:66
+#: ../adduser.conf.5:58
#, no-wrap
msgid "B<DSHELL>"
msgstr "B<DSHELL>"
#. type: Plain text
-#: ../adduser.conf.5:70
+#: ../adduser.conf.5:62
msgid ""
"The login shell to be used for all new users. Defaults to I</bin/bash>."
msgstr ""
@@ -1822,13 +1910,13 @@ msgstr ""
"angemeldet hat) für alle neuen Benutzer; Standardwert ist I</bin/bash>"
#. type: TP
-#: ../adduser.conf.5:70
+#: ../adduser.conf.5:62
#, no-wrap
msgid "B<EXTRA_GROUPS>"
msgstr "B<EXTRA_GROUPS>"
#. type: Plain text
-#: ../adduser.conf.5:75
+#: ../adduser.conf.5:67
msgid ""
"This is the space-separated list of groups that new non-system users will be "
"added to. Defaults to I<users>."
@@ -1837,13 +1925,13 @@ msgstr ""
"werden diesen Gruppen zugeordnet. Standardmäßig I<users>."
#. type: TP
-#: ../adduser.conf.5:75
+#: ../adduser.conf.5:67
#, no-wrap
msgid "B<FIRST_SYSTEM_GID and LAST_SYSTEM_GID>"
msgstr "B<FIRST_SYSTEM_GID und LAST_SYSTEM_GID>"
#. type: Plain text
-#: ../adduser.conf.5:80
+#: ../adduser.conf.5:72
msgid ""
"specify an inclusive range of GIDs from which GIDs for system groups can be "
"dynamically allocated. Defaults to I<100> - I<999>."
@@ -1852,29 +1940,29 @@ msgstr ""
"zugewiesen werden können. Standardmäßig I<100> - I<999>."
#. type: TP
-#: ../adduser.conf.5:80
+#: ../adduser.conf.5:72
#, no-wrap
msgid "B<FIRST_GID and LAST_GID>"
msgstr "B<FIRST_GID und LAST_GID>"
#. type: Plain text
-#: ../adduser.conf.5:85
+#: ../adduser.conf.5:77
msgid ""
"specify an inclusive range of GIDs from which GIDs for non-system groups can "
"be dynamically allocated. Defaults to I<1000> - I<59999>."
msgstr ""
-"geben einen Bereich von GID an, aus denen GIDs für Nicht-Systemgruppen "
+"geben einen Bereich von GIDs an, aus denen GIDs für Nicht-Systemgruppen "
"dynamisch zugewiesen werden können. Standardmäßig I<1000> - I<59999>."
#. type: TP
-#: ../adduser.conf.5:85
+#: ../adduser.conf.5:77
#, no-wrap
msgid "B<FIRST_SYSTEM_UID and LAST_SYSTEM_UID>"
msgstr "B<FIRST_SYSTEM_UID und LAST_SYSTEM_UID>"
# FIXME The third sentence needs improved wording
#. type: Plain text
-#: ../adduser.conf.5:93
+#: ../adduser.conf.5:85
msgid ""
"specify an inclusive range of UIDs from which UIDs for system users can be "
"dynamically allocated. Defaults to I<100> - I<999>. Please note that "
@@ -1888,13 +1976,13 @@ msgstr ""
"zugewiesen sind."
#. type: TP
-#: ../adduser.conf.5:93
+#: ../adduser.conf.5:85
#, no-wrap
msgid "B<FIRST_UID and LAST_UID>"
msgstr "B<FIRST_UID und LAST_UID>"
#. type: Plain text
-#: ../adduser.conf.5:98
+#: ../adduser.conf.5:90
msgid ""
"specify an inclusive range of UIDs from which UIDs for non-system users can "
"be dynamically allocated. Defaults to I<1000> - I<59999>."
@@ -1903,24 +1991,24 @@ msgstr ""
"dynamisch zugewiesen werden können. Standardmäßig I<1000> - I<59999>."
#. type: TP
-#: ../adduser.conf.5:98
+#: ../adduser.conf.5:90
#, no-wrap
msgid "B<GID_POOL>"
msgstr "B<GID_POOL>"
#. type: Plain text
-#: ../adduser.conf.5:101
+#: ../adduser.conf.5:93
msgid "See B<UID_POOL>."
msgstr "Siehe B<UID_POOL>."
#. type: TP
-#: ../adduser.conf.5:101
+#: ../adduser.conf.5:93
#, no-wrap
msgid "B<GROUPHOMES>"
msgstr "B<GROUPHOMES>"
#. type: Plain text
-#: ../adduser.conf.5:106
+#: ../adduser.conf.5:98
msgid ""
"If this is set to I<yes>, the home directories will be created as I</home/"
"groupname/user>. Defaults to I<no>. This option is B<deprecated> and will "
@@ -1931,42 +2019,42 @@ msgstr ""
"ist B<veraltet> und wird entfernt."
#. type: TP
-#: ../adduser.conf.5:106
+#: ../adduser.conf.5:98
#, no-wrap
msgid "B<LAST_GID>"
msgstr "B<LAST_GID>"
#. type: TQ
-#: ../adduser.conf.5:108
+#: ../adduser.conf.5:100
#, no-wrap
msgid "B<LAST_SYSTEM_GID>"
msgstr "B<LAST_SYSTEM_GID>"
#. type: TQ
-#: ../adduser.conf.5:110
+#: ../adduser.conf.5:102
#, no-wrap
msgid "B<LAST_UID>"
msgstr "B<LAST_UID>"
#. type: TQ
-#: ../adduser.conf.5:112
+#: ../adduser.conf.5:104
#, no-wrap
msgid "B<LAST_SYSTEM_UID>"
msgstr "B<LAST_SYSTEM_UID>"
#. type: Plain text
-#: ../adduser.conf.5:115
+#: ../adduser.conf.5:107
msgid "See the B<FIRST_> variants of the option."
msgstr "Siehe die Varianten B<FIRST_> der Option."
#. type: TP
-#: ../adduser.conf.5:115
+#: ../adduser.conf.5:107
#, no-wrap
msgid "B<LETTERHOMES>"
msgstr "B<LETTERHOMES>"
#. type: Plain text
-#: ../adduser.conf.5:122
+#: ../adduser.conf.5:114
msgid ""
"If this is set to I<yes>, then the home directories created will have an "
"extra directory inserted which is the first letter of the loginname. For "
@@ -1974,18 +2062,18 @@ msgid ""
"and will be removed."
msgstr ""
"Wird diese Option auf I<yes> gesetzt, wird beim Anlegen der Home-"
-"Verzeichnisse ein zusätzliches Verzeichnis angelegt, dessen Name der erste "
+"Verzeichnisse ein zusätzliches Verzeichnis eingefügt, dessen Name der erste "
"Buchstabe des Benutzernamens ist, z. B. I</home/b/benutzer>. Der Vorgabewert "
"ist I<no>. Diese Option ist B<veraltet> und wird entfernt."
#. type: TP
-#: ../adduser.conf.5:122
+#: ../adduser.conf.5:114
#, no-wrap
msgid "B<NAME_REGEX>"
msgstr "B<NAME_REGEX>"
#. type: Plain text
-#: ../adduser.conf.5:133
+#: ../adduser.conf.5:125
msgid ""
"Non-system user- and groupnames are checked against this regular "
"expression. If the name doesn't match this regexp, user and group creation "
@@ -2003,13 +2091,13 @@ msgstr ""
"und B<Gültige Namen> für weitere Informationen."
#. type: TP
-#: ../adduser.conf.5:133
+#: ../adduser.conf.5:125
#, no-wrap
msgid "B<QUOTAUSER>"
msgstr "B<QUOTAUSER>"
#. type: Plain text
-#: ../adduser.conf.5:139
+#: ../adduser.conf.5:131
msgid ""
"If set to a nonempty value, new users will have quotas copied from that user "
"using I<edquota -p QUOTAUSER newuser>. Defaults to I<the empty string>."
@@ -2019,13 +2107,30 @@ msgstr ""
"QUOTAUSER Neuerbenutzer>. Die Voreinstellung ist I<die leere Zeichenkette>."
#. type: TP
-#: ../adduser.conf.5:139
+#: ../adduser.conf.5:131
+#, no-wrap
+msgid "B<RESERVE_UID_POOL and RESERVE_GID_POOL>"
+msgstr "B<RESERVE_UID_POOL und RESERVE_GID_POOL>"
+
+#. type: Plain text
+#: ../adduser.conf.5:137
+msgid ""
+"Controls whether the UID and GID values that are listed in the pool files "
+"are truly reserved. See UID AND GID POOLS in the NOTES section. Defaults "
+"to I<yes>."
+msgstr ""
+"Steuert, ob die UID- und GID-Werte, die in den Vorratsdateien aufgeführt "
+"sind, wirklich reserviert sind. Siehe UID- und GID-VORRAT im Abschnitt "
+"ANMERKUNGEN. Beide sind standardmäßig I<yes>."
+
+#. type: TP
+#: ../adduser.conf.5:137
#, no-wrap
msgid "B<SETGID_HOME>"
msgstr "B<SETGID_HOME>"
#. type: Plain text
-#: ../adduser.conf.5:149
+#: ../adduser.conf.5:147
msgid ""
"If this is set to I<yes>, then home directories for users with their own "
"group (B<USERGROUPS> = yes) will have the set-group-ID bit set. Note that "
@@ -2039,13 +2144,13 @@ msgstr ""
"Sie stattdessen B<DIR_MODE>. Standardmäßig I<no>."
#. type: TP
-#: ../adduser.conf.5:149
+#: ../adduser.conf.5:147
#, no-wrap
msgid "B<SKEL>"
msgstr "B<SKEL>"
#. type: Plain text
-#: ../adduser.conf.5:154
+#: ../adduser.conf.5:152
msgid ""
"The directory from which skeletal user configuration files will be copied. "
"Defaults to I</etc/skel>."
@@ -2054,13 +2159,13 @@ msgstr ""
"Benutzer kopiert. Standardmäßig ist I</etc/skel>."
#. type: TP
-#: ../adduser.conf.5:154
+#: ../adduser.conf.5:152
#, no-wrap
msgid "B<SKEL_IGNORE_REGEX>"
msgstr "B<SKEL_IGNORE_REGEX>"
#. type: Plain text
-#: ../adduser.conf.5:161
+#: ../adduser.conf.5:159
msgid ""
"When populating the newly created home directory of a non-system user, files "
"in SKEL matching this regex are not copied. Defaults to to I<(.(dpkg|ucf)-"
@@ -2074,13 +2179,13 @@ msgstr ""
"Konfigurationsdateien stammen."
#. type: TP
-#: ../adduser.conf.5:161
+#: ../adduser.conf.5:159
#, no-wrap
msgid "B<SYS_DIR_MODE>"
msgstr "B<SYS_DIR_MODE>"
#. type: Plain text
-#: ../adduser.conf.5:170
+#: ../adduser.conf.5:168
msgid ""
"The permissions mode for home directories of system users that are created "
"by B<adduser>(8). Defaults to I<0755>. Note that changing the default "
@@ -2089,18 +2194,19 @@ msgid ""
msgstr ""
"Der Berechtigungsmodus für Home-Verzeichnisse von Systembenutzern, die durch "
"B<adduser>(8) erstellt werden. Standardmäßig I<0755>. Beachten Sie, dass die "
-"Änderung von Berechtigungen für Systembenutzer dazu führen kann, dass sich "
+"Änderung von Standard-Berechtigungen für Systembenutzer dazu führen kann, dass sich "
"einige Pakete unzuverlässig verhalten, falls sich das Programm auf die "
"Standardeinstellungen verlässt. Siehe auch B<DIR_MODE>."
#. type: TP
-#: ../adduser.conf.5:170
+#: ../adduser.conf.5:168
#, no-wrap
msgid "B<SYS_NAME_REGEX>"
msgstr "B<SYS_NAME_REGEX>"
+# FIXME adduser → B<adduser>(1)
#. type: Plain text
-#: ../adduser.conf.5:181
+#: ../adduser.conf.5:179
msgid ""
"System user- and groupnames are checked against this regular expression. If "
"the name doesn't match this regexp, system user and group creation in "
@@ -2111,36 +2217,36 @@ msgid ""
msgstr ""
"Systembenutzer- und -gruppennamen werden mit diesem regulären Ausdruck "
"überprüft. Wenn der Name nicht zum regulären Ausdruck passt, verweigert "
-"Adduser die Erstellung von Benutzer und Gruppe - es sei denn, die Option B<--"
+"B<adduser>(1) die Erstellung von Benutzer und Gruppe - es sei denn, die Option B<--"
"allow-bad-names> wurde gewählt. Durch Setzen von B<--allow-bad-names> werden "
"schwächere Prüfungen durchgeführt. Die Vorgabe sind die konservativsten "
"I<^[a-z_][-a-z0-9_]*$>. Siehe B<NAME_REGEX> weiter oben und B<Gültige Namen> "
"weiter unten für weitere Informationen."
#. type: TP
-#: ../adduser.conf.5:181
+#: ../adduser.conf.5:179
#, no-wrap
msgid "B<UID_POOL and GID_POOL>"
msgstr "B<UID_POOL und GID_POOL>"
#. type: Plain text
-#: ../adduser.conf.5:186
+#: ../adduser.conf.5:184
msgid ""
"specify a file or a directory containing UID and GID pool files. See UID "
-"and GID POOLS in the NOTES section. Both default to I<empty>."
+"AND GID POOLS in the NOTES section. Both default to I<empty>."
msgstr ""
"Legt eine Datei oder ein Verzeichnis fest, dass die UID- und GID-Vorrat-"
-"Dateien enthält. Siehe UID- und GID-VORRAT im Abschnitt ANMERKUNGEN. Beide "
+"Dateien enthält. Siehe UID- UND GID-VORRAT im Abschnitt ANMERKUNGEN. Beide "
"sind standardmäßig I<leer>."
#. type: TP
-#: ../adduser.conf.5:186
+#: ../adduser.conf.5:184
#, no-wrap
msgid "B<USERGROUPS>"
msgstr "B<USERGROUPS>"
#. type: Plain text
-#: ../adduser.conf.5:191
+#: ../adduser.conf.5:189
msgid ""
"Specify whether each created non-system user will be given their own group "
"to use. Defaults to I<yes>."
@@ -2149,13 +2255,13 @@ msgstr ""
"Verwendung gegeben wird. Standardmäßig I<yes>."
#. type: TP
-#: ../adduser.conf.5:191
+#: ../adduser.conf.5:189
#, no-wrap
msgid "B<USERS_GID and USERS_GROUP>"
msgstr "B<USERS_GID und USERS_GROUP>"
#. type: Plain text
-#: ../adduser.conf.5:207
+#: ../adduser.conf.5:205
msgid ""
"Defines the groupname or GID of the group all newly-created non-system users "
"are placed into. If B<USERGROUPS> is I<yes,> the group will be added as a "
@@ -2179,13 +2285,13 @@ msgstr ""
"Variablen zu definieren, selbst wenn die Werte konsistent sind."
#. type: SS
-#: ../adduser.conf.5:208
+#: ../adduser.conf.5:206
#, no-wrap
msgid "VALID NAMES"
msgstr "GÜLTIGE NAMEN"
#. type: Plain text
-#: ../adduser.conf.5:218
+#: ../adduser.conf.5:216
msgid ""
"Historically, B<adduser>(8) and B<addgroup>(8) enforced conformity to IEEE "
"Std 1003.1-2001, which allows only the following characters to appear in "
@@ -2201,19 +2307,19 @@ msgstr ""
"typische Samba-Maschinenkonten zu erlauben."
#. type: Plain text
-#: ../adduser.conf.5:224
+#: ../adduser.conf.5:222
msgid ""
"The default settings for B<NAME_REGEX> and B<SYS_NAME_REGEX> allow usernames "
"to contain lowercase letters and digits, plus dash (-) and underscore (_); "
"the name must begin with a letter (or an underscore for system users)."
msgstr ""
"Die Standardeinstellungen für B<NAME_REGEX> und B<SYS_NAME_REGEX> erlauben, "
-"das Benutzernamen Kleinbuchstaben und Ziffern enthalten, sowie den Gedanken- "
+"dass Benutzernamen Kleinbuchstaben und Ziffern enthalten, sowie den Gedanken- "
"(-) und Unterstrich (_). Der Name muss mit einem Buchstaben (oder einem "
"Unterstrich für Systembenutzer) beginnen."
#. type: Plain text
-#: ../adduser.conf.5:230
+#: ../adduser.conf.5:228
msgid ""
"The least restrictive policy, available by using the B<--allow-all-names> "
"option, simply makes the same checks as B<useradd>(8): cannot start with a "
@@ -2227,7 +2333,7 @@ msgstr ""
"Leerraum enthalten."
#. type: Plain text
-#: ../adduser.conf.5:233
+#: ../adduser.conf.5:231
msgid ""
"This option can be used to create confusing or misleading names; use it with "
"caution."
@@ -2236,25 +2342,25 @@ msgstr ""
"werden; verwenden Sie sie vorsichtig."
#. type: Plain text
-#: ../adduser.conf.5:239
+#: ../adduser.conf.5:237
msgid ""
"Please note that regardless of the regular expressions used to evaluate the "
"username, it may be a maximum of 32 bytes; this may be less than 32 visual "
"characters when using Unicode glyphs in the username."
msgstr ""
-"Beachten Sie das Maximum von 32 byte, unabhängig von dem zur Auswertung des "
-"Benutzernamens verwandten regulären Ausdruck. Dies kann weniger als 32 "
+"Beachten Sie das Maximum von 32 byte, unabhängig von den zur Auswertung des "
+"Benutzernamens verwandten regulären Ausdrücken. Dies können weniger als 32 "
"sichtbare Zeichen sein, wenn Unicode-Zeichen in dem Benutzernamen verwandt "
"werden."
#. type: SS
-#: ../adduser.conf.5:239
+#: ../adduser.conf.5:237
#, no-wrap
msgid "UID AND GID POOLS"
msgstr "UID- und GID-VORRAT"
#. type: Plain text
-#: ../adduser.conf.5:247
+#: ../adduser.conf.5:245
msgid ""
"Some installations desire that a non-system account gets preconfigured "
"properties when it is generated. Commonly, the local admin wants to make "
@@ -2268,7 +2374,7 @@ msgstr ""
"auf den er oder sie existiert, die gleiche numerische UID/GID hat."
#. type: Plain text
-#: ../adduser.conf.5:255
+#: ../adduser.conf.5:253
msgid ""
"To enable this feature, define configuration variables B<UID_POOL> (for user "
"accounts) and/or B<GID_POOL> (for groups) in I</etc/adduser.conf> and "
@@ -2284,7 +2390,7 @@ msgstr ""
"betrachtet, die dem Namensschema I<*.conf> folgen."
#. type: Plain text
-#: ../adduser.conf.5:264
+#: ../adduser.conf.5:262
msgid ""
"The file format is similar to I</etc/passwd>: Text lines, fields separated "
"by a colon. The values are username/groupname (mandatory), UID/GID "
@@ -2297,7 +2403,7 @@ msgstr ""
"Home-Verzeichnis (dito), Shell (dito)."
#. type: Plain text
-#: ../adduser.conf.5:267
+#: ../adduser.conf.5:265
msgid ""
"It is possible to use the same file/directory for B<UID_POOL> and "
"B<GID_POOL>."
@@ -2306,7 +2412,7 @@ msgstr ""
"Verzeichnis verwandt werden."
#. type: Plain text
-#: ../adduser.conf.5:275
+#: ../adduser.conf.5:273
msgid ""
"If an account / group is created, B<adduser>(8) searches in all UID/GID pool "
"files for a line matching the name of the newly created account and uses the "
@@ -2319,9 +2425,29 @@ msgstr ""
"Konto zu initialisieren, anstatt die Vorgaben zu verwenden. Die "
"Einstellungen können auf der Befehlszeile außer Kraft gesetzt werden."
+# FIXME accounts are in the pool? (last sentence)
#. type: Plain text
#: ../adduser.conf.5:283
msgid ""
+"In the default configuration, UID and GID values listed in the pool will be "
+"reserved and thus not be used by the normal UID and GID selection "
+"processes. This is usually what you'd want. With the B<RESERVE_UID_POOL> "
+"and B<RESERVE_GID_POOL> configuration options, you can switch this behavior "
+"off if you want pooled UIDs and GIDs used by normal accounts. This might "
+"cause conflicts and cause your pool UIDs and GIDs to be used by accounts "
+"that are not in the pool."
+msgstr ""
+"In der Standardkonfiguration, werden im Vorrat aufgeführte UID- und GID-"
+"Werte reserviert und daher von dem normalen UID- und GID-Auswahlprozess "
+"nicht verwandt. Dieses Verhalten ist normalerweise gewünscht. Mit den "
+"Konfigurationsoptionen B<RESERVE_UID_POOL> und B<RESERVE_GID_POOL> können "
+"Sie das Verhalten ausschalten, wenn Sie UIDs und GUIDs aus dem Vorrat für "
+"normale Konten möchten. Dies könnte zu Konflikten führen und dazu, dass "
+"Vorrats-UIDs und -GIDs von Konten verwandt werden, die nicht im Vorrat sind."
+
+#. type: Plain text
+#: ../adduser.conf.5:291
+msgid ""
"B<deluser.conf>(5), B<addgroup>(8), B<adduser>(8), B<delgroup>(8), "
"B<deluser>(8)"
msgstr ""
@@ -2414,6 +2540,8 @@ msgstr ""
"conf>."
# FIXME: Friendlier sounds quite German.
+# FIXME B<userdel> → B<userdel>(8)
+# FIXME B<groupdel> → B<groupdel>(8)
#. type: Plain text
#: ../deluser.8:106
msgid ""
@@ -2421,8 +2549,8 @@ msgid ""
"removing the home directory as option or even all files on the system owned "
"by the user to be removed, running a custom script, and other features."
msgstr ""
-"Sie sind bedienungsfreundlichere Oberflächen für die Programme B<userdel> "
-"und B<groupdel>. Unter anderem löschen sie optional das Home-Verzeichnis "
+"Sie sind bedienungsfreundlichere Oberflächen für die Programme B<userdel>(8) "
+"und B<groupdel>(8). Unter anderem löschen sie optional das Home-Verzeichnis "
"oder sogar alle im System vorhandenen Dateien des zu entfernenden Benutzers "
"und lassen benutzerdefinierte Skripte laufen und weitere Funktionalitäten."
@@ -2745,16 +2873,51 @@ msgid ""
"console and in the log independently, keeping probably confusing information "
"to itself while still leaving helpful information in the log."
msgstr ""
+"Minimale Priorität für Meldungen, die im Syslog/Journal bzw. auf der Konsole "
+"protokolliert werden. Werte sind I<trace>, I<debug>, I<info>, I<warn>, "
+"I<err> und I<fatal>. Meldungen mit der hier gesetzten oder einer höheren "
+"Priorität werden auf das entsprechende Medium protokolliert. Meldungen, die "
+"auf der Standardfehlerausgabe ausgegeben werden, werden nicht auf der "
+"Standardausgabe wiederholt. Dies ermöglicht es dem lokalen Administrator, "
+"die Gesprächigkeit von B<adduser> auf der Konsole und im Protokoll "
+"voneinander unabhängig zu steuern sowie möglicherweise verwirrende "
+"Information bei sich selbst zu behalten, und dennoch hilfreiche "
+"Informationen in dem Protokoll zu hinterlassen."
+
+#. type: SH
+#: ../deluser.8:265
+#, no-wrap
+msgid "LOGGING↲"
+msgstr "PROTOKOLLIERUNG↲"
+
+# FIXME B<deluser> → B<deluser>(8)
+#. type: Plain text
+#: ../deluser.8:269
+msgid ""
+"B<deluser> uses extensive and configurable logging to tailor its verbosity "
+"to the needs and wishes of the system administrator."
+msgstr ""
+"B<deluser>(8) verwendet umfangreiche und konfigurierbare Protokollierung, um "
+"seine Ausführlichkeit an die Bedürfnisse des Systemadministrators anzupassen."
+
+# FIXME B<adduser> → B<adduser>(8)
+# FIXME adduser(8) → B<adduser>(8)
+#. type: Plain text
+#: ../deluser.8:271
+msgid "This works similar to B<adduser>. See adduser(8) for all the details."
+msgstr ""
+"Dies funktioniert ähnlich wie bei B<adduser>(8). Siehe B<adduser>(8) zu "
+"allen Details."
# FIXME adduser(8) → B<adduser>(8)
#. type: Plain text
-#: ../deluser.8:267
+#: ../deluser.8:275
msgid "The exit values documented in adduser(8) also apply for B<deluser>."
msgstr ""
"Die in B<adduser>(8) dokumentierten Exit-Werte gelten auch für B<deluser>."
#. type: Plain text
-#: ../deluser.8:280
+#: ../deluser.8:288
msgid ""
"B<deluser> needs root privileges and offers, via the B<--conf> command line "
"option to use different configuration files. Do not use B<sudo>(8) or "
@@ -2768,13 +2931,14 @@ msgstr ""
"Befehlszeilenoption B<--conf> die Möglichkeit, verschiedene "
"Konfigurationsdateien zu verwenden. Verwenden Sie nicht B<sudo>(8) oder "
"ähnliche Befehle, um Teilprivilegien an B<deluser> mit beschränkten "
-"Befehlszeilenparameter zu geben. Dies kann leicht umgangen werden und könnte "
-"Benutzern erlauben, Privilegien zu erlangen, die sie nicht haben sollten. Falls Sie dies erreichen "
-"wollen, entwickeln Sie Ihr eigenes Skript, das B<deluser> kapselt, und "
-"vergeben Sie Privilegien, um dieses Skript aufzurufen."
+"Befehlszeilenparametern zu geben. Dies kann leicht umgangen werden und könnte "
+"Benutzern erlauben, Privilegien zu erlangen, die sie nicht haben sollten. "
+"Falls Sie dies erreichen wollen, entwickeln Sie Ihr eigenes Skript, das "
+"B<deluser> kapselt, und vergeben Sie Privilegien, um dieses Skript "
+"aufzurufen."
#. type: Plain text
-#: ../deluser.8:284
+#: ../deluser.8:292
msgid ""
"I</etc/deluser.conf> Default configuration file for B<deluser>(8) and "
"B<delgroup>(8)"
@@ -2783,18 +2947,18 @@ msgstr ""
"B<delgroup>(8)"
#. type: TP
-#: ../deluser.8:284
+#: ../deluser.8:292
#, no-wrap
msgid "I</usr/local/sbin/deluser.local>"
msgstr "I</usr/local/sbin/deluser.local>"
#. type: Plain text
-#: ../deluser.8:288
+#: ../deluser.8:296
msgid "Optional custom add-ons, see B<deluser.local>(8)"
msgstr "Optionale benutzerspezifische Ergänzungen, siehe B<deluser.local>(8)."
#. type: Plain text
-#: ../deluser.8:295
+#: ../deluser.8:303
msgid ""
"B<adduser>(8), B<deluser.conf>(5), B<deluser.local.conf>(8), B<groupdel>(8), "
"B<userdel>(8)"
@@ -2825,7 +2989,7 @@ msgid ""
"a hash sign (#) in the first column."
msgstr ""
"Die Datei I</etc/deluser.conf> enthält Vorgabewerte für die Programme "
-"B<deluser>(8) und B<delgroup>(8). Jede Zeile enthält eine Option in der Form "
+"B<deluser>(8) und B<delgroup>(8). Jede Zeile enthält ein einzelnes Wertepaar in der Form "
"I<Option> = I<Wert>. Die Werte können von einfachen oder doppelten "
"Anführungszeichen, das Gleichheitszeichen von Leerraum eingeschlossen "
"werden. Kommentarzeilen müssen mit dem Raute-Zeichen (#) beginnen."
@@ -2877,7 +3041,7 @@ msgid ""
"suffix recognized by B<tar --auto-compress>. Defaults to I<.gz>."
msgstr ""
"Wählt den Komprimierungsalgorithmus für die Sicherungskopie des Home-"
-"Verzeichnisses. Kann auf jeden von B<tar --auto-compress> erkannten "
+"Verzeichnisses aus. Kann auf jeden von B<tar --auto-compress> erkannten "
"Algorithmus gesetzt werden. Standardmäßig I<.gz>."
#. type: TP
@@ -2931,7 +3095,7 @@ msgid ""
msgstr ""
"Eine Liste von regulären Ausdrücken, getrennt durch Leerzeichen. Alle zu "
"löschenden Dateien im Home-Verzeichnis oder dem Benutzer gehörende Dateien "
-"woanders werden mit jedem der regulären Ausdrücke verglichen. Wenn eine "
+"an anderen Orten werden mit jedem der regulären Ausdrücke verglichen. Wenn eine "
"Übereinstimmung erkannt wird, wird die Datei nicht gelöscht. Standardmäßig "
"wird eine Liste der System-Verzeichnisse vorgegeben, sodass nur I</home> "
"übrig bleibt. Daher werden nur Dateien unterhalb von I</home>, die zu dem "
=====================================
po/Makefile deleted
=====================================
@@ -1,39 +0,0 @@
-XGETTEXT = xgettext
-MSGFMT = msgfmt
-MSGMERGE = msgmerge
-
-LOCALEDIR = /usr/share/locale
-
-.SUFFIXES: .po .mo .pot
-
-%.mo: %.po
- $(MSGFMT) -o $@ $<
-
-PO = $(wildcard *.po)
-LANG = $(basename $(PO))
-MO = $(addsuffix .mo,$(LANG))
-SOURCES = ../adduser ../deluser ../AdduserCommon.pm ../AdduserLogging.pm ../AdduserRetvalues.pm
-
-all: update $(MO)
-update: adduser.pot
- - at for po in $(PO); do \
- echo -n "Updating $$po"; \
- $(MSGMERGE) --previous -U $$po adduser.pot; \
- done;
-
-adduser.pot: $(SOURCES)
- $(XGETTEXT) -c -L Perl -kgtx -kmtx \
- --msgid-bugs-address=adduser at packages.debian.org \
- -o $@ $(SOURCES)
-
-install: all
- for i in $(MO) ; do \
- t=$(DESTDIR)/$(LOCALEDIR)/`basename $$i .mo`/LC_MESSAGES ;\
- install -d $$t ;\
- install -m 644 $$i $$t/adduser.mo ;\
- done
-
-clean:
- $(RM) $(MO) *~
-
-.PHONY: update
=====================================
testsuite/runsuite.sh
=====================================
@@ -12,7 +12,7 @@ fi
cp /etc/passwd $PASSWD_BAK
-for a in off on; do
+for a in on; do
for i in ./test*.pl ; do
if ! shadowconfig $a > /dev/null; then
echo "shadowconfig $a failed"
View it on GitLab: https://salsa.debian.org/debian/adduser/-/compare/11c4216b1b64a18f06af06bc3232d7259d6e53f5...28f610f9f2ed243992fedfcf21ff9ce6ee76c5fd
--
View it on GitLab: https://salsa.debian.org/debian/adduser/-/compare/11c4216b1b64a18f06af06bc3232d7259d6e53f5...28f610f9f2ed243992fedfcf21ff9ce6ee76c5fd
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-shadow-devel/attachments/20250218/6d7ae65c/attachment-0001.htm>
More information about the Pkg-shadow-devel
mailing list