PAM从入门到精通(四)

news2025/1/22 13:11:24

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

本文参考:

The Linux-PAM Application Developers' Guide

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

更加形象的形式:

五、主要函数详解

1. pam_start

概述:

PAM事务初始化。

详细描述:

pam_start函数创建PAM上下文并启动PAM事务。它是应用程序需要调用的第一个PAM函数。事务状态完全包含在此句柄标识的结构中,因此可以并行处理多个事务。但是不可能对不同的事务使用相同的句柄,每个新的上下文都需要一个新的句柄。

函数声明:

#include <security/pam_appl.h>
int pam_start ( service_name , user , pam_conversation , pamh );
const char * service_name ;
const char * user ;
const struct pam_conv * pam_conversation ;
pam_handle_t ** pamh ;

参数说明:

  • const char *service_name

service_name参数指定要应用的服务的名称,并将作为PAM_SEVICE项存储在新上下文中。服务的策略将从文件/etc/pam.d/service_name中读取,如果该文件不存在,则从/etc/pam.conf中读取。如:passwd(/etc/pam.d/passwd)、useradd(/etc/pam.d/useradd)等。

  • const char *user

user参数可以指定目标用户的名称,并将存储为PAM_USER项。如果参数为NULL,则模块必须在必要时询问此项。

  • const struct pam_conv *pam_conversation

pam_conversation参数指向描述要使用的会话函数的结构pam_conv。应用程序必须为加载的模块与应用程序之间的直接通信提供此功能。

  • pam_handle_t **path

在成功返回(PAM_SUCCESS)之后,pamh的内容是一个句柄,它包含对PAM函数的连续调用的PAM上下文。在错误情况下,pamh的内容未定义。

pam_handle_t是一个盲结构,应用程序不应试图直接探测其信息。而是应该通过PAM库提供的函数pam_set_item和pam_get_item。PAM句柄不能同时用于多个身份验证,只要以前没有对其调用pam_end函数。

返回值:

  • PAM_ABORT:一般错误。
  • PAM_BUF_ERR:内存缓冲区错误。
  • PAM_SUCCESS:事务已成功创建。
  • PAM_SYSTEM_ERR:系统错误,例如提交了一个NULL指针而非指向数据的指针。

实例:

实例1. 一般性代码

     /* 初始化,并提供一个回调函数 */
    if ((pam_start("login", user_name, &pam_conv, &pamh)) != PAM_SUCCESS)
        exit(1);

实例2. sddm中的代码

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

代码如下:

 bool PamHandle::start(const QString &service, const QString &user) {
        if (user.isEmpty())
            m_result = pam_start(qPrintable(service), NULL, &m_conv, &m_handle);
        else
            m_result = pam_start(qPrintable(service), qPrintable(user), &m_conv, &m_handle);
        if (m_result != PAM_SUCCESS) {
            qWarning() << "[PAM] start" << pam_strerror(m_handle, m_result);
            return false;
        }
        else {
            qDebug() << "[PAM] Starting...";
        }
        return true;
    }

2. pam_end

概述:

PAM事务终止。

详细描述:

pam_end函数终止pam事务,是应用程序应在pam上下文中调用的最后一个函数。此函数为与pam_set_item和pam_get_item函数关联的项释放了所有内存。调用pam_end()后,与此类对象关联的指针不再有效。

函数声明:

#include <security/pam_appl.h>

int pam_end ( pamh , pam_status );
pam_handle_t * pamh ;
int pam_status ;

参数说明:

  • pam_handle_t *pamh

返回后,句柄pamh不再有效,并且与之相关的所有内存都将无效。

  • int pam_status

pam_status参数应设置为上次PAM库调用返回给应用程序的值。

pam_status获取的值用作模块特定回调函数cleanup的参数(参见pam_set_data()和pam_get_data())。通过这种方式,可以向模块发出拆除过程的通过/失败性质的通知,并在模块被取消链接之前执行适合模块的任何最后一分钟任务。

此参数可以与PAM_DATA_SILENT进行逻辑“或”运算,以指示模块不应过于认真地对待调用。它通常用于指示库的当前关闭处于分支进程中,并且父进程将负责清理当前进程空间之外的内容(如文件等)。

返回值:

  • PAM_SUCCESS:事务已成功创建。
  • PAM_SYSTEM_ERR:系统错误,例如一个NULL指针作为PAM句柄提交,或者函数被模块调用。

实例:

实例1. 一般性代码

    pam_end(pamh, PAM_SUCCESS);  /* PAM事务的结束 */

实例2. sddm中的代码

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

代码如下:

 bool PamHandle::end(int flags) {
        if (!m_handle)
            return false;
        m_result = pam_end(m_handle, m_result | flags);
        if (m_result != PAM_SUCCESS) {
            qWarning() << "[PAM] end:" << pam_strerror(m_handle, m_result);
            return false;
        }
        else {
            qDebug() << "[PAM] Ended.";
        }
        m_handle = NULL;
        return true;
    }

更多函数请看后续文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1102254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

添加Mybatis框架支持

配置环境 1.老项目 在pom.xml中使用generate ->edit starts->添加下面俩 2.新项目 然后运行发现会有报错 2.1这是因为没有配置数据库连接信息 spring:datasource:url: jdbc:mysql://localhost:3306/java2023?characterEncodingutf8&useSSLfalse # MySQL数…

2024泰晤士世界大学排名公布(附Top200榜单)

近日&#xff0c;泰晤士高等教育世界大学排名&#xff08;THE&#xff09;发布了2024世界大学榜单&#xff0c;这表明全球高等教育领域的四大主流排名&#xff08;QS、U.S. News、ARWU、THE&#xff09;都已经尘埃落定。知识人网小编整理了泰晤士TOP前200的榜单&#xff0c;供访…

数据挖掘十大算法--Apriori算法

一、Apriori 算法概述 Apriori 算法是一种用于关联规则挖掘的经典算法。它用于在大规模数据集中发现频繁项集&#xff0c;进而生成关联规则。关联规则揭示了数据集中项之间的关联关系&#xff0c;常被用于市场篮分析、推荐系统等应用。 以下是 Apriori 算法的基本概述&#x…

发面试题:(四)synchronized和lock区别

synchronized 关键字 synchronized关键字解决的是多个线程之间访问资源的同步性&#xff0c;synchronized关键字可以保证被它 修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外&#xff0c;在 Java 早期版本中&#xff0c; synchronized属于重量级锁&#xff0c;效率…

20-数据结构-内部排序-插入排序

简介&#xff1a;插入排序基本有两步&#xff0c;先是通过比较&#xff0c;得到插入位置&#xff0c;随后移动给需要插入的位置处腾空&#xff0c;最后进行值的插入。 目录 一、直接插入排序 1.1简介&#xff1a; 1.2代码 二、折半插入排序 2.1简介&#xff1a; 2.2代码…

vue项目获得开源代码之后跳过登录界面

readme运行 进入到账号和密码 找到main.js 比如说&#xff0c;以上这段代码 剩下next&#xff08;&#xff09;就成功进入了

SAP MM学习笔记37 - 请求书照合中的 追加请求/追加Credit 等概念/ 请求书的取消

有关请求书照合&#xff0c;之前学习了一部分&#xff0c;现在再来学其中的一些概念。 其实这些概念也许并不常用&#xff0c;但是你又不能不知道&#xff0c;因为客户会问。 有关请求书&#xff0c;贴一些以前学习的文章&#xff0c;以方便阅读。 SAP MM学习笔记33 - 请求书…

雷达人体感应器成品方案,智能化空间联动交互,人体存在触发应用

随着科技的快速发展&#xff0c;智能化已经成为我们生活中不可或缺的一部分。在酒店、会议室和办公室等场合&#xff0c;智能化更是显得尤为重要。 智能雷达感应器成品设备能够实时监测人体的静止存在&#xff0c;精准地探测人体存在&#xff0c;进而触发联动设备&#xff0c;…

【C++】BMI身体质量指数计算工具

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍BMI身体质量指数计算工具。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷…

信创办公–基于WPS的Word最佳实践系列 (图文环绕方式)

信创办公–基于WPS的Word最佳实践系列 &#xff08;图文环绕方式&#xff09; 目录 应用背景操作步骤1、 打开布局选项中图文环绕方式的方法2、 图文环绕三大类型 应用背景 在Word中&#xff0c;对文字和图片进行排版时&#xff0c;采用各种不同的图片与文字组合效果能够使页面…

Python基础教程:装饰器的详细教程

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、什么是装饰器 目的&#xff1a;给func()方法&#xff0c;增加一个功能&#xff0c;在fun()执行期间&#xff0c;同时把fun()执行速率机算出来 import time def func():print(嘻嘻哈哈)start_time time.time() ti…

Windows版IntelliJ插件SmartInput使用入门

插件设置 CtrlAlts 打开Setting&#xff0c;可以找到SmartInput插件设置页面&#xff0c;也可以通过“右键 -> SmartInput -> 插件设置”快速进入。右键选项打开使用统计可以看到插件为您有效切换输入法的次数。如果您遇到了BUG&#xff0c;右键选项反馈错误日志并复制U…

深入理解强化学习——智能体的类型:有模型强化学习智能体与免模型强化学习智能体

分类目录&#xff1a;《深入理解强化学习》总目录 根据智能体学习的事物不同&#xff0c;我们可以把智能体进行归类。基于价值的智能体&#xff08;Value-based agent&#xff09;显式地学习价值函数&#xff0c;隐式地学习它的策略。策略是其从学到的价值函数里面推算出来的。…

AlphaFold-multimer 复合物结构预测

AlphaFold-multimer 复合物结构预测 AlphaFold-multimer是DeepMind开发的AlphaFold项目的一个扩展&#xff0c;旨在预测蛋白质多聚体的三维结构。蛋白质多聚体是由多个蛋白质亚单位相互组装而成的结构&#xff0c;如酶、膜蛋白复合物和病毒颗粒。理解多聚体的结构对于揭示蛋白…

提高编程效率-Vscode实用指南

您是否知道全球73%的开发人员依赖同一个代码编辑器&#xff1f; 是的&#xff0c;2023 年 Stack Overflow 开发者调查结果已出炉&#xff0c;Visual Studio Code 迄今为止再次排名第一最常用的开发环境。 “Visual Studio Code 仍然是所有开发人员的首选 IDE&#xff0c;与专业…

数据库第六章作业

发表本文章意为记录与分享 第6章作业.xls 题量: 25 满分: 100 一. 单选题&#xff08;共25题&#xff09; 1. (单选题)关系模式中&#xff0c;满足2NF的模式&#xff0c;&#xff08; &#xff09;。 A. 可能是1NFB. 必定是3NFC. 必定是1NFD. 以上都不正确 我的答案: C :…

MySQL的多表操作-外键约束

文章目录 外键约束介绍特点添加外键约束数据插入 删除外键约束 外键约束 介绍 MySQL 外键约束&#xff08;FOREIGN KEY&#xff09;是表的一个特殊字段&#xff0c;经常与主键约束一起使用。对于两个具有关联关系的表而言&#xff0c;相关联字段中主键所在的表就是主表&#…

执行事务合伙人和法人区别是什么

1. 定义不同&#xff1a; 执行事务合伙人指负责经营和管理合伙企业的人&#xff0c;对外代表合伙企业进行业务活动&#xff0c;对内负责合伙企业的日常管理。 法人则是企业的法定代表人&#xff0c;代表企业参与民事活动&#xff0c;是企业的行政领导&#xff0c;对企业经济活动…

WebGL 世界坐标系和本地坐标系

目录 前言 ​编辑本地坐标系 世界坐标系 变换与坐标系 前言 在WebGL 从0到1绘制一个立方体_山楂树の的博客-CSDN博客中&#xff0c;我们创建并显示了第一个三维物体&#xff08;一个立方体&#xff09;&#xff0c;示例程序开始变得像一个“真正”的三维程序了。我们亲…

C++数位算法:数字1的个数

题目 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1&#xff1a; 输入&#xff1a;n 13 输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0 提示&#xff1a; 0 < n < 109 2023年1月版 class S…