msdfs referrals at share-level

Richard Sharpe rsharpe at richardsharpe.com
Sun Feb 9 01:30:21 GMT 2003


On Fri, 7 Feb 2003, Guenther Deschner wrote:

> now that the msdfs-proxy is in cvs (thanks again for taking a deeper look on
> that) i still have a small fix for the dfsenum-pipe that just prints the first
> dfsroot and then stops. with that fix it'll show you all dfsenum-infolevels.
> 
> attached you'll find a backport of the msdfs-proxy for 2_2, maybe you could
> have a quick look and comment on that one too.

Hmmm, how is this any different from having a normal MSDFS share set up in 
Samba, say to \\server1\share1, and doing:

ln -s "msdfs:server1\share2,server2\share3,..." /path/to/share1/share1 

Just what does this msdfs-proxy stuff do that you can't do with the 
existing code?

Regards
-----
Richard Sharpe, rsharpe[at]ns.aus.com, rsharpe[at]samba.org, 
sharpe[at]ethereal.com, http://www.richardsharpe.com
-------------- next part --------------
--- source/param/loadparm.c	20 Dec 2002 20:23:05 -0000	1.472
+++ source/param/loadparm.c	29 Dec 2002 23:29:07 -0000	1.473
@@ -343,6 +343,7 @@
 	char *fstype;
 	char *szVfsObjectFile;
 	char *szVfsOptions;
+	char *szMSDfsProxy;
 	int iMinPrintSpace;
 	int iMaxPrintJobs;
 	int iWriteCacheSize;
@@ -468,6 +469,7 @@
 	NULL,			/* fstype */
 	NULL,			/* vfs object */
 	NULL,			/* vfs options */
+	NULL,			/* szMSDfsProxy */
 	0,			/* iMinPrintSpace */
 	1000,			/* iMaxPrintJobs */
 	0,			/* iWriteCacheSize */
@@ -1105,6 +1107,7 @@

 	{"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
 	{"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, 0},
+	{"msdfs proxy", P_STRING, P_LOCAL, &sDefault.szMSDfsProxy, NULL, NULL, FLAG_SHARE},
 #endif

 	{"Winbind options", P_SEP, P_SEPARATOR},
@@ -1745,6 +1748,7 @@
 FN_LOCAL_STRING(lp_fstype, fstype)
 FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
 FN_LOCAL_STRING(lp_vfs_options, szVfsOptions)
+FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy)
 static FN_LOCAL_STRING(lp_volume, volume)
 FN_LOCAL_STRING(lp_mangled_map, szMangledMap)
 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
--- docs/docbook/manpages/smb.conf.5.sgml	27 Nov 2002 02:47:55 -0000	1.68
+++ docs/docbook/manpages/smb.conf.5.sgml	29 Dec 2002 23:29:08 -0000	1.69
@@ -869,6 +869,7 @@
 		<listitem><para><link linkend="MAXCONNECTIONS"><parameter>max connections</parameter></link></para></listitem>
 		<listitem><para><link linkend="MAXPRINTJOBS"><parameter>max print jobs</parameter></link></para></listitem>
 		<listitem><para><link linkend="MINPRINTSPACE"><parameter>min print space</parameter></link></para></listitem>
+		<listitem><para><link linkend="MSDFSPROXY"><parameter>msdfs proxy</parameter></link></para></listitem>
 		<listitem><para><link linkend="MSDFSROOT"><parameter>msdfs root</parameter></link></para></listitem>
 		<listitem><para><link linkend="NTACLSUPPORT"><parameter>nt acl support</parameter></link></para></listitem>
 		<listitem><para><link linkend="ONLYGUEST"><parameter>only guest</parameter></link></para></listitem>
@@ -4847,6 +4848,23 @@
 		</varlistentry>
 
 
+		<varlistentry>
+		<term><anchor id="MSDFSPROXY">msdfs proxy (S)</term>
+		<listitem><para>This parameter indicates that the share is a
+		stand-in for another CIFS share whose location is specified by
+		the value of the parameter. When clients attempt to connect to
+		this share, they are redirected to the proxied share using
+		the SMB-Dfs protocol.</para>
+		<para>Only Dfs roots can act as proxy shares. Take a look at the
+		<link linkend="MSDFSROOT"><parameter>msdfs root</parameter></link>
+		and
+		<link linkend="HOSTMSDFS"><parameter>host msdfs</parameter></link>
+		options to find out how to set up a Dfs root share.</para>
+		<para>Example: <command>msdfs proxy = \otherserver\someshare</command></para>
+		</listitem>
+		</varlistentry>
+
+
 		
 		
 		<varlistentry>
@@ -4857,8 +4875,8 @@
 		Samba treats the share as a Dfs root and  allows clients to browse 
 		the distributed file system tree rooted at the share directory. 
 		Dfs links are specified  in  the share directory by symbolic 
-		links of the form <filename>msdfs:serverA\shareA,serverB\shareB
-		</filename> and so on.  For more information on setting up a Dfs tree 
+		links of the form <filename>msdfs:serverA\shareA,serverB\shareB</filename>
+		and so on.  For more information on setting up a Dfs tree 
 		on Samba,  refer to <ulink url="msdfs_setup.html">msdfs_setup.html
 		</ulink>.</para>
 		

--- docs/manpages/smb.conf.5	2003-02-01 18:43:47.000000000 +0100
+++ docs/manpages/smb.conf.5	2003-02-07 10:29:02.000000000 +0100
@@ -1276,6 +1272,9 @@
 \fImin print space\fR
 .TP 0.2i
 \(bu
+\fImsdfs proxy\fR
+.TP 0.2i
+\(bu
 \fImsdfs root\fR
 .TP 0.2i
 \(bu
@@ -4664,14 +4663,29 @@
 
 Default: \fBmin wins ttl = 21600\fR
 .TP
+\fBmsdfs proxy (S)\fR
+This parameter indicates that the share is a
+stand-in for another CIFS share whose location is specified by
+the value of the parameter. When clients attempt to connect to
+this share, they are redirected to the proxied share using
+the SMB-Dfs protocol.
+
+Only Dfs roots can act as proxy shares. Take a look at the
+\fImsdfs root\fR
+and
+\fIhost msdfs\fR
+options to find out how to set up a Dfs root share.
+
+Example: \fBmsdfs proxy = \\otherserver\\someshare\fR
+.TP
 \fBmsdfs root (S)\fR
 This boolean parameter is only available if 
 Samba is configured and compiled with the \fB --with-msdfs\fR option. If set to yes, 
 Samba treats the share as a Dfs root and allows clients to browse 
 the distributed file system tree rooted at the share directory. 
 Dfs links are specified in the share directory by symbolic 
-links of the form \fImsdfs:serverA\\shareA,serverB\\shareB
-\fRand so on. For more information on setting up a Dfs tree 
+links of the form \fImsdfs:serverA\\shareA,serverB\\shareB\fR
+and so on. For more information on setting up a Dfs tree 
 on Samba, refer to msdfs_setup.html
 
 
--- source/msdfs/msdfs.c	2002-11-05 20:05:05.000000000 +0100
+++ source/msdfs/msdfs.c	2003-02-07 13:29:44.000000000 +0100
@@ -382,6 +383,31 @@
 		return False;
 	}
 
+	/* Handle msdfs-proxy support */
+	if (*lp_msdfs_proxy(snum) != '\0') {
+
+		DEBUG(3, ("local service %s is a msdfs proxy redirect to: %s\n", 
+		lp_servicename(SNUM(conn)), lp_msdfs_proxy(SNUM(conn)) ));
+
+		struct referral* ref;
+		jn->referral_count = 1;
+		if ((ref = (struct referral*) malloc(sizeof(struct referral)))
+		    == NULL) {
+			DEBUG(0, ("malloc failed for referral\n"));
+			return False;
+		}
+
+		pstrcpy(ref->alternate_path, lp_msdfs_proxy(snum));
+		if (dp.reqpath[0] != '\0')
+			pstrcat(ref->alternate_path, dp.reqpath);
+		ref->proximity = 0;
+		ref->ttl = REFERRAL_TTL;
+		jn->referral_list = ref;
+		if (consumedcntp)
+			*consumedcntp = strlen(pathname);
+		return True;
+	}
+
 	/* If not remote & not a self referral, return False */
 	if (!resolve_dfs_path(pathname, &dp, conn, False, 
 			      &jn->referral_list, &jn->referral_count,
@@ -797,6 +823,7 @@
 	char* service_name = lp_servicename(snum);
 	connection_struct conns;
 	connection_struct *conn = &conns;
+	struct referral *ref = NULL;
  
 	pstrcpy(connect_path,lp_pathname(snum));
 
@@ -810,31 +837,38 @@
 	if (!create_conn_struct(conn, snum))
 		return False;
 
-	{ 
-		/* form a junction for the msdfs root - convention 
-		   DO NOT REMOVE THIS: NT clients will not work with us
-		   if this is not present
-		*/ 
-		struct referral *ref = NULL;
-		pstring alt_path;
-		pstrcpy(jn[cnt].service_name, service_name);
-		jn[cnt].volume_name[0] = '\0';
-		jn[cnt].referral_count = 1;
-	
-		slprintf(alt_path,sizeof(alt_path)-1,"\\\\%s\\%s", 
-			 local_machine, service_name);
-		ref = jn[cnt].referral_list = (struct referral*) malloc(sizeof(struct referral));
-		if (jn[cnt].referral_list == NULL) {
-			DEBUG(0, ("Malloc failed!\n"));
-			return False;
-		}
+	/* form a junction for the msdfs root - convention 
+	   DO NOT REMOVE THIS: NT clients will not work with us
+	   if this is not present
+	*/ 
+	pstrcpy(jn[cnt].service_name, service_name);
+	jn[cnt].volume_name[0] = '\0';
+	jn[cnt].referral_count = 1;
+
+	ref = jn[cnt].referral_list
+		= (struct referral*) malloc(sizeof(struct referral));
+	if (jn[cnt].referral_list == NULL) {
+		DEBUG(0, ("Malloc failed!\n"));
+		return False;
+	}
 
-		safe_strcpy(ref->alternate_path, alt_path, sizeof(pstring));
-		ref->proximity = 0;
-		ref->ttl = REFERRAL_TTL;
+	ref->proximity = 0;
+	ref->ttl = REFERRAL_TTL;
+
+	/* handle msdfs-proxy */
+	if (*lp_msdfs_proxy(snum) != '\0') {
+		pstrcpy(ref->alternate_path, lp_msdfs_proxy(snum));
+		pstrcpy(jn[cnt].service_name, lp_servicename(snum));
 		cnt++;
+		*jn_count = cnt;
+		return True;
 	}
 
+	slprintf(ref->alternate_path, sizeof(pstring)-1,
+		 "\\\\%s\\%s", local_machine, service_name);
+	cnt++;
+
+	/* Now enumerate all dfs links */
 	dirp = conn->vfs_ops.opendir(conn, dos_to_unix_static(connect_path));
 	if(!dirp)
 		return False;
--- source/smbd/service.c	2003-02-07 13:47:24.000000000 +0100
+++ source/smbd/service.c	2003-02-07 13:47:12.000000000 +0100
@@ -640,6 +640,13 @@
 		dbgtext( "(uid=%d, gid=%d) ", (int)geteuid(), (int)getegid() );
 		dbgtext( "(pid %d)\n", (int)sys_getpid() );
 	}
+
+	/* Handle non-Dfs clients attempting connections to msdfs proxy */
+	if (lp_host_msdfs() && (*lp_msdfs_proxy(snum) != '\0'))  {
+		DEBUG(3, ("refusing connection to dfs proxy '%s'\n", service));
+		return NULL;
+	}
+
 	
 	/* we've finished with the sensitive stuff */
 	change_to_root_user();
-------------- next part --------------
--- source/msdfs/msdfs.c	2002-12-30 00:30:15.000000000 +0100
+++ source/msdfs/msdfs.c	2003-02-07 14:19:37.000000000 +0100
@@ -851,7 +851,9 @@
 	ref->ttl = REFERRAL_TTL;
 	if (*lp_msdfs_proxy(snum) != '\0') {
 		pstrcpy(ref->alternate_path, lp_msdfs_proxy(snum));
-		*jn_count = 1;
+		pstrcpy(jn[cnt].service_name, lp_servicename(snum));
+		cnt++;
+		*jn_count = cnt;
 		return True;
 	}
 		


More information about the samba-technical mailing list