Намерих част от кода в Интернет, който изглеждаше като добър пример - http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-appl
За съжаление не се справя правилно с акаунти, които изискват промяна на парола при първото влизане. Когато su - user
(от не-root акаунт,) получавам правилно запитване за парола и след това за промяна на парола. Когато стартирам програмата си, ме питат за паролата, но уви, нямам искане за промяна на парола и вътре в кода нямам индикация, че ще има дори такава нужда. Къде е проблема?
PAM отстраняването на грешки ми показва само това:
Mar 25 11:27:33 S-78 pam: pam_unix(su:auth): authentication failure; logname=greg uid=502 euid=502 tty=/dev/pts/4 ruser=greg rhost=SIR-78 user=tg
Резултатът от програмата, показана по-долу, е следният:
-bash-3.2$ ./pam tg
Password:
pam_authenticate = 7
pam_acct_mgmt = 0
Sorry - pam_err = 17
Ето част от малко модифициран код:
pam_start("su", user, &pamc, &pamh);
/* set some items */
gethostname(hostname, sizeof(hostname));
if ((pam_err = pam_set_item(pamh, PAM_RHOST, hostname)) != PAM_SUCCESS)
goto pamerr;
user = getlogin();
if ((pam_err = pam_set_item(pamh, PAM_RUSER, user)) != PAM_SUCCESS)
goto pamerr;
tty = ttyname(STDERR_FILENO);
if ((pam_err = pam_set_item(pamh, PAM_TTY, tty)) != PAM_SUCCESS)
goto pamerr;
/* authenticate the applicant */
if ((pam_err = pam_authenticate(pamh, 0)) != PAM_SUCCESS)
{
printf( "pam_authenticate = %d\n", ( int )pam_err ) ; /* returns error 7 - PAM_AUTH_ERR */
pam_err = pam_acct_mgmt(pamh, 0) ;
printf( "pam_acct_mgmt = %d\n", ( int )pam_err ) ; /* returns no error! */
}
/* establish the requested credentials */
if ((pam_err = pam_setcred(pamh, PAM_ESTABLISH_CRED)) != PAM_SUCCESS) /* returns error 17 - PAM_CRED_ERR */
goto pamerr;
Програмата по-горе използва функция за разговор, копирана от тук: http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-conv
Използвал съм също misc_conv
, деклариран в security/pam_misc.h
и наличен в -lpam_misc
, но получих същия резултат - няма заявка за промяна на парола или няма индикация, че такава ще е необходима.
Някаква идея как мога да се справя? Ако премахна функцията за разговор, получавам същите грешки, с изключение на липсата на подкана за въвеждане на парола.