[SCM] Samba Shared Repository - branch v4-17-test updated

Jule Anger janger at samba.org
Fri Apr 14 13:31:02 UTC 2023


The branch, v4-17-test has been updated
       via  8011cea58e3 rpcd_mdssvc: initialize POSIX locking
       via  0c633912732 smbXsrv_tcon: avoid storing temporary (invalid!) records.
       via  fd477e4ff6f net_ads: fill ads->auth.realm from c->creds
       via  45a264bf5b6 testprogs/blackbox: add test_net_ads_search_server.sh
      from  d8fa74a176e smbd: Fix case normalization in for directories

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-17-test


- Log -----------------------------------------------------------------
commit 8011cea58e34d1b348671ee7884bd68026568af3
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Apr 6 10:16:46 2023 +0200

    rpcd_mdssvc: initialize POSIX locking
    
    Otherwise the posix_pending_close_db is NULL and we crash when trying to close a
    file descriptor:
    
       #4 /usr/lib64/samba/libdbwrap-samba4.so(dbwrap_parse_record+0xe) [0x7fbc5d05c8ae]
       #5 /usr/lib64/samba/libdbwrap-samba4.so(dbwrap_fetch_int32+0x38) [0x7fbc5d05d438]
       #6 /usr/lib64/samba/libsmbd-base-samba4.so(fd_close_posix+0x7b) [0x7fbc5e276f8b]
       #7 /usr/lib64/samba/libsmbd-base-samba4.so(+0x57900) [0x7fbc5e28a900]
       #8 /usr/lib64/samba/libsmbd-base-samba4.so(fd_close+0x68) [0x7fbc5e2b7ea8]
       #9 /usr/lib64/samba/libsmbd-base-samba4.so(+0x62608) [0x7fbc5e295608]
       #10 /usr/lib64/samba/libtalloc-samba4.so(_talloc_free+0x51b) [0x7fbc5d9f439b]
       #11 /usr/lib64/samba/vfs/fruit.so(+0xcac2) [0x7fbc45fcdac2]
       #12 /usr/lib64/samba/vfs/fruit.so(+0xcbdd) [0x7fbc45fcdbdd]
       #13 /usr/lib64/samba/vfs/fruit.so(+0xf603) [0x7fbc45fd0603]
       #14 /usr/lib64/samba/libsmbd-base-samba4.so(+0x56375) [0x7fbc5e289375]
       #15 /usr/lib64/samba/vfs/nothingtoseeherereally.so(+0x196c) [0x7fbc467f996c]
       #16 /usr/lib64/samba/vfs/streams_xattr.so(+0x51fc) [0x7fbc461e71fc]
       #17 /usr/lib64/samba/libsmbd-base-samba4.so(+0xade3a) [0x7fbc5e2e0e3a]
       #18 /usr/lib64/samba/libsmbd-base-samba4.so(create_conn_struct_cwd+0x44) [0x7fbc5e2e1cf4]
       #19 /usr/libexec/samba/rpcd_mdssvc(mds_init_ctx+0x2c3) [0x563fdac08f03]
       #20 /usr/libexec/samba/rpcd_mdssvc(_mdssvc_open+0x141) [0x563fdac0b4d1]
    
    The corresponding open is done as part of initializing a connection_struct
    object, where we chdir() and stat() the root path of the share. The stat() in
    vfs_fruit causes an expensive metadata request on the path which triggers an
    internal open of a pathref handle. Note that this only affects servers that have
    fruit:metadata = netatalk set, which is the default unfortunately.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15354
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Fri Apr  7 21:12:21 UTC 2023 on atb-devel-224
    
    (cherry picked from commit 3633027e49aec064e7d890a1f7ec4d81711a5de7)
    
    Autobuild-User(v4-17-test): Jule Anger <janger at samba.org>
    Autobuild-Date(v4-17-test): Fri Apr 14 13:30:54 UTC 2023 on sn-devel-184

commit 0c633912732292f114496773150727fcd39d6400
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Apr 5 16:59:44 2023 +0200

    smbXsrv_tcon: avoid storing temporary (invalid!) records.
    
    We used to store smbXsrv_tcon_global.tdb records in two steps,
    first we created a record in order to allocate the tcon id.
    The temporary record had a NULL share_name, which translated
    into 0 bytes for the string during ndr_push_smbXsrv_tcon_global0.
    
    The problem is that ndr_pull_smbXsrv_tcon_global0 fails on
    this with something like:
    
    Invalid record in smbXsrv_tcon_global.tdb:key '2CA0ED4A' ndr_pull_struct_blob(length=85) - Buffer Size Error
    
    The blob looks like this:
    
    [0000] 00 00 00 00 01 00 00 00   00 00 00 00 00 00 02 00   ........  ........
    [0010] 00 00 00 00 4A ED A0 2C   4A ED A0 2C 00 00 00 00   ....J.., J..,....
    [0020] F8 4B 00 00 00 00 00 00   00 00 00 00 FF FF FF FF   .K......  ........
    [0030] 4D 59 9B 9F 83 F4 35 20   36 D2 B0 82 62 68 D9 01   MY....5 6...bh..
    [0040] 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00   ........  ........
    [0050] 00 00 00 00 00                                      .....
    
    The reason for having a temporary entry was just based on
    the fact, that it was easier to keep the logic in
    make_connection_snum() untouched.
    
    But we have all information available in order to store
    the final record directly. We only need to do the
    "max connections" check first.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15353
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    (cherry picked from commit e0e58ed0e2429f01265d544b444bf0e4075549e2)

commit fd477e4ff6f90568648059280cbf80f241ba3248
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 2 14:46:25 2023 +0100

    net_ads: fill ads->auth.realm from c->creds
    
    We get the realm we use for authentication needs to
    the realm belonging to the username we use.
    
    We derive the username from c->creds, so we need to
    do the same for the realm.
    
    Otherwise we try to authenticate as the wrong user.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15323
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    (cherry picked from commit 0ef53b948e13eb36b536228cccd89aa4c2adbb90)

commit 45a264bf5b6cd8116ed9c45086163d33da9ea7a4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Apr 5 16:45:21 2023 +0200

    testprogs/blackbox: add test_net_ads_search_server.sh
    
    This reproduces a regression with
    'net ads search -P --server server.of.trusted.domain'
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15323
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    (cherry picked from commit 3b585f9e8cc320841fab4cd5c3be53788d0a87ac)

-----------------------------------------------------------------------

Summary of changes:
 source3/rpc_server/rpcd_mdssvc.c                 |  8 ++++
 source3/smbd/globals.h                           |  5 ++
 source3/smbd/smb1_service.c                      | 48 ++++++++++++--------
 source3/smbd/smb2_service.c                      | 15 ------
 source3/smbd/smb2_tcon.c                         | 58 ++++++++++++++----------
 source3/smbd/smbXsrv_tcon.c                      | 29 +++++++++++-
 source3/utils/net_ads.c                          | 10 +++-
 source4/selftest/tests.py                        | 11 +++++
 testprogs/blackbox/test_net_ads_search_server.sh | 37 +++++++++++++++
 9 files changed, 160 insertions(+), 61 deletions(-)
 create mode 100755 testprogs/blackbox/test_net_ads_search_server.sh


Changeset truncated at 500 lines:

diff --git a/source3/rpc_server/rpcd_mdssvc.c b/source3/rpc_server/rpcd_mdssvc.c
index c5b632099fa..4040ae9e0d8 100644
--- a/source3/rpc_server/rpcd_mdssvc.c
+++ b/source3/rpc_server/rpcd_mdssvc.c
@@ -16,6 +16,7 @@
  */
 
 #include "includes.h"
+#include "source3/locking/proto.h"
 #include "rpc_worker.h"
 #include "librpc/gen_ndr/ndr_mdssvc.h"
 #include "librpc/gen_ndr/ndr_mdssvc_scompat.h"
@@ -38,9 +39,16 @@ static size_t mdssvc_servers(
 	void *private_data)
 {
 	static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL };
+	bool ok;
 
 	lp_load_with_shares(get_dyn_CONFIGFILE());
 
+	ok = posix_locking_init(false);
+	if (!ok) {
+		DBG_ERR("posix_locking_init() failed\n");
+		exit(1);
+	}
+
 	ep_servers[0] = mdssvc_get_ep_server();
 
 	*_ep_servers = ep_servers;
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index 125ef64f070..acf09ca4ac5 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -648,6 +648,8 @@ NTSTATUS smbXsrv_tcon_update(struct smbXsrv_tcon *tcon);
 NTSTATUS smbXsrv_tcon_disconnect(struct smbXsrv_tcon *tcon, uint64_t vuid);
 NTSTATUS smb1srv_tcon_table_init(struct smbXsrv_connection *conn);
 NTSTATUS smb1srv_tcon_create(struct smbXsrv_connection *conn,
+			     uint32_t session_global_id,
+			     const char *share_name,
 			     NTTIME now,
 			     struct smbXsrv_tcon **_tcon);
 NTSTATUS smb1srv_tcon_lookup(struct smbXsrv_connection *conn,
@@ -656,6 +658,9 @@ NTSTATUS smb1srv_tcon_lookup(struct smbXsrv_connection *conn,
 NTSTATUS smb1srv_tcon_disconnect_all(struct smbXsrv_client *client);
 NTSTATUS smb2srv_tcon_table_init(struct smbXsrv_session *session);
 NTSTATUS smb2srv_tcon_create(struct smbXsrv_session *session,
+			     uint32_t session_global_id,
+			     uint8_t encryption_flags,
+			     const char *share_name,
 			     NTTIME now,
 			     struct smbXsrv_tcon **_tcon);
 NTSTATUS smb2srv_tcon_lookup(struct smbXsrv_session *session,
diff --git a/source3/smbd/smb1_service.c b/source3/smbd/smb1_service.c
index ed18f298f5b..df26b9fa9d8 100644
--- a/source3/smbd/smb1_service.c
+++ b/source3/smbd/smb1_service.c
@@ -48,17 +48,43 @@ static connection_struct *make_connection_smb1(struct smb_request *req,
 {
 	const struct loadparm_substitution *lp_sub =
 		loadparm_s3_global_substitution();
+	uint32_t session_global_id;
+	char *share_name = NULL;
 	struct smbXsrv_tcon *tcon;
 	NTSTATUS status;
 	struct connection_struct *conn;
 
-	status = smb1srv_tcon_create(req->xconn, now, &tcon);
+	session_global_id = req->session->global->session_global_id;
+	share_name = lp_servicename(talloc_tos(), lp_sub, snum);
+	if (share_name == NULL) {
+		*pstatus = NT_STATUS_NO_MEMORY;
+		return NULL;
+	}
+
+	if ((lp_max_connections(snum) > 0)
+	    && (count_current_connections(lp_const_servicename(snum), true) >=
+		lp_max_connections(snum))) {
+
+		DBG_WARNING("Max connections (%d) exceeded for [%s][%s]\n",
+			  lp_max_connections(snum),
+			  lp_const_servicename(snum), share_name);
+		TALLOC_FREE(share_name);
+		*pstatus = NT_STATUS_INSUFFICIENT_RESOURCES;
+		return NULL;
+	}
+
+	status = smb1srv_tcon_create(req->xconn,
+				     session_global_id,
+				     share_name,
+				     now, &tcon);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0,("make_connection_smb1: Couldn't find free tcon %s.\n",
-			 nt_errstr(status)));
+		DEBUG(0,("make_connection_smb1: Couldn't find free tcon for [%s] - %s\n",
+			 share_name, nt_errstr(status)));
+		TALLOC_FREE(share_name);
 		*pstatus = status;
 		return NULL;
 	}
+	TALLOC_FREE(share_name);
 
 	conn = conn_new(req->sconn);
 	if (!conn) {
@@ -83,24 +109,10 @@ static connection_struct *make_connection_smb1(struct smb_request *req,
 		return NULL;
 	}
 
-	tcon->global->share_name = lp_servicename(tcon->global, lp_sub, SNUM(conn));
-	if (tcon->global->share_name == NULL) {
-		conn_free(conn);
-		TALLOC_FREE(tcon);
-		*pstatus = NT_STATUS_NO_MEMORY;
-		return NULL;
-	}
-	tcon->global->session_global_id =
-		req->session->global->session_global_id;
-
 	tcon->compat = talloc_move(tcon, &conn);
 	tcon->status = NT_STATUS_OK;
 
-	*pstatus = smbXsrv_tcon_update(tcon);
-	if (!NT_STATUS_IS_OK(*pstatus)) {
-		TALLOC_FREE(tcon);
-		return NULL;
-	}
+	*pstatus = NT_STATUS_OK;
 
 	return tcon->compat;
 }
diff --git a/source3/smbd/smb2_service.c b/source3/smbd/smb2_service.c
index 5affea6b3e4..71062e7bd84 100644
--- a/source3/smbd/smb2_service.c
+++ b/source3/smbd/smb2_service.c
@@ -646,21 +646,6 @@ NTSTATUS make_connection_snum(struct smbXsrv_connection *xconn,
 	 * in the logs. */
 	widelinks_warning(snum);
 
-	/*
-	 * Enforce the max connections parameter.
-	 */
-
-	if ((lp_max_connections(snum) > 0)
-	    && (count_current_connections(lp_const_servicename(SNUM(conn)), true) >=
-		lp_max_connections(snum))) {
-
-		DBG_WARNING("Max connections (%d) exceeded for %s\n",
-			  lp_max_connections(snum),
-			  lp_const_servicename(snum));
-		status = NT_STATUS_INSUFFICIENT_RESOURCES;
-		goto err_root_exit;
-	}
-
 	/* Invoke VFS make connection hook - this must be the first
 	   filesystem operation that we do. */
 
diff --git a/source3/smbd/smb2_tcon.c b/source3/smbd/smb2_tcon.c
index 14229366efa..5bd01c77e05 100644
--- a/source3/smbd/smb2_tcon.c
+++ b/source3/smbd/smb2_tcon.c
@@ -217,6 +217,9 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
 	bool encryption_required = req->session->global->encryption_flags & SMBXSRV_ENCRYPTION_REQUIRED;
 	bool guest_session = false;
 	bool require_signed_tcon = false;
+	uint32_t session_global_id;
+	char *share_name = NULL;
+	uint8_t encryption_flags = 0;
 
 	*disconnect = false;
 
@@ -328,17 +331,39 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
 		}
 	}
 
-	/* create a new tcon as child of the session */
-	status = smb2srv_tcon_create(req->session, now, &tcon);
-	if (!NT_STATUS_IS_OK(status)) {
-		return status;
-	}
-
 	if (encryption_desired) {
-		tcon->global->encryption_flags |= SMBXSRV_ENCRYPTION_DESIRED;
+		encryption_flags |= SMBXSRV_ENCRYPTION_DESIRED;
 	}
 	if (encryption_required) {
-		tcon->global->encryption_flags |= SMBXSRV_ENCRYPTION_REQUIRED;
+		encryption_flags |= SMBXSRV_ENCRYPTION_REQUIRED;
+	}
+
+	session_global_id = req->session->global->session_global_id;
+	share_name = lp_servicename(talloc_tos(), lp_sub, snum);
+	if (share_name == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	if ((lp_max_connections(snum) > 0)
+	    && (count_current_connections(lp_const_servicename(snum), true) >=
+		lp_max_connections(snum))) {
+
+		DBG_WARNING("Max connections (%d) exceeded for [%s][%s]\n",
+			  lp_max_connections(snum),
+			  lp_const_servicename(snum), share_name);
+		TALLOC_FREE(share_name);
+		return NT_STATUS_INSUFFICIENT_RESOURCES;
+	}
+
+	/* create a new tcon as child of the session */
+	status = smb2srv_tcon_create(req->session,
+				     session_global_id,
+				     encryption_flags,
+				     share_name,
+				     now, &tcon);
+	TALLOC_FREE(share_name);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
 	}
 
 	compat_conn = make_connection_smb2(req,
@@ -350,27 +375,10 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
 		return status;
 	}
 
-	tcon->global->share_name = lp_servicename(tcon->global,
-						  lp_sub,
-						  SNUM(compat_conn));
-	if (tcon->global->share_name == NULL) {
-		conn_free(compat_conn);
-		TALLOC_FREE(tcon);
-		return NT_STATUS_NO_MEMORY;
-	}
-	tcon->global->session_global_id =
-		req->session->global->session_global_id;
-
 	tcon->compat = talloc_move(tcon, &compat_conn);
 
 	tcon->status = NT_STATUS_OK;
 
-	status = smbXsrv_tcon_update(tcon);
-	if (!NT_STATUS_IS_OK(status)) {
-		TALLOC_FREE(tcon);
-		return status;
-	}
-
 	if (IS_PRINT(tcon->compat)) {
 		*out_share_type = SMB2_SHARE_TYPE_PRINT;
 	} else if (IS_IPC(tcon->compat)) {
diff --git a/source3/smbd/smbXsrv_tcon.c b/source3/smbd/smbXsrv_tcon.c
index 8707082edd6..cbb22852c92 100644
--- a/source3/smbd/smbXsrv_tcon.c
+++ b/source3/smbd/smbXsrv_tcon.c
@@ -738,6 +738,9 @@ static NTSTATUS smbXsrv_tcon_create(struct smbXsrv_tcon_table *table,
 				    enum protocol_types protocol,
 				    struct server_id server_id,
 				    NTTIME now,
+				    uint32_t session_global_id,
+				    uint8_t encryption_flags,
+				    const char *share_name,
 				    struct smbXsrv_tcon **_tcon)
 {
 	struct db_record *local_rec = NULL;
@@ -767,6 +770,14 @@ static NTSTATUS smbXsrv_tcon_create(struct smbXsrv_tcon_table *table,
 	}
 	tcon->global = global;
 
+	global->session_global_id = session_global_id;
+	global->encryption_flags = encryption_flags;
+	global->share_name = talloc_strdup(global, share_name);
+	if (global->share_name == NULL) {
+		TALLOC_FREE(tcon);
+		return NT_STATUS_NO_MEMORY;
+	}
+
 	if (protocol >= PROTOCOL_SMB2_02) {
 		uint64_t id = global->tcon_global_id;
 
@@ -1100,14 +1111,21 @@ NTSTATUS smb1srv_tcon_table_init(struct smbXsrv_connection *conn)
 }
 
 NTSTATUS smb1srv_tcon_create(struct smbXsrv_connection *conn,
+			     uint32_t session_global_id,
+			     const char *share_name,
 			     NTTIME now,
 			     struct smbXsrv_tcon **_tcon)
 {
 	struct server_id id = messaging_server_id(conn->client->msg_ctx);
+	const uint8_t encryption_flags = 0;
 
 	return smbXsrv_tcon_create(conn->client->tcon_table,
 				   conn->protocol,
-				   id, now, _tcon);
+				   id, now,
+				   session_global_id,
+				   encryption_flags,
+				   share_name,
+				   _tcon);
 }
 
 NTSTATUS smb1srv_tcon_lookup(struct smbXsrv_connection *conn,
@@ -1156,6 +1174,9 @@ NTSTATUS smb2srv_tcon_table_init(struct smbXsrv_session *session)
 }
 
 NTSTATUS smb2srv_tcon_create(struct smbXsrv_session *session,
+			     uint32_t session_global_id,
+			     uint8_t encryption_flags,
+			     const char *share_name,
 			     NTTIME now,
 			     struct smbXsrv_tcon **_tcon)
 {
@@ -1163,7 +1184,11 @@ NTSTATUS smb2srv_tcon_create(struct smbXsrv_session *session,
 
 	return smbXsrv_tcon_create(session->tcon_table,
 				   PROTOCOL_SMB2_02,
-				   id, now, _tcon);
+				   id, now,
+				   session_global_id,
+				   encryption_flags,
+				   share_name,
+				   _tcon);
 }
 
 NTSTATUS smb2srv_tcon_lookup(struct smbXsrv_session *session,
diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c
index 09f7f0b4a39..dd9341f3637 100644
--- a/source3/utils/net_ads.c
+++ b/source3/utils/net_ads.c
@@ -710,7 +710,15 @@ retry:
 			TALLOC_FREE(ads);
 			return ADS_ERROR(LDAP_NO_MEMORY);
 		}
-       }
+	} else if (ads->auth.realm == NULL) {
+		const char *c_realm = cli_credentials_get_realm(c->creds);
+
+		ads->auth.realm = talloc_strdup(ads, c_realm);
+		if (ads->auth.realm == NULL) {
+			TALLOC_FREE(ads);
+			return ADS_ERROR(LDAP_NO_MEMORY);
+		}
+	}
 
 	status = ads_connect(ads);
 
diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py
index 29801bc190b..336d13be8b2 100755
--- a/source4/selftest/tests.py
+++ b/source4/selftest/tests.py
@@ -666,6 +666,17 @@ plantestsuite("samba4.blackbox.client_etypes_strong(ad_dc:client)", "ad_dc:clien
 plantestsuite("samba4.blackbox.net_ads_dns(ad_member:local)", "ad_member:local", [os.path.join(bbdir, "test_net_ads_dns.sh"), '$DC_SERVER', '$DC_USERNAME', '$DC_PASSWORD', '$REALM', '$USERNAME', '$PASSWORD'])
 plantestsuite("samba4.blackbox.samba-tool_ntacl(ad_member:local)", "ad_member:local", [os.path.join(bbdir, "test_samba-tool_ntacl.sh"), '$PREFIX', '$DOMSID'])
 
+env = "ad_member:local"
+plantestsuite("samba4.blackbox.net_ads_search_server_P.primary", env,
+              [os.path.join(bbdir, "test_net_ads_search_server.sh"),
+              '$DC_SERVER', '$REALM'])
+plantestsuite("samba4.blackbox.net_ads_search_server_P.trust_e_both", env,
+              [os.path.join(bbdir, "test_net_ads_search_server.sh"),
+              '$TRUST_E_BOTH_SERVER', '$TRUST_E_BOTH_REALM'])
+plantestsuite("samba4.blackbox.net_ads_search_server_P.trust_f_both", env,
+              [os.path.join(bbdir, "test_net_ads_search_server.sh"),
+              '$TRUST_F_BOTH_SERVER', '$TRUST_F_BOTH_REALM'])
+
 if have_gnutls_fips_mode_support:
     plantestsuite("samba4.blackbox.weak_crypto.client", "ad_dc", [os.path.join(bbdir, "test_weak_crypto.sh"), '$SERVER', '$USERNAME', '$PASSWORD', '$REALM', '$DOMAIN', "$PREFIX/ad_dc"])
     plantestsuite("samba4.blackbox.test_weak_disable_ntlmssp_ldap", "ad_member:local", [os.path.join(bbdir, "test_weak_disable_ntlmssp_ldap.sh"),'$DC_USERNAME', '$DC_PASSWORD'])
diff --git a/testprogs/blackbox/test_net_ads_search_server.sh b/testprogs/blackbox/test_net_ads_search_server.sh
new file mode 100755
index 00000000000..f8350c9a97a
--- /dev/null
+++ b/testprogs/blackbox/test_net_ads_search_server.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+if [ $# -lt 2 ]; then
+cat <<EOF
+Usage: $0 SERVER REALM
+EOF
+exit 1;
+fi
+
+SERVER=$1
+REALM=$2
+shift 2
+
+failed=0
+. `dirname $0`/subunit.sh
+
+samba_net="$BINDIR/net"
+
+DN=$(echo "${REALM}" | tr '[:upper:]' '[:lower:]' | sed -e 's!^!DC=!' -e 's!\.!,DC=!g')
+testit_grep_count \
+	"net_ads_search.ntlmssp" \
+	"distinguishedName: ${DN}" \
+	1 \
+	$samba_net ads search --use-kerberos=off -P \
+	--server "${SERVER}.${REALM}" \
+	'(objectClass=domain)' distinguishedName || \
+	failed=$((failed + 1))
+testit_grep_count \
+	"net_ads_search.krb5" \
+	"distinguishedName: ${DN}" \
+	1 \
+	$samba_net ads search --use-kerberos=required -P \
+	--server "${SERVER}.${REALM}" \
+	'(objectClass=domain)' distinguishedName || \
+	failed=$((failed + 1))
+
+exit $failed


-- 
Samba Shared Repository



More information about the samba-cvs mailing list