2.2. libpam 提供的其他功能

2.2.1. 描述 PAM 错误代码的字符串

#include <security/pam_appl.h> 
   const char *pam_strerror( 
   pamh,  
   errnum); 
 pam_handle_t *pamh; 
 int errnum; 

2.2.1.1. DESCRIPTION

pam_strerror函数返回一个指针,该指针指向描述在参数* errnum *中传递的错误代码的字符串,可能使用当前语言环境的 LC_MESSAGES 部分来选择适当的语言。该字符串不得由应用程序修改。没有库函数将修改此字符串。

2.2.1.2. 返回值

此函数始终返回指向字符串的指针。

2.2.2. 请求失败延迟

#include <security/pam_appl.h> 
   int pam_fail_delay( 
   pamh,  
   usec); 
 pam_handle_t *pamh; 
 unsigned int usec; 

2.2.2.1. DESCRIPTION

pam_fail_delay函数提供了一种机制,应用程序或模块可通过该机制建议* usec *微秒的最小延迟。该功能记录该功能请求的最长时间。如果 pam_authenticate(3)失败,则失败的返回到应用程序的时间将延迟大约此最长值随机分布的时间(最多 50%)。

与成功无关,当 PAM 服务模块将控制权返回给应用程序时,延迟时间重置为其默认值零。延迟发生在所有身份验证模块被调用之后,但是在控制返回给服务应用程序之前。

使用此功能时,程序员应检查其是否可用于:

#ifdef HAVE_PAM_FAIL_DELAY
    ....
#endif /* HAVE_PAM_FAIL_DELAY */

对于本质上是事件驱动的用单线程编写的应用程序,可能不希望产生此延迟。相反,应用程序可能希望以其他方式注册延迟。例如,在一个服务于来自单个事件循环的多个身份验证请求的单线程服务器中,应用程序可能想要简单地将给定连接标记为已阻止,直到应用程序计时器到期。因此,可以使用* PAM_FAIL_DELAY *项目更改延迟功能。可以分别使用 pam_get_item(3)和 pam_set_item(3)进行查询和设置。用于设置它的值应该是以下原型的函数指针:

void (*delay_fn)(int retval, unsigned usec_delay, void *appdata_ptr);

参数是模块栈的* retval 返回码,libpam 请求的 usec_delay 微秒延迟以及应用程序与当前 pamh 关联的 appdata_ptr *。最后一个值是由应用程序在调用 pam_start(3)或显式使用 pam_set_item(3)时设置的。

请注意,默认情况下,PAM_FAIL_DELAY 项设置为 NULL。这表明,当身份验证失败并且建议了延迟时,PAM 应该执行如上所述的随机延迟。如果应用程序不希望 PAM 库在身份验证失败时执行任何延迟,则该应用程序必须定义一个不执行任何语句的自定义延迟函数,并将 PAM_FAIL_DELAY 项设置为指向此函数。

2.2.2.2. 返回值

  • PAM_SUCCESS

    • 延迟已成功调整。
  • PAM_SYSTEM_ERR

    • NULL 指针被提交为 PAM 句柄。