接前一篇文章:PAM从入门到精通(十一)
本文参考:
《The Linux-PAM Application Developers' Guide》
先再来重温一下PAM系统架构:
更加形象的形式:
五、主要函数详解
10. pam_chauthtok
概述:
更新身份验证令牌。
函数声明:
#include <security/pam_appl.h>
int pam_chauthtok (pamh , flags);
pam_handle_t *pamh;
int flags;
详细描述:
pam_chauthtok函数用于更改给定用户的身份验证令牌(如与句柄pamh关联的状态所示)。
参数说明:
- pam_handle_t *pamh
pamh参数是通过先前调用pam_start()获得的身份验证句柄。
- int flags
flags参数是以下值中的零或更多的二进制或:
PAM_SILENT
不发出任何消息。
PAM_CHANGE_EXPIRED_AUTHTOK
此参数向模块指示,用户的身份验证令牌(密码)只有在过期时才应更改。如果未传递此参数,则应用程序要求更改所有身份验证令牌。
返回值:
- PAM_AUTHTOK_ERR:模块无法获取新的身份验证令牌。
- PAM_AUTHTOK_RECOVERY_ERR:模块无法获取旧的身份验证令牌。
- PAM_AUTHTOK_LOCK_BUSY:一个或多个模块无法更改身份验证令牌,因为它当前已锁定。
- PAM_AUTHTOK_DISABLE_AGING:至少有一个模块的身份验证令牌老化已被禁用。
- PAM_PERM_DENIED:权限被拒绝。
- PAM_SUCCESS:身份验证令牌已成功更新。
- PAM_TRY_AGAIN:并非所有模块都可以更新身份验证令牌。在这种情况下,用户的身份验证令牌都不会被更新。
- PAM_USER_UNKNOWN:密码服务未知的用户。
实例:
实例1. 一般性代码
cpp
/* 通过了密码认证之后再调用帐号管理API,检查用户帐号是否已经过期 */
if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS)
{
if (status == PAM_AUTHTOK_EXPIRED)
{
status = pam_chauthtok(pamh, 0); /* 过期则要求用户更改密码 */
if (status != PAM_SUCCESS)
exit(1);
}
}
实例2. SDDM中的代码
参见SDDM包源码目录src/helper/backend/PamHandle.cpp中的PamHandle::acctMgmt函数。
代码如下:
cpp
bool PamHandle::chAuthTok(int flags) {
m_result = pam_chauthtok(m_handle, flags | m_silent);
if (m_result != PAM_SUCCESS) {
qWarning() << "[PAM] chAuthTok:" << pam_strerror(m_handle, m_result);
}
return m_result == PAM_SUCCESS;
}
更多函数请看后续文章。