summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'gnu')
-rw-r--r--gnu/services/authentication.scm28
-rw-r--r--gnu/services/base.scm54
-rw-r--r--gnu/services/desktop.scm44
-rw-r--r--gnu/services/kerberos.scm44
-rw-r--r--gnu/services/lightdm.scm2
-rw-r--r--gnu/services/mail.scm4
-rw-r--r--gnu/services/pam-mount.scm23
-rw-r--r--gnu/services/sddm.scm2
-rw-r--r--gnu/services/ssh.scm10
-rw-r--r--gnu/services/xorg.scm4
-rw-r--r--gnu/system/pam.scm76
11 files changed, 179 insertions, 112 deletions
diff --git a/gnu/services/authentication.scm b/gnu/services/authentication.scm
index f7becdfafbc..f1ad1b1afe3 100644
--- a/gnu/services/authentication.scm
+++ b/gnu/services/authentication.scm
@@ -506,19 +506,21 @@ password.")
506 (define pam-ldap-module 506 (define pam-ldap-module
507 #~(string-append #$(nslcd-configuration-nss-pam-ldapd config) 507 #~(string-append #$(nslcd-configuration-nss-pam-ldapd config)
508 "/lib/security/pam_ldap.so")) 508 "/lib/security/pam_ldap.so"))
509 (lambda (pam) 509 (pam-extension
510 (if (member (pam-service-name pam) 510 (transformer
511 (nslcd-configuration-pam-services config)) 511 (lambda (pam)
512 (let ((sufficient 512 (if (member (pam-service-name pam)
513 (pam-entry 513 (nslcd-configuration-pam-services config))
514 (control "sufficient") 514 (let ((sufficient
515 (module pam-ldap-module)))) 515 (pam-entry
516 (pam-service 516 (control "sufficient")
517 (inherit pam) 517 (module pam-ldap-module))))
518 (auth (cons sufficient (pam-service-auth pam))) 518 (pam-service
519 (session (cons sufficient (pam-service-session pam))) 519 (inherit pam)
520 (account (cons sufficient (pam-service-account pam))))) 520 (auth (cons sufficient (pam-service-auth pam)))
521 pam))) 521 (session (cons sufficient (pam-service-session pam)))
522 (account (cons sufficient (pam-service-account pam)))))
523 pam)))))
522 524
523(define (pam-ldap-pam-services config) 525(define (pam-ldap-pam-services config)
524 (list (pam-ldap-pam-service config))) 526 (list (pam-ldap-pam-service config)))
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index a4005fc4fdc..fdc2c8c764d 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -1603,20 +1603,22 @@ information on the configuration file syntax."
1603 1603
1604(define pam-limits-service-type 1604(define pam-limits-service-type
1605 (let ((pam-extension 1605 (let ((pam-extension
1606 (lambda (pam) 1606 (pam-extension
1607 (let ((pam-limits (pam-entry 1607 (transformer
1608 (control "required") 1608 (lambda (pam)
1609 (module "pam_limits.so") 1609 (let ((pam-limits (pam-entry
1610 (arguments 1610 (control "required")
1611 '("conf=/etc/security/limits.conf"))))) 1611 (module "pam_limits.so")
1612 (if (member (pam-service-name pam) 1612 (arguments
1613 '("login" "greetd" "su" "slim" "gdm-password" "sddm" 1613 '("conf=/etc/security/limits.conf")))))
1614 "sudo" "sshd")) 1614 (if (member (pam-service-name pam)
1615 (pam-service 1615 '("login" "greetd" "su" "slim" "gdm-password"
1616 (inherit pam) 1616 "sddm" "sudo" "sshd"))
1617 (session (cons pam-limits 1617 (pam-service
1618 (pam-service-session pam)))) 1618 (inherit pam)
1619 pam)))) 1619 (session (cons pam-limits
1620 (pam-service-session pam))))
1621 pam))))))
1620 1622
1621 ;; XXX: Using file-like objects is deprecated, use lists instead. 1623 ;; XXX: Using file-like objects is deprecated, use lists instead.
1622 ;; This is to be reduced into the list? case when the deprecated 1624 ;; This is to be reduced into the list? case when the deprecated
@@ -3264,16 +3266,18 @@ to handle."
3264 (greetd-allow-empty-passwords? config) 3266 (greetd-allow-empty-passwords? config)
3265 #:motd 3267 #:motd
3266 (greetd-motd config)) 3268 (greetd-motd config))
3267 (lambda (pam) 3269 (pam-extension
3268 (if (member (pam-service-name pam) 3270 (transformer
3269 '("login" "greetd" "su" "slim" "gdm-password")) 3271 (lambda (pam)
3270 (pam-service 3272 (if (member (pam-service-name pam)
3271 (inherit pam) 3273 '("login" "greetd" "su" "slim" "gdm-password"))
3272 (auth (append (pam-service-auth pam) 3274 (pam-service
3273 (list optional-pam-mount))) 3275 (inherit pam)
3274 (session (append (pam-service-session pam) 3276 (auth (append (pam-service-auth pam)
3275 (list optional-pam-mount)))) 3277 (list optional-pam-mount)))
3276 pam)))) 3278 (session (append (pam-service-session pam)
3279 (list optional-pam-mount))))
3280 pam))))))
3277 3281
3278(define (greetd-shepherd-services config) 3282(define (greetd-shepherd-services config)
3279 (map 3283 (map
@@ -3285,7 +3289,7 @@ to handle."
3285 (greetd-vt (greetd-terminal-vt tc))) 3289 (greetd-vt (greetd-terminal-vt tc)))
3286 (shepherd-service 3290 (shepherd-service
3287 (documentation "Minimal and flexible login manager daemon") 3291 (documentation "Minimal and flexible login manager daemon")
3288 (requirement '(user-processes host-name udev virtual-terminal)) 3292 (requirement '(pam user-processes host-name udev virtual-terminal))
3289 (provision (list (symbol-append 3293 (provision (list (symbol-append
3290 'term-tty 3294 'term-tty
3291 (string->symbol (greetd-terminal-vt tc))))) 3295 (string->symbol (greetd-terminal-vt tc)))))
diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index adea5b38dd8..6b1b21cf807 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -1187,10 +1187,12 @@ seats.)"
1187 (module (file-append (elogind-package config) 1187 (module (file-append (elogind-package config)
1188 "/lib/security/pam_elogind.so")))) 1188 "/lib/security/pam_elogind.so"))))
1189 1189
1190 (list (lambda (pam) 1190 (list (pam-extension
1191 (pam-service 1191 (transformer
1192 (inherit pam) 1192 (lambda (pam)
1193 (session (cons pam-elogind (pam-service-session pam))))))) 1193 (pam-service
1194 (inherit pam)
1195 (session (cons pam-elogind (pam-service-session pam)))))))))
1194 1196
1195(define (elogind-shepherd-service config) 1197(define (elogind-shepherd-service config)
1196 "Return a Shepherd service to start elogind according to @var{config}." 1198 "Return a Shepherd service to start elogind according to @var{config}."
@@ -1703,22 +1705,24 @@ dispatches events from it.")))
1703 (arguments arguments))) 1705 (arguments arguments)))
1704 1706
1705 (list 1707 (list
1706 (lambda (service) 1708 (pam-extension
1707 (case (assoc-ref (gnome-keyring-pam-services config) 1709 (transformer
1708 (pam-service-name service)) 1710 (lambda (service)
1709 ((login) 1711 (case (assoc-ref (gnome-keyring-pam-services config)
1710 (pam-service 1712 (pam-service-name service))
1711 (inherit service) 1713 ((login)
1712 (auth (append (pam-service-auth service) 1714 (pam-service
1713 (list (%pam-keyring-entry)))) 1715 (inherit service)
1714 (session (append (pam-service-session service) 1716 (auth (append (pam-service-auth service)
1715 (list (%pam-keyring-entry "auto_start")))))) 1717 (list (%pam-keyring-entry))))
1716 ((passwd) 1718 (session (append (pam-service-session service)
1717 (pam-service 1719 (list (%pam-keyring-entry "auto_start"))))))
1718 (inherit service) 1720 ((passwd)
1719 (password (append (pam-service-password service) 1721 (pam-service
1720 (list (%pam-keyring-entry)))))) 1722 (inherit service)
1721 (else service))))) 1723 (password (append (pam-service-password service)
1724 (list (%pam-keyring-entry))))))
1725 (else service)))))))
1722 1726
1723(define gnome-keyring-service-type 1727(define gnome-keyring-service-type
1724 (service-type 1728 (service-type
diff --git a/gnu/services/kerberos.scm b/gnu/services/kerberos.scm
index c3c78727342..1a1b37f8905 100644
--- a/gnu/services/kerberos.scm
+++ b/gnu/services/kerberos.scm
@@ -428,27 +428,29 @@ generates such a file. It does not cause any daemon to be started.")))
428 428
429(define (pam-krb5-pam-service config) 429(define (pam-krb5-pam-service config)
430 "Return a PAM service for Kerberos authentication." 430 "Return a PAM service for Kerberos authentication."
431 (lambda (pam) 431 (pam-extension
432 (define pam-krb5-module 432 (transformer
433 #~(string-append #$(pam-krb5-configuration-pam-krb5 config) 433 (lambda (pam)
434 "/lib/security/pam_krb5.so")) 434 (define pam-krb5-module
435 435 #~(string-append #$(pam-krb5-configuration-pam-krb5 config)
436 (let ((pam-krb5-sufficient 436 "/lib/security/pam_krb5.so"))
437 (pam-entry 437
438 (control "sufficient") 438 (let ((pam-krb5-sufficient
439 (module pam-krb5-module) 439 (pam-entry
440 (arguments 440 (control "sufficient")
441 (list 441 (module pam-krb5-module)
442 (format #f "minimum_uid=~a" 442 (arguments
443 (pam-krb5-configuration-minimum-uid config))))))) 443 (list
444 (pam-service 444 (format #f "minimum_uid=~a"
445 (inherit pam) 445 (pam-krb5-configuration-minimum-uid config)))))))
446 (auth (cons* pam-krb5-sufficient 446 (pam-service
447 (pam-service-auth pam))) 447 (inherit pam)
448 (session (cons* pam-krb5-sufficient 448 (auth (cons* pam-krb5-sufficient
449 (pam-service-session pam))) 449 (pam-service-auth pam)))
450 (account (cons* pam-krb5-sufficient 450 (session (cons* pam-krb5-sufficient
451 (pam-service-account pam))))))) 451 (pam-service-session pam)))
452 (account (cons* pam-krb5-sufficient
453 (pam-service-account pam)))))))))
452 454
453(define (pam-krb5-pam-services config) 455(define (pam-krb5-pam-services config)
454 (list (pam-krb5-pam-service config))) 456 (list (pam-krb5-pam-service config)))
diff --git a/gnu/services/lightdm.scm b/gnu/services/lightdm.scm
index 0b9094cda12..b966f402d66 100644
--- a/gnu/services/lightdm.scm
+++ b/gnu/services/lightdm.scm
@@ -616,7 +616,7 @@ port=" (number->string vnc-server-port) "\n"
616 (list 616 (list
617 (shepherd-service 617 (shepherd-service
618 (documentation "LightDM display manager") 618 (documentation "LightDM display manager")
619 (requirement '(dbus-system user-processes host-name)) 619 (requirement '(pam dbus-system user-processes host-name))
620 (provision '(lightdm display-manager xorg-server)) 620 (provision '(lightdm display-manager xorg-server))
621 (respawn? #f) 621 (respawn? #f)
622 (start 622 (start
diff --git a/gnu/services/mail.scm b/gnu/services/mail.scm
index bf4948dcfb6..12dcc8e71db 100644
--- a/gnu/services/mail.scm
+++ b/gnu/services/mail.scm
@@ -1578,7 +1578,7 @@ greyed out, instead of only later giving \"not selectable\" popup error.
1578 (list (shepherd-service 1578 (list (shepherd-service
1579 (documentation "Run the Dovecot POP3/IMAP mail server.") 1579 (documentation "Run the Dovecot POP3/IMAP mail server.")
1580 (provision '(dovecot)) 1580 (provision '(dovecot))
1581 (requirement '(networking)) 1581 (requirement '(pam networking))
1582 (start #~(make-forkexec-constructor 1582 (start #~(make-forkexec-constructor
1583 (list (string-append #$dovecot "/sbin/dovecot") 1583 (list (string-append #$dovecot "/sbin/dovecot")
1584 "-F"))) 1584 "-F")))
@@ -1676,7 +1676,7 @@ match from local for any action outbound
1676 (package config-file shepherd-requirement) 1676 (package config-file shepherd-requirement)
1677 (list (shepherd-service 1677 (list (shepherd-service
1678 (provision '(smtpd)) 1678 (provision '(smtpd))
1679 (requirement `(loopback ,@shepherd-requirement)) 1679 (requirement `(pam loopback ,@shepherd-requirement))
1680 (documentation "Run the OpenSMTPD daemon.") 1680 (documentation "Run the OpenSMTPD daemon.")
1681 (start (let ((smtpd (file-append package "/sbin/smtpd"))) 1681 (start (let ((smtpd (file-append package "/sbin/smtpd")))
1682 #~(make-forkexec-constructor 1682 #~(make-forkexec-constructor
diff --git a/gnu/services/pam-mount.scm b/gnu/services/pam-mount.scm
index e60781d05bb..21c34ddd617 100644
--- a/gnu/services/pam-mount.scm
+++ b/gnu/services/pam-mount.scm
@@ -88,16 +88,19 @@
88 (pam-entry 88 (pam-entry
89 (control "optional") 89 (control "optional")
90 (module #~(string-append #$pam-mount "/lib/security/pam_mount.so")))) 90 (module #~(string-append #$pam-mount "/lib/security/pam_mount.so"))))
91 (list (lambda (pam) 91 (list
92 (if (member (pam-service-name pam) 92 (pam-extension
93 '("login" "greetd" "su" "slim" "gdm-password" "sddm")) 93 (transformer
94 (pam-service 94 (lambda (pam)
95 (inherit pam) 95 (if (member (pam-service-name pam)
96 (auth (append (pam-service-auth pam) 96 '("login" "greetd" "su" "slim" "gdm-password" "sddm"))
97 (list optional-pam-mount))) 97 (pam-service
98 (session (append (pam-service-session pam) 98 (inherit pam)
99 (list optional-pam-mount)))) 99 (auth (append (pam-service-auth pam)
100 pam)))) 100 (list optional-pam-mount)))
101 (session (append (pam-service-session pam)
102 (list optional-pam-mount))))
103 pam))))))
101 104
102(define pam-mount-service-type 105(define pam-mount-service-type
103 (service-type 106 (service-type
diff --git a/gnu/services/sddm.scm b/gnu/services/sddm.scm
index 9e02f1cc81d..c9a7ba96f41 100644
--- a/gnu/services/sddm.scm
+++ b/gnu/services/sddm.scm
@@ -169,7 +169,7 @@ Relogin=" (if (sddm-configuration-relogin? config)
169 169
170 (list (shepherd-service 170 (list (shepherd-service
171 (documentation "SDDM display manager.") 171 (documentation "SDDM display manager.")
172 (requirement '(user-processes elogind)) 172 (requirement '(user-processes elogind pam))
173 (provision '(xorg-server display-manager)) 173 (provision '(xorg-server display-manager))
174 (start #~(make-forkexec-constructor #$sddm-command)) 174 (start #~(make-forkexec-constructor #$sddm-command))
175 (stop #~(make-kill-destructor))))) 175 (stop #~(make-kill-destructor)))))
diff --git a/gnu/services/ssh.scm b/gnu/services/ssh.scm
index b76544c1a8e..de5afdaa1a8 100644
--- a/gnu/services/ssh.scm
+++ b/gnu/services/ssh.scm
@@ -197,9 +197,11 @@
197 interfaces))))) 197 interfaces)))))
198 198
199 (define requires 199 (define requires
200 (if (and daemonic? (lsh-configuration-syslog-output? config)) 200 `(networking
201 '(networking syslogd) 201 pam
202 '(networking))) 202 ,@(if (and daemonic? (lsh-configuration-syslog-output? config))
203 '(syslogd)
204 '())))
203 205
204 (list (shepherd-service 206 (list (shepherd-service
205 (documentation "GNU lsh SSH server") 207 (documentation "GNU lsh SSH server")
@@ -566,7 +568,7 @@ of user-name/file-like tuples."
566 568
567 (list (shepherd-service 569 (list (shepherd-service
568 (documentation "OpenSSH server.") 570 (documentation "OpenSSH server.")
569 (requirement '(syslogd loopback)) 571 (requirement '(pam syslogd loopback))
570 (provision '(ssh-daemon ssh sshd)) 572 (provision '(ssh-daemon ssh sshd))
571 573
572 (start #~(if #$inetd-style? 574 (start #~(if #$inetd-style?
diff --git a/gnu/services/xorg.scm b/gnu/services/xorg.scm
index 7295a45b598..8b6080fd264 100644
--- a/gnu/services/xorg.scm
+++ b/gnu/services/xorg.scm
@@ -667,7 +667,7 @@ reboot_cmd " shepherd "/sbin/reboot\n"
667 667
668 (list (symbol-append 'xorg-server- 668 (list (symbol-append 'xorg-server-
669 (string->symbol vt))))) 669 (string->symbol vt)))))
670 (requirement '(user-processes host-name udev)) 670 (requirement '(pam user-processes host-name udev))
671 (start 671 (start
672 #~(lambda () 672 #~(lambda ()
673 ;; A stale lock file can prevent SLiM from starting, so remove it to 673 ;; A stale lock file can prevent SLiM from starting, so remove it to
@@ -1119,7 +1119,7 @@ argument.")))
1119 (list (shepherd-service 1119 (list (shepherd-service
1120 (documentation "Xorg display server (GDM)") 1120 (documentation "Xorg display server (GDM)")
1121 (provision '(xorg-server)) 1121 (provision '(xorg-server))
1122 (requirement '(dbus-system user-processes host-name udev elogind)) 1122 (requirement '(dbus-system pam user-processes host-name udev elogind))
1123 (start #~(lambda () 1123 (start #~(lambda ()
1124 (fork+exec-command 1124 (fork+exec-command
1125 (list #$(file-append (gdm-configuration-gdm config) 1125 (list #$(file-append (gdm-configuration-gdm config)
diff --git a/gnu/system/pam.scm b/gnu/system/pam.scm
index b6356816426..adc40c975fd 100644
--- a/gnu/system/pam.scm
+++ b/gnu/system/pam.scm
@@ -1,5 +1,6 @@
1;;; GNU Guix --- Functional package management for GNU 1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2013-2017, 2019-2021 Ludovic Courtès <ludo@gnu.org> 2;;; Copyright © 2013-2017, 2019-2021 Ludovic Courtès <ludo@gnu.org>
3;;; Copyright © 2023 Josselin Poiret <dev@jpoiret.xyz>
3;;; 4;;;
4;;; This file is part of GNU Guix. 5;;; This file is part of GNU Guix.
5;;; 6;;;
@@ -19,8 +20,11 @@
19(define-module (gnu system pam) 20(define-module (gnu system pam)
20 #:use-module (guix records) 21 #:use-module (guix records)
21 #:use-module (guix derivations) 22 #:use-module (guix derivations)
23 #:use-module (guix diagnostics)
22 #:use-module (guix gexp) 24 #:use-module (guix gexp)
25 #:use-module (guix i18n)
23 #:use-module (gnu services) 26 #:use-module (gnu services)
27 #:use-module (gnu services shepherd)
24 #:use-module (gnu system setuid) 28 #:use-module (gnu system setuid)
25 #:use-module (ice-9 match) 29 #:use-module (ice-9 match)
26 #:use-module (srfi srfi-1) 30 #:use-module (srfi srfi-1)
@@ -55,6 +59,10 @@
55 session-environment-service 59 session-environment-service
56 session-environment-service-type 60 session-environment-service-type
57 61
62 pam-extension
63 pam-extension-transformer
64 pam-extension-shepherd-requirements
65
58 pam-root-service-type 66 pam-root-service-type
59 pam-root-service)) 67 pam-root-service))
60 68
@@ -347,32 +355,71 @@ strings or string-valued gexps."
347;;; PAM root service. 355;;; PAM root service.
348;;; 356;;;
349 357
358;; Extension of the PAM configuration. A PAM transformer consists of a
359;; procedure acting on each PAM entry; 'shepherd-requirements' lists services
360;; that the meta 'pam' Shepherd service will depend on.
361(define-record-type* <pam-extension>
362 pam-extension make-pam-extension pam-extension?
363 (transformer pam-extension-transformer)
364 (shepherd-requirements pam-extension-shepherd-requirements
365 (default '())))
366
350;; Overall PAM configuration: a list of services, plus a procedure that takes 367;; Overall PAM configuration: a list of services, plus a procedure that takes
351;; one <pam-service> and returns a <pam-service>. The procedure is used to 368;; one <pam-service> and returns a <pam-service>. The procedure is used to
352;; implement cross-cutting concerns such as the use of the 'elogind.so' 369;; implement cross-cutting concerns such as the use of the 'elogind.so'
353;; session module that keeps track of logged-in users. 370;; session module that keeps track of logged-in users.
354(define-record-type* <pam-configuration> 371(define-record-type* <pam-configuration>
355 pam-configuration make-pam-configuration? pam-configuration? 372 pam-configuration make-pam-configuration pam-configuration?
356 (services pam-configuration-services) ;list of <pam-service> 373 ;list of <pam-service>
357 (transform pam-configuration-transform)) ;procedure 374 (services pam-configuration-services)
375 ;list of procedures <pam-entry> -> <pam-entry>
376 (transformers pam-configuration-transformers)
377 ;list of symbols
378 (shepherd-requirements pam-configuration-shepherd-requirements))
358 379
359(define (/etc-entry config) 380(define (/etc-entry config)
360 "Return the /etc/pam.d entry corresponding to CONFIG." 381 "Return the /etc/pam.d entry corresponding to CONFIG."
361 (match config 382 (match config
362 (($ <pam-configuration> services transform) 383 (($ <pam-configuration> services transformers shepherd-requirements)
363 (let ((services (map transform services))) 384 (let ((services (map (apply compose identity transformers)
385 services)))
364 `(("pam.d" ,(pam-services->directory services))))))) 386 `(("pam.d" ,(pam-services->directory services)))))))
365 387
388(define (pam-shepherd-service config)
389 "Return the PAM synchronization shepherd service corresponding to CONFIG."
390 (match config
391 (($ <pam-configuration> services transformers shepherd-requirements)
392 (list (shepherd-service
393 (documentation "Synchronization point for services that need to be
394started for PAM to work.")
395 (provision '(pam))
396 (requirement shepherd-requirements)
397 (start #~(const #t))
398 (stop #~(const #t)))))))
399
366(define (extend-configuration initial extensions) 400(define (extend-configuration initial extensions)
367 "Extend INITIAL with NEW." 401 "Extend INITIAL with NEW."
368 (let-values (((services procs) 402 ;; TODO: Remove deprecation shim.
369 (partition pam-service? extensions))) 403 (define cleaned-extensions
404 (map (lambda (ext)
405 (if (procedure? ext)
406 (begin
407 (warning (G_ "'pam-root-service-type' extensions should \
408now use the <pam-extension> record~%"))
409 (pam-extension (transformer ext)))
410 ext))
411 extensions))
412
413 (let-values (((services pam-extensions)
414 (partition pam-service? cleaned-extensions)))
370 (pam-configuration 415 (pam-configuration
371 (services (append (pam-configuration-services initial) 416 (services (append (pam-configuration-services initial)
372 services)) 417 services))
373 (transform (apply compose 418 (transformers (append (pam-configuration-transformers initial)
374 (pam-configuration-transform initial) 419 (map pam-extension-transformer pam-extensions)))
375 procs))))) 420 (shepherd-requirements
421 (append (pam-configuration-shepherd-requirements initial)
422 (append-map pam-extension-shepherd-requirements pam-extensions))))))
376 423
377(define pam-root-service-type 424(define pam-root-service-type
378 (service-type (name 'pam) 425 (service-type (name 'pam)
@@ -382,7 +429,9 @@ strings or string-valued gexps."
382 (lambda (_) 429 (lambda (_)
383 (list (file-like->setuid-program 430 (list (file-like->setuid-program
384 (file-append linux-pam "/sbin/unix_chkpwd"))))) 431 (file-append linux-pam "/sbin/unix_chkpwd")))))
385 (service-extension etc-service-type /etc-entry))) 432 (service-extension etc-service-type /etc-entry)
433 (service-extension shepherd-root-service-type
434 pam-shepherd-service)))
386 435
387 ;; Arguments include <pam-service> as well as procedures. 436 ;; Arguments include <pam-service> as well as procedures.
388 (compose concatenate) 437 (compose concatenate)
@@ -394,7 +443,7 @@ such as @command{login} or @command{sshd}, and specifies for instance how the
394program may authenticate users or what it should do when opening a new 443program may authenticate users or what it should do when opening a new
395session."))) 444session.")))
396 445
397(define* (pam-root-service base #:key (transform identity)) 446(define* (pam-root-service base #:key (transformers '()) (shepherd-requirements '()))
398 "The \"root\" PAM service, which collects <pam-service> instance and turns 447 "The \"root\" PAM service, which collects <pam-service> instance and turns
399them into a /etc/pam.d directory, including the <pam-service> listed in BASE. 448them into a /etc/pam.d directory, including the <pam-service> listed in BASE.
400TRANSFORM is a procedure that takes a <pam-service> and returns a 449TRANSFORM is a procedure that takes a <pam-service> and returns a
@@ -402,6 +451,7 @@ TRANSFORM is a procedure that takes a <pam-service> and returns a
402all the PAM services." 451all the PAM services."
403 (service pam-root-service-type 452 (service pam-root-service-type
404 (pam-configuration (services base) 453 (pam-configuration (services base)
405 (transform transform)))) 454 (transformers transformers)
455 (shepherd-requirements shepherd-requirements))))
406 456
407 457