~ruther/guix-local

43c4d16ad9e68e6d5302f0526ce5c69627941125 — Maxim Cournoyer 1 year, 7 months ago 4538aa4
services: Integrate gnome-keyring service in gnome-desktop service.

Previous to this change, GNOME users would have to manually add the
gnome-keyring-service-type to their services to have a default login keyring
created and unlocked at login time.  Some applications depend on a default
keyring being available, prompt repeatedly for it, which is confusing and
doesn't match user expectations, given most distributions use the GNOME
keyring pam module to unlock the login keyring by default.

* doc/guix.texi (Desktop Services): Update doc.
* gnu/services/desktop.scm (<gnome-keyring-configuration>): Move above
gnome-desktop-service-type, and streamline description.
(pam-gnome-keyring): Return the empty list when CONFIG is #f.
(gnome-desktop-configuration) [keyring]: New field.

Change-Id: Ica26c1e1b85a038c1187edfb3ec3691fcd429641
Reviewed-by: Liliana Marie Prikler <liliana.prikler@gmail.com>
2 files changed, 83 insertions(+), 54 deletions(-)

M doc/guix.texi
M gnu/services/desktop.scm
M doc/guix.texi => doc/guix.texi +10 -2
@@ 49,7 49,7 @@ Copyright @copyright{} 2017 humanitiesNerd@*
Copyright @copyright{} 2017, 2021 Christine Lemmer-Webber@*
Copyright @copyright{} 2017, 2018, 2019, 2020, 2021, 2022 Marius Bakke@*
Copyright @copyright{} 2017, 2019, 2020, 2022 Hartmut Goebel@*
Copyright @copyright{} 2017, 2019, 2020, 2021, 2022, 2023, 2024 Maxim Cournoyer@*
Copyright @copyright{} 2017, 2019--2025 Maxim Cournoyer@*
Copyright @copyright{} 2017–2022 Tobias Geerinckx-Rice@*
Copyright @copyright{} 2017 George Clemmer@*
Copyright @copyright{} 2017 Andy Wingo@*


@@ 25738,6 25738,12 @@ A list of regular expressions denoting polkit rules provided by any
package that should not be installed.  By default, every polkit rule
added by any package referenced in the other fields are installed.

@item @code{keyring} (type: gnome-keyring-configuration-or-#f)
A <gnome-keyring-configuration> record used to better integrate the
GNOME keyring with the system.  Refer to the documentation of the
@code{gnome-keyring-service-type} for more information.  If you'd rather
avoid integrating the GNOME keyring, you can set this to @code{#f}.

@end table
@end deftp



@@ 26755,7 26761,9 @@ Possible values are:
@defvar gnome-keyring-service-type
This is the type of the service that adds the
@uref{https://wiki.gnome.org/Projects/GnomeKeyring, GNOME Keyring}.  Its
value is a @code{gnome-keyring-configuration} object (see below).
value is a @code{gnome-keyring-configuration} object (see below).  Note
that there is no need to use this service when using
@code{gnome-desktop-service-type}, which includes it.

This service adds the @code{gnome-keyring} package to the system profile
and extends PAM with entries using @code{pam_gnome_keyring.so}, unlocking

M gnu/services/desktop.scm => gnu/services/desktop.scm +73 -52
@@ 154,6 154,7 @@
            gnome-desktop-configuration-extra-packages
            gnome-desktop-configuration-polkit-ignorelist
            gnome-desktop-configuration-udev-ignorelist
            gnome-desktop-configuration-keyring
            gnome-desktop-service
            gnome-desktop-service-type



@@ 1471,6 1472,65 @@ rules.")
          (service-extension account-service-type
                             (const %sane-accounts))))))


;;;
;;; gnome-keyring-service-type
;;;

(define-record-type* <gnome-keyring-configuration> gnome-keyring-configuration
  make-gnome-keyring-configuration
  gnome-keyring-configuration?
  (keyring gnome-keyring-package (default gnome-keyring))
  (pam-services gnome-keyring-pam-services (default '(("gdm-password" . login)
                                                      ("passwd" . passwd)))))

(define (pam-gnome-keyring config)
  ;; CONFIG may be either a <gnome-desktop-configuration> or a
  ;; <gnome-keyring-configuration>> record, when using the
  ;; gnome-keyring-service-type on its own.
  (let ((config (if (gnome-desktop-configuration? config)
                    (gnome-desktop-configuration-keyring
                     config)
                    config)))
    (match config
      (#f '())                          ;explicitly disabled by user
      (_
       (define (%pam-keyring-entry . arguments)
         (pam-entry
          (control "optional")
          (module (file-append (gnome-keyring-package config)
                               "/lib/security/pam_gnome_keyring.so"))
          (arguments arguments)))

       (list
        (pam-extension
         (transformer
          (lambda (service)
            (case (assoc-ref (gnome-keyring-pam-services config)
                             (pam-service-name service))
              ((login)
               (pam-service
                (inherit service)
                (auth (append (pam-service-auth service)
                              (list (%pam-keyring-entry))))
                (session (append (pam-service-session service)
                                 (list (%pam-keyring-entry "auto_start"))))))
              ((passwd)
               (pam-service
                (inherit service)
                (password (append (pam-service-password service)
                                  (list (%pam-keyring-entry))))))
              (else service))))))))))

(define gnome-keyring-service-type
  (service-type
   (name 'gnome-keyring)
   (extensions (list
                (service-extension pam-root-service-type pam-gnome-keyring)))
   (default-value (gnome-keyring-configuration))
   (description "Return a service, that extends PAM with entries using
@code{pam_gnome_keyring.so}, unlocking a user's login keyring when they log in
or setting its password with passwd.")))


;;;


@@ 1479,6 1539,10 @@ rules.")

(define-maybe/no-serialization package)

(define (gnome-keyring-configuration-or-#f? value)
  (or (gnome-keyring-configuration? value)
      (not value)))

(define (extract-propagated-inputs package)
  ;; Drop input labels.  Attempt to support outputs.
  (map


@@ 1515,7 1579,13 @@ are installed.")
   (list-of-strings '())
   "A list of regular expressions denoting polkit rules provided by any package
that should not be installed.  By default, every polkit rule added by any package
referenced in the other fields are installed."))
referenced in the other fields are installed.")
  (keyring
   (gnome-keyring-configuration-or-#f (gnome-keyring-configuration))
   "A <gnome-keyring-configuration> record used to better integrate the GNOME
keyring with the system.  Refer to the documentation of the
@code{gnome-keyring-service-type} for more information.  If you'd rather avoid
integrating the GNOME keyring, you can set this to @code{#f}."))

(define (gnome-package gnome name)
  "Return the package NAME among the GNOME package inputs.  NAME can be a


@@ 1636,6 1706,8 @@ CONFIG, a <gnome-desktop-configuration> object."
   (extensions
    (list (service-extension udev-service-type
                             gnome-udev-configuration-files)
          (service-extension pam-root-service-type
                             pam-gnome-keyring)
          (service-extension polkit-service-type
                             gnome-polkit-settings)
          (service-extension privileged-program-service-type


@@ 1974,57 2046,6 @@ dispatches events from it.")))


;;;
;;; gnome-keyring-service-type
;;;

(define-record-type* <gnome-keyring-configuration> gnome-keyring-configuration
  make-gnome-keyring-configuration
  gnome-keyring-configuration?
  (keyring gnome-keyring-package (default gnome-keyring))
  (pam-services gnome-keyring-pam-services (default '(("gdm-password" . login)
                                                      ("passwd" . passwd)))))

(define (pam-gnome-keyring config)
  (define (%pam-keyring-entry . arguments)
    (pam-entry
     (control "optional")
     (module (file-append (gnome-keyring-package config)
                          "/lib/security/pam_gnome_keyring.so"))
     (arguments arguments)))

  (list
   (pam-extension
    (transformer
     (lambda (service)
       (case (assoc-ref (gnome-keyring-pam-services config)
                        (pam-service-name service))
         ((login)
          (pam-service
           (inherit service)
           (auth (append (pam-service-auth service)
                         (list (%pam-keyring-entry))))
           (session (append (pam-service-session service)
                            (list (%pam-keyring-entry "auto_start"))))))
         ((passwd)
          (pam-service
           (inherit service)
           (password (append (pam-service-password service)
                             (list (%pam-keyring-entry))))))
         (else service)))))))

(define gnome-keyring-service-type
  (service-type
   (name 'gnome-keyring)
   (extensions (list
                (service-extension pam-root-service-type pam-gnome-keyring)))
   (default-value (gnome-keyring-configuration))
   (description "Return a service, that adds the @code{gnome-keyring} package
to the system profile and extends PAM with entries using
@code{pam_gnome_keyring.so}, unlocking a user's login keyring when they log in
or setting its password with passwd.")))


;;;
;;; polkit-wheel-service -- Allow wheel group to perform admin actions
;;;