使用GObjectIntrospection

时间:2016-03-03 11:36:51

标签: introspection gobject gnome-shell-extensions gjs gobject-introspection

我正在编写一个gnome-shell扩展,显示电话(或电力)等预付卡的当前余额。由于这需要给定服务的凭证,我不想将密码存储在gsettings中,而是作为gnome密钥环中的条目存储。

目前,我使用同步方式使用

向密钥环询问登录名和密码
const GnomeKeyring = imports.gi.GnomeKeyring;

GnomeKeyring.unlock_sync(null, null)
// the variable 'id' is a concat of login '@'webservice url
var attrs = GnomeKeyring.Attribute.list_new()
GnomeKeyring.Attribute.list_append_string(attrs, 'id', id)
var result = GnomeKeyring.find_items_sync(
                GnomeKeyring.ItemType.GENERIC_SECRET, 
                attrs
             )
if (result[0] != GnomeKeyring.Result.OK) return
log('  => password '+result[1][0].secret)
log('     keyring id  = '+result[1][0].item_id)
log('     keyring  = '+result[1][0].keyring)

此同步。接近弱点的是,密钥环需要已经打开或提示密码对话框。当使用自动登录启动gnome-shell时,此同步调用实际上会阻止实际启动shell - 因此无法输入密钥环密码。

Gnome Developer Wiki命名异步方法

  • GnomeKeyring.unlock
  • GnomeKeyring.find_items

the javascript environment中均未找到。

在哪里可以找到fedora23下的GnomeKeyring-Gir文件来确认缺少异步函数? 如何实现异步密钥环打开和密码检索? 有人看到一种完全不同的可能方法吗? 每一点都有帮助...

1 个答案:

答案 0 :(得分:1)

请考虑使用libsecret而不是libgnome-keyring。 它说" libsecret取代了libgnome-keyring"在libsecret的project website上。因此,对于新项目,您应该使用libsecret。

此外,libsecret有一个asynchronous unlock() method。虽然在撰写本文时,文档说异步方法可以无限期地阻止"。但这可能是复制和粘贴错误。所以我会尝试一下!

另请注意,libsecret使用GnomeKeyring作为后端,因此您实际上会使用GnomeKeyring,尽管与更通用的库结合使用。