diff --git a/ChangeLog b/ChangeLog index 584f8b6b5..3f19923c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -158,6 +158,8 @@ takes 2 more args. with djm@ - (dtucker) [defines.h] Bug #1112: __dead is, well dead. Based on a patch from Todd Vierling. + - (dtucker) [auth-sia.c] Bug #1241: support password expiry on Tru64 SIA + systems. Patch from R. Scott Bailey. 20080611 - (djm) [channels.c configure.ac] @@ -4320,4 +4322,4 @@ OpenServer 6 and add osr5bigcrypt support so when someone migrates passwords between UnixWare and OpenServer they will still work. OK dtucker@ -$Id: ChangeLog,v 1.4998 2008/06/13 00:58:50 dtucker Exp $ +$Id: ChangeLog,v 1.4999 2008/06/13 01:13:13 dtucker Exp $ diff --git a/auth-sia.c b/auth-sia.c index a9e1c258c..debf30201 100644 --- a/auth-sia.c +++ b/auth-sia.c @@ -34,6 +34,10 @@ #include #include #include +#include +#include +#include +#include #include "ssh.h" #include "key.h" @@ -49,6 +53,52 @@ extern ServerOptions options; extern int saved_argc; extern char **saved_argv; +static int +sia_password_change_required(const char *user) +{ + struct es_passwd *acct; + time_t pw_life; + time_t pw_date; + + set_auth_parameters(saved_argc, saved_argv); + + if ((acct = getespwnam(user)) == NULL) { + error("Couldn't access protected database entry for %s", user); + endprpwent(); + return (0); + } + + /* If forced password change flag is set, honor it */ + if (acct->uflg->fg_psw_chg_reqd && acct->ufld->fd_psw_chg_reqd) { + endprpwent(); + return (1); + } + + /* Obtain password lifetime; if none, it can't have expired */ + if (acct->uflg->fg_expire) + pw_life = acct->ufld->fd_expire; + else if (acct->sflg->fg_expire) + pw_life = acct->sfld->fd_expire; + else { + endprpwent(); + return (0); + } + + /* Offset from last change; if none, it must be expired */ + if (acct->uflg->fg_schange) + pw_date = acct->ufld->fd_schange + pw_life; + else { + endprpwent(); + return (1); + } + + endprpwent(); + + /* If expiration date is prior to now, change password */ + + return (pw_date <= time((time_t *) NULL)); +} + int sys_auth_passwd(Authctxt *authctxt, const char *pass) { @@ -76,6 +126,9 @@ sys_auth_passwd(Authctxt *authctxt, const char *pass) sia_ses_release(&ent); + authctxt->force_pwchange = sia_password_change_required( + authctxt->user); + return (1); }