#x11 #saver #screen #graphics #password #daemon #locker

nightly app screenruster

X11屏幕保护程序和锁定器

12个版本

0.2.1 2020年1月4日
0.2.0 2019年6月11日
0.1.9 2016年8月24日
0.1.4 2016年7月26日

#302 in GUI

33 每月下载量

GPL-3.0 许可证

140KB
3.5K SLoC

ScreenRuster

一个X11屏幕保护程序和锁定器。

安装

要安装守护进程,您需要一个nightly Rust工具链,然后您可以使用Cargo安装它

cargo install screenruster

完成后,您可以在 $XDG_CONFIG_HOME/screenruster/config.toml ($XDG_CONFIG_HOME 默认为 ~/.config/) 创建一个配置文件,或者从 assets/config.toml 复制一个。

屏幕保护程序必须位于 $PATH 中,并且可执行文件名必须以 screenruster-saver- 开头。

可以使用Cargo安装一个示例屏幕保护程序

cargo install screenruster-saver-laughing_man

示例配置文件已经为其设置了默认设置。

用法

首先,启动守护进程。

screenruster daemon &

然后如果您想手动激活屏幕保护程序

screenruster activate

或者如果您想手动锁定

screenruster lock

要解锁,只需输入您的密码并按回车键。

授权

授权由各种模块处理,每个模块都尝试进行身份验证,第一个成功的身份验证将解锁屏幕。

内部

内部模块使用配置文件中指定的密码,这最初是为了测试而制作的,您可能不应该使用它。

[auth.internal]
password = "password"

PAM

此模块使用可插拔身份验证模块进行身份验证,您需要在 /etc/pam.d/screenruster 中为其安装一个配置文件。

auth	include		system-auth

如果您希望PAM账户管理受到尊重,请确保使用具有 auth-pam-accounts 特性的构建。

可用的屏幕保护程序

这是一个随时间更新的可用屏保列表,如果您制作了屏保并希望添加到此列表,只需发起一个pull request。

为什么?

因为我想要制作一个花哨的屏保,而使用xscreensaver可能比从头开始制作更痛苦。

为什么我要用这个而不是xscreensaver

如果您喜欢冒险,并想使用一个没有像xscreensaver那样经过充分测试的屏锁。

或者如果您喜欢为ScreenRuster制作的任何屏保。

理论上,由于它使用Rust编写并且架构与xscreensaver略有不同,ScreenRuster应该比xscreensaver更安全,这进一步减少了攻击面。

实际上,ScreenRuster仍然很年轻,并且在使用PAM(但是它足够小,足以保证安全)的地方有一些不安全代码。

为什么我要用这个而不是gnome-screensaver

因为ScreenRuster仍然比gnome-screensaver更安全,并且它实现了相同的DBus接口,因此它应该能够在GNOME环境的其余部分中正常工作。

但说实话,现在就使用xscreensaver,任何东西都比gnome-screensaver好。

架构

架构大致遵循xscreensaver,因为这是最佳方法,保持屏幕锁定简单,将花哨的图形委托给一个单独的进程,这使得有缺陷的屏保不会使整个锁定机制崩溃,从而保护免受漏洞的侵害。

屏保可以用任何可以绘制到X11窗口、解析和生成JSON、写入stdout和从stdin读取的语言编写。

JSON用于在守护程序和屏保之间进行IPC,守护程序将数据写入屏保进程的stdin,从进程的stdout读取,并将来自stderr的任何内容转发,以便进行调试或记录。

屏保的工作仅仅是进行渲染,这包括任何淡入/淡出或对话框,这进一步减少了锁定程序的攻击面。注意屏保实际上不获取输入,它只获取InsertDelete事件,因此它可以填充其对话框。

协议

协议是基于行的,其中每行包含一个JSON编码的消息,每个消息都有一个type字段,包含消息的名称,参数是同一对象上的属性。

请求

请求是从守护程序发送到派生的屏保进程的消息。

配置

配置请求是握手的一部分,并且是当进程被派生时发送的第一个请求。

配置是单一的,并由守护程序在TOML文件中管理,相关的TOML映射被转换为JSON并发送给屏保。

  • type = "config"
  • config = Object

目标

目标请求是握手的一部分,是在进程启动时发送的第二次请求。

它包含了获取X11窗口所需的所有详细信息,包括显示名称、屏幕编号和窗口XID

  • type = "target"
  • display = String
  • screen = Integer
  • window = Integer

调整大小

当锁定窗口调整大小时,会发送调整大小请求,这可能会在XRandr用于更改分辨率或旋转屏幕时发生。

  • type = "resize"
  • width = Integer
  • height = Integer

节流

当省电程序应该尝试减少功耗时,会发送节流请求。

  • type = "throttle"
  • throttle = Boolean

空白

当屏幕被清除或恢复时,会发送空白请求。

  • type = "blank"
  • throttle = Boolean

指针

当在省电窗口上发生指针事件时,会发送指针请求。

  • type = "pointer"
  • move = Object { x, y }
  • button = Object { x, y, button, press }

密码

当任何授权相关更改发生时,会发送密码请求,这包括字符被插入或删除、密码正在检查或授权失败或成功。

  • type = "password"
  • password = "insert""delete""reset""check""success""failure"

开始

当省电程序应该开始渲染时,会发送开始请求,这可能包括淡入或其他特效。

  • type = "start"

锁定

当屏幕被锁定时,会发送锁定请求,这可以用来渲染通知屏幕当前已锁定。

  • 类型 = "锁定"

停止

当保存器应停止渲染时发送停止请求,这可能包括淡出或其他精美图形。

  • 类型 = "停止"

响应

响应是从派生的保存器进程发送到守护进程的消息。

初始化

在完成握手并且保存器准备好开始后发送初始化响应,因为精美图形可能需要加载纹理等,保存器被给予一些准备渲染的余地。

  • 类型 = "初始化"

开始

在收到开始请求并开始渲染后发送开始响应,它告诉守护进程可以显示窗口。

  • 类型 = "开始"

停止

在收到停止请求并停止渲染后发送停止响应,它告诉守护进程可以隐藏窗口。

依赖项

~10-21MB
~306K SLoC