X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fuams%2Fuams_pam.c;h=0c2359ca9855b6cb6ded2549ccffcfc2be8a0a93;hb=97947cdd4ed4343ec1ae1df25f9f23d9b3f6432b;hp=bd2c6ac11d73670a7379197268a4cc547455a1e8;hpb=cd78872f9d60d082a49ec1afba3534e9b24c46f0;p=netatalk.git diff --git a/etc/uams/uams_pam.c b/etc/uams/uams_pam.c index bd2c6ac1..0c2359ca 100644 --- a/etc/uams/uams_pam.c +++ b/etc/uams/uams_pam.c @@ -1,5 +1,5 @@ /* - * $Id: uams_pam.c,v 1.15.2.1.2.2 2003-09-11 23:49:30 bfernhomberg Exp $ + * $Id: uams_pam.c,v 1.15.2.1.2.5.2.1 2005-09-27 10:40:41 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) @@ -34,10 +34,16 @@ char *strchr (), *strrchr (); #include +#ifdef HAVE_SECURITY_PAM_APPL_H #include +#endif +#ifdef HAVE_PAM_PAM_APPL_H +#include +#endif #include #include +#include #define PASSWDLEN 8 @@ -63,7 +69,7 @@ extern void append(void *, const char *, int); static int PAM_conv (int num_msg, const struct pam_message **msg, struct pam_response **resp, - void *appdata_ptr) + void *appdata_ptr _U_) { struct pam_response *reply; int count; @@ -133,8 +139,8 @@ static struct pam_conv PAM_conversation = { }; static int login(void *obj, char *username, int ulen, struct passwd **uam_pwd, - char *ibuf, int ibuflen, - char *rbuf, int *rbuflen) + char *ibuf, int ibuflen _U_, + char *rbuf _U_, int *rbuflen _U_) { struct passwd *pwd; int err, PAM_error; @@ -174,13 +180,14 @@ static int login(void *obj, char *username, int ulen, struct passwd **uam_pwd, PAM_error = pam_acct_mgmt(pamh, 0); if (PAM_error != PAM_SUCCESS) { - if (PAM_error == PAM_ACCT_EXPIRED) + if (PAM_error == PAM_NEW_AUTHTOK_REQD) /* Password change required */ err = AFPERR_PWDEXPR; #ifdef PAM_AUTHTOKEN_REQD else if (PAM_error == PAM_AUTHTOKEN_REQD) err = AFPERR_PWDCHNG; #endif /* PAM_AUTHTOKEN_REQD */ - goto login_err; + else + goto login_err; } #ifndef PAM_CRED_ESTABLISH @@ -195,6 +202,10 @@ static int login(void *obj, char *username, int ulen, struct passwd **uam_pwd, goto login_err; *uam_pwd = pwd; + + if (err == AFPERR_PWDEXPR) + return err; + return AFP_OK; login_err: @@ -271,9 +282,9 @@ static void pam_logout() { } /* change passwd */ -static int pam_changepw(void *obj, char *username, - struct passwd *pwd, char *ibuf, int ibuflen, - char *rbuf, int *rbuflen) +static int pam_changepw(void *obj _U_, char *username, + struct passwd *pwd _U_, char *ibuf, int ibuflen _U_, + char *rbuf _U_, int *rbuflen _U_) { char pw[PASSWDLEN + 1]; pam_handle_t *lpamh; @@ -341,14 +352,13 @@ int pam_printer(start, stop, username, out) static const char *loginok = "0\r"; struct passwd *pwd; - data = (char *)malloc(stop - start + 2); + data = (char *)malloc(stop - start + 1); if (!data) { LOG(log_info, logtype_uams,"Bad Login ClearTxtUAM: malloc"); return(-1); } - strncpy(data, start, stop - start + 1); - data[stop - start + 2] = 0; + strlcpy(data, start, stop - start + 1); /* We are looking for the following format in data: * (username) (password) @@ -368,8 +378,7 @@ int pam_printer(start, stop, username, out) free(data); return(-1); } - strncpy(username, p, MIN(UAM_USERNAMELEN, q - p) ); - username[ UAM_USERNAMELEN +1] = '\0'; + memcpy(username, p, MIN(UAM_USERNAMELEN, q - p) ); /* Parse input for password in next () */ p = q + 3; @@ -378,8 +387,7 @@ int pam_printer(start, stop, username, out) free(data); return(-1); } - strncpy(password, p, MIN(PASSWDLEN, (q - p)) ); - password[ PASSWDLEN + 1] = '\0'; + memcpy(password, p, MIN(PASSWDLEN, (q - p)) ); /* Done copying username and password, clean up */ free(data);