Author: vlendec
Date: 2007-10-03 18:37:57 +0000 (Wed, 03 Oct 2007)
New Revision: 25484

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

Log:
Fix srvsrc_NetFileEnum listing only for one user
Modified:
   branches/SAMBA_3_2/source/rpc_server/srv_srvsvc_nt.c
   branches/SAMBA_3_2_0/source/rpc_server/srv_srvsvc_nt.c


Changeset:
Modified: branches/SAMBA_3_2/source/rpc_server/srv_srvsvc_nt.c
===================================================================
--- branches/SAMBA_3_2/source/rpc_server/srv_srvsvc_nt.c        2007-10-03 
13:34:44 UTC (rev 25483)
+++ branches/SAMBA_3_2/source/rpc_server/srv_srvsvc_nt.c        2007-10-03 
18:37:57 UTC (rev 25484)
@@ -37,6 +37,7 @@
 
 struct file_enum_count {
        TALLOC_CTX *ctx;
+       const char *username;
        uint32 count;
        struct srvsvc_NetFileInfo3 *info;
 };
@@ -55,56 +56,64 @@
 {
        struct pipe_open_rec prec;
        struct file_enum_count *fenum = (struct file_enum_count *)p;
+       struct srvsvc_NetFileInfo3 *f;
+       int i = fenum->count;
+       pstring fullpath;
+       const char *username;
  
        if (rec->value.dsize != sizeof(struct pipe_open_rec))
                return 0;
 
        memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec));
  
-       if ( process_exists(prec.pid) ) {
-               struct srvsvc_NetFileInfo3 *f;
-               int i = fenum->count;
-               pstring fullpath;
+       if ( !process_exists(prec.pid) ) {
+               return 0;
+       }
+
+       username = uidtoname(prec.uid);
+
+       if ((fenum->username != NULL)
+           && !strequal(username, fenum->username)) {
+               return 0;
+       }
                
-               snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name );
+       snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name );
                
-               f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, struct 
srvsvc_NetFileInfo3, i+1 );
-               if ( !f ) {
-                       DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", 
i+1));
-                       return 1;
-               }
+       f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info,
+                                 struct srvsvc_NetFileInfo3, i+1 );
+       if ( !f ) {
+               DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
+               return 1;
+       }
 
-               fenum->info = f;
+       fenum->info = f;
                
-               fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & 
prec.pnum);
-               fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA);
-               fenum->info[i].num_locks = 0;
-               if (!(fenum->info[i].user = talloc_strdup(
-                             fenum->ctx, uidtoname(prec.uid)))) {
-                       /* There's not much we can do here. */
-                       fenum->info[i].user = "";
-               }
-               if (!(fenum->info[i].path = talloc_strdup(
-                             fenum->ctx, fullpath))) {
-                       /* There's not much we can do here. */
-                       fenum->info[i].path = "";
-               }
-                       
-               fenum->count++;
+       fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & 
prec.pnum);
+       fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA);
+       fenum->info[i].num_locks = 0;
+       fenum->info[i].user = talloc_move(fenum->ctx, &username);
+       if (!(fenum->info[i].path = talloc_strdup(
+                     fenum->ctx, fullpath))) {
+               /* There's not much we can do here. */
+               fenum->info[i].path = "";
        }
 
+       fenum->count++;
+
        return 0;
 }
 
 /*******************************************************************
 ********************************************************************/
 
-static WERROR net_enum_pipes( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 
**info, 
+static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username,
+                             struct srvsvc_NetFileInfo3 **info,
                               uint32 *count, uint32 *resume )
 {
        struct file_enum_count fenum;
 
        fenum.ctx = ctx;
+       fenum.username = username;
        fenum.info = *info;
        fenum.count = *count;
 
@@ -137,12 +146,20 @@
        int num_locks = 0;
        pstring fullpath;
        uint32 permissions;
+       const char *username;
  
        /* If the pid was not found delete the entry from connections.tdb */
 
        if (!process_exists(e->pid)) {
                return;
        }
+
+       username = uidtoname(e->uid);
+
+       if ((fenum->username != NULL)
+           && !strequal(username, fenum->username)) {
+               return;
+       }
                
        f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info,
                                  struct srvsvc_NetFileInfo3, i+1 );
@@ -175,11 +192,7 @@
        fenum->info[i].fid = e->share_file_id;
        fenum->info[i].permissions = permissions;
        fenum->info[i].num_locks = num_locks;
-       if (!(fenum->info[i].user = talloc_strdup(
-                     fenum->ctx, uidtoname(e->uid)))) {
-               /* There's not much we can do here. */
-               fenum->info[i].user = "";
-       }
+       fenum->info[i].user = talloc_move(fenum->ctx, &username);
        if (!(fenum->info[i].path = talloc_strdup(
                      fenum->ctx, fullpath))) {
                /* There's not much we can do here. */
@@ -192,12 +205,14 @@
 /*******************************************************************
 ********************************************************************/
 
-static WERROR net_enum_files( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 
**info, 
+static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username,
+                             struct srvsvc_NetFileInfo3 **info,
                               uint32 *count, uint32 *resume )
 {
        struct file_enum_count f_enum_cnt;
 
        f_enum_cnt.ctx = ctx;
+       f_enum_cnt.username = username;
        f_enum_cnt.count = *count;
        f_enum_cnt.info = *info;
        
@@ -1047,7 +1062,9 @@
  makes a SRV_R_NET_FILE_ENUM structure.
 ********************************************************************/
 
-static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, 
uint32 *resume_hnd, uint32 *num_entries )
+static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr,
+                             uint32 *resume_hnd, const char *username,
+                             uint32 *num_entries )
 {
        WERROR status;
 
@@ -1057,11 +1074,13 @@
 
        ctr->ctr3 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetFileCtr3);
        
-       status = net_enum_files(p->mem_ctx, &ctr->ctr3->array, num_entries, 
resume_hnd );
+       status = net_enum_files(p->mem_ctx, username, &ctr->ctr3->array,
+                               num_entries, resume_hnd );
        if ( !W_ERROR_IS_OK(status))
                return status;
                
-       status = net_enum_pipes(p->mem_ctx, &ctr->ctr3->array, num_entries, 
resume_hnd );
+       status = net_enum_pipes(p->mem_ctx, username, &ctr->ctr3->array,
+                               num_entries, resume_hnd );
        if ( !W_ERROR_IS_OK(status))
                return status;
 
@@ -1077,7 +1096,8 @@
 {
        switch ( *r->in.level ) {
        case 3:
-               return net_file_enum_3(p, r->in.ctr, r->in.resume_handle, 
r->out.totalentries );        
+               return net_file_enum_3(p, r->in.ctr, r->in.resume_handle,
+                                      r->in.user, r->out.totalentries );
        default:
                return WERR_UNKNOWN_LEVEL;
        }

Modified: branches/SAMBA_3_2_0/source/rpc_server/srv_srvsvc_nt.c
===================================================================
--- branches/SAMBA_3_2_0/source/rpc_server/srv_srvsvc_nt.c      2007-10-03 
13:34:44 UTC (rev 25483)
+++ branches/SAMBA_3_2_0/source/rpc_server/srv_srvsvc_nt.c      2007-10-03 
18:37:57 UTC (rev 25484)
@@ -33,6 +33,7 @@
 
 struct file_enum_count {
        TALLOC_CTX *ctx;
+       const char *username;
        int count;
        FILE_INFO_3 *info;
 };
@@ -51,36 +52,43 @@
 {
        struct pipe_open_rec prec;
        struct file_enum_count *fenum = (struct file_enum_count *)p;
+       FILE_INFO_3 *f;
+       int i = fenum->count;
+       pstring fullpath;
+       const char *username;
  
        if (rec->value.dsize != sizeof(struct pipe_open_rec))
                return 0;
 
        memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec));
  
-       if ( process_exists(prec.pid) ) {
-               FILE_INFO_3 *f;
-               int i = fenum->count;
-               pstring fullpath;
+       if ( !process_exists(prec.pid) ) {
+               return 0;
+       }
+
+       username = uidtoname(prec.uid);
+
+       if ((fenum->username != NULL)
+           && !strequal(username, fenum->username)) {
+               return 0;
+       }
                
-               snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name );
+       snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name );
                
-               f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, 
i+1 );
-               if ( !f ) {
-                       DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", 
i+1));
-                       return 1;
-               }
-               fenum->info = f;
+       f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
+       if ( !f ) {
+               DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
+               return 1;
+       }
+       fenum->info = f;
                
-               
-               init_srv_file_info3( &fenum->info[i], 
-                       (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum),
-                       (FILE_READ_DATA|FILE_WRITE_DATA), 
-                       0,
-                       uidtoname( prec.uid ),
-                       fullpath );
+       init_srv_file_info3(
+               &fenum->info[i], 
+               (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum),
+               (FILE_READ_DATA|FILE_WRITE_DATA), 
+               0, username, fullpath);
                        
-               fenum->count++;
-       }
+       fenum->count++;
 
        return 0;
 }
@@ -88,12 +96,14 @@
 /*******************************************************************
 ********************************************************************/
 
-static WERROR net_enum_pipes( TALLOC_CTX *ctx, FILE_INFO_3 **info, 
+static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username,
+                             FILE_INFO_3 **info, 
                               uint32 *count, uint32 resume )
 {
        struct file_enum_count fenum;
        
        fenum.ctx = ctx;
+       fenum.username = username;
        fenum.count = *count;
        fenum.info = *info;
 
@@ -126,12 +136,20 @@
        int num_locks = 0;
        pstring fullpath;
        uint32 permissions;
+       const char *username;
  
        /* If the pid was not found delete the entry from connections.tdb */
 
        if ( !process_exists(e->pid) ) {
                return;
        }
+
+       username = uidtoname(e->uid);
+
+       if ((fenum->username != NULL)
+           && !strequal(username, fenum->username)) {
+               return;
+       }
                
        f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
        if ( !f ) {
@@ -165,7 +183,7 @@
                             e->share_file_id,
                             permissions,
                             num_locks,
-                            uidtoname(e->uid),
+                            username,
                             fullpath );
                        
        fenum->count++;
@@ -174,12 +192,14 @@
 /*******************************************************************
 ********************************************************************/
 
-static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info, 
+static WERROR net_enum_files( TALLOC_CTX *ctx, const char **username,
+                             FILE_INFO_3 **info, 
                               uint32 *count, uint32 resume )
 {
        struct file_enum_count f_enum_cnt;
 
        f_enum_cnt.ctx = ctx;
+       f_enum_cnt.username = username;
        f_enum_cnt.count = *count;
        f_enum_cnt.info = *info;
        
@@ -1112,7 +1132,8 @@
  makes a SRV_R_NET_FILE_ENUM structure.
 ********************************************************************/
 
-static WERROR net_file_enum_3( SRV_R_NET_FILE_ENUM *r, uint32 resume_hnd )
+static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r,
+                              uint32 resume_hnd )
 {
        TALLOC_CTX *ctx = talloc_tos();
        SRV_FILE_INFO_CTR *ctr = &r->ctr;
@@ -1121,11 +1142,13 @@
           (b) active pipes
           (c) open directories and files */
 
-       r->status = net_enum_files( ctx, &ctr->file.info3, &ctr->num_entries, 
resume_hnd );
+       r->status = net_enum_files( ctx, username, &ctr->file.info3,
+                                   &ctr->num_entries, resume_hnd );
        if ( !W_ERROR_IS_OK(r->status))
                goto done;
                
-       r->status = net_enum_pipes( ctx, &ctr->file.info3, &ctr->num_entries, 
resume_hnd );
+       r->status = net_enum_pipes( ctx, username, &ctr->file.info3,
+                                   &ctr->num_entries, resume_hnd );
        if ( !W_ERROR_IS_OK(r->status))
                goto done;
        
@@ -1153,7 +1176,8 @@
 {
        switch ( q_u->level ) {
        case 3:
-               return net_file_enum_3( r_u, get_enum_hnd(&q_u->enum_hnd) );    
+               return net_file_enum_3( q_u->username, r_u,
+                                       get_enum_hnd(&q_u->enum_hnd) );
        default:
                return WERR_UNKNOWN_LEVEL;
        }

Reply via email to