python:tests: Store keys as bytes rather than as lists of ints
[samba.git] / selftest / target / Samba3.pm
index d0ef659da99cee1fb90b311a279a13920f6cd692..0ae1eceb7d46d25e7838e73b681f625e917d83b8 100755 (executable)
@@ -31,7 +31,7 @@ sub have_ads($) {
         open(IN, $smbd_build_options) or die("Unable to run $smbd_build_options: $!");
 
         while (<IN>) {
-                if (/WITH_ADS/) {
+                if (/HAVE_ADS/) {
                        $found_ads = 1;
                 }
         }
@@ -97,44 +97,54 @@ sub teardown_env_samba($$)
        my $smbdpid = $envvars->{SMBD_TL_PID};
        my $nmbdpid = $envvars->{NMBD_TL_PID};
        my $winbinddpid = $envvars->{WINBINDD_TL_PID};
+       my $samba_dcerpcdpid = $envvars->{SAMBA_DCERPCD_TL_PID};
 
        # This should give it time to write out the gcov data
        until ($count > 20) {
            my $smbdchild = Samba::cleanup_child($smbdpid, "smbd");
            my $nmbdchild = Samba::cleanup_child($nmbdpid, "nmbd");
            my $winbinddchild = Samba::cleanup_child($winbinddpid, "winbindd");
+           my $samba_dcerpcdchild = Samba::cleanup_child(
+               $samba_dcerpcdpid, "samba-dcerpcd");
            if ($smbdchild == -1
                && $nmbdchild == -1
-               && $winbinddchild == -1) {
+               && $winbinddchild == -1
+               && $samba_dcerpcdpid == -1) {
                last;
            }
            sleep(1);
            $count++;
        }
 
-       if ($count <= 20 && kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) {
+       if ($count <= 20 &&
+           kill(0, $smbdpid, $nmbdpid, $winbinddpid, $samba_dcerpcdpid) == 0) {
            return;
        }
 
        $self->stop_sig_term($smbdpid);
        $self->stop_sig_term($nmbdpid);
        $self->stop_sig_term($winbinddpid);
+       $self->stop_sig_term($samba_dcerpcdpid);
 
        $count = 0;
        until ($count > 10) {
            my $smbdchild = Samba::cleanup_child($smbdpid, "smbd");
            my $nmbdchild = Samba::cleanup_child($nmbdpid, "nmbd");
            my $winbinddchild = Samba::cleanup_child($winbinddpid, "winbindd");
+           my $samba_dcerpcdpid = Samba::cleanup_child(
+               $samba_dcerpcdpid, "samba-dcerpcd");
            if ($smbdchild == -1
                && $nmbdchild == -1
-               && $winbinddchild == -1) {
+               && $winbinddchild == -1
+               && $samba_dcerpcdpid == -1) {
                last;
            }
            sleep(1);
            $count++;
        }
 
-       if ($count <= 10 && kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) {
+       if ($count <= 10 &&
+           kill(0, $smbdpid, $nmbdpid, $winbinddpid, $samba_dcerpcdpid) == 0) {
            return;
        }
 
@@ -142,6 +152,7 @@ sub teardown_env_samba($$)
        $self->stop_sig_kill($smbdpid);
        $self->stop_sig_kill($nmbdpid);
        $self->stop_sig_kill($winbinddpid);
+       $self->stop_sig_kill($samba_dcerpcdpid);
 
        return 0;
 }
@@ -188,7 +199,7 @@ sub getlog_env_app($$$)
        close(LOG);
 
        return "" if $out eq $title;
+
        return $out;
 }
 
@@ -236,10 +247,13 @@ sub check_env($$)
        ad_member           => ["ad_dc", "fl2008r2dc", "fl2003dc"],
        ad_member_rfc2307   => ["ad_dc_ntvfs"],
        ad_member_idmap_rid => ["ad_dc"],
+       admem_idmap_autorid => ["ad_dc"],
        ad_member_idmap_ad  => ["fl2008r2dc"],
        ad_member_fips      => ["ad_dc_fips"],
        ad_member_offlogon  => ["ad_dc"],
        ad_member_oneway    => ["fl2000dc"],
+       ad_member_idmap_nss => ["ad_dc"],
+       ad_member_s3_join   => ["vampire_dc"],
 
        clusteredmember => ["nt4_dc"],
 );
@@ -248,7 +262,7 @@ sub check_env($$)
 
 sub setup_nt4_dc
 {
-       my ($self, $path, $more_conf, $server) = @_;
+       my ($self, $path, $more_conf, $domain, $server) = @_;
 
        print "PROVISIONING NT4 DC...";
 
@@ -258,20 +272,39 @@ sub setup_nt4_dc
        lanman auth = yes
        ntlm auth = yes
        raw NTLMv2 auth = yes
-       server schannel = auto
-
-       rpc_server:epmapper = external
-       rpc_server:spoolss = external
-       rpc_server:lsarpc = external
-       rpc_server:samr = external
-       rpc_server:netlogon = external
-       rpc_server:register_embedded_np = yes
-       rpc_server:FssagentRpc = external
-
-       rpc_daemon:epmd = fork
-       rpc_daemon:spoolssd = fork
-       rpc_daemon:lsasd = fork
-       rpc_daemon:fssd = fork
+       rpc start on demand helpers = false
+
+       CVE_2020_1472:warn_about_unused_debug_level = 3
+       server require schannel:schannel0\$ = no
+       server require schannel:schannel1\$ = no
+       server require schannel:schannel2\$ = no
+       server require schannel:schannel3\$ = no
+       server require schannel:schannel4\$ = no
+       server require schannel:schannel5\$ = no
+       server require schannel:schannel6\$ = no
+       server require schannel:schannel7\$ = no
+       server require schannel:schannel8\$ = no
+       server require schannel:schannel9\$ = no
+       server require schannel:schannel10\$ = no
+       server require schannel:schannel11\$ = no
+       server require schannel:torturetest\$ = no
+
+       server schannel require seal:schannel0\$ = no
+       server schannel require seal:schannel1\$ = no
+       server schannel require seal:schannel2\$ = no
+       server schannel require seal:schannel3\$ = no
+       server schannel require seal:schannel4\$ = no
+       server schannel require seal:schannel5\$ = no
+       server schannel require seal:schannel6\$ = no
+       server schannel require seal:schannel7\$ = no
+       server schannel require seal:schannel8\$ = no
+       server schannel require seal:schannel9\$ = no
+       server schannel require seal:schannel10\$ = no
+       server schannel require seal:schannel11\$ = no
+       server schannel require seal:torturetest\$ = no
+
+       vfs_default:VFS_OPEN_HOW_RESOLVE_NO_SYMLINKS = no
+
        fss: sequence timeout = 1
        check parent directory delete on close = yes
 ";
@@ -279,12 +312,15 @@ sub setup_nt4_dc
        if (defined($more_conf)) {
                $nt4_dc_options = $nt4_dc_options . $more_conf;
        }
+       if (!defined($domain)) {
+               $domain = "SAMBA-TEST";
+       }
        if (!defined($server)) {
                $server = "LOCALNT4DC2";
        }
        my $vars = $self->provision(
            prefix => $path,
-           domain => "SAMBA-TEST",
+           domain => $domain,
            server => $server,
            password => "localntdc2pass",
            extra_options => $nt4_dc_options);
@@ -293,6 +329,7 @@ sub setup_nt4_dc
 
        if (not $self->check_or_start(
                env_vars => $vars,
+               samba_dcerpcd => "yes",
                nmbd => "yes",
                winbindd => "yes",
                smbd => "yes")) {
@@ -318,7 +355,7 @@ sub setup_nt4_dc_smb1
        client min protocol = CORE
        server min protocol = LANMAN1
 ";
-       return $self->setup_nt4_dc($path, $conf, "LCLNT4DC2SMB1");
+       return $self->setup_nt4_dc($path, $conf, "NT4SMB1", "LCLNT4DC2SMB1");
 }
 
 sub setup_nt4_dc_smb1_done
@@ -338,17 +375,6 @@ sub setup_nt4_dc_schannel
        domain logons = yes
        lanman auth = yes
 
-       rpc_server:epmapper = external
-       rpc_server:spoolss = external
-       rpc_server:lsarpc = external
-       rpc_server:samr = external
-       rpc_server:netlogon = external
-       rpc_server:register_embedded_np = yes
-
-       rpc_daemon:epmd = fork
-       rpc_daemon:spoolssd = fork
-       rpc_daemon:lsasd = fork
-
        server schannel = yes
        # used to reproduce bug #12772
        server max protocol = SMB2_02
@@ -480,8 +506,6 @@ sub setup_clusteredmember
        my $prefix_abs = abs_path($prefix);
        mkdir($prefix_abs, 0777);
 
-       my $server_name = "CLUSTEREDMEMBER";
-
        my $ctdb_data = $self->setup_ctdb($prefix);
 
        if (not $ctdb_data) {
@@ -504,8 +528,8 @@ sub setup_clusteredmember
                my $pub_iface = $node->{SOCKET_WRAPPER_DEFAULT_IFACE};
                my $node_prefix = $node->{NODE_PREFIX};
 
-               print "NODE_PREFIX=${node_prefix}\n";
-               print "SOCKET=${socket}\n";
+               print "CTDB_BASE=${node_prefix}\n";
+               print "CTDB_SOCKET=${socket}\n";
 
                my $require_mutexes = "dbwrap_tdb_require_mutexes:* = yes";
                if ($ENV{SELFTEST_DONT_REQUIRE_TDB_MUTEX_SUPPORT} // '' eq "1") {
@@ -516,6 +540,8 @@ sub setup_clusteredmember
        security = domain
        server signing = on
        clustering = yes
+       rpc start on demand helpers = false
+       rpcd witness:include node ips = yes
        ctdbd socket = ${socket}
        include = registry
        dbwrap_tdb_mutexes:* = yes
@@ -537,6 +563,36 @@ sub setup_clusteredmember
                        return undef;
                }
 
+               my $registry_share_template = "$node_ret->{SERVERCONFFILE}.registry_share_template";
+               unless (open(REGISTRYCONF, ">$registry_share_template")) {
+                       warn("Unable to open $registry_share_template");
+                       teardown_env($self, $node_ret);
+                       teardown_env($self, $ctdb_data);
+                       return undef;
+               }
+
+               print REGISTRYCONF "
+[registry_share]
+       copy = tmp
+       comment = smb username is [%U]
+";
+
+               close(REGISTRYCONF);
+
+               my $net = Samba::bindir_path($self, "net");
+               my $cmd = "";
+
+               $cmd .= "UID_WRAPPER_ROOT=1 ";
+               $cmd .= "$net conf import $node_ret->{CONFIGURATION} ${registry_share_template}";
+
+               my $net_ret = system($cmd);
+               if ($net_ret != 0) {
+                       warn("net conf import failed: $net_ret\n$cmd");
+                       teardown_env($self, $node_ret);
+                       teardown_env($self, $ctdb_data);
+                       return undef;
+               }
+
                my $nmblookup = Samba::bindir_path($self, "nmblookup");
                do {
                        print "Waiting for the LOGON SERVER registration ...\n";
@@ -579,6 +635,7 @@ sub setup_clusteredmember
                my $ok;
                $ok = $self->check_or_start(
                    env_vars => $node_provision,
+                   samba_dcerpcd => "yes",
                    winbindd => "yes",
                    smbd => "yes",
                    child_cleanup => sub {
@@ -653,8 +710,15 @@ sub provision_ad_member
            $dcvars,
            $trustvars_f,
            $trustvars_e,
+           $extra_member_options,
            $force_fips_mode,
-           $offline_logon) = @_;
+           $offline_logon,
+           $no_nss_winbind) = @_;
+
+       if (defined($offline_logon) && defined($no_nss_winbind)) {
+               warn ("Offline logon incompatible with no nss winbind\n");
+               return undef;
+       }
 
        my $prefix_abs = abs_path($prefix);
        my @dirs = ();
@@ -686,6 +750,9 @@ sub provision_ad_member
        $substitution_path = "$share_dir/D_$dcvars->{DOMAIN}/u_$dcvars->{DOMAIN}/alice/g_$dcvars->{DOMAIN}/domain users";
        push(@dirs, $substitution_path);
 
+       my $smbcacls_sharedir="$share_dir/smbcacls";
+       push(@dirs,$smbcacls_sharedir);
+
        my $option_offline_logon = "no";
        if (defined($offline_logon)) {
                $option_offline_logon = "yes";
@@ -696,6 +763,10 @@ sub provision_ad_member
                $netbios_aliases = "netbios aliases = foo bar";
        }
 
+       unless (defined($extra_member_options)) {
+               $extra_member_options = "";
+       }
+
        my $member_options = "
        security = ads
         workgroup = $dcvars->{DOMAIN}
@@ -709,15 +780,11 @@ sub provision_ad_member
 
        allow dcerpc auth level connect:lsarpc = yes
        dcesrv:max auth states = 8
+       rpc start on demand helpers = false
 
-       rpc_server:epmapper = external
-       rpc_server:lsarpc = external
-       rpc_server:samr = external
-       rpc_server:netlogon = disabled
-       rpc_server:register_embedded_np = yes
-
-       rpc_daemon:epmd = fork
-       rpc_daemon:lsasd = fork
+       # Begin extra member options
+       $extra_member_options
+       # End extra member options
 
 [sub_dug]
        path = $share_dir/D_%D/U_%U/G_%G
@@ -751,6 +818,10 @@ sub provision_ad_member
     path = $share_dir
     valid users = \"+$dcvars->{DOMAIN}/domain users\"
 
+[valid_users_nis_group]
+    path = $share_dir
+    valid users = \"&$dcvars->{DOMAIN}/domain users\"
+
 [valid_users_unix_nis_group]
     path = $share_dir
     valid users = \"+&$dcvars->{DOMAIN}/domain users\"
@@ -782,7 +853,6 @@ sub provision_ad_member
 
        mkdir($_, 0777) foreach(@dirs);
 
-       close(USERMAP);
        $ret->{DOMAIN} = $dcvars->{DOMAIN};
        $ret->{REALM} = $dcvars->{REALM};
        $ret->{DOMSID} = $dcvars->{DOMSID};
@@ -913,37 +983,22 @@ sub provision_ad_member
                # Start winbindd in offline mode
                if (not $self->check_or_start(
                        env_vars => $ret,
-                       winbindd => "yes",
-                       skip_wait => 1)) {
+                       winbindd => "offline")) {
                        return undef;
                }
 
                # Set socket dir again
                $ENV{SOCKET_WRAPPER_DIR} = $swrap_env;
 
-               print "checking for winbindd\n";
-               my $count = 0;
-               my $rc = 0;
-               $cmd = "NSS_WRAPPER_PASSWD='$ret->{NSS_WRAPPER_PASSWD}' ";
-               $cmd .= "NSS_WRAPPER_GROUP='$ret->{NSS_WRAPPER_GROUP}' ";
-               $cmd .= "SELFTEST_WINBINDD_SOCKET_DIR=\"$ret->{SELFTEST_WINBINDD_SOCKET_DIR}\" ";
-               $cmd .= "$wbinfo --ping";
-
-               do {
-                       $rc = system($cmd);
-                       if ($rc != 0) {
-                               sleep(1);
-                       }
-                       $count++;
-               } while ($rc != 0 && $count < 20);
-               if ($count == 20) {
-                       print "WINBINDD not reachable after 20 seconds\n";
-                       teardown_env($self, $ret);
-                       return undef;
-               }
        } else {
+               if (defined($no_nss_winbind)) {
+                       $ret->{NSS_WRAPPER_MODULE_SO_PATH} = "";
+                       $ret->{NSS_WRAPPER_MODULE_FN_PREFIX} = "";
+               }
+
                if (not $self->check_or_start(
                        env_vars => $ret,
+                       samba_dcerpcd => "yes",
                        nmbd => "yes",
                        winbindd => "yes",
                        smbd => "yes")) {
@@ -958,6 +1013,10 @@ sub provision_ad_member
        $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
        $ret->{DC_USERNAME} = $dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
+       $ret->{DOMAIN_ADMIN} = $dcvars->{DOMAIN_ADMIN};
+       $ret->{DOMAIN_ADMIN_PASSWORD} = $dcvars->{DOMAIN_ADMIN_PASSWORD};
+       $ret->{DOMAIN_USER} = $dcvars->{DOMAIN_USER};
+       $ret->{DOMAIN_USER_PASSWORD} = $dcvars->{DOMAIN_USER_PASSWORD};
 
        # forest trust
        $ret->{TRUST_F_BOTH_SERVER} = $trustvars_f->{SERVER};
@@ -1004,6 +1063,28 @@ sub setup_ad_member
                                          $trustvars_e);
 }
 
+sub setup_ad_member_s3_join
+{
+        my ($self,
+            $prefix,
+            $dcvars,
+            $trustvars_f,
+            $trustvars_e) = @_;
+
+        # If we didn't build with ADS, pretend this env was never available
+        if (not $self->have_ads()) {
+                return "UNKNOWN";
+        }
+
+        print "PROVISIONING AD MEMBER...";
+
+        return $self->provision_ad_member($prefix,
+                                          "LOCALADMEMBER2",
+                                          $dcvars,
+                                          $trustvars_f,
+                                          $trustvars_e);
+}
+
 sub setup_ad_member_rfc2307
 {
        my ($self, $prefix, $dcvars) = @_;
@@ -1044,7 +1125,6 @@ sub setup_ad_member_rfc2307
 
        $ret or return undef;
 
-       close(USERMAP);
        $ret->{DOMAIN} = $dcvars->{DOMAIN};
        $ret->{REALM} = $dcvars->{REALM};
        $ret->{DOMSID} = $dcvars->{DOMSID};
@@ -1102,6 +1182,110 @@ sub setup_ad_member_rfc2307
        $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
        $ret->{DC_USERNAME} = $dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
+       $ret->{DOMAIN_ADMIN} = $dcvars->{DOMAIN_ADMIN};
+       $ret->{DOMAIN_ADMIN_PASSWORD} = $dcvars->{DOMAIN_ADMIN_PASSWORD};
+       $ret->{DOMAIN_USER} = $dcvars->{DOMAIN_USER};
+       $ret->{DOMAIN_USER_PASSWORD} = $dcvars->{DOMAIN_USER_PASSWORD};
+
+       return $ret;
+}
+
+sub setup_admem_idmap_autorid
+{
+       my ($self, $prefix, $dcvars) = @_;
+
+       # If we didn't build with ADS, pretend this env was never available
+       if (not $self->have_ads()) {
+               return "UNKNOWN";
+       }
+
+       print "PROVISIONING S3 AD MEMBER WITH idmap_autorid config...";
+
+       my $member_options = "
+       security = ads
+       workgroup = $dcvars->{DOMAIN}
+       realm = $dcvars->{REALM}
+       idmap config * : backend = autorid
+       idmap config * : range = 1000000-19999999
+       idmap config * : rangesize = 1000000
+
+       # Prevent overriding the provisioned lib/krb5.conf which sets certain
+       # values required for tests to succeed
+       create krb5 conf = no
+";
+
+       my $ret = $self->provision(
+           prefix => $prefix,
+           domain => $dcvars->{DOMAIN},
+           realm => $dcvars->{REALM},
+           server => "ADMEMAUTORID",
+           password => "loCalMemberPass",
+           extra_options => $member_options,
+           resolv_conf => $dcvars->{RESOLV_CONF});
+
+       $ret or return undef;
+
+       $ret->{DOMAIN} = $dcvars->{DOMAIN};
+       $ret->{REALM} = $dcvars->{REALM};
+       $ret->{DOMSID} = $dcvars->{DOMSID};
+
+       my $ctx;
+       my $prefix_abs = abs_path($prefix);
+       $ctx = {};
+       $ctx->{krb5_conf} = "$prefix_abs/lib/krb5.conf";
+       $ctx->{domain} = $dcvars->{DOMAIN};
+       $ctx->{realm} = $dcvars->{REALM};
+       $ctx->{dnsname} = lc($dcvars->{REALM});
+       $ctx->{kdc_ipv4} = $dcvars->{SERVER_IP};
+       $ctx->{kdc_ipv6} = $dcvars->{SERVER_IPV6};
+       $ctx->{krb5_ccname} = "$prefix_abs/krb5cc_%{uid}";
+       Samba::mk_krb5_conf($ctx, "");
+
+       $ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
+
+       my $net = Samba::bindir_path($self, "net");
+       # Add hosts file for name lookups
+       my $cmd = "NSS_WRAPPER_HOSTS='$ret->{NSS_WRAPPER_HOSTS}' ";
+       $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
+       if (defined($ret->{RESOLV_WRAPPER_CONF})) {
+               $cmd .= "RESOLV_WRAPPER_CONF=\"$ret->{RESOLV_WRAPPER_CONF}\" ";
+       } else {
+               $cmd .= "RESOLV_WRAPPER_HOSTS=\"$ret->{RESOLV_WRAPPER_HOSTS}\" ";
+       }
+       $cmd .= "RESOLV_CONF=\"$ret->{RESOLV_CONF}\" ";
+       $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
+       $cmd .= "SELFTEST_WINBINDD_SOCKET_DIR=\"$ret->{SELFTEST_WINBINDD_SOCKET_DIR}\" ";
+       $cmd .= "$net join $ret->{CONFIGURATION}";
+       $cmd .= " -U$dcvars->{USERNAME}\%$dcvars->{PASSWORD}";
+
+       if (system($cmd) != 0) {
+           warn("Join failed\n$cmd");
+           return undef;
+       }
+
+       # We need world access to this share, as otherwise the domain
+       # administrator from the AD domain provided by Samba4 can't
+       # access the share for tests.
+       chmod 0777, "$prefix/share";
+
+       if (not $self->check_or_start(
+               env_vars => $ret,
+               nmbd => "yes",
+               winbindd => "yes",
+               smbd => "yes")) {
+               return undef;
+       }
+
+       $ret->{DC_SERVER} = $dcvars->{SERVER};
+       $ret->{DC_SERVER_IP} = $dcvars->{SERVER_IP};
+       $ret->{DC_SERVER_IPV6} = $dcvars->{SERVER_IPV6};
+       $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
+       $ret->{DC_USERNAME} = $dcvars->{USERNAME};
+       $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
+       $ret->{DOMAIN_ADMIN} = $dcvars->{DOMAIN_ADMIN};
+       $ret->{DOMAIN_ADMIN_PASSWORD} = $dcvars->{DOMAIN_ADMIN_PASSWORD};
+       $ret->{DOMAIN_USER} = $dcvars->{DOMAIN_USER};
+       $ret->{DOMAIN_USER_PASSWORD} = $dcvars->{DOMAIN_USER_PASSWORD};
 
        return $ret;
 }
@@ -1125,10 +1309,12 @@ sub setup_ad_member_idmap_rid
        idmap config * : range = 1000000-1999999
        idmap config $dcvars->{DOMAIN} : backend = rid
        idmap config $dcvars->{DOMAIN} : range = 2000000-2999999
-       # Prevent overridding the provisioned lib/krb5.conf which sets certain
+       # Prevent overriding the provisioned lib/krb5.conf which sets certain
        # values required for tests to succeed
        create krb5 conf = no
         map to guest = bad user
+       winbind expand groups = 10
+       server signing = required
 ";
 
        my $ret = $self->provision(
@@ -1142,7 +1328,6 @@ sub setup_ad_member_idmap_rid
 
        $ret or return undef;
 
-       close(USERMAP);
        $ret->{DOMAIN} = $dcvars->{DOMAIN};
        $ret->{REALM} = $dcvars->{REALM};
        $ret->{DOMSID} = $dcvars->{DOMSID};
@@ -1200,6 +1385,10 @@ sub setup_ad_member_idmap_rid
        $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
        $ret->{DC_USERNAME} = $dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
+       $ret->{DOMAIN_ADMIN} = $dcvars->{DOMAIN_ADMIN};
+       $ret->{DOMAIN_ADMIN_PASSWORD} = $dcvars->{DOMAIN_ADMIN_PASSWORD};
+       $ret->{DOMAIN_USER} = $dcvars->{DOMAIN_USER};
+       $ret->{DOMAIN_USER_PASSWORD} = $dcvars->{DOMAIN_USER_PASSWORD};
 
        return $ret;
 }
@@ -1226,9 +1415,12 @@ sub setup_ad_member_idmap_ad
        idmap config $dcvars->{DOMAIN} : range = 2000000-2999999
        idmap config $dcvars->{DOMAIN} : unix_primary_group = yes
        idmap config $dcvars->{DOMAIN} : unix_nss_info = yes
+       idmap config $dcvars->{DOMAIN} : deny ous = \"ou=sub,DC=samba2008r2,DC=example,DC=com\"
        idmap config $dcvars->{TRUST_DOMAIN} : backend = ad
        idmap config $dcvars->{TRUST_DOMAIN} : range = 2000000-2999999
        gensec_gssapi:requested_life_time = 5
+       winbind scan trusted domains = yes
+       winbind expand groups = 1
 ";
 
        my $ret = $self->provision(
@@ -1242,7 +1434,6 @@ sub setup_ad_member_idmap_ad
 
        $ret or return undef;
 
-       close(USERMAP);
        $ret->{DOMAIN} = $dcvars->{DOMAIN};
        $ret->{REALM} = $dcvars->{REALM};
        $ret->{DOMSID} = $dcvars->{DOMSID};
@@ -1300,6 +1491,10 @@ sub setup_ad_member_idmap_ad
        $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
        $ret->{DC_USERNAME} = $dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
+       $ret->{DOMAIN_ADMIN} = $dcvars->{DOMAIN_ADMIN};
+       $ret->{DOMAIN_ADMIN_PASSWORD} = $dcvars->{DOMAIN_ADMIN_PASSWORD};
+       $ret->{DOMAIN_USER} = $dcvars->{DOMAIN_USER};
+       $ret->{DOMAIN_USER_PASSWORD} = $dcvars->{DOMAIN_USER_PASSWORD};
 
        $ret->{TRUST_SERVER} = $dcvars->{TRUST_SERVER};
        $ret->{TRUST_USERNAME} = $dcvars->{TRUST_USERNAME};
@@ -1342,7 +1537,6 @@ sub setup_ad_member_oneway
 
        $ret or return undef;
 
-       close(USERMAP);
        $ret->{DOMAIN} = $dcvars->{DOMAIN};
        $ret->{REALM} = $dcvars->{REALM};
        $ret->{DOMSID} = $dcvars->{DOMSID};
@@ -1393,6 +1587,10 @@ sub setup_ad_member_oneway
        $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
        $ret->{DC_USERNAME} = $dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
+       $ret->{DOMAIN_ADMIN} = $dcvars->{DOMAIN_ADMIN};
+       $ret->{DOMAIN_ADMIN_PASSWORD} = $dcvars->{DOMAIN_ADMIN_PASSWORD};
+       $ret->{DOMAIN_USER} = $dcvars->{DOMAIN_USER};
+       $ret->{DOMAIN_USER_PASSWORD} = $dcvars->{DOMAIN_USER_PASSWORD};
 
        $ret->{TRUST_SERVER} = $dcvars->{TRUST_SERVER};
        $ret->{TRUST_USERNAME} = $dcvars->{TRUST_USERNAME};
@@ -1424,6 +1622,7 @@ sub setup_ad_member_fips
                                          $dcvars,
                                          $trustvars_f,
                                          $trustvars_e,
+                                         undef,
                                          1);
 }
 
@@ -1448,9 +1647,62 @@ sub setup_ad_member_offlogon
                                          $trustvars_f,
                                          $trustvars_e,
                                          undef,
+                                         undef,
                                          1);
 }
 
+sub setup_ad_member_idmap_nss
+{
+       my ($self,
+           $prefix,
+           $dcvars,
+           $trustvars_f,
+           $trustvars_e) = @_;
+
+       # If we didn't build with ADS, pretend this env was never available
+       if (not $self->have_ads()) {
+               return "UNKNOWN";
+       }
+
+       print "PROVISIONING AD MEMBER WITHOUT NSS WINBIND WITH idmap_nss config...";
+
+       my $extra_member_options = "
+       # bob:x:65521:65531:localbob gecos:/:/bin/false
+       # jane:x:65520:65531:localjane gecos:/:/bin/false
+       # jackthemapper:x:65519:65531:localjackthemaper gecos:/:/bin/false
+       # jacknomapper:x:65518:65531:localjacknomaper gecos:/:/bin/false
+       idmap config $dcvars->{DOMAIN} : backend = nss
+       idmap config $dcvars->{DOMAIN} : range = 65518-65521
+
+       # Support SMB1 so that we can use posix_whoami().
+       client min protocol = CORE
+       server min protocol = LANMAN1
+
+       username map = $prefix/lib/username.map
+";
+
+       my $ret = $self->provision_ad_member($prefix,
+                                            "ADMEMIDMAPNSS",
+                                            $dcvars,
+                                            $trustvars_f,
+                                            $trustvars_e,
+                                            $extra_member_options,
+                                            undef,
+                                            undef,
+                                            1);
+
+       open(USERMAP, ">$prefix/lib/username.map") or die("Unable to open $prefix/lib/username.map");
+       print USERMAP "
+!jacknomapper = \@jackthemappergroup
+!root = jacknomappergroup
+root = $dcvars->{DOMAIN}/root
+bob = $dcvars->{DOMAIN}/bob
+";
+       close(USERMAP);
+
+       return $ret;
+}
+
 sub setup_simpleserver
 {
        my ($self, $path) = @_;
@@ -1458,6 +1710,11 @@ sub setup_simpleserver
        print "PROVISIONING simple server...";
 
        my $prefix_abs = abs_path($path);
+       mkdir($prefix_abs, 0777);
+
+       my $external_streams_depot="$prefix_abs/external_streams_depot";
+       remove_tree($external_streams_depot);
+       mkdir($external_streams_depot, 0777);
 
        my $simpleserver_options = "
        lanman auth = yes
@@ -1465,6 +1722,7 @@ sub setup_simpleserver
        vfs objects = xattr_tdb streams_depot
        change notify = no
        server smb encrypt = off
+        allow trusted domains = no
 
 [vfs_aio_pthread]
        path = $prefix_abs/share
@@ -1489,31 +1747,11 @@ sub setup_simpleserver
        aio_pthread:aio open = yes
        smbd async dosmode = yes
 
-[vfs_aio_pthread_async_dosmode_force_sync1]
-       path = $prefix_abs/share
-       read only = no
-       vfs objects = aio_pthread
-       store dos attributes = yes
-       aio_pthread:aio open = yes
-       smbd async dosmode = yes
-       # This simulates non linux systems
-       smbd:force sync user path safe threadpool = yes
-       smbd:force sync user chdir safe threadpool = yes
-       smbd:force sync root path safe threadpool = yes
-       smbd:force sync root chdir safe threadpool = yes
-
-[vfs_aio_pthread_async_dosmode_force_sync2]
+[async_dosmode_shadow_copy2]
        path = $prefix_abs/share
        read only = no
-       vfs objects = aio_pthread xattr_tdb
-       store dos attributes = yes
-       aio_pthread:aio open = yes
+       vfs objects = shadow_copy2 xattr_tdb
        smbd async dosmode = yes
-       # This simulates non linux systems
-       smbd:force sync user path safe threadpool = yes
-       smbd:force sync user chdir safe threadpool = yes
-       smbd:force sync root path safe threadpool = yes
-       smbd:force sync root chdir safe threadpool = yes
 
 [vfs_aio_fork]
        path = $prefix_abs/share
@@ -1531,6 +1769,11 @@ sub setup_simpleserver
 [hidenewfiles]
        path = $prefix_abs/share
        hide new files timeout = 5
+
+[external_streams_depot]
+       path = $prefix_abs/share
+       read only = no
+       streams_depot:directory = $external_streams_depot
 ";
 
        my $vars = $self->provision(
@@ -1609,9 +1852,6 @@ sub setup_fileserver
        my $force_user_valid_users_dir = "$share_dir/force_user_valid_users";
        push(@dirs, $force_user_valid_users_dir);
 
-       my $smbget_sharedir="$share_dir/smbget";
-       push(@dirs,$smbget_sharedir);
-
        my $tarmode_sharedir="$share_dir/tarmode";
        push(@dirs,$tarmode_sharedir);
 
@@ -1630,10 +1870,24 @@ sub setup_fileserver
        my $bad_iconv_sharedir="$share_dir/bad_iconv";
        push(@dirs, $bad_iconv_sharedir);
 
+       my $veto_sharedir="$share_dir/veto";
+       push(@dirs,$veto_sharedir);
+
+       my $virusfilter_sharedir="$share_dir/virusfilter";
+       push(@dirs,$virusfilter_sharedir);
+
+       my $delete_unwrite_sharedir="$share_dir/delete_unwrite";
+       push(@dirs,$delete_unwrite_sharedir);
+       push(@dirs, "$delete_unwrite_sharedir/delete_veto_yes");
+       push(@dirs, "$delete_unwrite_sharedir/delete_veto_no");
+
+       my $volume_serial_number_sharedir="$share_dir/volume_serial_number";
+       push(@dirs, $volume_serial_number_sharedir);
+
        my $ip4 = Samba::get_ipv4_addr("FILESERVER");
        my $fileserver_options = "
+        smb3 unix extensions = yes
        kernel change notify = yes
-       rpc_server:mdssvc = embedded
        spotlight backend = elasticsearch
        elasticsearch:address = $ip4
        elasticsearch:port = 8080
@@ -1697,10 +1951,6 @@ sub setup_fileserver
        force group = everyone
        write list = force_user
 
-[smbget]
-       path = $smbget_sharedir
-       comment = smb username is [%U]
-       guest ok = yes
 [ign_sysacls]
        path = $share_dir
        comment = ignore system acls
@@ -1738,6 +1988,68 @@ sub setup_fileserver
        comment = smb username is [%U]
        vfs objects =
 
+[veto_files_nodelete]
+       path = $veto_sharedir
+       read only = no
+       msdfs root = yes
+       veto files = /veto_name*/
+       delete veto files = no
+
+[veto_files_delete]
+       path = $veto_sharedir
+       msdfs root = yes
+       veto files = /veto_name*/
+       delete veto files = yes
+
+[delete_veto_files_only]
+       path = $veto_sharedir
+       delete veto files = yes
+
+[veto_files_nohidden]
+       path = $veto_sharedir
+       veto files = /.*/
+
+[veto_files]
+       path = $veto_sharedir
+       veto files = /veto_name*/
+
+[delete_yes_unwrite]
+       read only = no
+       path = $delete_unwrite_sharedir
+       hide unwriteable files = yes
+       delete veto files = yes
+
+[delete_no_unwrite]
+       read only = no
+       path = $delete_unwrite_sharedir
+       hide unwriteable files = yes
+       delete veto files = no
+
+[virusfilter]
+       path = $virusfilter_sharedir
+       vfs objects = acl_xattr virusfilter
+       virusfilter:scanner = dummy
+       virusfilter:min file size = 0
+       virusfilter:infected files = *infected*
+       virusfilter:infected file action = rename
+       virusfilter:scan on close = yes
+       vfs_default:VFS_OPEN_HOW_RESOLVE_NO_SYMLINKS = no
+
+[volumeserialnumber]
+       path = $volume_serial_number_sharedir
+       volume serial number = 0xdeadbeef
+
+[ea_acl_xattr]
+       path = $share_dir
+       vfs objects = acl_xattr
+       acl_xattr:security_acl_name = user.hackme
+       read only = no
+
+[io_uring]
+       path = $share_dir
+       vfs objects = acl_xattr fake_acls xattr_tdb streams_depot time_audit full_audit io_uring
+       read only = no
+
 [homes]
        comment = Home directories
        browseable = No
@@ -1815,6 +2127,14 @@ sub setup_fileserver
        ##
        create_file_chmod("$bad_iconv_sharedir/\xED\x9F\xBF", 0644) or return undef;
 
+       ##
+       ## create unwritable files inside inside the delete unwrite veto share dirs.
+       ##
+       unlink("$delete_unwrite_sharedir/delete_veto_yes/file_444");
+       create_file_chmod("$delete_unwrite_sharedir/delete_veto_yes/file_444", 0444) or return undef;
+       unlink("$delete_unwrite_sharedir/delete_veto_no/file_444");
+       create_file_chmod("$delete_unwrite_sharedir/delete_veto_no/file_444", 0444) or return undef;
+
        return $vars;
 }
 
@@ -1826,6 +2146,7 @@ sub setup_fileserver_smb1
 [global]
        client min protocol = CORE
        server min protocol = LANMAN1
+       check parent directory delete on close = yes
 
 [hidenewfiles]
        path = $prefix_abs/share
@@ -1853,32 +2174,6 @@ sub setup_fileserver_smb1
        aio_pthread:aio open = yes
        smbd async dosmode = yes
 
-[vfs_aio_pthread_async_dosmode_force_sync1]
-       path = $prefix_abs/share
-       read only = no
-       vfs objects = aio_pthread
-       store dos attributes = yes
-       aio_pthread:aio open = yes
-       smbd async dosmode = yes
-       # This simulates non linux systems
-       smbd:force sync user path safe threadpool = yes
-       smbd:force sync user chdir safe threadpool = yes
-       smbd:force sync root path safe threadpool = yes
-       smbd:force sync root chdir safe threadpool = yes
-
-[vfs_aio_pthread_async_dosmode_force_sync2]
-       path = $prefix_abs/share
-       read only = no
-       vfs objects = aio_pthread xattr_tdb
-       store dos attributes = yes
-       aio_pthread:aio open = yes
-       smbd async dosmode = yes
-       # This simulates non linux systems
-       smbd:force sync user path safe threadpool = yes
-       smbd:force sync user chdir safe threadpool = yes
-       smbd:force sync root path safe threadpool = yes
-       smbd:force sync root chdir safe threadpool = yes
-
 [vfs_aio_fork]
        path = $prefix_abs/share
         vfs objects = aio_fork
@@ -1909,7 +2204,6 @@ sub setup_ktest
         workgroup = KTEST
         realm = ktest.samba.example.com
        security = ads
-        username map = $prefix/lib/username.map
         server signing = required
        server min protocol = SMB3_00
        client max protocol = SMB3
@@ -1917,6 +2211,10 @@ sub setup_ktest
         # This disables NTLM auth against the local SAM, which
         # we use can then test this setting by.
         ntlm auth = disabled
+
+        idmap config * : backend = autorid
+        idmap config * : range = 1000000-1999999
+        idmap config * : rangesize = 100000
 ";
 
        my $ret = $self->provision(
@@ -1942,12 +2240,6 @@ sub setup_ktest
 
        $ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
 
-       open(USERMAP, ">$prefix/lib/username.map") or die("Unable to open $prefix/lib/username.map");
-       print USERMAP "
-$ret->{USERNAME} = KTEST\\Administrator
-";
-       close(USERMAP);
-
 #This is the secrets.tdb created by 'net ads join' from Samba3 to a
 #Samba4 DC with the same parameters as are being used here.  The
 #domain SID is S-1-5-21-1071277805-689288055-3486227160
@@ -1999,6 +2291,7 @@ $ret->{USERNAME} = KTEST\\Administrator
        if (not $self->check_or_start(
                env_vars => $ret,
                nmbd => "yes",
+               winbindd => "offline",
                smbd => "yes")) {
               return undef;
        }
@@ -2016,8 +2309,10 @@ sub setup_maptoguest
        print "PROVISIONING maptoguest...";
 
        my $options = "
+domain logons = yes
 map to guest = bad user
 ntlm auth = yes
+server min protocol = LANMAN1
 
 [force_user_error_inject]
        path = $share_dir
@@ -2038,6 +2333,7 @@ ntlm auth = yes
        if (not $self->check_or_start(
                env_vars => $vars,
                nmbd => "yes",
+               winbindd => "yes",
                smbd => "yes")) {
               return undef;
        }
@@ -2079,7 +2375,7 @@ sub make_bin_cmd
 {
        my ($self, $binary, $env_vars, $options, $valgrind, $dont_log_stdout) = @_;
 
-       my @optargs = ("-d0");
+       my @optargs = ();
        if (defined($options)) {
                @optargs = split(/ /, $options);
        }
@@ -2104,8 +2400,8 @@ sub check_or_start($$) {
        my $nmbd = $args{nmbd} // "no";
        my $winbindd = $args{winbindd} // "no";
        my $smbd = $args{smbd} // "no";
+       my $samba_dcerpcd = $args{samba_dcerpcd} // "no";
        my $child_cleanup = $args{child_cleanup};
-       my $skip_wait = $args{skip_wait} // 0;
 
        my $STDIN_READER;
 
@@ -2114,16 +2410,47 @@ sub check_or_start($$) {
        # exit when the test script exits
        pipe($STDIN_READER, $env_vars->{STDIN_PIPE});
 
-       my $binary = Samba::bindir_path($self, "nmbd");
-       my @full_cmd = $self->make_bin_cmd($binary, $env_vars,
-                                          $ENV{NMBD_OPTIONS}, $ENV{NMBD_VALGRIND},
-                                          $ENV{NMBD_DONT_LOG_STDOUT});
+       my $binary = Samba::bindir_path($self, "samba-dcerpcd");
+       my @full_cmd = $self->make_bin_cmd(
+           $binary,
+           $env_vars,
+           $ENV{SAMBA_DCERPCD_OPTIONS},
+           $ENV{SAMBA_DCERPCD_VALGRIND},
+           $ENV{SAMBA_DCERPCD_DONT_LOG_STDOUT});
+       push(@full_cmd, '--libexec-rpcds');
+
+       my $samba_dcerpcd_envs = Samba::get_env_for_process(
+           "samba_dcerpcd", $env_vars);
+
+       # fork and exec() samba_dcerpcd in the child process
+       my $daemon_ctx = {
+               NAME => "samba_dcerpcd",
+               BINARY_PATH => $binary,
+               FULL_CMD => [ @full_cmd ],
+               LOG_FILE => $env_vars->{SAMBA_DCERPCD_TEST_LOG},
+               PCAP_FILE => "env-$ENV{ENVNAME}-samba_dcerpcd",
+               ENV_VARS => $samba_dcerpcd_envs,
+       };
+       if ($samba_dcerpcd ne "yes") {
+               $daemon_ctx->{SKIP_DAEMON} = 1;
+       }
+
+       my $pid = Samba::fork_and_exec(
+           $self, $env_vars, $daemon_ctx, $STDIN_READER, $child_cleanup);
+
+       $env_vars->{SAMBA_DCERPCD_TL_PID} = $pid;
+       write_pid($env_vars, "samba_dcerpcd", $pid);
+
+       $binary = Samba::bindir_path($self, "nmbd");
+       @full_cmd = $self->make_bin_cmd($binary, $env_vars,
+                                       $ENV{NMBD_OPTIONS}, $ENV{NMBD_VALGRIND},
+                                       $ENV{NMBD_DONT_LOG_STDOUT});
        my $nmbd_envs = Samba::get_env_for_process("nmbd", $env_vars);
        delete $nmbd_envs->{RESOLV_WRAPPER_CONF};
        delete $nmbd_envs->{RESOLV_WRAPPER_HOSTS};
 
        # fork and exec() nmbd in the child process
-       my $daemon_ctx = {
+       $daemon_ctx = {
                NAME => "nmbd",
                BINARY_PATH => $binary,
                FULL_CMD => [ @full_cmd ],
@@ -2134,7 +2461,7 @@ sub check_or_start($$) {
        if ($nmbd ne "yes") {
                $daemon_ctx->{SKIP_DAEMON} = 1;
        }
-       my $pid = Samba::fork_and_exec(
+       $pid = Samba::fork_and_exec(
            $self, $env_vars, $daemon_ctx, $STDIN_READER, $child_cleanup);
 
        $env_vars->{NMBD_TL_PID} = $pid;
@@ -2154,7 +2481,7 @@ sub check_or_start($$) {
                LOG_FILE => $env_vars->{WINBINDD_TEST_LOG},
                PCAP_FILE => "env-$ENV{ENVNAME}-winbindd",
        };
-       if ($winbindd ne "yes") {
+       if ($winbindd ne "yes" and $winbindd ne "offline") {
                $daemon_ctx->{SKIP_DAEMON} = 1;
        }
 
@@ -2190,11 +2517,11 @@ sub check_or_start($$) {
        # close the parent's read-end of the pipe
        close($STDIN_READER);
 
-       if ($skip_wait) {
-               return 1;
-       }
-
-       return $self->wait_for_start($env_vars, $nmbd, $winbindd, $smbd);
+       return $self->wait_for_start($env_vars,
+                               $nmbd,
+                               $winbindd,
+                               $smbd,
+                               $samba_dcerpcd);
 }
 
 sub createuser($$$$$)
@@ -2306,6 +2633,15 @@ sub provision($$)
        my $msdfs_shrdir="$shrdir/msdfsshare";
        push(@dirs,$msdfs_shrdir);
 
+       my $msdfs_shrdir2="$shrdir/msdfsshare2";
+       push(@dirs,$msdfs_shrdir2);
+
+       my $msdfs_pathname_share="$shrdir/msdfs_pathname_share";
+       push(@dirs,$msdfs_pathname_share);
+
+       my $non_msdfs_pathname_share="$shrdir/non_msdfs_pathname_share";
+       push(@dirs,$non_msdfs_pathname_share);
+
        my $msdfs_deeppath="$msdfs_shrdir/deeppath";
        push(@dirs,$msdfs_deeppath);
 
@@ -2351,13 +2687,28 @@ sub provision($$)
        my $local_symlinks_shrdir="$shrdir/local_symlinks";
        push(@dirs,$local_symlinks_shrdir);
 
+       my $worm_shrdir="$shrdir/worm";
+       push(@dirs,$worm_shrdir);
+
+       my $fruit_resource_stream_shrdir="$shrdir/fruit_resource_stream";
+       push(@dirs,$fruit_resource_stream_shrdir);
+
+       my $smbget_sharedir="$shrdir/smbget";
+       push(@dirs, $smbget_sharedir);
+
+       my $recycle_shrdir="$shrdir/recycle";
+       push(@dirs,$recycle_shrdir);
+
+       my $fakedircreatetimes_shrdir="$shrdir/fakedircreatetimes";
+       push(@dirs,$fakedircreatetimes_shrdir);
+
        # this gets autocreated by winbindd
        my $wbsockdir="$prefix_abs/wbsock";
 
        my $nmbdsockdir="$prefix_abs/nmbd";
        unlink($nmbdsockdir);
 
-       ## 
+       ##
        ## create the test directory layout
        ##
        die ("prefix_abs = ''") if $prefix_abs eq "";
@@ -2390,6 +2741,7 @@ sub provision($$)
 
        chmod 0755, $ro_shrdir;
 
+       create_file_chmod("$ro_shrdir/readable_file", 0644) or return undef;
        create_file_chmod("$ro_shrdir/unreadable_file", 0600) or return undef;
 
        create_file_chmod("$ro_shrdir/msdfs-target", 0600) or return undef;
@@ -2399,6 +2751,8 @@ sub provision($$)
        symlink "msdfs:$server_ip\\smbcacls_sharedir_dfs,$server_ipv6\\smbcacls_sharedir_dfs",
                "$msdfs_shrdir/smbcacls_sharedir_dfs";
 
+       symlink "msdfs:$server_ip\\msdfs-share2,$server_ipv6\\msdfs-share2", "$msdfs_shrdir/dfshop1";
+       symlink "msdfs:$server_ip\\tmp,$server_ipv6\\tmp", "$msdfs_shrdir2/dfshop2";
        ##
        ## create bad names in $badnames_shrdir
        ##
@@ -2427,7 +2781,7 @@ sub provision($$)
        create_file_chmod("$widelinks_target", 0666) or return undef;
 
        ##
-       ## This link should get ACCESS_DENIED
+       ## This link should get an error
        ##
        symlink "$widelinks_target", "$widelinks_shrdir/source";
        ##
@@ -2440,6 +2794,8 @@ sub provision($$)
        my $errorinjectconf="$libdir/error_inject.conf";
        my $delayinjectconf="$libdir/delay_inject.conf";
        my $globalinjectconf="$libdir/global_inject.conf";
+       my $aliceconfdir="$libdir";
+       my $aliceconffile="$libdir/alice.conf";
 
        my $nss_wrapper_pl = "$ENV{PERL} $self->{srcdir}/third_party/nss_wrapper/nss_wrapper.pl";
        my $nss_wrapper_passwd = "$privatedir/passwd";
@@ -2465,11 +2821,17 @@ sub provision($$)
        my ($gid_nobody, $gid_nogroup, $gid_root, $gid_domusers, $gid_domadmins);
        my ($gid_userdup, $gid_everyone);
        my ($gid_force_user);
+       my ($gid_jackthemapper);
+       my ($gid_jacknomapper);
        my ($uid_user1);
        my ($uid_user2);
        my ($uid_gooduser);
        my ($uid_eviluser);
        my ($uid_slashuser);
+       my ($uid_localbob);
+       my ($uid_localjane);
+       my ($uid_localjackthemapper);
+       my ($uid_localjacknomapper);
 
        if ($unix_uid < 0xffff - 13) {
                $max_uid = 0xffff;
@@ -2490,6 +2852,10 @@ sub provision($$)
        $uid_gooduser = $max_uid - 11;
        $uid_eviluser = $max_uid - 12;
        $uid_slashuser = $max_uid - 13;
+       $uid_localbob = $max_uid - 14;
+       $uid_localjane = $max_uid - 15;
+       $uid_localjackthemapper = $max_uid - 16;
+       $uid_localjacknomapper = $max_uid - 17;
 
        if ($unix_gids[0] < 0xffff - 8) {
                $max_gid = 0xffff;
@@ -2505,6 +2871,8 @@ sub provision($$)
        $gid_userdup = $max_gid - 6;
        $gid_everyone = $max_gid - 7;
        $gid_force_user = $max_gid - 8;
+       $gid_jackthemapper = $max_gid - 9;
+       $gid_jacknomapper = $max_gid - 10;
 
        ##
        ## create conffile
@@ -2526,6 +2894,7 @@ sub provision($$)
        panic action = cd $self->{srcdir} && $self->{srcdir}/selftest/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
        smbd:suicide mode = yes
        smbd:FSCTL_SMBTORTURE = yes
+       smbd:validate_oplock_types = yes
 
        client min protocol = SMB2_02
        server min protocol = SMB2_02
@@ -2540,9 +2909,13 @@ sub provision($$)
        lock directory = $lockdir
        log file = $logdir/log.\%m
        log level = $server_log_level
+       winbind debug traceid = yes
        debug pid = yes
         max log size = 0
 
+       debug syslog format = always
+       debug hires timestamp = yes
+
        state directory = $lockdir
        cache directory = $lockdir
 
@@ -2710,6 +3083,23 @@ sub provision($$)
        msdfs root = yes
        msdfs shuffle referrals = yes
        guest ok = yes
+[msdfs-share-wl]
+       path = $msdfs_shrdir
+       msdfs root = yes
+       wide links = yes
+       guest ok = yes
+[msdfs-share2]
+       path = $msdfs_shrdir2
+       msdfs root = yes
+       guest ok = yes
+[msdfs-pathname-share]
+       path = $msdfs_pathname_share
+       msdfs root = yes
+       guest ok = yes
+[non-msdfs-pathname-share]
+       path = $non_msdfs_pathname_share
+       msdfs root = no
+       guest ok = yes
 [hideunread]
        copy = tmp
        hide unreadable = yes
@@ -2811,6 +3201,14 @@ sub provision($$)
        directory mask = 0777
        force directory mode = 0
        vfs objects = xattr_tdb streams_depot
+[smb3_posix_share]
+       vfs objects = fake_acls xattr_tdb streams_depot time_audit full_audit
+       create mask = 07777
+       directory mask = 07777
+       mangled names = no
+       path = $shrdir
+       read only = no
+       guest ok = yes
 [aio]
        copy = durable
        aio read size = 1
@@ -2892,6 +3290,13 @@ sub provision($$)
        fruit:resource = file
        fruit:metadata = stream
        fruit:zero_file_id=yes
+       fruit:validate_afpinfo = no
+
+[fruit_resource_stream]
+       path = $fruit_resource_stream_shrdir
+       vfs objects = fruit streams_xattr acl_xattr xattr_tdb
+       fruit:resource = stream
+       fruit:metadata = stream
 
 [badname-tmp]
        path = $badnames_shrdir
@@ -2913,7 +3318,7 @@ sub provision($$)
 
 [fsrvp_share]
        path = $fsrvp_shrdir
-       comment = fake shapshots using rsync
+       comment = fake snapshots using rsync
        vfs objects = shell_snap shadow_copy2
        shell_snap:check path command = $fake_snap_pl --check
        shell_snap:create command = $fake_snap_pl --create
@@ -3057,11 +3462,15 @@ sub provision($$)
 [shadow_write]
        path = $shadow_tstdir
        comment = previous versions snapshots under mount point
-       vfs objects = shadow_copy2 streams_xattr error_inject
-       aio write size = 0
-       error_inject:pwrite = EBADF
+       vfs objects = shadow_copy2 streams_xattr
        shadow:mountpoint = $shadow_tstdir
        shadow:fixinodes = yes
+       smbd async dosmode = yes
+
+[shadow_depot]
+       path = $shadow_shrdir
+       comment = previous versions with streams_depot
+       vfs objects = streams_depot shadow_copy2
 
 [dfq]
        path = $shrdir/dfree
@@ -3100,12 +3509,22 @@ sub provision($$)
        copy = tmp
        path = $nosymlinks_shrdir
        follow symlinks = no
+[nosymlinks_smb1allow]
+       copy=nosymlinks
+       follow symlinks = yes
 
 [local_symlinks]
        copy = tmp
        path = $local_symlinks_shrdir
        follow symlinks = yes
 
+[worm]
+       copy = tmp
+       path = $worm_shrdir
+       vfs objects = worm
+       worm:grace_period = 1
+       comment = vfs_worm with 1s grace_period
+
 [kernel_oplocks]
        copy = tmp
        kernel oplocks = yes
@@ -3115,6 +3534,18 @@ sub provision($$)
        copy = tmp
        vfs objects = streams_xattr xattr_tdb
 
+[streams_xattr_nostrict]
+       copy = tmp
+       strict rename = no
+       vfs objects = streams_xattr xattr_tdb
+
+[acl_streams_xattr]
+       copy = tmp
+       vfs objects = acl_xattr streams_xattr fake_acls xattr_tdb
+       acl_xattr:ignore system acls = yes
+       acl_xattr:security_acl_name = user.acl
+       xattr_tdb:ignore_user_xattr = yes
+
 [compound_find]
        copy = tmp
        smbd:find async delay usec = 10000
@@ -3170,6 +3601,42 @@ sub provision($$)
 [acls_non_canonical]
        copy = tmp
        acl flag inherited canonicalization = no
+
+[full_audit_success_bad_name]
+       copy = tmp
+       full_audit:success = badname
+
+[full_audit_fail_bad_name]
+       copy = tmp
+       full_audit:failure = badname
+
+[only_ipv6]
+       copy = tmpguest
+       server addresses = $server_ipv6
+
+[smbget]
+       path = $smbget_sharedir
+       comment = smb username is [%U]
+
+[recycle]
+       copy = tmp
+       path = $recycle_shrdir
+       vfs objects = recycle
+       recycle : repository = .trash
+       recycle : exclude = *.tmp
+       recycle : directory_mode = 755
+
+[fakedircreatetimes]
+       copy = tmp
+       path = $fakedircreatetimes_shrdir
+       fake directory create times = yes
+
+[smbget_guest]
+       path = $smbget_sharedir
+       comment = smb username is [%U]
+       guest ok = yes
+
+include = $aliceconfdir/%U.conf
        ";
 
        close(CONF);
@@ -3210,6 +3677,19 @@ sub provision($$)
        }
        close(DELAYCONF);
 
+       unless (open(ALICECONF, ">$aliceconffile")) {
+               warn("Unable to open $aliceconffile");
+               return undef;
+       }
+
+       print ALICECONF "
+[alice_share]
+       path = $shrdir
+       comment = smb username is [%U]
+       ";
+
+       close(ALICECONF);
+
        ##
        ## create a test account
        ##
@@ -3217,7 +3697,7 @@ sub provision($$)
        unless (open(PASSWD, ">$nss_wrapper_passwd")) {
            warn("Unable to open $nss_wrapper_passwd");
            return undef;
-        } 
+        }
        print PASSWD "nobody:x:$uid_nobody:$gid_nobody:nobody gecos:$prefix_abs:/bin/false
 $unix_name:x:$unix_uid:$unix_gids[0]:$unix_name gecos:$prefix_abs:/bin/false
 pdbtest:x:$uid_pdbtest:$gid_nogroup:pdbtest gecos:$prefix_abs:/bin/false
@@ -3231,6 +3711,10 @@ user2:x:$uid_user2:$gid_nogroup:user2 gecos:$prefix_abs:/bin/false
 gooduser:x:$uid_gooduser:$gid_domusers:gooduser gecos:$prefix_abs:/bin/false
 eviluser:x:$uid_eviluser:$gid_domusers:eviluser gecos::/bin/false
 slashuser:x:$uid_slashuser:$gid_domusers:slashuser gecos:/:/bin/false
+bob:x:$uid_localbob:$gid_domusers:localbob gecos:/:/bin/false
+jane:x:$uid_localjane:$gid_domusers:localjane gecos:/:/bin/false
+jackthemapper:x:$uid_localjackthemapper:$gid_domusers:localjackthemaper gecos:/:/bin/false
+jacknomapper:x:$uid_localjacknomapper:$gid_domusers:localjacknomaper gecos:/:/bin/false
 ";
        if ($unix_uid != 0) {
                print PASSWD "root:x:$uid_root:$gid_root:root gecos:$prefix_abs:/bin/false
@@ -3250,6 +3734,8 @@ domadmins:X:$gid_domadmins:
 userdup:x:$gid_userdup:$unix_name
 everyone:x:$gid_everyone:
 force_user:x:$gid_force_user:
+jackthemappergroup:x:$gid_jackthemapper:jackthemapper
+jacknomappergroup:x:$gid_jacknomapper:jacknomapper
 ";
        if ($unix_gids[0] != 0) {
                print GROUP "root:x:$gid_root:
@@ -3279,7 +3765,7 @@ force_user:x:$gid_force_user:
        $createuser_env{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
        $createuser_env{NSS_WRAPPER_GROUP} = $nss_wrapper_group;
        $createuser_env{NSS_WRAPPER_HOSTS} = $nss_wrapper_hosts;
-       $createuser_env{NSS_WRAPPER_HOSTNAME} = "${hostname}.samba.example.com";
+       $createuser_env{NSS_WRAPPER_HOSTNAME} = "${hostname}.${dns_domain}";
        if ($ENV{SAMBA_DNS_FAKING}) {
                $createuser_env{RESOLV_WRAPPER_HOSTS} = $dns_host_file;
        } else {
@@ -3295,6 +3781,8 @@ force_user:x:$gid_force_user:
        createuser($self, "gooduser", $password, $conffile, \%createuser_env) || die("Unable to create gooduser");
        createuser($self, "eviluser", $password, $conffile, \%createuser_env) || die("Unable to create eviluser");
        createuser($self, "slashuser", $password, $conffile, \%createuser_env) || die("Unable to create slashuser");
+       createuser($self, "jackthemapper", "mApsEcrEt", $conffile, \%createuser_env) || die("Unable to create jackthemapper");
+       createuser($self, "jacknomapper", "nOmApsEcrEt", $conffile, \%createuser_env) || die("Unable to create jacknomapper");
 
        open(DNS_UPDATE_LIST, ">$prefix/dns_update_list") or die("Unable to open $$prefix/dns_update_list");
        print DNS_UPDATE_LIST "A $server. $server_ip\n";
@@ -3305,6 +3793,8 @@ force_user:x:$gid_force_user:
 
        $ret{SERVER_IP} = $server_ip;
        $ret{SERVER_IPV6} = $server_ipv6;
+       $ret{SAMBA_DCERPCD_TEST_LOG} = "$prefix/samba_dcerpcd_test.log";
+       $ret{SAMBA_DCERPCD_LOG_POS} = 0;
        $ret{NMBD_TEST_LOG} = "$prefix/nmbd_test.log";
        $ret{NMBD_TEST_LOG_POS} = 0;
        $ret{WINBINDD_TEST_LOG} = "$prefix/winbindd_test.log";
@@ -3320,7 +3810,7 @@ force_user:x:$gid_force_user:
        $ret{USERID} = $unix_uid;
        $ret{DOMAIN} = $domain;
        $ret{SAMSID} = $samsid;
-       $ret{NETBIOSNAME} = $server;
+       $ret{NETBIOSNAME} = $netbios_name;
        $ret{PASSWORD} = $password;
        $ret{PIDDIR} = $piddir;
        $ret{SELFTEST_WINBINDD_SOCKET_DIR} = $wbsockdir;
@@ -3329,7 +3819,7 @@ force_user:x:$gid_force_user:
        $ret{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
        $ret{NSS_WRAPPER_GROUP} = $nss_wrapper_group;
        $ret{NSS_WRAPPER_HOSTS} = $nss_wrapper_hosts;
-       $ret{NSS_WRAPPER_HOSTNAME} = "${hostname}.samba.example.com";
+       $ret{NSS_WRAPPER_HOSTNAME} = "${hostname}.${dns_domain}";
        $ret{NSS_WRAPPER_MODULE_SO_PATH} = Samba::nss_wrapper_winbind_so_path($self);
        $ret{NSS_WRAPPER_MODULE_FN_PREFIX} = "winbind";
        if ($ENV{SAMBA_DNS_FAKING}) {
@@ -3357,11 +3847,33 @@ force_user:x:$gid_force_user:
 
 sub wait_for_start($$$$$)
 {
-       my ($self, $envvars, $nmbd, $winbindd, $smbd) = @_;
+       my ($self, $envvars, $nmbd, $winbindd, $smbd, $samba_dcerpcd) = @_;
        my $cmd;
        my $netcmd;
        my $ret;
 
+       if ($samba_dcerpcd eq "yes") {
+           my $count = 0;
+           my $rpcclient = Samba::bindir_path($self, "rpcclient");
+
+           print "checking for samba_dcerpcd\n";
+
+           do {
+               $ret = system("UID_WRAPPER_ROOT=1 $rpcclient $envvars->{CONFIGURATION} ncalrpc: -c epmmap");
+
+               if ($ret != 0) {
+                   sleep(1);
+               }
+               $count++
+           } while ($ret != 0 && $count < 10);
+
+           if ($count == 10) {
+               print "samba_dcerpcd not reachable after 10 retries\n";
+               teardown_env($self, $envvars);
+               return 0;
+           }
+       }
+
        if ($nmbd eq "yes") {
                my $count = 0;
 
@@ -3390,13 +3902,17 @@ sub wait_for_start($$$$$)
                }
        }
 
-       if ($winbindd eq "yes") {
+       if ($winbindd eq "yes" or $winbindd eq "offline") {
            print "checking for winbindd\n";
            my $count = 0;
            $cmd = "SELFTEST_WINBINDD_SOCKET_DIR='$envvars->{SELFTEST_WINBINDD_SOCKET_DIR}' ";
            $cmd .= "NSS_WRAPPER_PASSWD='$envvars->{NSS_WRAPPER_PASSWD}' ";
            $cmd .= "NSS_WRAPPER_GROUP='$envvars->{NSS_WRAPPER_GROUP}' ";
-           $cmd .= Samba::bindir_path($self, "wbinfo") . " --ping-dc";
+           if ($winbindd eq "yes") {
+               $cmd .= Samba::bindir_path($self, "wbinfo") . " --ping-dc";
+           } elsif ($winbindd eq "offline") {
+               $cmd .= Samba::bindir_path($self, "wbinfo") . " --ping";
+           }
 
            do {
                $ret = system($cmd);
@@ -3685,6 +4201,24 @@ sub provision_ctdb($$$$)
        $ret{CTDB_NODES} = \@nodes;
        $ret{CTDB_NODES_FILE} = $nodes_file;
 
+       for (my $i = 0; $i < $num_nodes; $i++) {
+               my $node = $nodes[$i];
+               my $socket = $node->{SOCKET_FILE};
+               my $server_name = $node->{SERVER_NAME};
+               my $node_prefix = $node->{NODE_PREFIX};
+               my $ip = $node->{IP};
+
+               $ret{"CTDB_BASE_NODE${i}"} = $node_prefix;
+               $ret{"CTDB_SOCKET_NODE${i}"} = $socket;
+               $ret{"CTDB_SERVER_NAME_NODE${i}"} = $server_name;
+               $ret{"CTDB_IFACE_IP_NODE${i}"} = $ip;
+       }
+
+       $ret{CTDB_BASE} = $ret{CTDB_BASE_NODE0};
+       $ret{CTDB_SOCKET} = $ret{CTDB_SOCKET_NODE0};
+       $ret{CTDB_SERVER_NAME} = $ret{CTDB_SERVER_NAME_NODE0};
+       $ret{CTDB_IFACE_IP} = $ret{CTDB_IFACE_IP_NODE0};
+
        return \%ret;
 }