• PAM从入门到精通(六)


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

    本文参考:

    《The Linux-PAM Application Developers' Guide》

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

    更加形象的形式:

    五、主要函数详解

    4. pam_get_item

    概述:

    获取PAM项。

    详细描述:

    pam_get_item函数允许应用程序和PAM服务模块访问和检索item_type的PAM信息。成功返回后,item包含一个指向相应项的值的指针。

    注意,这是一个指向实际数据的指针,不应该被free()掉或覆盖!

    item_type支持以下值:

    • PAM_SERVICE

    服务名称(标识PAM函数将用于验证程序的PAM堆栈)。

    • PAM_USER

    将使用其提供身份服务的实体的用户名。也就是说,在身份验证之后,PAM_USER标识可以使用该服务的本地实体。

    注意,PAM堆栈中的任何模块都可以将该值从某个事物(例如,“匿名”)映射到其它事物(例如“guest119”)。

    • PAM_USER_PROMPT

    提示输入用户名时使用的字符串。此字符串的默认值是“login:”的本地化版本。

    • PAM_TTY

    终端名称:如果是设备文件,则前缀为/dev/;对于图形化的、基于X的应用程序,该项的值应该是$DISPLAY变量。

    • PAM_RUSER

    请求用户名:本地请求用户的本地名称或远程请求用户的远程用户名。

    通常,应用程序或模块会尝试提供经过最强身份验证的值(在远程帐户之前是本地帐户)。该值的信任级别体现在与应用程序相关联的实际身份验证堆栈中,因此最终由系统管理员决定。

    PAM_RUSER@PAM_RHOST应始终识别请求用户。在某些情况下,PAM_RUSER可能为NULL。在此种情况下,不清楚提出请求的实体是谁。

    • PAM_HOST

    请求主机名(PAM_RUSER实体请求服务的机器的主机名)。这就是PAM_RUSER@PAM_RHOST确实标识了请求用户。在某些应用程序中,PAM_RHOST可能为NULL。在这种情况下,不清楚身份验证请求的来源。

    • PAM_AUTHOK

    身份验证令牌(通常是密码)。除了pam_sm_authenticate()和pam_sm_chauthtok()之外,所有模块函数都应该忽略此令牌。在前一个函数中,它用于将最新的身份验证令牌从一个堆叠的模块传递到另一个模块。在后一个函数中,令牌用于另一个目的。它包含当前活动的身份验证令牌。

    • PAM_OLDAUTHOK

    旧的身份验证令牌。除pam_sm_chauthtok()外,所有模块函数都应忽略此令牌。

    • PAM_CONV

    pam_conv结构。参见pam_conv。

    以下附加项目是特定于Linux PAM的,不应在可移植应用程序中使用:

    • PAM_FAIL_DELAY

    用于重定向集中管理的故障延迟的函数指针。参见pam_fail_delay。

    • PAM_XDISPLAY

    X display的名称。对于图形化的、基于X的应用程序,该项的值应该是$DISPLAY变量。该值可以独立于PAM_TTY用于传递display的名称。

    • PAM_XAUTHDATA

    指向一个结构的指针,该结构包含连接到PAM_XDISPLAY指定的显示器所需的X身份验证数据(如果需要此类信息)。参见pam_xauth_data。

    • PAM_AUTHOK_TYPE

    默认操作是模块在请求密码时使用以下提示:“New UNIX password:”和“Retype UNIX password:”。示例单词UNIX可以替换为此项,默认情况下为空。此项目由pam_get_authtok使用。

    如果服务模块希望获得用户的名称,则不应使用此函数,而应执行对pam_get_user()的调用。

    只有服务模块有权读取身份验证令牌PAM_AUTHTOK和PAM_OLDAUTHTOK。

    函数声明:

    #include
    int pam_get_item ( pamh , item_type , item );
    const pam_handle_t * pamh ;
    int item_type ;
    const void ** item ;

    返回值:

    • PAM_BAD_ITEM:应用程序试图设置未定义或不可访问的项。
    • PAM_BUF_ERR:内存缓冲区错误。
    • PAM_PERM_DENIED:item的值为NULL。
    • PAM_SUCCESS:数据已成功更新。
    • PAM_SYSTEM_ERR:系统错误,作为第一个参数传递的pam_handle_t无效。

    实例:

    实例1. 一般性代码

    1. const void *user = NULL;
    2. const char *authtok = NULL;
    3. const char *prompt = NULL;
    4. //获得用户名密码的函数如下:
    5. pam_get_item(pamh, PAM_USER, &user); //get the user
    6. pam_get_authtok(pamh, PAM_AUTHTOK, &authtok, prompt);

    实例2. 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. }

    更多函数请看后续文章。

  • 相关阅读:
    食堂消费开启新模式,接招吧
    自定义Unity组件——AudioManager(音频管理器)
    uni-app中vue3+setup实现下拉刷新、上拉加载更多效果
    存储型XSS和BEEF浏览器攻击框架
    配置与管理数据库服务器(MariaDB)
    Verilog实现SPI通信协议驱动设计
    ubuntu,kali设置静态IP
    UE4在蓝图中使用自己定义的对象蓝图
    PCI Pharma Services宣布斥资数百万美元扩建英国制造设施,以满足市场对支持肿瘤治疗的全球高效药制造服务日益增长的需求
    c# 中的类
  • 原文地址:https://blog.csdn.net/phmatthaus/article/details/133901195