cups用户认证实现细节

1、背景

目前打印管理器依赖系统给用户默认分配的lpadmin和lp用户组,才能正常管理打印机和打印测试页。一旦新建一个用户,没有lpadmin权限,切换到新用户打印管理器就无法正常工作。所以需要采用cups的授权机制,让非lpadmin用户组的用户也可以管理打印机。

2、技术细节

2.1、cups权限配置

cups在/etc/cups/cups-files.conf中定义了SystemGroup lpadmin,在/etc/cups/cupsd.conf中user @SYSTEM就表示lpadmin组的用户。当一个用户不在lpadmin组时,执行需要该用户组权限的操作时cups会给出”1025 已禁止”的错误提示,对应cups的状态值为IPP_STATUS_ERROR_FORBIDDEN。IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED

2.2、总体思路

既然权限不够那说明需要提升权限,重点就是让当前连接以root用户身份执行ipp请求,这就需要cupsSetUser()这个接口(该接口针对线程,多线程程序需要每个线程都进行设置,后续相关接口也是如此)。关键是程序里面如何动态获取root密码,这就需要通过用户交互来让用户自己输入密码,然后在cups的密码回调函数里面返回该密码。所以需要使用polkit触发系统的授权对话框,刚好cups-pk-helper已经提供了需要的action,使用其中定义的all-edit即可。

2.2、授权流程

  • 启动的时候解锁弹出授权界面

  • 存储授权界面填充的用户名和密码

  • 建立一个连接,通过setPasswordCB设置回调,并通过setCupsUser()设置用户名。回调里面先返回空密码,认证失败之后再尝试返回用户填充的密码。

  • 上述连接认证成功之后才让用户继续其他和cups相关的操作


cups用户认证实现细节
http://yoursite.com/2021/02/19/cups用户认证实现细节/
作者
还在输入
发布于
2021年2月19日
许可协议