00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "includes.h"
00026 RCSID("$Id: auth-shadow.c,v 1.7 2005/07/17 07:04:47 djm Exp $");
00027
00028 #if defined(USE_SHADOW) && defined(HAS_SHADOW_EXPIRE)
00029 #include <shadow.h>
00030
00031 #include "auth.h"
00032 #include "buffer.h"
00033 #include "log.h"
00034
00035 #ifdef DAY
00036 # undef DAY
00037 #endif
00038 #define DAY (24L * 60 * 60)
00039
00040 extern Buffer loginmsg;
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 int
00052 auth_shadow_acctexpired(struct spwd *spw)
00053 {
00054 time_t today;
00055 int daysleft;
00056 char buf[256];
00057
00058 today = time(NULL) / DAY;
00059 daysleft = spw->sp_expire - today;
00060 debug3("%s: today %d sp_expire %d days left %d", __func__, (int)today,
00061 (int)spw->sp_expire, daysleft);
00062
00063 if (spw->sp_expire == -1) {
00064 debug3("account expiration disabled");
00065 } else if (daysleft < 0) {
00066 logit("Account %.100s has expired", spw->sp_namp);
00067 return 1;
00068 } else if (daysleft <= spw->sp_warn) {
00069 debug3("account will expire in %d days", daysleft);
00070 snprintf(buf, sizeof(buf),
00071 "Your account will expire in %d day%s.\n", daysleft,
00072 daysleft == 1 ? "" : "s");
00073 buffer_append(&loginmsg, buf, strlen(buf));
00074 }
00075
00076 return 0;
00077 }
00078
00079
00080
00081
00082
00083 int
00084 auth_shadow_pwexpired(Authctxt *ctxt)
00085 {
00086 struct spwd *spw = NULL;
00087 const char *user = ctxt->pw->pw_name;
00088 char buf[256];
00089 time_t today;
00090 int daysleft, disabled = 0;
00091
00092 if ((spw = getspnam((char *)user)) == NULL) {
00093 error("Could not get shadow information for %.100s", user);
00094 return 0;
00095 }
00096
00097 today = time(NULL) / DAY;
00098 debug3("%s: today %d sp_lstchg %d sp_max %d", __func__, (int)today,
00099 (int)spw->sp_lstchg, (int)spw->sp_max);
00100
00101 #if defined(__hpux) && !defined(HAVE_SECUREWARE)
00102 if (iscomsec()) {
00103 struct pr_passwd *pr;
00104
00105 pr = getprpwnam((char *)user);
00106
00107
00108 if (pr != NULL && pr->ufld.fd_min == 0 &&
00109 pr->ufld.fd_lifetime == 0 && pr->ufld.fd_expire == 0 &&
00110 pr->ufld.fd_pw_expire_warning == 0 &&
00111 pr->ufld.fd_schange != 0)
00112 disabled = 1;
00113 }
00114 #endif
00115
00116
00117 daysleft = spw->sp_lstchg + spw->sp_max - today;
00118 if (disabled) {
00119 debug3("password expiration disabled");
00120 } else if (spw->sp_lstchg == 0) {
00121 logit("User %.100s password has expired (root forced)", user);
00122 return 1;
00123 } else if (spw->sp_max == -1) {
00124 debug3("password expiration disabled");
00125 } else if (daysleft < 0) {
00126 logit("User %.100s password has expired (password aged)", user);
00127 return 1;
00128 } else if (daysleft <= spw->sp_warn) {
00129 debug3("password will expire in %d days", daysleft);
00130 snprintf(buf, sizeof(buf),
00131 "Your password will expire in %d day%s.\n", daysleft,
00132 daysleft == 1 ? "" : "s");
00133 buffer_append(&loginmsg, buf, strlen(buf));
00134 }
00135
00136 return 0;
00137 }
00138 #endif