Polkit 使用什么 JavaScript 解释器来解释rules.d 文件?
撰写本文时的源代码链接到已失效的维基百科标题“ECMAScript.2C_5th_Edition”,但这只是解释器写入的规范,而不是用于解释 polkit 规则文件的特定实现。
了解授权系统中嵌入的 JavaScript 解释器的用途和使用方式,最好能清楚地声明。消除细节歧义,例如解释器嵌入的位置、共享运行时的内容、何时解释规则文件函数、是否异步解释它们等;显然也不错。
答案1
这可能是 Mozilla 的实现。
在我的 Centos 7 机器上:
% ldd /usr/lib/polkit-1/polkitd | grep js
libmozjs-17.0.so => /lib64/libmozjs-17.0.so (0x00007f7c25d9f000)
% rpm -qif /lib64/libmozjs-17.0.so
Name : mozjs17
Version : 17.0.0
Release : 20.el7
Architecture: x86_64
Install Date: Sun May 13 09:40:16 2018
Group : Development/Languages
Size : 4045213
License : GPLv2+ or LGPLv2+ or MPLv1.1
Signature : RSA/SHA256, Wed Apr 25 07:27:32 2018, Key ID 24c6a8a7f4a80eb5
Source RPM : mozjs17-17.0.0-20.el7.src.rpm
Build Date : Tue Apr 10 20:33:07 2018
Build Host : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.mozilla.org/js/
Summary : JavaScript interpreter and libraries
Description :
JavaScript is the Netscape-developed object scripting language used in millions
of web pages and server applications worldwide. Netscape's JavaScript is a
superset of the ECMA-262 Edition 3 (ECMAScript) standard scripting language,
with only mild differences from the published standard.
答案2
看起来 polkit 现在使用 duktape (https://duktape.org/) 用于执行 JavaScript:
nu ❯ paru -Qi polkit
Name : polkit
Version : 122-1
Description : Application development toolkit for controlling system-wide privileges
Architecture : x86_64
URL : https://gitlab.freedesktop.org/polkit/polkit
Licenses : LGPL
...
Depends On : duktape expat glib2 pam systemd
...
~
nu ❯ paru -Qi duktape
Name : duktape
Version : 2.7.0-6
Description : Embeddable Javascript engine
Architecture : x86_64
URL : https://duktape.org/
Licenses : MIT
...
从网站上看,duktape 2.6.0 似乎已经实现了 ECMAScript 2015 和 2016 的大部分内容,但我想您可能希望使用某种测试工具(甚至是网站)仔细检查您的规则是否没有执行超出其范围的任何操作
答案3
事实上,现有的两个答案都有些正确。 Polkit 实际上支持mozjs
和duktape
作为其 JS 解释器,可在编译时配置。所以今天的答案是“这取决于你的分布”。
duktape
2022 年初添加了对候补口译员的支持这位先生,似乎所有三个主要基础发行版(经过测试:ArchLinux、Debian 12、Fedora 38)都已切换到它。然而,对于旧版本和/或面向稳定性的发行版(尤其是 RHEL 9)来说,情况可能并非如此。
因此,找到适合您的发行版的最终方法是检查/usr/lib/polkit-1/polkitd
链接的库,正如 @StephenHarris 所建议的那样。你可以运行这个 oneliner:
ldd /usr/lib/polkit-1/polkitd | grep -E '(mozjs|duktape)'
如果它没有打印任何内容,则意味着polkit
您的包是在没有 JS 规则支持的情况下构建的。