Author: jra
Date: 2006-01-09 08:24:33 +0000 (Mon, 09 Jan 2006)
New Revision: 12786

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12786

Log:
Add in the facility of denying/allowing usershares on
areas of the filesystem. Thanks to Volker for the idea.
Jeremy.

Modified:
   trunk/source/param/loadparm.c
   trunk/source/utils/net_usershare.c


Changeset:
Modified: trunk/source/param/loadparm.c
===================================================================
--- trunk/source/param/loadparm.c       2006-01-09 02:43:38 UTC (rev 12785)
+++ trunk/source/param/loadparm.c       2006-01-09 08:24:33 UTC (rev 12786)
@@ -191,6 +191,8 @@
        char **szServicesList;
        char *szUsersharePath;
        char *szUsershareTemplateShare;
+       char **szUsersharePrefixAllowList;
+       char **szUsersharePrefixDenyList;
        int mangle_prefix;
        int max_log_size;
        char *szLogLevel;
@@ -1223,6 +1225,8 @@
        {"usershare max shares", P_INTEGER, P_GLOBAL, 
&Globals.iUsershareMaxShares, NULL, NULL, FLAG_ADVANCED},
        {"usershare path", P_STRING, P_GLOBAL, &Globals.szUsersharePath, NULL, 
NULL, FLAG_ADVANCED},
        {"usershare template share", P_STRING, P_GLOBAL, 
&Globals.szUsershareTemplateShare, NULL, NULL, FLAG_ADVANCED},
+       {"usershare prefix allow list", P_LIST, P_GLOBAL, 
&Globals.szUsersharePrefixAllowList, NULL, NULL, FLAG_ADVANCED}, 
+       {"usershare prefix deny list", P_LIST, P_GLOBAL, 
&Globals.szUsersharePrefixDenyList, NULL, NULL, FLAG_ADVANCED}, 
        {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, 
FLAG_ADVANCED | FLAG_SHARE }, 
        {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, 
FLAG_ADVANCED | FLAG_SHARE}, 
        {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, 
NULL, FLAG_ADVANCED | FLAG_SHARE}, 
@@ -1829,6 +1833,8 @@
 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
 FN_GLOBAL_STRING(lp_usershare_path, &Globals.szUsersharePath)
+FN_GLOBAL_LIST(lp_usershare_prefix_allow_list, 
&Globals.szUsersharePrefixAllowList)
+FN_GLOBAL_LIST(lp_usershare_prefix_deny_list, 
&Globals.szUsersharePrefixDenyList)
 
 FN_GLOBAL_LIST(lp_eventlog_list, &Globals.szEventLogs)
 
@@ -4255,6 +4261,7 @@
 
 BOOL parse_usershare_file(TALLOC_CTX *ctx, 
                        SMB_STRUCT_STAT *psbuf,
+                       const char *servicename,
                        int snum,
                        char **lines,
                        int numlines,
@@ -4262,6 +4269,8 @@
                        pstring comment,
                        SEC_DESC **ppsd)
 {
+       const char **prefixallowlist = lp_usershare_prefix_allow_list();
+       const char **prefixdenylist = lp_usershare_prefix_deny_list();
        SMB_STRUCT_DIR *dp;
        SMB_STRUCT_STAT sbuf;
 
@@ -4303,17 +4312,53 @@
 
        /* The path *must* be absolute. */
        if (sharepath[0] != '/') {
-               DEBUG(0,("parse_usershare_file: path %s is not an absolute 
path.\n",
-                       sharepath));
+               DEBUG(2,("parse_usershare_file: share %s: path %s is not an 
absolute path.\n",
+                       servicename, sharepath));
                return False;
        }
 
+       /* If there is a usershare prefix deny list ensure one of these paths
+          doesn't match the start of the user given path. */
+       if (prefixdenylist) {
+               int i;
+               for ( i=0; prefixdenylist[i]; i++ ) {
+                       DEBUG(10,("parse_usershare_file: share %s : checking 
prefixdenylist[%d]='%s' against %s\n",
+                               servicename, i, prefixdenylist[i], sharepath ));
+                       if (memcmp( sharepath, prefixdenylist[i], 
strlen(prefixdenylist[i])) == 0) {
+                               DEBUG(2,("parse_usershare_file: share %s path 
%s starts with one of the "
+                                       "usershare prefix deny list entries.\n",
+                                       servicename, sharepath));
+                               return False;
+                       }
+               }
+       }
+
+       /* If there is a usershare prefix allow list ensure one of these paths
+          does match the start of the user given path. */
+
+       if (prefixallowlist) {
+               int i;
+               for ( i=0; prefixallowlist[i]; i++ ) {
+                       DEBUG(10,("parse_usershare_file: share %s checking 
prefixallowlist[%d]='%s' against %s\n",
+                               servicename, i, prefixallowlist[i], sharepath 
));
+                       if (memcmp( sharepath, prefixallowlist[i], 
strlen(prefixallowlist[i])) == 0) {
+                               break;
+                       }
+               }
+               if (prefixallowlist[i] == NULL) {
+                       DEBUG(2,("parse_usershare_file: share %s path %s 
doesn't start with one of the "
+                               "usershare prefix allow list entries.\n",
+                               servicename, sharepath));
+                       return False;
+               }
+        }
+
        /* Ensure this is pointing to a directory. */
        dp = sys_opendir(sharepath);
 
        if (!dp) {
-               DEBUG(0,("parse_usershare_file: path %s is not a directory.\n",
-                       sharepath));
+               DEBUG(2,("parse_usershare_file: share %s path %s is not a 
directory.\n",
+                       servicename, sharepath));
                return False;
        }
 
@@ -4321,27 +4366,27 @@
           this directory. */
 
        if (sys_stat(sharepath, &sbuf) == -1) {
-               DEBUG(0,("parse_usershare_file: stat failed on path %s. %s\n",
-                       sharepath, strerror(errno) ));
+               DEBUG(2,("parse_usershare_file: share %s : stat failed on path 
%s. %s\n",
+                       servicename, sharepath, strerror(errno) ));
                sys_closedir(dp);
                return False;
        }
 
        if (!S_ISDIR(sbuf.st_mode)) {
-               DEBUG(0,("parse_usershare_file: %s is not a directory.\n",
-                       sharepath ));
+               DEBUG(2,("parse_usershare_file: share %s path %s is not a 
directory.\n",
+                       servicename, sharepath ));
                sys_closedir(dp);
                return False;
        }
 
+#if 0
        /* Owner can always share. */
        if (sbuf.st_uid == psbuf->st_uid) {
                sys_closedir(dp);
                return True;
        }
 
-#if 0
-       /* We have to check if the user requesting the share is in the
+       /* We could check if the user requesting the share is in the
           owning group of the directory. */
 
        username = uidtoname(psbuf->st_uid);
@@ -4472,7 +4517,7 @@
                return 1;
        }
 
-       if (!parse_usershare_file(ctx, &sbuf, iService, lines, numlines, 
sharepath, comment, &psd)) {
+       if (!parse_usershare_file(ctx, &sbuf, service_name, iService, lines, 
numlines, sharepath, comment, &psd)) {
                talloc_destroy(ctx);
                SAFE_FREE(lines);
                return -1;

Modified: trunk/source/utils/net_usershare.c
===================================================================
--- trunk/source/utils/net_usershare.c  2006-01-09 02:43:38 UTC (rev 12785)
+++ trunk/source/utils/net_usershare.c  2006-01-09 08:24:33 UTC (rev 12786)
@@ -538,7 +538,7 @@
        }
 
        /* Ensure it's well formed. */
-       if (!parse_usershare_file(ctx, &sbuf, -1, lines, numlines,
+       if (!parse_usershare_file(ctx, &sbuf, fl->pathname, -1, lines, numlines,
                                sharepath,
                                comment,
                                &psd)) {

Reply via email to