aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu tests ldap)
  #:use-module (gnu tests)
  #:use-module (gnu system)
  #:use-module (gnu system nss)
  #:use-module (gnu system vm)
  #:use-module (gnu services)
  #:use-module (gnu services authentication)
  #:use-module (gnu services networking)
  #:use-module (gnu packages base)
  #:use-module (gnu packages openldap)
  #:use-module (guix gexp)
  #:use-module (guix store)
  #:export (%test-ldap))

(define %ldap-os
  (let ((simple
         (simple-operating-system
          (service dhcp-client-service-type)
          (service nslcd-service-type))))
    (operating-system
      (inherit simple)
      (name-service-switch
       (let ((services (list (name-service (name "db"))
                             (name-service (name "files"))
                             (name-service (name "ldap")))))
         (name-service-switch
          (inherit %mdns-host-lookup-nss)
          (password services)
          (shadow   services)
          (group    services)
          (netgroup services)
          (gshadow  services)))))))

(define (run-ldap-test)
  "Run tests in %LDAP-OS."
  (define os
    (marionette-operating-system
     %ldap-os
     #:imported-modules '((gnu services herd)
                          (guix combinators))))

  (define vm
    (virtual-machine
     (operating-system os)
     (memory-size 1024)))

  (define test
    (with-imported-modules '((gnu build marionette))
      #~(begin
          (use-modules (srfi srfi-11) (srfi srfi-64)
                       (gnu build marionette))

          (define marionette
            (make-marionette (list #$vm)))

          (test-runner-current (system-test-runner #$output))
          (test-begin "ldap")

          ;; Set up LDAP directory server
          (test-assert "LDAP server instance running"
            (marionette-eval
             '(begin
                (with-output-to-file "instance.inf"
                  (lambda ()
                    (display "[general]
config_version = 2

\n[slapd]
root_password = SECRET_PASS
user = root
group = root

\n[backend-userroot]
sample_entries = yes
suffix = dc=example,dc=com")))
                (and
                 ;; Create instance
                 (zero? (system* #$(file-append 389-ds-base "/sbin/dscreate")
                                     "-v" "from-file" "instance.inf"))
                 ;; Start instance
                 (zero? (system* #$(file-append 389-ds-base "/sbin/dsctl")
                                 "localhost" "start"))
                 ;; Create user account
                 (zero? (system* #$(file-append 389-ds-base "/sbin/dsidm")
                                 "-b" "dc=example,dc=com"
                                 "localhost" "user" "create"
                                 "--uid" "eva" "--cn" "Eva Lu Ator"
                                 "--displayName" "Eva Lu Ator"
                                 "--uidNumber" "1234" "--gidNumber" "2345"
                                 "--homeDirectory" "/home/eva"))))
             marionette))

          (test-assert "Manager can bind to LDAP server instance"
            (marionette-eval
             '(zero? (system* #$(file-append openldap "/bin/ldapwhoami")
                              "-H" "ldap://localhost" "-D"
                              "cn=Directory Manager" "-w" "SECRET_PASS"))
             marionette))

          ;; Wait for nslcd to be up and running.
          (test-assert "nslcd service running"
            (marionette-eval
             '(begin
                (use-modules (gnu services herd))
                (match (start-service 'nslcd)
                  (#f #f)
                  (('service response-parts ...)
                   (match (assq-ref response-parts 'running)
                     ((pid) (number? pid))))))
             marionette))

          (test-assert "nslcd produces a log file"
            (marionette-eval
             '(file-exists? "/var/log/nslcd")
             marionette))

          (test-assert "Can query LDAP user accounts"
            (marionette-eval
             '(begin
                ;; TODO: This shouldn't be necessary, but unfortunately it
                ;; really is needed to discover LDAP accounts with "id".
                (setenv "LD_LIBRARY_PATH"
                        #$(file-append nss-pam-ldapd "/lib"))
                (zero? (system* #$(file-append coreutils "/bin/id") "eva")))
             marionette))

          (test-assert "Can become LDAP user"
            (marionette-eval
             '(zero? (system* "/run/privileged/bin/su" "eva" "-c"
                              #$(file-append coreutils "/bin/true")))
             marionette))

          (test-end))))

  (gexp->derivation "ldap-test" test))

(define %test-ldap
  (system-test
   (name "ldap")
   (description "Run an LDAP directory server and authenticate against it.")
   (value (run-ldap-test))))
class='msg-avail'>...Ludovic Courtès 2013-04-27build: Explicitly require Guile >= 2.0.5....Ludovic Courtès 2013-02-16Replace individual scripts with master 'guix' script....Mark H Weaver 2013-02-06build: `chmod +x' scripts as they are generated....Ludovic Courtès 2013-01-28build: Require Automake 1.12 or later....Ludovic Courtès 2013-01-19build: Use "nix-instantiate" as the default name for that program....Ludovic Courtès 2013-01-18build: Bump to version 0.2....Ludovic Courtès 2013-01-06Add `guix-gc'....Ludovic Courtès 2012-12-13build: Make `--enable-daemon' the default....Ludovic Courtès 2012-12-13build: When `--enable-daemon', don't error out when Nix programs are missing....Ludovic Courtès 2012-12-06build: Capture configure-time settings in (guix config)....Ludovic Courtès 2012-12-06build: Run all the tests against the just-built daemon....Ludovic Courtès 2012-12-03build: Include a copy of Nix's libstore and daemon; build it....Ludovic Courtès 2012-11-24build: Change bug-report address; add URL....Ludovic Courtès 2012-11-18Turn Guix into "GNU Guix"....Ludovic Courtès 2012-11-04Add (guix snix) and the `guix-import' command....Ludovic Courtès 2012-11-03build: Require GNU libgcrypt....Ludovic Courtès 2012-11-03build: Produce (guix config) instead of using compile-time tricks....Ludovic Courtès 2012-11-03build: Clearly mark Nixpkgs as optional....Ludovic Courtès 2012-11-01Add a preliminary `guix-package' command-line tool....Ludovic Courtès 2012-10-25Add `guix-download'....Ludovic Courtès 2012-10-04Add `pre-inst-env' script....Ludovic Courtès 2012-08-27configure.ac: Make 'guild' configure check fatal, otherwise one gets 'compile...Cyprien Nicolas (fulax) 2012-08-22build: Bump version number....Ludovic Courtès 2012-08-17build: Add `--with-libgcrypt-prefix'; capture the path to libgcrypt....Ludovic Courtès 2012-08-14build: Pass the right flags for "make distcheck"....Ludovic Courtès 2012-07-07build: Use Automake's `gnu' option....Ludovic Courtès 2012-07-02build: Use `AM_GNU_GETTEXT_VERSION'....Ludovic Courtès