• PAM从入门到精通(七)


    接前一篇文章:PAM从入门到精通(六)

    本文参考:

    《The Linux-PAM Application Developers' Guide》

    先再来重温一下PAM系统架构:

    更加形象的形式:

    五、主要函数详解

    5. pam_strerror

    概述:

    描述PAM错误代码的字符串

    详细描述:

    pam_strerror函数返回一个指向字符串的指针,该字符串描述参数errnum中传递的错误代码,可能使用当前区域设置的LC_MESSAGES部分来选择适当的语言。应用程序不得修改此字符串。任何库函数都不会修改此字符串。

    函数声明:

    #include
    const char * pam_strerror ( pamh , errnum );
    pam_handle_t * pamh ;
    int errnum ;

    返回值:

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

    实例:

    SDDM中的代码

    参见SDDM包源码目录src/helper/backend/PamHandle.cpp中的PamHandle::getItem函数。

    1. const void* PamHandle::getItem(int item_type) {
    2. const void *item;
    3. m_result = pam_get_item(m_handle, item_type, &item);
    4. if (m_result != PAM_SUCCESS) {
    5. qWarning() << "[PAM] getItem:" << pam_strerror(m_handle, m_result);
    6. }
    7. return item;
    8. }

    由于这个函数比较简单,捎带手直接给出其实现,而无需过多解析。其在PAM源码根目录下的libpam/pam_strerror.c中,代码如下:

    1. const char *pam_strerror(pam_handle_t *pamh UNUSED, int errnum)
    2. {
    3. switch (errnum) {
    4. case PAM_SUCCESS:
    5. return _("Success");
    6. case PAM_ABORT:
    7. return _("Critical error - immediate abort");
    8. case PAM_OPEN_ERR:
    9. return _("Failed to load module");
    10. case PAM_SYMBOL_ERR:
    11. return _("Symbol not found");
    12. case PAM_SERVICE_ERR:
    13. return _("Error in service module");
    14. case PAM_SYSTEM_ERR:
    15. return _("System error");
    16. case PAM_BUF_ERR:
    17. return _("Memory buffer error");
    18. case PAM_PERM_DENIED:
    19. return _("Permission denied");
    20. case PAM_AUTH_ERR:
    21. return _("Authentication failure");
    22. case PAM_CRED_INSUFFICIENT:
    23. return _("Insufficient credentials to access authentication data");
    24. case PAM_AUTHINFO_UNAVAIL:
    25. return _("Authentication service cannot retrieve authentication info");
    26. case PAM_USER_UNKNOWN:
    27. return _("User not known to the underlying authentication module");
    28. case PAM_MAXTRIES:
    29. return _("Have exhausted maximum number of retries for service");
    30. case PAM_NEW_AUTHTOK_REQD:
    31. return _("Authentication token is no longer valid; new one required");
    32. case PAM_ACCT_EXPIRED:
    33. return _("User account has expired");
    34. case PAM_SESSION_ERR:
    35. return _("Cannot make/remove an entry for the specified session");
    36. case PAM_CRED_UNAVAIL:
    37. return _("Authentication service cannot retrieve user credentials");
    38. case PAM_CRED_EXPIRED:
    39. return _("User credentials expired");
    40. case PAM_CRED_ERR:
    41. return _("Failure setting user credentials");
    42. case PAM_NO_MODULE_DATA:
    43. return _("No module specific data is present");
    44. case PAM_BAD_ITEM:
    45. return _("Bad item passed to pam_*_item()");
    46. case PAM_CONV_ERR:
    47. return _("Conversation error");
    48. case PAM_AUTHTOK_ERR:
    49. return _("Authentication token manipulation error");
    50. case PAM_AUTHTOK_RECOVERY_ERR:
    51. return _("Authentication information cannot be recovered");
    52. case PAM_AUTHTOK_LOCK_BUSY:
    53. return _("Authentication token lock busy");
    54. case PAM_AUTHTOK_DISABLE_AGING:
    55. return _("Authentication token aging disabled");
    56. case PAM_TRY_AGAIN:
    57. return _("Failed preliminary check by password service");
    58. case PAM_IGNORE:
    59. return _("The return value should be ignored by PAM dispatch");
    60. case PAM_MODULE_UNKNOWN:
    61. return _("Module is unknown");
    62. case PAM_AUTHTOK_EXPIRED:
    63. return _("Authentication token expired");
    64. case PAM_CONV_AGAIN:
    65. return _("Conversation is waiting for event");
    66. case PAM_INCOMPLETE:
    67. return _("Application needs to call libpam again");
    68. }
    69. return _("Unknown PAM error");
    70. }

    可见,虽然函数有两个参数,但实际上第一个参数pam_handle_t *pamh并未实际使用到。函数的作用一目了然,就是 将各种结果宏定义转换为易于理解的字符串,类似于Linux中的strerror函数。

    更多函数请看后续文章。

  • 相关阅读:
    【MySql】Mysql之备份与恢复
    提升 React 应用的安全性:从这几点入手
    计算机网络模型(OSI架构、TCP/IP架构)
    SpringBoot快速入门--高级版
    4 另一种图片颜色表示:YUV
    【微搭低代码】美业小程序官方模板练习-绘制原型
    Java 集合中的排序算法浅析
    网易笔试题——mysql整理
    ROS(5)PX4仿真安装及运行
    《Spring Boot配置文件大揭秘:看懂 application.yaml 与 bootstrap.yaml 的不同》
  • 原文地址:https://blog.csdn.net/phmatthaus/article/details/133904999