summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/docbook/manpages/smb.conf.5.sgml28
-rw-r--r--docs/htmldocs/smb.conf.5.html72
-rw-r--r--docs/manpages/smb.conf.524
-rw-r--r--source3/msdfs/msdfs.c72
-rw-r--r--source3/param/loadparm.c4
-rw-r--r--source3/smbd/service.c7
6 files changed, 166 insertions, 41 deletions
diff --git a/docs/docbook/manpages/smb.conf.5.sgml b/docs/docbook/manpages/smb.conf.5.sgml
index 13fdb1c6cb..17a1ddf77e 100644
--- a/docs/docbook/manpages/smb.conf.5.sgml
+++ b/docs/docbook/manpages/smb.conf.5.sgml
@@ -1,6 +1,6 @@
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
<refentry id="smb.conf">
-
+
<refmeta>
<refentrytitle>smb.conf</refentrytitle>
<manvolnum>5</manvolnum>
@@ -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,8 +4848,25 @@
</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>
<term><anchor id="MSDFSROOT">msdfs root (S)</term>
<listitem><para>This boolean parameter is only available if
@@ -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>
diff --git a/docs/htmldocs/smb.conf.5.html b/docs/htmldocs/smb.conf.5.html
index 5e0e9be1e8..84b0920d5b 100644
--- a/docs/htmldocs/smb.conf.5.html
+++ b/docs/htmldocs/smb.conf.5.html
@@ -16,7 +16,9 @@ VLINK="#840084"
ALINK="#0000FF"
><H1
><A
-NAME="SMB.CONF">smb.conf</H1
+NAME="SMB.CONF"
+></A
+>smb.conf</H1
><DIV
CLASS="REFNAMEDIV"
><A
@@ -3994,6 +3996,18 @@ CLASS="PARAMETER"
><LI
><P
><A
+HREF="#MSDFSPROXY"
+><TT
+CLASS="PARAMETER"
+><I
+>msdfs proxy</I
+></TT
+></A
+></P
+></LI
+><LI
+><P
+><A
HREF="#MSDFSROOT"
><TT
CLASS="PARAMETER"
@@ -4656,7 +4670,7 @@ CLASS="PARAMETER"
><DIV
CLASS="REFSECT1"
><A
-NAME="AEN1513"
+NAME="AEN1517"
></A
><H2
>EXPLANATION OF EACH PARAMETER</H2
@@ -12529,6 +12543,46 @@ CLASS="COMMAND"
></DD
><DT
><A
+NAME="MSDFSPROXY"
+></A
+>msdfs proxy (S)</DT
+><DD
+><P
+>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.</P
+><P
+>Only Dfs roots can act as proxy shares. Take a look at the
+ <A
+HREF="#MSDFSROOT"
+><TT
+CLASS="PARAMETER"
+><I
+>msdfs root</I
+></TT
+></A
+>
+ and
+ <A
+HREF="#HOSTMSDFS"
+><TT
+CLASS="PARAMETER"
+><I
+>host msdfs</I
+></TT
+></A
+>
+ options to find out how to set up a Dfs root share.</P
+><P
+>Example: <B
+CLASS="COMMAND"
+>msdfs proxy = \otherserver\someshare</B
+></P
+></DD
+><DT
+><A
NAME="MSDFSROOT"
></A
>msdfs root (S)</DT
@@ -12547,9 +12601,9 @@ CLASS="CONSTANT"
Dfs links are specified in the share directory by symbolic
links of the form <TT
CLASS="FILENAME"
->msdfs:serverA\shareA,serverB\shareB
- </TT
-> and so on. For more information on setting up a Dfs tree
+>msdfs:serverA\shareA,serverB\shareB</TT
+>
+ and so on. For more information on setting up a Dfs tree
on Samba, refer to <A
HREF="msdfs_setup.html"
TARGET="_top"
@@ -19432,7 +19486,7 @@ CLASS="PARAMETER"
><DIV
CLASS="REFSECT1"
><A
-NAME="AEN6147"
+NAME="AEN6163"
></A
><H2
>WARNINGS</H2
@@ -19462,7 +19516,7 @@ TARGET="_top"
><DIV
CLASS="REFSECT1"
><A
-NAME="AEN6153"
+NAME="AEN6169"
></A
><H2
>VERSION</H2
@@ -19473,7 +19527,7 @@ NAME="AEN6153"
><DIV
CLASS="REFSECT1"
><A
-NAME="AEN6156"
+NAME="AEN6172"
></A
><H2
>SEE ALSO</H2
@@ -19552,7 +19606,7 @@ CLASS="COMMAND"
><DIV
CLASS="REFSECT1"
><A
-NAME="AEN6176"
+NAME="AEN6192"
></A
><H2
>AUTHOR</H2
diff --git a/docs/manpages/smb.conf.5 b/docs/manpages/smb.conf.5
index a9cf133c8d..a5330e50b6 100644
--- a/docs/manpages/smb.conf.5
+++ b/docs/manpages/smb.conf.5
@@ -3,7 +3,7 @@
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>
.\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng <steve@ggi-project.org>.
-.TH "SMB.CONF" "5" "26 November 2002" "" ""
+.TH "SMB.CONF" "5" "29 December 2002" "" ""
.SH NAME
smb.conf \- The configuration file for the Samba suite
.SH "SYNOPSIS"
@@ -1271,6 +1271,9 @@ each parameter for details. Note that some are synonyms.
\fImin print space\fR
.TP 0.2i
\(bu
+\fImsdfs proxy\fR
+.TP 0.2i
+\(bu
\fImsdfs root\fR
.TP 0.2i
\(bu
@@ -4497,14 +4500,29 @@ is 6 hours (21600 seconds).
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
-\fR and 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
diff --git a/source3/msdfs/msdfs.c b/source3/msdfs/msdfs.c
index 3e66c1c10c..613382961b 100644
--- a/source3/msdfs/msdfs.c
+++ b/source3/msdfs/msdfs.c
@@ -381,6 +381,26 @@ BOOL get_referred_path(char *pathname, struct junction_map* jn,
return False;
}
+ if (*lp_msdfs_proxy(snum) != '\0') {
+ 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,
@@ -630,7 +650,7 @@ int setup_dfs_referral(char* pathname, int max_referral_level, char** ppdata)
dbgtext(".\n");
}
}
-
+
/* create the referral depeding on version */
DEBUG(10,("max_referral_level :%d\n",max_referral_level));
if(max_referral_level<2 || max_referral_level>3)
@@ -798,6 +818,7 @@ static BOOL form_junctions(int snum, struct junction_map* jn, int* jn_count)
char* service_name = lp_servicename(snum);
connection_struct conns;
connection_struct *conn = &conns;
+ struct referral *ref = NULL;
pstrcpy(connect_path,lp_pathname(snum));
@@ -811,31 +832,34 @@ static BOOL form_junctions(int snum, struct junction_map* jn, int* jn_count)
if (!create_conn_struct(conn, snum, connect_path))
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;
- }
-
- safe_strcpy(ref->alternate_path, alt_path, sizeof(pstring));
- ref->proximity = 0;
- ref->ttl = REFERRAL_TTL;
- cnt++;
+ /* 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;
}
+ ref->proximity = 0;
+ ref->ttl = REFERRAL_TTL;
+ if (*lp_msdfs_proxy(snum) != '\0') {
+ pstrcpy(ref->alternate_path, lp_msdfs_proxy(snum));
+ *jn_count = 1;
+ 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, connect_path);
if(!dirp)
return False;
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index 02f120b534..621aa67e6a 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -328,6 +328,7 @@ typedef struct
char *szVfsObjectFile;
char *szVfsOptions;
char *szVfsPath;
+ char *szMSDfsProxy;
int iMinPrintSpace;
int iMaxPrintJobs;
int iWriteCacheSize;
@@ -447,6 +448,7 @@ static service sDefault = {
NULL, /* vfs object */
NULL, /* vfs options */
NULL, /* vfs path */
+ NULL, /* szMSDfsProxy */
0, /* iMinPrintSpace */
1000, /* iMaxPrintJobs */
0, /* iWriteCacheSize */
@@ -1091,6 +1093,7 @@ static struct parm_struct parm_table[] = {
{"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
+ {"msdfs proxy", P_STRING, P_LOCAL, &sDefault.szMSDfsProxy, NULL, NULL, FLAG_SHARE},
{"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"Winbind options", P_SEP, P_SEPARATOR},
@@ -1739,6 +1742,7 @@ FN_LOCAL_STRING(lp_fstype, fstype)
FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
FN_LOCAL_STRING(lp_vfs_options, szVfsOptions)
FN_LOCAL_STRING(lp_vfs_path, szVfsPath)
+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)
diff --git a/source3/smbd/service.c b/source3/smbd/service.c
index 1f168dd3ff..d00c908a1a 100644
--- a/source3/smbd/service.c
+++ b/source3/smbd/service.c
@@ -833,6 +833,13 @@ connection_struct *make_connection(const char *service_in, DATA_BLOB password,
return NULL;
}
+ /* 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));
+ *status = NT_STATUS_BAD_NETWORK_NAME;
+ return NULL;
+ }
+
DEBUG(5, ("making a connection to 'normal' service %s\n", service));
return make_connection_snum(snum, vuser,