trying to get HEAD building again. If you want the code
[kai/samba.git] / source3 / rpc_server / srv_srvsvc_nt.c
index 4d9130fb9704f12165bef0fab74b89bc0d12057f..ea66a7d38b49329da282f3094e9de93b6669ca64 100644 (file)
@@ -432,10 +432,13 @@ static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh100
 
 static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum)
 {
-       sh1005->dfs_root_flag = 0;
+       sh1005->share_info_flags = 0;
 
        if(lp_host_msdfs() && lp_msdfs_root(snum))
-               sh1005->dfs_root_flag = 3;
+               sh1005->share_info_flags |= 
+                       SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
+       sh1005->share_info_flags |= 
+               lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT;
 }
 /***************************************************************************
  Fill in a share info level 1006 structure.
@@ -1513,6 +1516,19 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S
                type = STYPE_DISKTREE;
                break;
        case 1005:
+                /* XP re-sets the csc policy even if it wasn't changed by the
+                  user, so we must compare it to see if it's what is set in
+                  smb.conf, so that we can contine other ops like setting
+                  ACLs on a share */
+               if (((q_u->info.share.info1005.share_info_flags &
+                     SHARE_1005_CSC_POLICY_MASK) >>
+                    SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
+                       return WERR_OK;
+               else {
+                       DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n"));
+                       return WERR_ACCESS_DENIED;
+               }
+               break;
        case 1006:
        case 1007:
                return WERR_ACCESS_DENIED;
@@ -1840,8 +1856,6 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC
        struct current_user user;
        connection_struct *conn = NULL;
        BOOL became_user = False; 
-       fstring dev;
-       fstrcpy(dev, "A:");
 
        ZERO_STRUCT(st);
 
@@ -1855,7 +1869,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC
        get_current_user(&user, p);
 
        become_root();
-       conn = make_connection(qualname, null_pw, dev, user.vuid, &nt_status);
+       conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
        unbecome_root();
 
        if (conn == NULL) {
@@ -1889,7 +1903,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC
                }
        }
 
-       sd_size = conn->vfs_ops.get_nt_acl(fsp, fsp->fsp_name, &psd);
+       sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd);
 
        if (sd_size == 0) {
                DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename));
@@ -1945,12 +1959,9 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_
        struct current_user user;
        connection_struct *conn = NULL;
        BOOL became_user = False;
-       fstring dev;
-       fstrcpy(dev, "A:");
 
        ZERO_STRUCT(st);
 
-
        r_u->status = WERR_OK;
 
        unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
@@ -1961,7 +1972,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_
        get_current_user(&user, p);
 
        become_root();
-       conn = make_connection(qualname, null_pw, dev, user.vuid, &nt_status);
+       conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
        unbecome_root();
 
        if (conn == NULL) {
@@ -1996,7 +2007,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_
                }
        }
 
-       ret = conn->vfs_ops.set_nt_acl(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc);
+       ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc);
 
        if (ret == False) {
                DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename));