LINUX.ORG.RU

Как пофиксить pinentry?

 , ,


1

1

Пользуюсь pass+gpg+rofi+i3. rofi работает с pass через dmenu режим. скрипт взят отсюда. Пароли просматривает и копирует в clipboard. Но вот проблема!

  • Если я запускаю скрипт через хоткеи из i3, то pinenrty проваливается под X на tty терминал.
  • Если запускаю скрипт из терминала, то pinentry отрабатывает отлично и диалог ввода пароля выводися в терминал. Я попробовал разные pinenrty. gtk, dmenu, tty, gnome3. Графические работают нормально. pinenrty не проваливается за X. терминальные только в терминале или за прослойкой Х. Как пофиксить чтобы pinentry tty или curses при выполнениия скрипта делали запуск терминала например urxvt? Такое ощущение что у меня где-то, что-то не прописано чтобы терминал запускался для pinenrty и я не пойму кто за это отвечает


Последнее исправление: kambulya999 (всего исправлений: 3)

Ответ на: комментарий от mord0d

Хорошо. Запускать промежуточный софт. Где запускать ? На уровне кода прописано поведение ведь? В зависимости от N условий мы либо делаем вывод в терминал если оттуда шел вызов либо мы уходим на tty0 если вызов прошел не из терминала, а с DISPLAY условно. (это мои догадки после беглого и особо не понятливого просмотра исходного кода pinenrty. Я там заметил что-то есть про parent, про pid, по display и условия….но без знания С и баша не разобраться) Может что-то можно поменять/дописать в скрипте чтобы он мог запустить терминал ? Или я не соображаю что прошу ?xD

kambulya999
() автор топика
Ответ на: комментарий от kambulya999

Хорошо. Запускать промежуточный софт. Где запускать ? На уровне кода прописано поведение ведь? В зависимости от N условий мы либо делаем вывод в терминал если оттуда шел вызов либо мы уходим на tty0 если вызов прошел не из терминала, а с DISPLAY условно.

Как работает gpg2:

  • Если в конфиге прописан pinentry:
    • Если pinentry графический:
      • Если переменная окружения DISPLAY назначена и по этому адресу сокет доступен пользователю, от которого запущен gpg2, пытаемся запустить графический pinentry;
        • Если удалось, получаем результат ввода пассфразы;
      • Если переменная окружения не назначена и/или сокет недоступен, но процесс gpg2 присоединён к tty, пытаемся запустить дефолтный pinentry-cli и получить результат ввода пассфразы из него;
        • Если нет, выходим с ошибкой;
    • Если pinentry не графический (cli или tui):
      • Если процесс gpg2 присоединён к tty, пытаемся запустить pinentry и получить результат ввода пассфразы из него;
        • Если нет, выходим с ошибкой;
  • Если pinentry в конфиге не прописан, идём по второму сценарию (с cli).

Ни gpg2, ни тем более pinentry ничего не знают о графических эмуляторах терминала, как их запускать, с какими аргументами, как получить из них результат и прочее. Если pinentry не графический, он будет запущен только в tty, в котором вызван процесс gpg2 (даже если он является дочерним процессом, контрольный терминал будет найден из дерева процессов — каждый процесс знает своего родителя и (некоторую) информацию о нём).

Может что-то можно поменять/дописать в скрипте чтобы он мог запустить терминал ?

Можно. Внутри этого терминала нужно будет запустить pass show -c, чтобы он в этом же терминале запустил gpg2, который в свою очередь вызовет pinentry.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Я нашел решение того, что я хотел. https://gist.github.com/kevinoid/189a0168ef4ceae76ed669cd696eaa37 Возможно кому-то пригодится. Это реально удобно и гибко. Я не знаю это «костыль» или можно как-то правильнее это настроить или такие действия нарушают что-то….Работает как часы. С иксов дергает gtk, а с терминала pinentry-tty.

kambulya999
() автор топика