• 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:太长了,后半部分没写完,明天再发。哈哈。

» You can leave a comment.

1 Pingbacks

8 Comments

  1. 为什么没有python的绑定..要是有的话..
    会方便很多..C/C++都忘记得差不多了呀

  2. 你去写一个绑定提交上去不就行了~
    非常好奇为什么你文章的标题都是繁体,内容都是简体呢?

    • 说的容易,你觉得写一个绑定很容易吗?
      至于用繁体作标题,很简单,为什么人家店面、学校、公司等等的招牌要用繁体呢?

      • 各种东西都是循序渐进的嘛……
        你同时了解这两个东西,先稍微写一写,然后不断改进……最后就写出来了!
        o(∩_∩)o...哈哈

        • 幽隱之賢

          這個到是實話,原來有個人寫Qt庫的C語言綁定也就是這樣寫一點再寫一點,不過就寫到0.0.2因為沒有人用就沒有寫下去了。
            還有那個不叫繁體,那個叫正體。

  3. 受教了,一直不太了解dbus。记得freedesktop上有很详细的介绍。

    其实我觉得长远来看,还是写绑定好。然后让UT依赖这个wrapper。
    但既然这么久了也没有这样一个wrapper,肯定是有问题或者无需求。

  4. L

    一直在留意 IMTX 呢,今天发第一条留言,虽然看不懂。。。

Leave a Comment