Date: Wed, 22 Nov 2000 07:24:41 -0800 (PST) From: opentrax@email.com To: Gerhard.Sittig@gmx.net Cc: bugs@FreeBSD.ORG Subject: Re: bin/22860: [PATCH] adduser & friends with '$' in usernames Message-ID: <200011221524.HAA00667@spammie.svbug.com> In-Reply-To: <20001114220122.N27042@speedy.gsinet>
next in thread | previous in thread | raw e-mail | index | archive | help
With regards to this bug report I would like to state an opinion.
IMO, this patch should be reject for inclusion in FreeBSD and
should be place on a 'freely available shelf'. IMO, FreeBSD is NOT
here to support M$, or their attempts to obfuscate UNIX. IMO, given
that, FreeBSD should not abandon those that need an exit strategy
from M$ systems. IMO, placing this patch within the reach of
responsible system adminstrators will provide a reasonable balance.
This has been my opinion.
On 14 Nov, Gerhard Sittig wrote:
>
>>Number: 22860
>>Category: bin
>>Synopsis: [PATCH] adduser & friends with '$' in usernames
>>Confidential: no
>>Severity: non-critical
>>Priority: low
>>Responsible: freebsd-bugs
>>State: open
>>Quarter:
>>Keywords:
>>Date-Required:
>>Class: change-request
>>Submitter-Id: current-users
>>Arrival-Date: Tue Nov 14 22:00:01 PST 2000
>>Closed-Date:
>>Last-Modified:
>>Originator: Gerhard Sittig
>>Release: FreeBSD 4.1-STABLE i386
>>Organization:
> in private
>>Environment:
>
> adduser(8), rmuser(8), pw(8) administrative commands
> and usernames with non-alphanumeric characters in them
>
>>Description:
>
> When dealing with NTdom functionality (in heterogenous networks
> with NT machines in your LAN) the need arises to put dollar signs
> into usernames.
>
> Although they can be handled well when brought into the user
> database manually, the "admin's frontend" tools mentioned above
> deny to accept these names, since they don't fit a given pattern
> the names are checked against.
>
>>How-To-Repeat:
>
> Just try to add or manipulate an account named "machine$" with
> the given tools. They will be claimed "invalid".
>
> # adduser (opens an interactive session,
> specify "machine$" as the username)
> # rmuser machine\$
> # pw useradd machine\$ -g machines -h -
>
>>Fix:
>
> The following patch extends the adduser(8) and rmuser(8) scripts
> to accept dollar signs at the username's end. It is drawn from
> the command sequence
>
> cd /usr/src/usr.sbin/adduser
> cvs diff
>
> Index: adduser.perl
> ===================================================================
> RCS file: /home/ncvs/src/usr.sbin/adduser/adduser.perl,v
> retrieving revision 1.44
> diff -u -r1.44 adduser.perl
> --- adduser.perl 1999/08/28 01:15:11 1.44
> +++ adduser.perl 2000/11/13 08:51:00
> @@ -304,7 +304,7 @@
> local($name);
>
> while(1) {
> - $name = &confirm_list("Enter username", 1, "a-z0-9_-", "");
> + $name = &confirm_list("Enter username", 1, "a-z0-9_-\$", "");
> if (length($name) > 16) {
> warn "Username is longer than 16 chars\a\n";
> next;
> @@ -317,9 +317,9 @@
> sub new_users_name_valid {
> local($name) = @_;
>
> - if ($name !~ /^[a-z0-9_][a-z0-9_\-]*$/ || $name eq "a-z0-9_-") {
> + if ($name !~ /^[a-z0-9_][a-z0-9_\-]*\$?$/ || $name eq "a-z0-9_-\$") {
> warn "Wrong username. " .
> - "Please use only lowercase characters or digits\a\n";
> + "Please use only lowercase characters or digits and maybe a dollar sign at the end\a\n";
> return 0;
> } elsif ($username{$name}) {
> warn "Username ``$name'' already exists!\a\n"; return 0;
> Index: rmuser.perl
> ===================================================================
> RCS file: /home/ncvs/src/usr.sbin/adduser/rmuser.perl,v
> retrieving revision 1.8.2.1
> diff -u -r1.8.2.1 rmuser.perl
> --- rmuser.perl 2000/03/20 13:00:36 1.8.2.1
> +++ rmuser.perl 2000/11/13 08:50:01
> @@ -107,8 +107,8 @@
> if ($#ARGV == 0) {
> # Username was given as a parameter
> $login_name = pop(@ARGV);
> - die "Sorry, login name must contain alphanumeric characters only.\n"
> - if ($login_name !~ /^[a-zA-Z0-9_]\w*$/);
> + die "Sorry, login name must contain alphanumeric characters only and may end with a dollar sign.\n"
> + if ($login_name !~ /^[a-zA-Z0-9_]\w*\$?$/);
> } else {
> if ($affirm) {
> print STDERR "${whoami}: Error: -y option given without username!\n";
> @@ -276,8 +276,8 @@
> print "Enter login name for user to remove: ";
> $login_name = <>;
> chop $login_name;
> - if (!($login_name =~ /^[a-z0-9_][a-z0-9_\-]*$/)) {
> - print STDERR "Sorry, login name must contain alphanumeric characters only.\n";
> + if (!($login_name =~ /^[a-z0-9_][a-z0-9_\-]*\$?$/)) {
> + print STDERR "Sorry, login name must contain alphanumeric characters only and may end with a dollar sign.\n";
> } elsif (length($login_name) > 16 || length($login_name) == 0) {
> print STDERR "Sorry, login name must be 16 characters or less.\n";
> } else {
>
> The following patch extends the pw(8) command to accept dollar
> signs at the username's end. It is drawn from the command
> sequence
>
> cd /usr/src/usr.sbin/pw
> cvs diff
>
> and has the "side effect" of making the pw_checkname() routine
> easier to maintain when user names, group names, login classes
> and gecos fields should differ in their handling in future.
>
> Index: pw.h
> ===================================================================
> RCS file: /home/ncvs/src/usr.sbin/pw/pw.h,v
> retrieving revision 1.10.2.1
> diff -u -r1.10.2.1 pw.h
> --- pw.h 2000/06/28 19:19:04 1.10.2.1
> +++ pw.h 2000/11/13 08:36:09
> @@ -62,6 +62,15 @@
> W_NUM
> };
>
> +enum _gecos
> +{ /* pw_checkname() classes (plausi test) */
> + GEC_PWNAME, /* user name field */
> + GEC_GROUP, /* user group field */
> + GEC_CLASS, /* default login class */
> + GEC_COMMENT, /* gecos comment field */
> + GEC_MAXDIM /* allowed patterns table dimensioning */
> +};
> +
> struct carg
> {
> int ch;
> @@ -105,7 +114,7 @@
>
> int pw_user(struct userconf * cnf, int mode, struct cargs * _args);
> int pw_group(struct userconf * cnf, int mode, struct cargs * _args);
> -char *pw_checkname(u_char *name, int gecos);
> +char *pw_checkname(u_char *name, enum _gecos gecos);
>
> int addpwent(struct passwd * pwd);
> int delpwent(struct passwd * pwd);
> Index: pw_group.c
> ===================================================================
> RCS file: /home/ncvs/src/usr.sbin/pw/pw_group.c,v
> retrieving revision 1.12.2.1
> diff -u -r1.12.2.1 pw_group.c
> --- pw_group.c 2000/06/28 19:19:04 1.12.2.1
> +++ pw_group.c 2000/11/13 08:36:58
> @@ -135,7 +135,7 @@
> grp->gr_gid = (gid_t) atoi(a_gid->val);
>
> if ((arg = getarg(args, 'l')) != NULL)
> - grp->gr_name = pw_checkname((u_char *)arg->val, 0);
> + grp->gr_name = pw_checkname((u_char *)arg->val, GEC_GROUP);
> } else {
> if (a_name == NULL) /* Required */
> errx(EX_DATAERR, "group name required");
> @@ -145,7 +145,7 @@
> extendarray(&members, &grmembers, 200);
> members[0] = NULL;
> grp = &fakegroup;
> - grp->gr_name = pw_checkname((u_char *)a_name->val, 0);
> + grp->gr_name = pw_checkname((u_char *)a_name->val, GEC_GROUP);
> grp->gr_passwd = "*";
> grp->gr_gid = gr_gidpolicy(cnf, args);
> grp->gr_mem = members;
> Index: pw_user.c
> ===================================================================
> RCS file: /home/ncvs/src/usr.sbin/pw/pw_user.c,v
> retrieving revision 1.34.2.7
> diff -u -r1.34.2.7 pw_user.c
> --- pw_user.c 2000/09/20 11:19:55 1.34.2.7
> +++ pw_user.c 2000/11/13 09:16:54
> @@ -231,7 +231,7 @@
> }
> }
> if ((arg = getarg(args, 'L')) != NULL)
> - cnf->default_class = pw_checkname((u_char *)arg->val, 0);
> + cnf->default_class = pw_checkname((u_char *)arg->val, GEC_CLASS);
>
> if ((arg = getarg(args, 'G')) != NULL && arg->val) {
> int i = 0;
> @@ -293,7 +293,7 @@
> }
>
> if ((a_name = getarg(args, 'n')) != NULL)
> - pwd = GETPWNAM(pw_checkname((u_char *)a_name->val, 0));
> + pwd = GETPWNAM(pw_checkname((u_char *)a_name->val, GEC_PWNAME));
> a_uid = getarg(args, 'u');
>
> if (a_uid == NULL) {
> @@ -455,7 +455,7 @@
> if ((arg = getarg(args, 'l')) != NULL) {
> if (strcmp(pwd->pw_name, "root") == 0)
> errx(EX_DATAERR, "can't rename `root' account");
> - pwd->pw_name = pw_checkname((u_char *)arg->val, 0);
> + pwd->pw_name = pw_checkname((u_char *)arg->val, GEC_PWNAME);
> edited = 1;
> }
>
> @@ -595,7 +595,7 @@
> * Shared add/edit code
> */
> if ((arg = getarg(args, 'c')) != NULL) {
> - char *gecos = pw_checkname((u_char *)arg->val, 1);
> + char *gecos = pw_checkname((u_char *)arg->val, GEC_COMMENT);
> if (strcmp(pwd->pw_gecos, gecos) != 0) {
> pwd->pw_gecos = gecos;
> edited = 1;
> @@ -1208,22 +1208,29 @@
> }
>
> char *
> -pw_checkname(u_char *name, int gecos)
> +pw_checkname(u_char *name, enum _gecos gecos)
> {
> int l = 0;
> - char const *notch = gecos ? ":!@" : " ,\t:+&#%$^()!@~*?<>=|\\/\"";
> + static const char *notchtab[GEC_MAXDIM] = {
> + " ,\t:+&#%^()!@~*?<>=|\\/\"" , /* GEC_PWNAME */
> + " ,\t:+&#%$^()!@~*?<>=|\\/\"", /* GEC_GROUP */
> + " ,\t:+&#%$^()!@~*?<>=|\\/\"", /* GEC_CLASS */
> + ":!@" , /* GEC_COMMENT */
> + };
> + char const *notch = notchtab[gecos];
>
> while (name[l]) {
> if (strchr(notch, name[l]) != NULL || name[l] < ' ' || name[l] == 127 ||
> - (!gecos && l==0 && name[l] == '-') || /* leading '-' */
> - (!gecos && name[l] & 0x80)) /* 8-bit */
> + (gecos != GEC_COMMENT && l==0 && name[l] == '-') || /* leading '-' */
> + (gecos != GEC_COMMENT && name[l] == '$' && name[l+1]) || /* not a trailing '$' */
> + (gecos != GEC_COMMENT && name[l] & 0x80)) /* 8-bit */
> errx(EX_DATAERR, (name[l] >= ' ' && name[l] < 127)
> ? "invalid character `%c' in field"
> : "invalid character 0x%02x in field",
> name[l]);
> ++l;
> }
> - if (!gecos && l > LOGNAMESIZE)
> + if (gecos != GEC_COMMENT && l > LOGNAMESIZE)
> errx(EX_DATAERR, "name too long `%s'", name);
> return (char *)name;
> }
>
> Feel free to change the wording of printouts and to rearrange the
> last check (LOGNAMESIZE length for anything that's not a gecos
> field -- does it actually apply only to user names and group
> names or maybe login classes, too? I'm not sure of this. As
> well as I never tried dollar signs in anything that's not a user
> name).
>
>
> virtually yours 82D1 9B9C 01DC 4FB4 D7B4 61BE 3F49 4F77 72DE DA76
> Gerhard Sittig true | mail -s "get gpg key" Gerhard.Sittig@gmx.net
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?200011221524.HAA00667>
