diff options
Diffstat (limited to 'gnu')
| -rw-r--r-- | gnu/services/authentication.scm | 28 | ||||
| -rw-r--r-- | gnu/services/base.scm | 54 | ||||
| -rw-r--r-- | gnu/services/desktop.scm | 44 | ||||
| -rw-r--r-- | gnu/services/kerberos.scm | 44 | ||||
| -rw-r--r-- | gnu/services/lightdm.scm | 2 | ||||
| -rw-r--r-- | gnu/services/mail.scm | 4 | ||||
| -rw-r--r-- | gnu/services/pam-mount.scm | 23 | ||||
| -rw-r--r-- | gnu/services/sddm.scm | 2 | ||||
| -rw-r--r-- | gnu/services/ssh.scm | 10 | ||||
| -rw-r--r-- | gnu/services/xorg.scm | 4 | ||||
| -rw-r--r-- | gnu/system/pam.scm | 76 |
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 | ||
| 394 | started 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 \ | ||
| 408 | now 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 | |||
| 394 | program may authenticate users or what it should do when opening a new | 443 | program may authenticate users or what it should do when opening a new |
| 395 | session."))) | 444 | session."))) |
| 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 |
| 399 | them into a /etc/pam.d directory, including the <pam-service> listed in BASE. | 448 | them into a /etc/pam.d directory, including the <pam-service> listed in BASE. |
| 400 | TRANSFORM is a procedure that takes a <pam-service> and returns a | 449 | TRANSFORM 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 | |||
| 402 | all the PAM services." | 451 | all 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 | ||
