首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何为有效用户和密码处理PAM_AUTHTOK_RECOVERY_ERR从pam_authenticate返回的值?

如何为有效用户和密码处理PAM_AUTHTOK_RECOVERY_ERR从pam_authenticate返回的值?
EN

Stack Overflow用户
提问于 2014-08-15 00:44:31
回答 1查看 338关注 0票数 0

我正在尝试编写一些服务器,它使用linux对客户端进行身份验证。我写了下面的课:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Pam
{
public:
    Pam(const char *module, const char *username)
    {
        mConv.appdata_ptr = nullptr;
        mConv.conv = &convCallback;
        const int res = pam_start("system-auth", username, &mConv, &mPamHandle);
        if (res != PAM_SUCCESS)
            throw std::runtime_error("Failed to initialize PAM");
     }

     bool authenticate(char *passwd)
     {
         pam_response *resp = static_cast<pam_response*>(malloc(sizeof(pam_response)));
         resp->resp = passwd;
         resp->resp_retcode = 0;
         mConv.appdata_ptr = resp;
         const int res = pam_authenticate(mPamHandle, 0);
         log(res);
         return res == PAM_SUCCESS;
    }

    ~Pam()
    {
        if (mPamHandle)
            pam_end(mPamHandle, PAM_SUCCESS);
        mPamHandle = nullptr;
    }
private:
    static int convCallback (int msgId, const pam_message **msg, pam_response **resp, void *appData)
    {
        *resp = static_cast<pam_response*>(appData);
        return PAM_SUCCESS;
    }

private:
    pam_handle_t *mPamHandle = nullptr;
    pam_conv mConv;
};

然后被使用如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Pam pam("system-auth", username);
if (pam.authenticate(passwd))
    return true;
// error handling code here

我发现pam_authenticate返回有效用户/密码的PAM_AUTHTOK_RECOVERY_ERR。手册页和Linux-pan.org authenticate中记录的可能返回值根本不包含此值。文档显示pam_chauthtok可以返回它,这意味着:

PAM_AUTHTOK_RECOVERY_ERR 模块无法获得旧的身份验证令牌。

目前还不清楚这对身份验证意味着什么。我尝试以普通用户和root用户的身份运行代码,结果是一样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-15 04:05:25

正在发生的事情是,您将0视为appDataconvCallback中的值,这是错误的来源--回复数据是空的,这意味着会话错误,这将导致PAM_AUTHTOK_RECOVERY_ERR返回值。这是基于读取PAM源代码当前代码中的support.c文件。

好吧,有几个问题。

  1. 初始化后不能重新分配会话appdata_ptr值--指针的值应该在调用pam_start之后被视为常量。你应该在那里传递一个永远不会改变的值。如果您检查了会话函数,就会注意到appData的值是0
  2. 您必须假定将被放入应答中的值属于调用例程--也就是说,您必须增强密码字符串(与此相关的所有邪恶信息)。

考虑到这两个方面,我稍微修改了您的代码如下,这将解决您的问题(同样,这是简化的代码):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Pam
{
public:
    Pam(const char *module, const char *username)
    {
        mConv.appdata_ptr = (void *)(this);
        mConv.conv = &convCallback;
        const int res = pam_start(module, username, &mConv, &mPamHandle);
        if (res != PAM_SUCCESS)
            throw std::runtime_error("Failed to initialize PAM");
     }

     bool authenticate(char *passwd)
     {
         mPassword = passwd;
         const int res = pam_authenticate(mPamHandle, 0);
         log(res);
         return res == PAM_SUCCESS;
    }

    ~Pam()
    {
        if (mPamHandle)
            pam_end(mPamHandle, PAM_SUCCESS);
        mPamHandle = 0;
    }
private:
    static int convCallback (int msgId, const pam_message **msg, pam_response **resp, void *appData)
    {
        Pam *me = static_cast<Pam *>(appData);
        pam_response *reply = static_cast<pam_response *>(calloc(1, sizeof(pam_response)));
        reply->resp = strdup(me->mPassword);
        reply->resp_retcode = 0;
        *resp = reply;
        return PAM_SUCCESS;
    }

private:
    pam_handle_t *mPamHandle = 0;
    pam_conv mConv;
    const char *mPassword = 0;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25323600

复制
相关文章
Php如何返回json数据(返回json对象或json格式数据)
header(‘Content-Type:application/json; charset=utf-8’);
超级小可爱
2023/02/20
17K0
【说站】php返回json数据
PHP中的json_encode()用于JSON编码变量,如果功能成功返回JSON数据,则返回FALSE。
很酷的站长
2022/11/23
2.2K0
【说站】php返回json数据
php返回json格式的{}花括号
方括号的[]在json中调试是一个数组,而花括号{}在json中表示一个对象,不过二者在PHP中基本上一个empty就可以判断为i空了,但在js里好像就有一些麻烦了,可能需要下面的判断方式。
老高的技术博客
2022/12/28
1.7K0
struts返回json数据
  实际上就是在struts中获取response对象的输出流。然后写入你要返回的json数据,本质和用servlet返回json数据是一样的,需要自己导入json的jar包。不做详细介绍。
用户2038589
2018/09/06
2K0
struts返回json数据
php对‘[{“id“:“1“,“name“:“cyg”},{“id“:“2“,“name“:“liwen“}]json数据进行修改删除操作
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 前言 代码 删除效果 修改效果 ---- 前言 对json数据进行修改删除操作,数组里面有两个
贵哥的编程之路
2022/10/24
1.1K0
php对‘[{“id“:“1“,“name“:“cyg”},{“id“:“2“,“name“:“liwen“}]json数据进行修改删除操作
Python Flask,Json,返回Json数据,jsonify
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142981.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
1.9K0
django 返回 json 格式数据
1.返回的格式需要是json数据格式的时候,将content 格式为json对象即可: from django.http import HttpResponse import json def test(request): resp = { 'code': '200', 'message': 'success', 'data': { 'num': '1234', }, } response
onety码生
2018/11/21
2.8K0
php json_decode 返回 null 乱码问题
编码错乱的昵称存在json字符串里,php调用json_decode(xxx, true) 失败,返回null的问题。
shirishiyue
2020/01/01
3.3K0
[Go] golang http下返回json数据
从post中获取到字段后 , 返回对应的结果 , 设置header必须在返回响应码之前调用
唯一Chat
2020/05/26
8.6K0
Java后端返回Json数据规范
列表数据 在返回的json的中,有一个键值为data的Hashmap 使用mybatis plus无条件(wrapper为null,查询全部)查询所有用户的信息 所有信息返回一个list 将list放入hashmap中,键值为items
小颜同学
2023/08/24
1K0
Flask 使用json或者jsonify返回json响应数据的方法
在前后端分离的时代,后端一般返回前端的数据就是json格式的响应数据。 而json格式的响应数据其实实际上就是一个字符串。
Devops海洋的渔夫
2019/12/02
17.4K0
物流信息接口 返回JSON数据
获取物流信息接口 【获取物流信息】 请求模式:GET/POST 请求地址:https://api.shunnet.top/logistics/api?companycode=ems&number=1
Shunnet
2021/06/11
1.1K0
【黄啊码】PHP:json_encode返回null
在对小程序端(get)提交的数据在网页端进行显示的时候,使用PHP的json_decode()函数对已经经过JSON.stringify编译的数据转换为数组,结果返回null,使用json_last_error()输出error是Syntax error
黄啊码
2021/09/26
5.2K0
如何使用php调用api接口,获得返回json字符的指定字段数据
逻辑: 先合并出需要调用的接口以及参数 然后用php中file_get_contents()函数,获取接口返回的所有内容。 最后再通过json_decode,将获取到的内容进行json解码,然后进行输出,得到想要的结果。(这里调用接口,获得百度域名的备案主体的信息)。
吃猫的鱼Code
2023/02/02
8.5K2
Json乱码问题和返回json数据统一解决
我们可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置!
PHY_68
2020/10/28
1.2K0
Django 2.1.7 查询数据返回json格式
在日常工作中,对于前端发送过来的请求,后端django大部分都是采用json格式返回,也有采用模板返回视图的方式。 在模板返回视图的方式的确很方便,但是如果涉及到动静分离、ajax请求这类,django就只能返回json格式的数据了。 那么这里就带来了一个问题,如何将django从数据库模型类中查询的数据以json格式放回前端。 然后前端如果获取读取返回过来的数据呢?
Devops海洋的渔夫
2019/09/18
3K0
Django 2.1.7 查询数据返回json格式
WebAPI返回JSON
web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法:  方法一:(改配置法)  找到Global.asax文件,在Application_Start()方法中添加一句:
莫问今朝
2018/08/31
3.5K0
php json_encode()函数返回对象和数组问题
php json_encode() 函数格式化数据时会根据不同的数组类型格式化不同类型的json数据
码缘
2019/09/11
3.7K0
springmvc之返回json类型的数据给前端
1、加入三个Jar包 2、为方法加上@ResponseBody注解,方法直接返回相关信息。 使用ResponseBody注解需要在springmvc.xml文件中配置: <mvc:annotation
西西嘛呦
2020/08/26
1.1K0
springmvc之返回json类型的数据给前端
点击加载更多

相似问题

JSON PHP服务器已修改

233

用PHP修改JSON数据

22

修改PHP代码以返回JSON值

12

修改已返回的对象

10

修改php laravel中的json数据

364
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文