XScreenSaver:工具包对话框上

2020-11-12 09:59:06

因此,您希望xcreensaver调用解锁对话框程序并等待响应。解锁器将使用一个图形用户界面工具包,并将与各种安全库相关联。也许它的工作方式是,根据输入的密码是否正确,它将在标准输出上打印";yes&34;或";no&34;。如果它崩溃了,这个守护程序就会认为这意味着不会。事实上,这种方法实际上会减少守护进程本身中的库(从而减少代码行)的数量,因为守护进程不需要链接到PAM和Crypto之类的东西。这是一件好事。因此,到目前为止,这听起来并不难,只是xcreensaver守护程序抓取了键盘。按住抓取非常重要,因为否则击键往往会穿过xcreensaver窗口,到达下面随机桌面窗口。这就引出了这样一个问题:按键到底是如何到达解锁对话框的?这是一个很难回答的问题。理解如何正确操作需要大量关于X的知识(我有),但可能还需要大量关于外语输入法、屏幕阅读器和其他辅助工具的知识(我没有)。调任抢夺?由于xcreensaver使用覆盖-重定向窗口(即不在窗口管理器控制下的窗口)来消隐屏幕,因此它有必要抓取键盘和鼠标。否则,窗口管理器将继续向上次获得焦点的任何窗口发送事件。这显然是一件坏事,因为这会导致人们在IRC频道上输入密码。在当前系统中,屏幕消隐窗口和解锁对话框的创建者都是同一个进程,这不是问题:该进程可以获得它想要的所有事件。但当它们处于不同的进程中时,我们需要一种方法让键盘和鼠标事件到达驱动解锁对话框的进程。因此,您想要将抓取从xcreensaver守护程序转移到解锁对话框中,然后再将它们转移回来。不幸的是,没有办法在X中自动转移抓取。你能做的最好的事情是:这里有两个争用条件:在步骤3和4之间,以及在步骤6和7之间。在这些时期,键盘和鼠标(短暂地)根本不被抓取。那里可能会发生两件坏事。首先,键盘或鼠标可能会被某个第三个程序抓取(例如,桌面上其他东西的弹出窗口)。其次,用户可能在错误的时间键入击键。然后,该击键既不会进入xcreensaver,也不会进入解锁对话框,而是会进入桌面上的其他窗口。

人工合成项目?另一种可能是xcreensaver守护进程保留它的抓取,这意味着所有键盘和鼠标事件都将交给它;但随后它会使用XSendEvent()在锁定对话框窗口上生成合成事件。也就是说,xcreensaver守护进程将读取一个KeyPress,然后在锁定对话框窗口中模拟与该KeyPress完全相同的副本。这种方法有几个潜在的问题:应用程序有可能区分真实事件和合成事件,作为一种安全措施,工具包忽略合成事件并不少见。我不知道GTK是否做到了这一点(尽管我想,这很容易找到)。

我不知道当前流行的输入法和辅助工具是如何工作的;如果它们嵌入到解锁对话框本身,这不会成为问题。然而,如果它们通过弹出第二个窗口(例如,在您键入的一侧的另一个窗口,或者屏幕上的键盘或其他东西)来工作,那么我们就有问题要找出将事件发送到哪个窗口。请记住,当屏幕被锁定时,窗口管理器根本不参与其中:它看不到这些窗口中的任何一个。这些窗口没有标题栏。你不能点击并拖拽它们。您不能通过单击来更改焦点。你最喜欢的窗口管理按键不起作用。如果需要对任意窗口进行完全的窗口管理才能使辅助工具发挥作用,那么,这就是一个大问题……。

总而言之:让xcreensaver解锁对话框安全地使用工具包是很困难的,但如果是一个有知识的人来做这项工作是可能的。如果这项工作做得很好(我的意思是:有清晰的注释和文档,并明显注意到安全方面的影响),我很乐意将这些更改合并到xcreensaver发行版中。让解锁对话框也能够利用辅助工具可能要困难得多。我不知道有多难,因为我不是可访问性专家。但任何想要实现这一点的人最好既是可访问性方面的专家,又精通