From 934ac07b06a9e16e9b41bc573691079788148f77 Mon Sep 17 00:00:00 2001 From: nekral-guest Date: Wed, 23 Jan 2008 21:50:27 +0000 Subject: [PATCH] Check that the new fields set with -u, -s, -l, -g, -f, -e, -d, and -c differ from the old ones. If a requested new value is equal to the old one, no changes will be performed for that field. If no fields are changed, usermod will exist successfully with a warning. This avoids logging changes to syslog when there are actually no changes. --- ChangeLog | 9 +++++++++ NEWS | 5 +++++ src/usermod.c | 42 +++++++++++++++++++++++++++++++++--------- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2a336ad4..88e79b49 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-01-23 Nicolas François + + * NEWS, src/usermod.c: Check that the new fields set with -u, -s, + -l, -g, -f, -e, -d, and -c differ from the old ones. If a + requested new value is equal to the old one, no changes will + be performed for that field. If no fields are changed, usermod + will exist successfully with a warning. This avoids logging + changes to syslog when there are actually no changes. + 2008-01-23 Nicolas François * src/usermod.c: Always define user_newcomment, user_newshell, diff --git a/NEWS b/NEWS index d0c89296..a653d295 100644 --- a/NEWS +++ b/NEWS @@ -50,6 +50,11 @@ shadow-4.1.0 -> shadow-4.1.1 UNRELEASED - usermod * Keep the access and modification time of files when moving an user's home directory. + * Check that the new fields set with -u, -s, -l, -g, -f, -e, -d, and -c + differ from the old ones. If a requested new value is equal to the old + one, no changes will be performed for that field. If no fields are + changed, usermod will exist successfully with a warning. This avoids + logging changes to syslog when there are actually no changes. - vipw/vigr * Recommend editing the shadowed (resp. regular) file if the regular (resp. shadowed) file was edited. diff --git a/src/usermod.c b/src/usermod.c index 55a21e75..cc0a1243 100644 --- a/src/usermod.c +++ b/src/usermod.c @@ -930,15 +930,7 @@ static void process_flags (int argc, char **argv) Prog, optarg); exit (E_BAD_ARG); } - - /* - * If the name does not really change, we mustn't - * set the flag as this will cause rather serious - * problems later! - */ - if (strcmp (user_name, optarg)) - lflg++; - + lflg++; user_newname = optarg; break; case 'L': @@ -982,6 +974,38 @@ static void process_flags (int argc, char **argv) fprintf (stderr, _("%s: no flags given\n"), Prog); exit (E_USAGE); } + + if (user_newid == user_id) { + uflg = 0; + } + if (user_newgid == user_gid) { + gflg = 0; + } + if (strcmp (user_newshell, user_shell) == 0) { + sflg = 0; + } + if (strcmp (user_newname, user_name) == 0) { + lflg = 0; + } + if (user_newinactive == user_inactive) { + fflg = 0; + } + if (user_newexpire == user_expire) { + eflg = 0; + } + if (strcmp (user_newhome, user_home) == 0) { + dflg = 0; + } + if (strcmp (user_newcomment, user_comment) == 0) { + cflg = 0; + } + + if (Uflg + uflg + sflg + pflg + oflg + mflg + Lflg + lflg + Gflg + + gflg + fflg + eflg + dflg + cflg == 0) { + fprintf (stderr, _("%s: no changes\n"), Prog); + exit (E_SUCCESS); + } + if (!is_shadow_pwd && (eflg || fflg)) { fprintf (stderr, _