- 1
- Sep
首先小小的抱怨一下,PolicyKit这么个有用的东西,居然没有Python的binding。真是太可惜了!
之前是纯Python的Ubuntu Tweak,现在不得不引入了C语言的代码。这倒也没关系,就当是练习练习C语言。
幸运的是,之前一直使用autotools来作为源码的编译/打包机制,所以很自然地加上了C的代码。
经过了几个小时的奋斗,终于将Ubuntu Tweak真正地实现了PolicyKit机制。因此撰文记录之。
-----
在讲PolicyKit之前,首先讲dbus这个应用程序通讯总线。
dbus是掌管系统进程之间交互的一个强大的工具,应用程序可以选择注册到dbus总线,然后相互之间进行交互。dbus总线上又具备两种模式,分别是:
- 会话模式:只在当前用户的登录环境有效,一般是普通的桌面应用程序会使用这种模式。比如你去呼叫“org.gnome.Rhythmbox”,那么Rhythmbox就在你当前的桌面起来了,而不是在别的已登录的桌面起来;
- 系统模式:是系统级别的总线,一般需要操作硬件,或者执行系统级别的应用程序要用到它。比如:Hal。挂载磁盘可不是谁都能挂的,普通用户可以系统总线来进行这个操作。
dbus本身也設定了非常复杂的权限,比如Hal服务,一般被设定为只有root用户才能调用。这就有问题要解决了,普通用户如何双击盘符进行挂载的呢?
这就是通过PolicyKit机制了。
PolicyKit,用于进行帐户的认证。Hal内置了PolicyKit的支持,当一个普通用户要挂载磁盘时,将会是这样的情况:
- 用户在Nautilus中双击盘符;
- Nautilus通过dbus去呼叫Hal的挂载磁盘方法;
- Hal的daemon发现是普通用户呼叫的,于是显示一个PolicyKit验证对话框;
- 用户输入密码,验证通过;
- PolicyKit告诉Hal,该用户是认证型用户,可以执行该操作,于是Hal就挂载磁盘;
- Nautilus里可以访问该已经挂载的磁盘了;
如果没有PolicyKit作中间的验证,普通用户就无法进行挂载。或者要弄一些workaround,导致灵活性不好了。
你看了这个过程后,可能会觉得这个机制,与sudo,gksu不是一样的嘛,都是验证,然后执行root操作。实际上区别大着呢:
- 首先,这个机制,用户态的应用程序,始终是用户态,并没有像sudo以后成为root级别,所以可以继续进行用户级的操作;
- 其次,应用程序被设计为,只在需要root级的调用时才进行验证,保证了在大多数情况下,用户进行的都是非特权操作,将危险降至最低;
- 最后,该设计将用户级与系统级的操作分离开来,灵活而且具备良好的重用性。
BTW:太长了,后半部分没写完,明天再发。哈哈。
为什么没有python的绑定..要是有的话..
会方便很多..C/C++都忘记得差不多了呀
主要还是没有需求吧,所以开发者就懒得去搞了。
有时写一下C还是需要的啊,C是必须的。
你去写一个绑定提交上去不就行了~
非常好奇为什么你文章的标题都是繁体,内容都是简体呢?
说的容易,你觉得写一个绑定很容易吗?
至于用繁体作标题,很简单,为什么人家店面、学校、公司等等的招牌要用繁体呢?
各种东西都是循序渐进的嘛……
你同时了解这两个东西,先稍微写一写,然后不断改进……最后就写出来了!
o(∩_∩)o...哈哈
這個到是實話,原來有個人寫Qt庫的C語言綁定也就是這樣寫一點再寫一點,不過就寫到0.0.2因為沒有人用就沒有寫下去了。
還有那個不叫繁體,那個叫正體。
受教了,一直不太了解dbus。记得freedesktop上有很详细的介绍。
其实我觉得长远来看,还是写绑定好。然后让UT依赖这个wrapper。
但既然这么久了也没有这样一个wrapper,肯定是有问题或者无需求。
一直在留意 IMTX 呢,今天发第一条留言,虽然看不懂。。。