# -*- mode: org; coding: utf-8; -*-
# SPDX-FileCopyrightText: 2023 Fredrik Salomonsson <plattfot@posteo.net>
#
# SPDX-License-Identifier: GPL-3.0-or-later

#+TITLE: README for Pinentry-Rofi

* Description
  Based on [[https://gist.github.com/sardemff7/759cbf956bea20d382a6128c641d2746][this gist]]

  Simple [[https://www.gnupg.org/related_software/pinentry/index.html][pinentry]] gui using [[https://github.com/davatorium/rofi][rofi]] written in [[https://www.gnu.org/software/guile/][GNU guile]].

  It's similar in functionality as the gist but this one doesn't force
  the width to be 27 and doesn't depend on systemd.

  I also wanted a small project which I could use to practice writing
  GNU guile.

* 3.0.0 Breaking changes please read

  There is a major bug in pinentry-rofi 2.2.0 and below.  The password
  was not encoded before giving it to gpg.  Which meant that passwords
  including character other than alphanumerics from ASCII and `-`,
  `.`, `_` and `~` ended up being decoded on gpg's side.  Making them
  not match the input and therefore not work on other pinentry tools.
  See [[https://github.com/plattfot/pinentry-rofi/issues/27][#27]] for details.

  Before moving to pinentry-rofi-3.0.0, please make sure to
  temporarily change the passwords affected by this bug to something
  that does not include those special characters.  Make the upgrade
  then change back.

  An alternative is to figure out what gnupg decoded the passwords too
  and use that as the input when using pinentry-rofi-3.0.0.  And
  change the passwords to match what they where suppose to be.

  Sorry for the headaches.

* 2.0.0 Breaking changes please read

  As of version 2.0.0, =pinentry-rofi= is now built using [[https://www.gnu.org/software/automake][automake]].
  See [[file:HACKING][HACKING]] for more info on that. It also lost its =-guile= suffix
  for the executable. And it is no longer just one file, most of its
  content is now a [[https://www.gnu.org/software/guile/manual/html_node/General-Information-about-Modules.html][guile module]], which the executable now calls.

* Install
** Guix (Recommended)
   To install it using [[https://guix.gnu.org/][guix]], run
   #+begin_src shell
     guix install pinentry-rofi
   #+end_src

   Just make sure you have a version of `guix` that is newer than Jan
   8 2021.

   The binary location is then `$HOME/.guix-profile/bin/pinentry-rofi`
   were the `$HOME` is the home location of the user you used to
   install it with. E.g. `/home/$USER` for a normal user and `/root`
   for the root user.

   Install it with guix is recommended as that will work on most linux
   distributions.

   Then add it to your =~/.gnupg/gpg-agent.conf=

*** Guix on a foreign distro

    If you are running guix on a foreign distro, you need to make sure
    the =GUIX_LOCPATH= environment variable is passed to the gpg-agent
    otherwise rofi will fail to set the locale and therefore cannot
    launch. Which result in the pinentry aborting.

    On a distribution that is using systemd (here I'm using Arch Linux
    as an example) simply run:

    #+begin_src shell
      echo "GUIX_LOCPATH=$GUIX_LOCPATH"
    #+end_src

    Copy that, then run:
    #+begin_src shell
      systend --user edit gpg-agent.service
    #+end_src

    And add it in the =override.conf=:
    #+begin_src conf
      [Service]
      Environment=GUIX_LOCPATH=%h/.guix-profile/lib/locale
    #+end_src

    On my system, =GUIX_LOCPATH= points to the default profile i.e.
    =$HOME/.guix-profile/lib/locale=. =%h= in systemd gives you the
    path to the home directory. This should be the case for most
    people, but if your =GUIX_LOCPATH= points to something different
    change the =override.conf= to reflect that.

** Arch Linux
   The =PKGBUILD= file for arch is in the =build-aux=, so just run:

   #+begin_src shell
     cd build-aux
     makepkg -ic
   #+end_src

   The binary location is then `/usr/bin/pinentry-rofi`.

** From Source

  See [[file:HACKING][HACKING]] on how to build this from source

* Gpg-agent

  To use =pinentry-rofi= with =gpg-agent=, you can set it as the
  =pinentry-program= in the =~/.gnupg/gpg-agent.conf=. Note that you
  need to use the full path to the binary.

  For example for Arch Linux this would be:
  #+begin_src conf
    pinentry-program /usr/bin/pinentry-rofi
  #+end_src

  And for guix:
  #+begin_src conf
    pinentry-program <HOME>/.guix-profile/bin/pinentry-rofi
  #+end_src
  Where =<HOME>= is the full path to home for your user.

  Don't forget to restart =gpg-agent= for the changes to take affect:
  #+begin_src shell
    gpg-connect-agent reloadagent /bye
  #+end_src
