Date: Wed, 16 Jan 2002 16:40:03 -0800 (PST) From: Yar Tikhiy <yar@freebsd.org> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/22860: [PATCH] adduser & friends with '$' in usernames Message-ID: <200201170040.g0H0e3c71093@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/22860; it has been noted by GNATS. From: Yar Tikhiy <yar@freebsd.org> To: Sheldon Hearn <sheldonh@starjuice.net> Cc: bug-followup@freebsd.org Subject: Re: bin/22860: [PATCH] adduser & friends with '$' in usernames Date: Thu, 17 Jan 2002 03:34:58 +0300 On Wed, Jan 16, 2002 at 05:08:23PM +0200, Sheldon Hearn wrote: > > On Fri, 04 Jan 2002 15:10:01 PST, Yar Tikhiy wrote: > > > As an alternative to the "allow anything the admin wants" solution, > > I would propose to make the regular expression usernames are checked > > against configurable and saved in /etc/adduser.conf. > > I like this idea. Ok, I've implemented that instead of the -force option. Would you mind trying the attached adduser.perl patch (it's against -current) and telling about your impression? -- Yar Index: adduser.perl =================================================================== RCS file: /home/ncvs/src/usr.sbin/adduser/adduser.perl,v retrieving revision 1.53 diff -u -r1.53 adduser.perl --- adduser.perl 4 Jan 2002 21:28:32 -0000 1.53 +++ adduser.perl 17 Jan 2002 00:29:43 -0000 @@ -30,7 +30,8 @@ # read variables sub variables { $verbose = 1; # verbose = [0-2] - $force = 0; # relax username validity check if true + $usernameregexp = "^[a-z0-9_][a-z0-9_-]*\$"; # configurable + $defaultusernameregexp = $usernameregexp; # remains constant $defaultusepassword = "yes"; # use password authentication for new users $defaultenableaccount = "yes"; # enable the account by default $defaultemptypassword = "no"; # don't create an empty password @@ -315,7 +316,7 @@ local($name); while(1) { - $name = &confirm_list("Enter username", 1, "a-z0-9_-", ""); + $name = &confirm_list("Enter username", 1, $usernameregexp, ""); if (length($name) > 16) { warn "Username is longer than 16 chars\a\n"; next; @@ -328,29 +329,20 @@ sub new_users_name_valid { local($name) = @_; - if ($force) { - if ($name eq "a-z0-9_-") { - warn "Please enter a username.\a\n"; - return 0; - } - if ($name =~ /[:\n]/) { - warn "Illegal username, which would break your passwd file.\a\n"; - return 0; + if ($name eq $usernameregexp) { + warn "Please enter a username\a\n"; + return 0; + } elsif ($name !~ /$usernameregexp/) { + if ($usernameregexp eq $defaultusernameregexp) { + warn "Illegal username.\n" . + "Please use only lowercase Roman, decimal, underscore, " . + "or hyphen characters.\n" . + "Additionally, a username should not start with a hyphen.\a\n"; + } else { + warn "Username doesn't match the regexp /$usernameregexp/\a\n"; } - if ($name !~ /^[a-z0-9_][a-z0-9_\-]*$/) { - warn "Caution: Username contains illegal characters.\n" . - "Adding this user may cause utilities " . - "or applications to malfunction,\n" . - "or even impose a security risk on your system.\a\n"; - } - } elsif ($name !~ /^[a-z0-9_][a-z0-9_\-]*$/ || $name eq "a-z0-9_-") { - warn "Illegal username.\n" . - "Please use only lowercase Roman, decimal, underscore, " . - "or hyphen characters.\n" . - "Additionally, a username should not start with a hyphen.\a\n"; return 0; - } - if ($username{$name}) { + } elsif ($username{$name}) { warn "Username ``$name'' already exists!\a\n"; return 0; } return 1; @@ -878,7 +870,6 @@ [-class login_class] [-config_create] [-dotdir dotdir] - [-f|-force] [-group login_group] [-h|-help] [-home home] @@ -952,7 +943,6 @@ if (/^--?(v|verbose)$/) { $verbose = 1 } elsif (/^--?(s|silent|q|quiet)$/) { $verbose = 0 } elsif (/^--?(debug)$/) { $verbose = 2 } - elsif (/^--?(f|force)$/) { $force = 1 } elsif (/^--?(h|help|\?)$/) { &usage } elsif (/^--?(home)$/) { $home = $argv[0]; shift @argv } elsif (/^--?(shell)$/) { $defaultshell = $argv[0]; shift @argv } @@ -1223,6 +1213,21 @@ return 0; } +# allow configuring usernameregexp +sub usernameregexp_default { + local($r) = $usernameregexp; + + while ($verbose) { + $r = &confirm_list("Usernames must match regular expression:", 1, + $r, ""); + eval "'foo' =~ /$r/"; + last unless $@; + warn "Invalid regular expression\a\n"; + } + $changes++ if $r ne $usernameregexp; + return $r; +} + # test if $dotdir exist # return "no" if $dotdir not exist or dotfiles should not copied sub dotdir_default { @@ -1438,6 +1443,10 @@ # verbose = [0-2] verbose = $verbose +# regular expression usernames are checked against (see perlre(1)) +# usernameregexp = 'regexp' +usernameregexp = '$usernameregexp' + # use password-based authentication for new users # defaultusepassword = "yes" | "no" defaultusepassword = "$defaultusepassword" @@ -1522,6 +1531,7 @@ # interactive # some questions +$usernameregexp = &usernameregexp_default; # regexp to check usernames against &shells_add; # maybe add some new shells $defaultshell = &shell_default; # enter default shell $home = &home_partition($home); # find HOME partition To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200201170040.g0H0e3c71093>