Асинхронный вызов GnomeKeyring с использованием GObjectIntrospection

Я пишу расширение 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 с автоматическим входом в систему этот синхронный вызов вообще блокирует фактический запуск оболочки, поэтому нет возможности ввести пароль для набора ключей.

Вики для разработчиков Gnome называет асинхронные методы

  • GnomeKeyring.unlock
  • GnomeKeyring.find_items

но оба не найдены в среде javascript .

Где я могу найти файл GnomeKeyring-Gir под fedora23, чтобы подтвердить отсутствие асинхронных функций? Как я могу добиться асинхронного открытия набора ключей и извлечения паролей? Кто-нибудь видит совершенно другой, возможный подход? Каждый по нитке...


person L-Ray    schedule 03.03.2016    source источник
comment
Рассматривали ли вы возможность использования libsecret вместо GnomeKeyring?   -  person JayStrictor    schedule 14.03.2016
comment
Привет, @JayStrictor, на самом деле нет. Хотел использовать стандартную среду Gnome (как и для расширения оболочки Gnome) и не искал альтернатив вместо GnomeKeyring. Знаете ли вы, поддерживает ли libsecret асинхронные вызовы с синхронизацией. вызывает мое расширение, которое блокирует всю оболочку gnome при запуске.   -  person L-Ray    schedule 14.03.2016
comment
В нем говорится, что libsecret заменяет libgnome-keyring на веб-сайте. Поэтому я предполагаю, что для новых проектов вам, вероятно, следует использовать вместо этого libsecret. Кроме того, в libsecret есть асинхронный метод unlock() . Хотя в документе говорится, что асинхронный метод может блокироваться на неопределенный срок, это может быть ошибкой копирования и вставки. Так что я бы просто попробовать!   -  person JayStrictor    schedule 15.03.2016
comment
Также обратите внимание, что libsecret использует GnomeKeyring в качестве серверной части.   -  person JayStrictor    schedule 15.03.2016
comment
Привет, @JayStrictor, твое решение отлично работает. Вы хотите сформулировать это как ответ, чтобы я мог принять и дать вам похвалу, которую вы заслуживаете? :-)   -  person L-Ray    schedule 20.03.2016
comment
Спасибо :) Подойдет.   -  person JayStrictor    schedule 21.03.2016


Ответы (1)


Пожалуйста, рассмотрите возможность использования libsecret вместо libgnome-keyring. В нем говорится, что «libsecret заменяет libgnome-keyring» на веб-сайте проекта libsecret. Поэтому для новых проектов вам, вероятно, следует использовать вместо этого libsecret.

Кроме того, в libsecret есть асинхронный unlock() метод. . Хотя на момент написания в документах говорилось, что асинхронный метод «может блокироваться на неопределенный срок». Но это может быть ошибка копирования и вставки. Так что я бы просто попробовать!

Также обратите внимание, что libsecret использует GnomeKeyring в качестве бэкенда, так что вы действительно будете использовать GnomeKeyring, хотя и в сочетании с более универсальной библиотекой.

person JayStrictor    schedule 21.03.2016