120 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
import ./make-test.nix ({ pkgs, lib, ...} :
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
  dbSuffix = "dc=example,dc=com";
 | 
						|
  dbPath = "/var/db/openldap";
 | 
						|
  dbAdminDn = "cn=admin,${dbSuffix}";
 | 
						|
  dbAdminPwd = "test";
 | 
						|
  serverUri = "ldap:///";
 | 
						|
  ldapUser = "test-ldap-user";
 | 
						|
  ldapUserId = 10000;
 | 
						|
  ldapUserPwd = "test";
 | 
						|
  ldapGroup = "test-ldap-group";
 | 
						|
  ldapGroupId = 10000;
 | 
						|
  setupLdif = pkgs.writeText "test-ldap.ldif" ''
 | 
						|
    dn: ${dbSuffix}
 | 
						|
    dc: ${with lib; let dc = head (splitString "," dbSuffix); dcName = head (tail (splitString "=" dc)); in dcName}
 | 
						|
    o: ${dbSuffix}
 | 
						|
    objectclass: top
 | 
						|
    objectclass: dcObject
 | 
						|
    objectclass: organization
 | 
						|
 | 
						|
    dn: cn=${ldapUser},${dbSuffix}
 | 
						|
    sn: ${ldapUser}
 | 
						|
    objectClass: person
 | 
						|
    objectClass: posixAccount
 | 
						|
    uid: ${ldapUser}
 | 
						|
    uidNumber: ${toString ldapUserId}
 | 
						|
    gidNumber: ${toString ldapGroupId}
 | 
						|
    homeDirectory: /home/${ldapUser}
 | 
						|
    loginShell: /bin/sh
 | 
						|
    userPassword: ${ldapUserPwd}
 | 
						|
 | 
						|
    dn: cn=${ldapGroup},${dbSuffix}
 | 
						|
    objectClass: posixGroup
 | 
						|
    gidNumber: ${toString ldapGroupId}
 | 
						|
    memberUid: ${ldapUser}
 | 
						|
  '';
 | 
						|
  mkClient = useDaemon:
 | 
						|
    { config, pkgs, lib, ... }:
 | 
						|
    {
 | 
						|
      virtualisation.memorySize = 256;
 | 
						|
      virtualisation.vlans = [ 1 ];
 | 
						|
      security.pam.services.su.rootOK = lib.mkForce false;
 | 
						|
      users.ldap.enable = true;
 | 
						|
      users.ldap.daemon.enable = useDaemon;
 | 
						|
      users.ldap.loginPam = true;
 | 
						|
      users.ldap.nsswitch = true;
 | 
						|
      users.ldap.server = "ldap://server";
 | 
						|
      users.ldap.base = "${dbSuffix}";
 | 
						|
    };
 | 
						|
 | 
						|
in
 | 
						|
 | 
						|
{
 | 
						|
  name = "ldap";
 | 
						|
  meta = with pkgs.stdenv.lib.maintainers; {
 | 
						|
    maintainers = [ montag451 ];
 | 
						|
  };
 | 
						|
 | 
						|
  nodes = {
 | 
						|
 | 
						|
    server =
 | 
						|
      { config, pkgs, lib, ... }:
 | 
						|
      {
 | 
						|
        virtualisation.memorySize = 256;
 | 
						|
        virtualisation.vlans = [ 1 ];
 | 
						|
        networking.firewall.allowedTCPPorts = [ 389 ];
 | 
						|
        services.openldap.enable = true;
 | 
						|
        services.openldap.dataDir = dbPath;
 | 
						|
        services.openldap.urlList = [
 | 
						|
          serverUri
 | 
						|
        ];
 | 
						|
        services.openldap.extraConfig = ''
 | 
						|
          include ${pkgs.openldap.out}/etc/schema/core.schema
 | 
						|
          include ${pkgs.openldap.out}/etc/schema/cosine.schema
 | 
						|
          include ${pkgs.openldap.out}/etc/schema/inetorgperson.schema
 | 
						|
          include ${pkgs.openldap.out}/etc/schema/nis.schema
 | 
						|
 | 
						|
          database mdb
 | 
						|
          suffix ${dbSuffix}
 | 
						|
          rootdn ${dbAdminDn}
 | 
						|
          rootpw ${dbAdminPwd}
 | 
						|
          directory ${dbPath}
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
    client1 = mkClient true; # use nss_pam_ldapd
 | 
						|
    client2 = mkClient false; # use nss_ldap and pam_ldap
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
  testScript = ''
 | 
						|
    startAll;
 | 
						|
    $server->waitForUnit("default.target");
 | 
						|
    $client1->waitForUnit("default.target");
 | 
						|
    $client2->waitForUnit("default.target");
 | 
						|
 | 
						|
    $server->succeed("ldapadd -D '${dbAdminDn}' -w ${dbAdminPwd} -H ${serverUri} -f '${setupLdif}'");
 | 
						|
 | 
						|
    # NSS tests
 | 
						|
    subtest "nss", sub {
 | 
						|
        $client1->succeed("test \"\$(id -u '${ldapUser}')\" -eq ${toString ldapUserId}");
 | 
						|
        $client1->succeed("test \"\$(id -u -n '${ldapUser}')\" = '${ldapUser}'");
 | 
						|
        $client1->succeed("test \"\$(id -g '${ldapUser}')\" -eq ${toString ldapGroupId}");
 | 
						|
        $client1->succeed("test \"\$(id -g -n '${ldapUser}')\" = '${ldapGroup}'");
 | 
						|
        $client2->succeed("test \"\$(id -u '${ldapUser}')\" -eq ${toString ldapUserId}");
 | 
						|
        $client2->succeed("test \"\$(id -u -n '${ldapUser}')\" = '${ldapUser}'");
 | 
						|
        $client2->succeed("test \"\$(id -g '${ldapUser}')\" -eq ${toString ldapGroupId}");
 | 
						|
        $client2->succeed("test \"\$(id -g -n '${ldapUser}')\" = '${ldapGroup}'");
 | 
						|
    };
 | 
						|
 | 
						|
    # PAM tests
 | 
						|
    subtest "pam", sub {
 | 
						|
        $client1->succeed("echo ${ldapUserPwd} | su -l '${ldapUser}' -c true");
 | 
						|
        $client2->succeed("echo ${ldapUserPwd} | su -l '${ldapUser}' -c true");
 | 
						|
    };
 | 
						|
  '';
 | 
						|
})
 |