Allow non-US-ASCII characters in the GECOS fields ("name", "room number",
and "other info" fields).
This commit is contained in:
parent
4d7d6a1a9f
commit
4196525702
@ -1,3 +1,9 @@
|
||||
2008-04-27 Nicolas François <nicolas.francois@centraliens.net>
|
||||
|
||||
* 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 <nicolas.francois@centraliens.net>
|
||||
|
||||
* NEWS, src/newgrp.c: Fix compilation failure when compiled with
|
||||
|
3
NEWS
3
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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -46,14 +46,17 @@
|
||||
GECOS field.
|
||||
</para>
|
||||
|
||||
<para>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 <emphasis remap='I'>other</emphasis> field does not
|
||||
have this restriction, and is used to store accounting information
|
||||
used by other applications.
|
||||
<para>
|
||||
These fields must not contain any colons. Except for the
|
||||
<emphasis remap='I'>other</emphasis> 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 <emphasis remap='I'>other</emphasis> field is used to
|
||||
store accounting information used by other applications.
|
||||
</para>
|
||||
|
||||
<para> If none of the options are selected, <command>chfn</command>
|
||||
<para>
|
||||
If none of the options are selected, <command>chfn</command>
|
||||
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
|
||||
|
16
src/chfn.c
16
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);
|
||||
|
Loading…
Reference in New Issue
Block a user