aboutsummaryrefslogtreecommitdiff
A big thanks to Eelco Dolstra, who designed and implemented Nix.
Transposing functional programming discipline to package management
proved to be inspiring and fruitful.

Thanks to the following people who contributed to GNU Guix through
suggestions, bug reports, patches, internationalization, or general
infrastructure help:

	    Lluís Batlle i Rossell <viric@viric.name>
          Sylvain Beucler <beuc@beuc.net>
	   Carlos Carleos <carleos@uniovi.es>
	   Felipe Castro <fefcas@gmail.com>
	   Daniel Clark <dclark@pobox.com>
	Alexandru Cojocaru <xojoc@gmx.com>
	    Aleix Conchillo Flaqué <aconchillo@gmail.com>
          Malcolm Cook <MEC@stowers.org>
           Thomas Danckaert <thomas.danckaert@gmail.com>
	   Rafael Ferreira <rafael.f.f1@gmail.com>
	Christian Grothoff <christian@grothoff.org>
             Eric Hanchrow <eric.hanchrow@gmail.com>
           Konrad Hinsen <konrad.hinsen@fastmail.net>
          Brandon Invergo <brandon@gnu.org>
           Anders Jonsson <anders.jonsson@norsjovallen.se>
	  Jeffrin Jose <ahiliation@yahoo.co.in>
	          Kete <kete@ninthfloor.org>
           Daniel Kochmański <dkochmanski@hellsgate.pl>
	  Matthew Lien <bluet@bluet.org>
             Dave Love <fx@gnu.org>
            Chris Marusich <cmmarusich@gmail.com>
            Niels Möller <nisse@lysator.liu.se>
          Cyprien Nicolas <cyprien@nicolas.tf>
	   Yutaka Niibe <gniibe@fsij.org>
           Andrei Osipov <andrspv@gmail.com>
                  Petter <petter@mykolab.ch>
             Adam Pribyl <pribyl@lowlevel.cz>
            Pjotr Prins <pjotr.public12@thebird.nl>
  Yakkala Yagnesh Raghava <hi@yagnesh.org>
           Joshua Randall <jcrandall@alum.mit.edu>
      Bruno Félix Rezende Ribeiro <oitofelix@gnu.org>
	    Benno Schulenberg <coordinator@translationproject.org>
           Thomas Schwinge <thomas@codesourcery.com>
        Alexander Shendi <Alexander.Shendi@web.de>
	     Alen Skondro <askondro@gmail.com>
              Jan Synáček <jan.synacek@gmail.com>
	 Matthias Wachs <wachs@net.in.tum.de>
        Christine Lemmer-Webber <cwebber@dustycloud.org>
           Philip Woods <elzairthesorcerer@gmail.com>

GNU Guix also includes non-software works.  Thanks to the following
people who contributed the logo and general artwork and themes:

           Nikita Karetnikov <nikita@karetnikov.org>
           Felipe López <felipe.lopez@openmailbox.org>
ipher=%(CIPHER))'" " '%(if %(FSKEYCIPHER)," "-ofsk_cipher=%(FSKEYCIPHER))'" " '%(if %(FSKEYHASH),-ofsk_hash=%(FSKEYHASH))'" " '%(if %(FSKEYPATH),-okeyfile=%(FSKEYPATH))'" " '%(if %(OPTIONS),-o%(OPTIONS))'" " '%(VOLUME)' '%(MNTPT)'"))) (cryptumount #$(file-append pam-mount "/sbin/umount.crypt '%(MNTPT)'")))) port)))))) (define-record-type* <pam-mount-configuration> pam-mount-configuration make-pam-mount-configuration pam-mount-configuration? (rules pam-mount-configuration-rules (default %pam-mount-default-configuration))) (define (pam-mount-etc-service config) `(("security/pam_mount.conf.xml" ,(make-pam-mount-configuration-file config)))) (define (pam-mount-pam-service config) (define optional-pam-mount (pam-entry (control "optional") (module (file-append pam-mount "/lib/security/pam_mount.so")))) (list (pam-extension (transformer (lambda (pam) (if (member (pam-service-name pam) '("login" "greetd" "su" "slim" "gdm-password" "sddm")) (pam-service (inherit pam) (auth (append (pam-service-auth pam) (list optional-pam-mount))) (session (append (pam-service-session pam) (list optional-pam-mount)))) pam)))))) (define (extend-pam-mount-configuration initial extensions) "Extends INITIAL with EXTENSIONS." (pam-mount-configuration (rules (append (pam-mount-configuration-rules initial) extensions)))) (define pam-mount-service-type (service-type (name 'pam-mount) (extensions (list (service-extension etc-service-type pam-mount-etc-service) (service-extension pam-root-service-type pam-mount-pam-service))) (compose concatenate) (extend extend-pam-mount-configuration) (default-value (pam-mount-configuration)) (description "Activate PAM-Mount support. It allows mounting volumes for specific users when they log in."))) (define (field-name->tag field-name) "Convert FIELD-NAME to its tag used by the configuration XML." (match field-name ('user-name 'user) ('user-id 'uid) ('primary-group 'pgrp) ('group-id 'gid) ('secondary-group 'sgrp) ('file-system-type 'fstype) ('no-mount-as-root? 'noroot) ('file-name 'path) ('mount-point 'mountpoint) ('ssh? 'ssh) ('file-system-key-cipher 'fskeycipher) ('file-system-key-hash 'fskeyhash) ('file-system-key-file-name 'fskeypath) (_ field-name))) (define-maybe string) (define (serialize-string field-name value) (list (field-name->tag field-name) value)) (define (integer-or-range? value) (match value ((start . end) (and (integer? start) (integer? end))) (_ (number? value)))) (define-maybe integer-or-range) (define (serialize-integer-or-range field-name value) (let ((value-string (match value ((start . end) (format #f "~a-~a" start end)) (_ (number->string value))))) (list (field-name->tag field-name) value-string))) (define-maybe boolean) (define (serialize-boolean field-name value) (let ((value-string (if value "1" "0"))) (list (field-name->tag field-name) value-string))) (define-configuration pam-mount-volume (user-name maybe-string "User name to match.") (user-id maybe-integer-or-range "User ID, or range of user IDs, in the form of @code{(start . end)} to\nmatch.") (primary-group maybe-string "Primary group name to match.") (group-id maybe-integer-or-range "Group ID, or range of group IDs, in the form of @code{(start . end)} to\nmatch.") (secondary-group maybe-string "Match users who belong to this group name as either a primary or secondary\ngroup.") (file-system-type maybe-string "File system type of volume being mounted.") (no-mount-as-root? maybe-boolean "Do not use super user privileges to mount this volume.") (server maybe-string "Remote server this volume resides on.") (file-name maybe-string "Location of the volume to be mounted.") (mount-point maybe-string "Where to mount the volume in the local file system.") (options maybe-string "Options to pass to the underlying mount program.") (ssh? maybe-boolean "Whether to pass the login password to SSH.") (cipher maybe-string "Cryptsetup cipher named used by volume.") (file-system-key-cipher maybe-string "Cipher name used by the target volume.") (file-system-key-hash maybe-string "SSL hash name used by the target volume.") (file-system-key-file-name maybe-string "File name for the file system key used by the target volume.")) (define (pam-mount-volume->sxml volume) ;; Convert a list of configuration fields into an SXML-compatible attribute ;; list. (define xml-attrs (filter-map (lambda (field) (let* ((accessor (configuration-field-getter field)) (value (accessor volume))) (and (not (eq? value %unset-value)) (list (field-name->tag (configuration-field-name field)) value)))) pam-mount-volume-fields)) `(volume (@ ,@xml-attrs))) (define (pam-mount-volume-rules volumes) (map pam-mount-volume->sxml volumes)) (define pam-mount-volume-service-type (service-type (name 'pam-mount-volume) (extensions (list (service-extension pam-mount-service-type pam-mount-volume-rules))) (compose concatenate) (extend append) (default-value '()) (description "Mount remote volumes such as CIFS shares @i{via} @acronym{PAM, Pluggable Authentication Modules} when logging in, using login credentials.")))