diff --git a/ChangeLog b/ChangeLog index bf94b05f..608d0bbc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-04-27 Nicolas François + + * NEWS, libmisc/fields.c, src/chfn.c, man/chfn.1.xml: Allow + non-US-ASCII characters in the GECOS fields ("name", "room + number", and "other info" fields). + 2008-04-17 Nicolas François * NEWS, src/newgrp.c: Fix compilation failure when compiled with diff --git a/NEWS b/NEWS index 424c3078..6ce02c05 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,9 @@ shadow-4.1.1 -> shadow-4.1.2 UNRELEASED file; and fail if the feature is requested but not present on the system. * Fix build failure when configured with audit support. +- chfn + * Allow non-US-ASCII characters in the GECOS fields ("name", "room + number", and "other info" fields). shadow-4.1.0 -> shadow-4.1.1 02-04-2008 diff --git a/libmisc/fields.c b/libmisc/fields.c index e021f06d..c07492f2 100644 --- a/libmisc/fields.c +++ b/libmisc/fields.c @@ -38,21 +38,31 @@ /* * valid_field - insure that a field contains all legal characters * - * The supplied field is scanned for non-printing and other illegal - * characters. If any illegal characters are found, valid_field - * returns -1. Zero is returned for success. + * The supplied field is scanned for non-printable and other illegal + * characters. + * + -1 is returned if an illegal character is present. + * + 1 is returned if no illegal characters are present, but the field + * contains a non-printable character. + * + 0 is returned otherwise. */ int valid_field (const char *field, const char *illegal) { const char *cp; + int err = 0; - for (cp = field; - *cp && isprint (*cp & 0x7F) && !strchr (illegal, *cp); cp++); + for (cp = field; *cp && !strchr (illegal, *cp); cp++); - if (*cp) - return -1; - else - return 0; + if (*cp) { + err = -1; + } else { + for (cp = field; *cp && isprint (*cp); cp++); + + if (*cp) { + err = 1; + } + } + + return err; } /* diff --git a/man/chfn.1.xml b/man/chfn.1.xml index cd9fd39a..89607c98 100644 --- a/man/chfn.1.xml +++ b/man/chfn.1.xml @@ -46,14 +46,17 @@ GECOS field. - The only restriction placed on the contents of the fields is that - no control characters may be present, nor any of comma, colon, or - equal sign. The other field does not - have this restriction, and is used to store accounting information - used by other applications. + + These fields must not contain any colons. Except for the + other field, they should not contain + any comma or equal sign. It is also recommended to avoid + non-US-ASCII characters, but this is only enforced for the phone + numbers. The other field is used to + store accounting information used by other applications. - If none of the options are selected, chfn + + If none of the options are selected, chfn operates in an interactive fashion, prompting the user with the current values for all of the fields. Enter the new value to change the field, or leave the line blank to use the current value. The diff --git a/src/chfn.c b/src/chfn.c index 027467d7..f927274b 100644 --- a/src/chfn.c +++ b/src/chfn.c @@ -536,12 +536,19 @@ static void get_old_fields (const char *gecos) */ static void check_fields (void) { - if (valid_field (fullnm, ":,=")) { + int err; + err = valid_field (fullnm, ":,="); + if (err > 0) { + fprintf (stderr, _("%s: name with non-ASCII characters: '%s'\n"), Prog, fullnm); + } else if (err < 0) { fprintf (stderr, _("%s: invalid name: '%s'\n"), Prog, fullnm); closelog (); exit (E_NOPERM); } - if (valid_field (roomno, ":,=")) { + err = valid_field (roomno, ":,="); + if (err > 0) { + fprintf (stderr, _("%s: room number with non-ASCII characters: '%s'\n"), Prog, roomno); + } else if (err < 0) { fprintf (stderr, _("%s: invalid room number: '%s'\n"), Prog, roomno); closelog (); @@ -559,7 +566,10 @@ static void check_fields (void) closelog (); exit (E_NOPERM); } - if (valid_field (slop, ":")) { + err = valid_field (slop, ":"); + if (err > 0) { + fprintf (stderr, _("%s: '%s' contains non-ASCII characters\n"), Prog, slop); + } else if (err < 0) { fprintf (stderr, _("%s: '%s' contains illegal characters\n"), Prog, slop);