aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-07-13 01:15:30 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-07-13 01:15:30 +0200
commit189f74d0f2760d3da1a05cba75653dade4c8a9c3 (patch)
treef192b88fd0a919d8d71d930272f25de1002a3e70
parent044b18083b4380f158002ed7c00c52d362c9632c (diff)
downloadbusybox-w32-189f74d0f2760d3da1a05cba75653dade4c8a9c3.tar.gz
busybox-w32-189f74d0f2760d3da1a05cba75653dade4c8a9c3.tar.bz2
busybox-w32-189f74d0f2760d3da1a05cba75653dade4c8a9c3.zip
passwd + /etc/shadow: chage "change time" field too
function old new delta update_passwd 1171 1270 +99 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/update_passwd.c22
-rw-r--r--loginutils/adduser.c13
2 files changed, 31 insertions, 4 deletions
diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c
index aa1e2ed08..3aab40175 100644
--- a/libbb/update_passwd.c
+++ b/libbb/update_passwd.c
@@ -87,6 +87,12 @@ int FAST_FUNC update_passwd(const char *filename,
87 int i; 87 int i;
88 int changed_lines; 88 int changed_lines;
89 int ret = -1; /* failure */ 89 int ret = -1; /* failure */
90 /* used as a bool: "are we modifying /etc/shadow?" */
91#if ENABLE_FEATURE_SHADOWPASSWDS
92 const char *shadow = strstr(filename, "shadow");
93#else
94# define shadow NULL
95#endif
90 96
91 filename = xmalloc_follow_symlinks(filename); 97 filename = xmalloc_follow_symlinks(filename);
92 if (filename == NULL) 98 if (filename == NULL)
@@ -100,7 +106,7 @@ int FAST_FUNC update_passwd(const char *filename,
100 name = xasprintf("%s:", name); 106 name = xasprintf("%s:", name);
101 user_len = strlen(name); 107 user_len = strlen(name);
102 108
103 if (ENABLE_FEATURE_SHADOWPASSWDS && strstr(filename, "shadow")) 109 if (shadow)
104 old_fp = fopen(filename, "r+"); 110 old_fp = fopen(filename, "r+");
105 else 111 else
106 old_fp = fopen_or_warn(filename, "r+"); 112 old_fp = fopen_or_warn(filename, "r+");
@@ -215,8 +221,18 @@ int FAST_FUNC update_passwd(const char *filename,
215 ) { 221 ) {
216 /* Change passwd */ 222 /* Change passwd */
217 cp = strchrnul(cp, ':'); /* move past old passwd */ 223 cp = strchrnul(cp, ':'); /* move past old passwd */
218 /* name: + new_passwd + :rest of line */ 224
219 fprintf(new_fp, "%s%s%s\n", name, new_passwd, cp); 225 if (shadow && *cp == ':') {
226 /* /etc/shadow's field 3 (passwd change date) needs updating */
227 /* move past old change date */
228 cp = strchrnul(cp + 1, ':');
229 /* "name:" + "new_passwd" + ":" + "change date" + ":rest of line" */
230 fprintf(new_fp, "%s%s:%u%s\n", name, new_passwd,
231 (unsigned)(time(NULL)) / (24*60*60), cp);
232 } else {
233 /* "name:" + "new_passwd" + ":rest of line" */
234 fprintf(new_fp, "%s%s%s\n", name, new_passwd, cp);
235 }
220 changed_lines++; 236 changed_lines++;
221 } /* else delete user or group: skip the line */ 237 } /* else delete user or group: skip the line */
222 next: 238 next:
diff --git a/loginutils/adduser.c b/loginutils/adduser.c
index 00232375b..136dcdff8 100644
--- a/loginutils/adduser.c
+++ b/loginutils/adduser.c
@@ -169,7 +169,18 @@ int adduser_main(int argc UNUSED_PARAM, char **argv)
169 free(p); 169 free(p);
170 170
171#if ENABLE_FEATURE_SHADOWPASSWDS 171#if ENABLE_FEATURE_SHADOWPASSWDS
172 p = xasprintf("!:%u:0:99999:7:::", (unsigned)(time(NULL) / 86400)); /* sp->sp_lstchg */ 172 /* /etc/shadow fields:
173 * 1. username
174 * 2. encrypted password
175 * 3. last password change (unix date (unix time/24*60*60))
176 * 4. minimum days required between password changes
177 * 5. maximum days password is valid
178 * 6. days before password is to expire that user is warned
179 * 7. days after password expires that account is disabled
180 * 8. unix date when login expires (may no longer be used)
181 */
182 /* fields: 2 3 4 5 6 78 */
183 p = xasprintf("!:%u:0:99999:7:::", (unsigned)(time(NULL)) / (24*60*60));
173 /* ignore errors: if file is missing we suppose admin doesn't want it */ 184 /* ignore errors: if file is missing we suppose admin doesn't want it */
174 update_passwd(bb_path_shadow_file, pw.pw_name, p, NULL); 185 update_passwd(bb_path_shadow_file, pw.pw_name, p, NULL);
175 if (ENABLE_FEATURE_CLEAN_UP) 186 if (ENABLE_FEATURE_CLEAN_UP)