独自のPAMモジュールを作成しようとしています。
int pam_sm_setcred(pam_handle_t* handle, int flags, int argc, const char** argv)
{
return PAM_SUCCESS;
}
int pam_sm_acct_mgmt(pam_handle_t* handle, int flags, int argc, const char** argv)
{
return PAM_SUCCESS;
}
int pam_sm_authenticate(pam_handle_t* handle, int flags, int argc, const char** argv)
{
...
retval = pam_get_user(handle, &username, "Username: ");
if (retval != PAM_SUCCESS)
{
return retval;
}
passwd = getpwnam(username);
if (!passwd)
{
return PAM_USER_UNKNOWN;
}
retval = pam_get_authtok(handle, PAM_AUTHTOK, &password, "Password: ");
if (retval != PAM_SUCCESS)
{
return retval;
}
printf("Welcome to Hell, %s : %s\n", username, password);
return PAM_SUCCESS;
}
.soライブラリを/lib/securityに入れて、pamファイル(/etc/pam.d/common-auth)の上部に次の行を追加すると機能します。
auth sufficient mypam.so
account sufficient mypam.so
例: sudo で一部のファイルを開こうとすると正常に動作します。
しかし、私はまた、実行可能な小さなテストを書こうとします。
int main(...)
{
pam_conv conv = {misc_conv, NULL};
pam_start("test", NULL, &conv, &handle);
pam_sm_authenticate(handle, 0, 0, NULL);
...
}
この場合、実行時にpam_get_authtok(...)
エラーコード29(PAM_BAD_ITEM)が返されます。
私は何が間違っていましたか?