2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Jeremy Allison 2001.
6 * Copyright (C) Nigel Williams 2001.
7 * Copyright (C) Gerald (Jerry) Carter 2006.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 /* This is the implementation of the srvsvc pipe. */
28 extern struct generic_mapping file_generic_mapping;
29 extern userdom_struct current_user_info;
32 #define DBGC_CLASS DBGC_RPC_SRV
34 /* Use for enumerating connections, pipes, & files */
36 struct file_enum_count {
42 struct sess_file_count {
48 /****************************************************************************
49 Count the entries belonging to a service in the connection db.
50 ****************************************************************************/
52 static int pipe_enum_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *p)
54 struct pipe_open_rec prec;
55 struct file_enum_count *fenum = (struct file_enum_count *)p;
57 if (dbuf.dsize != sizeof(struct pipe_open_rec))
60 memcpy(&prec, dbuf.dptr, sizeof(struct pipe_open_rec));
62 if ( process_exists(prec.pid) ) {
67 snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name );
69 f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
71 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
77 init_srv_file_info3( &fenum->info[i],
78 (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum),
79 (FILE_READ_DATA|FILE_WRITE_DATA),
81 uidtoname( prec.uid ),
90 /*******************************************************************
91 ********************************************************************/
93 static WERROR net_enum_pipes( TALLOC_CTX *ctx, FILE_INFO_3 **info,
94 uint32 *count, uint32 resume )
96 struct file_enum_count fenum;
97 TDB_CONTEXT *conn_tdb = conn_tdb_ctx();
100 DEBUG(0,("net_enum_pipes: Failed to retrieve the connections tdb handle!\n"));
101 return WERR_ACCESS_DENIED;
105 fenum.count = *count;
108 if (tdb_traverse(conn_tdb, pipe_enum_fn, &fenum) == -1) {
109 DEBUG(0,("net_enum_pipes: traverse of connections.tdb failed with error %s.\n",
110 tdb_errorstr(conn_tdb) ));
115 *count = fenum.count;
119 /*******************************************************************
120 ********************************************************************/
122 /* global needed to make use of the share_mode_forall() callback */
123 static struct file_enum_count f_enum_cnt;
125 static void enum_file_fn( const struct share_mode_entry *e,
126 const char *sharepath, const char *fname )
128 struct file_enum_count *fenum = &f_enum_cnt;
130 /* If the pid was not found delete the entry from connections.tdb */
132 if ( process_exists(e->pid) ) {
134 int i = fenum->count;
136 struct byte_range_lock *brl;
141 f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
143 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
148 /* need to count the number of locks on a file */
152 fsp.inode = e->inode;
154 if ( (brl = brl_get_locks(NULL,&fsp)) != NULL ) {
155 num_locks = brl->num_locks;
159 if ( strcmp( fname, "." ) == 0 ) {
160 pstr_sprintf( fullpath, "C:%s", sharepath );
162 pstr_sprintf( fullpath, "C:%s/%s", sharepath, fname );
164 string_replace( fullpath, '/', '\\' );
166 /* mask out create (what ever that is) */
167 permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA);
169 /* now fill in the FILE_INFO_3 struct */
170 init_srv_file_info3( &fenum->info[i],
184 /*******************************************************************
185 ********************************************************************/
187 static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info,
188 uint32 *count, uint32 resume )
190 f_enum_cnt.ctx = ctx;
191 f_enum_cnt.count = *count;
192 f_enum_cnt.info = *info;
194 share_mode_forall( enum_file_fn );
196 *info = f_enum_cnt.info;
197 *count = f_enum_cnt.count;
202 /*******************************************************************
203 Utility function to get the 'type' of a share from a share definition.
204 ********************************************************************/
205 static uint32 get_share_type(const struct share_params *params)
207 char *net_name = lp_servicename(params->service);
208 int len_net_name = strlen(net_name);
210 /* work out the share type */
211 uint32 type = STYPE_DISKTREE;
213 if (lp_print_ok(params->service))
215 if (strequal(lp_fstype(params->service), "IPC"))
217 if (net_name[len_net_name] == '$')
218 type |= STYPE_HIDDEN;
223 /*******************************************************************
224 Fill in a share info level 0 structure.
225 ********************************************************************/
227 static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0,
228 const struct share_params *params)
230 char *net_name = lp_servicename(params->service);
231 init_srv_share_info0(&sh0->info_0, net_name);
232 init_srv_share_info0_str(&sh0->info_0_str, net_name);
235 /*******************************************************************
236 Fill in a share info level 1 structure.
237 ********************************************************************/
239 static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1,
240 const struct share_params *params)
242 connection_struct *conn = p->conn;
243 char *net_name = lp_servicename(params->service);
246 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
247 conn->user, conn->connectpath, conn->gid,
248 get_current_username(),
249 current_user_info.domain,
250 lp_comment(params->service));
252 init_srv_share_info1(&sh1->info_1, net_name, get_share_type(params),
254 init_srv_share_info1_str(&sh1->info_1_str, net_name, remark);
257 /*******************************************************************
258 Fill in a share info level 2 structure.
259 ********************************************************************/
261 static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2,
262 const struct share_params *params)
264 connection_struct *conn = p->conn;
267 int max_connections = lp_max_connections(params->service);
268 uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff;
270 char *net_name = lp_servicename(params->service);
272 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
273 conn->user, conn->connectpath, conn->gid,
274 get_current_username(),
275 current_user_info.domain,
276 lp_comment(params->service));
277 path = talloc_asprintf(p->mem_ctx, "C:%s",
278 lp_pathname(params->service));
281 * Change / to \\ so that win2k will see it as a valid path. This was
282 * added to enable use of browsing in win2k add share dialog.
285 string_replace(path, '/', '\\');
287 count = count_current_connections( net_name, False );
288 init_srv_share_info2(&sh2->info_2, net_name, get_share_type(params),
289 remark, 0, max_uses, count, path, "");
291 init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, "");
294 /*******************************************************************
295 Map any generic bits to file specific bits.
296 ********************************************************************/
298 static void map_generic_share_sd_bits(SEC_DESC *psd)
301 SEC_ACL *ps_dacl = NULL;
310 for (i = 0; i < ps_dacl->num_aces; i++) {
311 SEC_ACE *psa = &ps_dacl->ace[i];
312 uint32 orig_mask = psa->info.mask;
314 se_map_generic(&psa->info.mask, &file_generic_mapping);
315 psa->info.mask |= orig_mask;
319 /*******************************************************************
320 Fill in a share info level 501 structure.
321 ********************************************************************/
323 static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501,
324 const struct share_params *params)
326 connection_struct *conn = p->conn;
328 const char *net_name = lp_servicename(params->service);
330 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
331 conn->user, conn->connectpath, conn->gid,
332 get_current_username(),
333 current_user_info.domain,
334 lp_comment(params->service));
336 init_srv_share_info501(&sh501->info_501, net_name,
337 get_share_type(params), remark,
338 (lp_csc_policy(params->service) << 4));
339 init_srv_share_info501_str(&sh501->info_501_str, net_name, remark);
342 /*******************************************************************
343 Fill in a share info level 502 structure.
344 ********************************************************************/
346 static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502,
347 const struct share_params *params)
349 connection_struct *conn = p->conn;
355 TALLOC_CTX *ctx = p->mem_ctx;
360 net_name = lp_servicename(params->service);
362 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
363 conn->user, conn->connectpath, conn->gid,
364 get_current_username(),
365 current_user_info.domain,
366 lp_comment(params->service));
368 path = talloc_asprintf(p->mem_ctx, "C:%s",
369 lp_pathname(params->service));
372 * Change / to \\ so that win2k will see it as a valid path. This was
373 * added to enable use of browsing in win2k add share dialog.
376 string_replace(path, '/', '\\');
378 sd = get_share_security(ctx, lp_servicename(params->service),
381 init_srv_share_info502(&sh502->info_502, net_name,
382 get_share_type(params), remark, 0, 0xffffffff,
383 1, path, "", sd, sd_size);
384 init_srv_share_info502_str(&sh502->info_502_str, net_name, remark,
385 path, "", sd, sd_size);
388 /***************************************************************************
389 Fill in a share info level 1004 structure.
390 ***************************************************************************/
392 static void init_srv_share_info_1004(pipes_struct *p,
393 SRV_SHARE_INFO_1004* sh1004,
394 const struct share_params *params)
396 connection_struct *conn = p->conn;
399 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
400 conn->user, conn->connectpath, conn->gid,
401 get_current_username(),
402 current_user_info.domain,
403 lp_comment(params->service));
405 ZERO_STRUCTP(sh1004);
407 init_srv_share_info1004(&sh1004->info_1004, remark);
408 init_srv_share_info1004_str(&sh1004->info_1004_str, remark);
411 /***************************************************************************
412 Fill in a share info level 1005 structure.
413 ***************************************************************************/
415 static void init_srv_share_info_1005(pipes_struct *p,
416 SRV_SHARE_INFO_1005* sh1005,
417 const struct share_params *params)
419 sh1005->share_info_flags = 0;
421 if(lp_host_msdfs() && lp_msdfs_root(params->service))
422 sh1005->share_info_flags |=
423 SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
424 sh1005->share_info_flags |=
425 lp_csc_policy(params->service) << SHARE_1005_CSC_POLICY_SHIFT;
427 /***************************************************************************
428 Fill in a share info level 1006 structure.
429 ***************************************************************************/
431 static void init_srv_share_info_1006(pipes_struct *p,
432 SRV_SHARE_INFO_1006* sh1006,
433 const struct share_params *params)
435 sh1006->max_uses = -1;
438 /***************************************************************************
439 Fill in a share info level 1007 structure.
440 ***************************************************************************/
442 static void init_srv_share_info_1007(pipes_struct *p,
443 SRV_SHARE_INFO_1007* sh1007,
444 const struct share_params *params)
446 pstring alternate_directory_name = "";
449 ZERO_STRUCTP(sh1007);
451 init_srv_share_info1007(&sh1007->info_1007, flags,
452 alternate_directory_name);
453 init_srv_share_info1007_str(&sh1007->info_1007_str,
454 alternate_directory_name);
457 /*******************************************************************
458 Fill in a share info level 1501 structure.
459 ********************************************************************/
461 static void init_srv_share_info_1501(pipes_struct *p,
462 SRV_SHARE_INFO_1501 *sh1501,
463 const struct share_params *params)
467 TALLOC_CTX *ctx = p->mem_ctx;
469 ZERO_STRUCTP(sh1501);
471 sd = get_share_security(ctx, lp_servicename(params->service),
474 sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
477 /*******************************************************************
478 True if it ends in '$'.
479 ********************************************************************/
481 static BOOL is_hidden_share(const struct share_params *params)
483 const char *net_name = lp_servicename(params->service);
485 return (net_name[strlen(net_name) - 1] == '$');
488 /*******************************************************************
489 Fill in a share info structure.
490 ********************************************************************/
492 static WERROR init_srv_share_info_ctr(pipes_struct *p,
493 SRV_SHARE_INFO_CTR *ctr,
494 uint32 info_level, uint32 *resume_hnd,
495 uint32 *total_entries, BOOL all_shares)
498 TALLOC_CTX *ctx = p->mem_ctx;
499 struct share_iterator *shares;
500 struct share_params *share;
502 DEBUG(5,("init_srv_share_info_ctr\n"));
504 ZERO_STRUCT(ctr->share);
506 ctr->info_level = ctr->switch_value = info_level;
509 /* Ensure all the usershares are loaded. */
511 load_usershare_shares();
516 ZERO_STRUCT(ctr->share);
518 if (!(shares = share_list_all(ctx))) {
519 DEBUG(5, ("Could not list shares\n"));
520 return WERR_ACCESS_DENIED;
523 while ((share = next_share(shares)) != NULL) {
524 if (!lp_browseable(share->service)) {
527 if (!all_shares && is_hidden_share(share)) {
531 switch (info_level) {
535 init_srv_share_info_0(p, &i, share);
536 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_0, i,
537 &ctr->share.info0, &num_entries);
538 if (ctr->share.info0 == NULL) {
547 init_srv_share_info_1(p, &i, share);
548 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1, i,
549 &ctr->share.info1, &num_entries);
550 if (ctr->share.info1 == NULL) {
559 init_srv_share_info_2(p, &i, share);
560 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_2, i,
561 &ctr->share.info2, &num_entries);
562 if (ctr->share.info2 == NULL) {
570 SRV_SHARE_INFO_501 i;
571 init_srv_share_info_501(p, &i, share);
572 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_501, i,
573 &ctr->share.info501, &num_entries);
574 if (ctr->share.info501 == NULL) {
582 SRV_SHARE_INFO_502 i;
583 init_srv_share_info_502(p, &i, share);
584 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_502, i,
585 &ctr->share.info502, &num_entries);
586 if (ctr->share.info502 == NULL) {
592 /* here for completeness but not currently used with enum
597 SRV_SHARE_INFO_1004 i;
598 init_srv_share_info_1004(p, &i, share);
599 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1004, i,
600 &ctr->share.info1004, &num_entries);
601 if (ctr->share.info1004 == NULL) {
609 SRV_SHARE_INFO_1005 i;
610 init_srv_share_info_1005(p, &i, share);
611 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1005, i,
612 &ctr->share.info1005, &num_entries);
613 if (ctr->share.info1005 == NULL) {
621 SRV_SHARE_INFO_1006 i;
622 init_srv_share_info_1006(p, &i, share);
623 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1006, i,
624 &ctr->share.info1006, &num_entries);
625 if (ctr->share.info1006 == NULL) {
633 SRV_SHARE_INFO_1007 i;
634 init_srv_share_info_1007(p, &i, share);
635 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1007, i,
636 &ctr->share.info1007, &num_entries);
637 if (ctr->share.info1007 == NULL) {
645 SRV_SHARE_INFO_1501 i;
646 init_srv_share_info_1501(p, &i, share);
647 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1501, i,
648 &ctr->share.info1501, &num_entries);
649 if (ctr->share.info1501 == NULL) {
655 DEBUG(5,("init_srv_share_info_ctr: unsupported switch "
656 "value %d\n", info_level));
657 return WERR_UNKNOWN_LEVEL;
663 *total_entries = num_entries;
664 ctr->num_entries2 = ctr->num_entries = num_entries;
665 ctr->ptr_share_info = ctr->ptr_entries = 1;
670 /*******************************************************************
671 Inits a SRV_R_NET_SHARE_ENUM structure.
672 ********************************************************************/
674 static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n,
675 uint32 info_level, uint32 resume_hnd, BOOL all)
677 DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__));
679 r_n->status = init_srv_share_info_ctr(p, &r_n->ctr, info_level,
681 &r_n->total_entries, all);
683 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
686 /*******************************************************************
687 Inits a SRV_R_NET_SHARE_GET_INFO structure.
688 ********************************************************************/
690 static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_INFO *r_n,
691 char *share_name, uint32 info_level)
693 WERROR status = WERR_OK;
694 const struct share_params *params;
696 DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__));
698 r_n->info.switch_value = info_level;
700 params = get_share_params(p->mem_ctx, share_name);
702 if (params != NULL) {
703 switch (info_level) {
705 init_srv_share_info_0(p, &r_n->info.share.info0,
709 init_srv_share_info_1(p, &r_n->info.share.info1,
713 init_srv_share_info_2(p, &r_n->info.share.info2,
717 init_srv_share_info_501(p, &r_n->info.share.info501,
721 init_srv_share_info_502(p, &r_n->info.share.info502,
725 /* here for completeness */
727 init_srv_share_info_1004(p, &r_n->info.share.info1004,
731 init_srv_share_info_1005(p, &r_n->info.share.info1005,
735 /* here for completeness 1006 - 1501 */
737 init_srv_share_info_1006(p, &r_n->info.share.info1006,
741 init_srv_share_info_1007(p, &r_n->info.share.info1007,
745 init_srv_share_info_1501(p, &r_n->info.share.info1501,
749 DEBUG(5,("init_srv_net_share_get_info: unsupported "
750 "switch value %d\n", info_level));
751 status = WERR_UNKNOWN_LEVEL;
755 status = WERR_INVALID_NAME;
758 r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0;
759 r_n->status = status;
762 /*******************************************************************
763 fill in a sess info level 0 structure.
764 ********************************************************************/
766 static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot)
768 struct sessionid *session_list;
769 uint32 num_entries = 0;
770 (*stot) = list_sessions(&session_list);
774 SAFE_FREE(session_list);
778 DEBUG(5,("init_srv_sess_0_ss0\n"));
781 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
782 init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine);
786 ss0->num_entries_read = num_entries;
787 ss0->ptr_sess_info = num_entries > 0 ? 1 : 0;
788 ss0->num_entries_read2 = num_entries;
790 if ((*snum) >= (*stot)) {
795 ss0->num_entries_read = 0;
796 ss0->ptr_sess_info = 0;
797 ss0->num_entries_read2 = 0;
799 SAFE_FREE(session_list);
802 /*******************************************************************
803 ********************************************************************/
805 /* global needed to make use of the share_mode_forall() callback */
806 static struct sess_file_count s_file_cnt;
808 static void sess_file_fn( const struct share_mode_entry *e,
809 const char *sharepath, const char *fname )
811 struct sess_file_count *sess = &s_file_cnt;
813 if ( (procid_to_pid(&e->pid) == sess->pid) && (sess->uid == e->uid) ) {
820 /*******************************************************************
821 ********************************************************************/
823 static int net_count_files( uid_t uid, pid_t pid )
825 s_file_cnt.count = 0;
826 s_file_cnt.uid = uid;
827 s_file_cnt.pid = pid;
829 share_mode_forall( sess_file_fn );
831 return s_file_cnt.count;
834 /*******************************************************************
835 fill in a sess info level 1 structure.
836 ********************************************************************/
838 static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot)
840 struct sessionid *session_list;
841 uint32 num_entries = 0;
842 time_t now = time(NULL);
845 ss1->num_entries_read = 0;
846 ss1->ptr_sess_info = 0;
847 ss1->num_entries_read2 = 0;
859 (*stot) = list_sessions(&session_list);
862 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
865 struct passwd *pw = sys_getpwnam(session_list[*snum].username);
869 DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n",
870 session_list[*snum].username));
874 connect_time = (uint32)(now - session_list[*snum].connect_start);
875 num_files = net_count_files(pw->pw_uid, session_list[*snum].pid);
876 guest = strequal( session_list[*snum].username, lp_guestaccount() );
878 init_srv_sess_info1( &ss1->info_1[num_entries],
879 session_list[*snum].remote_machine,
880 session_list[*snum].username,
888 ss1->num_entries_read = num_entries;
889 ss1->ptr_sess_info = num_entries > 0 ? 1 : 0;
890 ss1->num_entries_read2 = num_entries;
892 if ((*snum) >= (*stot)) {
896 SAFE_FREE(session_list);
899 /*******************************************************************
900 makes a SRV_R_NET_SESS_ENUM structure.
901 ********************************************************************/
903 static WERROR init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr,
904 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
906 WERROR status = WERR_OK;
907 DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__));
909 ctr->switch_value = switch_value;
911 switch (switch_value) {
913 init_srv_sess_info_0(&(ctr->sess.info0), resume_hnd, total_entries);
914 ctr->ptr_sess_ctr = 1;
917 init_srv_sess_info_1(&(ctr->sess.info1), resume_hnd, total_entries);
918 ctr->ptr_sess_ctr = 1;
921 DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value));
923 (*total_entries) = 0;
924 ctr->ptr_sess_ctr = 0;
925 status = WERR_UNKNOWN_LEVEL;
932 /*******************************************************************
933 makes a SRV_R_NET_SESS_ENUM structure.
934 ********************************************************************/
936 static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n,
937 uint32 resume_hnd, int sess_level, int switch_value)
939 DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__));
941 r_n->sess_level = sess_level;
943 if (sess_level == -1)
944 r_n->status = WERR_UNKNOWN_LEVEL;
946 r_n->status = init_srv_sess_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
948 if (!W_ERROR_IS_OK(r_n->status))
951 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
954 /*******************************************************************
955 fill in a conn info level 0 structure.
956 ********************************************************************/
958 static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot)
960 uint32 num_entries = 0;
968 DEBUG(5,("init_srv_conn_0_ss0\n"));
971 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
973 init_srv_conn_info0(&ss0->info_0[num_entries], (*stot));
975 /* move on to creating next connection */
976 /* move on to creating next conn */
980 ss0->num_entries_read = num_entries;
981 ss0->ptr_conn_info = num_entries > 0 ? 1 : 0;
982 ss0->num_entries_read2 = num_entries;
984 if ((*snum) >= (*stot)) {
989 ss0->num_entries_read = 0;
990 ss0->ptr_conn_info = 0;
991 ss0->num_entries_read2 = 0;
997 /*******************************************************************
998 fill in a conn info level 1 structure.
999 ********************************************************************/
1001 static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1,
1002 uint32 id, uint32 type,
1003 uint32 num_opens, uint32 num_users, uint32 open_time,
1004 const char *usr_name, const char *net_name)
1006 init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name);
1007 init_srv_conn_info1_str(str1, usr_name, net_name);
1010 /*******************************************************************
1011 fill in a conn info level 1 structure.
1012 ********************************************************************/
1014 static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot)
1016 uint32 num_entries = 0;
1024 DEBUG(5,("init_srv_conn_1_ss1\n"));
1027 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
1028 init_srv_conn_1_info(&ss1->info_1[num_entries],
1029 &ss1->info_1_str[num_entries],
1030 (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$");
1032 /* move on to creating next connection */
1033 /* move on to creating next conn */
1037 ss1->num_entries_read = num_entries;
1038 ss1->ptr_conn_info = num_entries > 0 ? 1 : 0;
1039 ss1->num_entries_read2 = num_entries;
1042 if ((*snum) >= (*stot)) {
1047 ss1->num_entries_read = 0;
1048 ss1->ptr_conn_info = 0;
1049 ss1->num_entries_read2 = 0;
1055 /*******************************************************************
1056 makes a SRV_R_NET_CONN_ENUM structure.
1057 ********************************************************************/
1059 static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,
1060 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
1062 WERROR status = WERR_OK;
1063 DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__));
1065 ctr->switch_value = switch_value;
1067 switch (switch_value) {
1069 init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries);
1070 ctr->ptr_conn_ctr = 1;
1073 init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries);
1074 ctr->ptr_conn_ctr = 1;
1077 DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value));
1079 (*total_entries) = 0;
1080 ctr->ptr_conn_ctr = 0;
1081 status = WERR_UNKNOWN_LEVEL;
1088 /*******************************************************************
1089 makes a SRV_R_NET_CONN_ENUM structure.
1090 ********************************************************************/
1092 static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,
1093 uint32 resume_hnd, int conn_level, int switch_value)
1095 DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__));
1097 r_n->conn_level = conn_level;
1098 if (conn_level == -1)
1099 r_n->status = WERR_UNKNOWN_LEVEL;
1101 r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
1103 if (!W_ERROR_IS_OK(r_n->status))
1106 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
1109 /*******************************************************************
1110 makes a SRV_R_NET_FILE_ENUM structure.
1111 ********************************************************************/
1113 static WERROR net_file_enum_3( SRV_R_NET_FILE_ENUM *r, uint32 resume_hnd )
1115 TALLOC_CTX *ctx = get_talloc_ctx();
1116 SRV_FILE_INFO_CTR *ctr = &r->ctr;
1118 /* TODO -- Windows enumerates
1120 (c) open directories and files */
1122 r->status = net_enum_files( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd );
1123 if ( !W_ERROR_IS_OK(r->status))
1126 r->status = net_enum_pipes( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd );
1127 if ( !W_ERROR_IS_OK(r->status))
1130 r->level = ctr->level = 3;
1131 r->total_entries = ctr->num_entries;
1132 /* ctr->num_entries = r->total_entries - resume_hnd; */
1133 ctr->num_entries2 = ctr->num_entries;
1134 ctr->ptr_file_info = 1;
1136 r->status = WERR_OK;
1139 if ( ctr->num_entries > 0 )
1140 ctr->ptr_entries = 1;
1142 init_enum_hnd(&r->enum_hnd, 0);
1147 /*******************************************************************
1148 *******************************************************************/
1150 WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u)
1152 switch ( q_u->level ) {
1154 return net_file_enum_3( r_u, get_enum_hnd(&q_u->enum_hnd) );
1156 return WERR_UNKNOWN_LEVEL;
1162 /*******************************************************************
1164 ********************************************************************/
1166 WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u)
1168 WERROR status = WERR_OK;
1169 SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR);
1176 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1178 if (!pipe_access_check(p)) {
1179 DEBUG(3, ("access denied to srv_net_srv_get_info\n"));
1180 return WERR_ACCESS_DENIED;
1183 switch (q_u->switch_value) {
1185 /* Technically level 102 should only be available to
1186 Administrators but there isn't anything super-secret
1187 here, as most of it is made up. */
1190 init_srv_info_102(&ctr->srv.sv102,
1191 500, global_myname(),
1192 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH),
1193 lp_major_announce_version(), lp_minor_announce_version(),
1194 lp_default_server_announce(),
1195 0xffffffff, /* users */
1199 3000, /* announce delta */
1200 100000, /* licenses */
1201 "c:\\"); /* user path */
1204 init_srv_info_101(&ctr->srv.sv101,
1205 500, global_myname(),
1206 lp_major_announce_version(), lp_minor_announce_version(),
1207 lp_default_server_announce(),
1208 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH));
1211 init_srv_info_100(&ctr->srv.sv100, 500, global_myname());
1214 status = WERR_UNKNOWN_LEVEL;
1218 /* set up the net server get info structure */
1219 init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status);
1221 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1226 /*******************************************************************
1228 ********************************************************************/
1230 WERROR _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u)
1232 WERROR status = WERR_OK;
1234 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1236 /* Set up the net server set info structure. */
1238 init_srv_r_net_srv_set_info(r_u, 0x0, status);
1240 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1245 /*******************************************************************
1247 ********************************************************************/
1249 WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u)
1251 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1253 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR);
1257 ZERO_STRUCTP(r_u->ctr);
1260 init_srv_r_net_conn_enum(r_u,
1261 get_enum_hnd(&q_u->enum_hnd),
1263 q_u->ctr->switch_value);
1265 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1270 /*******************************************************************
1272 ********************************************************************/
1274 WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u)
1276 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1278 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR);
1282 ZERO_STRUCTP(r_u->ctr);
1285 init_srv_r_net_sess_enum(r_u,
1286 get_enum_hnd(&q_u->enum_hnd),
1288 q_u->ctr->switch_value);
1290 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1295 /*******************************************************************
1297 ********************************************************************/
1299 WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u)
1301 struct sessionid *session_list;
1302 int num_sessions, snum;
1305 BOOL not_root = False;
1307 rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name);
1308 rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name);
1310 /* strip leading backslashes if any */
1311 while (machine[0] == '\\') {
1312 memmove(machine, &machine[1], strlen(machine));
1315 num_sessions = list_sessions(&session_list);
1317 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1319 r_u->status = WERR_ACCESS_DENIED;
1321 /* fail out now if you are not root or not a domain admin */
1323 if ((p->pipe_user.ut.uid != sec_initial_uid()) &&
1324 ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) {
1329 for (snum = 0; snum < num_sessions; snum++) {
1331 if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
1332 strequal(session_list[snum].remote_machine, machine)) {
1334 if (p->pipe_user.ut.uid != sec_initial_uid()) {
1339 if (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False))
1340 r_u->status = WERR_OK;
1347 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1351 SAFE_FREE(session_list);
1356 /*******************************************************************
1358 ********************************************************************/
1360 WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1362 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1364 if (!pipe_access_check(p)) {
1365 DEBUG(3, ("access denied to srv_net_share_enum_all\n"));
1366 return WERR_ACCESS_DENIED;
1369 /* Create the list of shares for the response. */
1370 init_srv_r_net_share_enum(p, r_u,
1371 q_u->ctr.info_level,
1372 get_enum_hnd(&q_u->enum_hnd), True);
1374 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1379 /*******************************************************************
1381 ********************************************************************/
1383 WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1385 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1387 if (!pipe_access_check(p)) {
1388 DEBUG(3, ("access denied to srv_net_share_enum\n"));
1389 return WERR_ACCESS_DENIED;
1392 /* Create the list of shares for the response. */
1393 init_srv_r_net_share_enum(p, r_u,
1394 q_u->ctr.info_level,
1395 get_enum_hnd(&q_u->enum_hnd), False);
1397 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1402 /*******************************************************************
1404 ********************************************************************/
1406 WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u)
1410 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1412 /* Create the list of shares for the response. */
1413 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1414 init_srv_r_net_share_get_info(p, r_u, share_name, q_u->info_level);
1416 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1421 /*******************************************************************
1422 Check a given DOS pathname is valid for a share.
1423 ********************************************************************/
1425 char *valid_share_pathname(char *dos_pathname)
1429 /* Convert any '\' paths to '/' */
1430 unix_format(dos_pathname);
1431 unix_clean_name(dos_pathname);
1433 /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
1435 if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/')
1438 /* Only absolute paths allowed. */
1445 /*******************************************************************
1446 Net share set info. Modify share details.
1447 ********************************************************************/
1449 WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u)
1459 SEC_DESC *psd = NULL;
1460 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1461 BOOL is_disk_op = False;
1462 int max_connections = 0;
1464 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1466 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1468 r_u->parm_error = 0;
1470 if ( strequal(share_name,"IPC$")
1471 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1472 || strequal(share_name,"global") )
1474 return WERR_ACCESS_DENIED;
1477 snum = find_service(share_name);
1479 /* Does this share exist ? */
1481 return WERR_NET_NAME_NOT_FOUND;
1483 /* No change to printer shares. */
1484 if (lp_print_ok(snum))
1485 return WERR_ACCESS_DENIED;
1487 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1489 /* fail out now if you are not root and not a disk op */
1491 if ( p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1492 return WERR_ACCESS_DENIED;
1494 switch (q_u->info_level) {
1496 pstrcpy(pathname, lp_pathname(snum));
1497 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1498 type = q_u->info.share.info2.info_2.type;
1502 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1503 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname));
1504 type = q_u->info.share.info2.info_2.type;
1505 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1509 /* not supported on set but here for completeness */
1511 unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment));
1512 type = q_u->info.share.info501.info_501.type;
1517 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment));
1518 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname));
1519 type = q_u->info.share.info502.info_502.type;
1520 psd = q_u->info.share.info502.info_502_str.sd;
1521 map_generic_share_sd_bits(psd);
1524 pstrcpy(pathname, lp_pathname(snum));
1525 unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment));
1526 type = STYPE_DISKTREE;
1529 /* XP re-sets the csc policy even if it wasn't changed by the
1530 user, so we must compare it to see if it's what is set in
1531 smb.conf, so that we can contine other ops like setting
1533 if (((q_u->info.share.info1005.share_info_flags &
1534 SHARE_1005_CSC_POLICY_MASK) >>
1535 SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
1538 DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n"));
1539 return WERR_ACCESS_DENIED;
1543 return WERR_ACCESS_DENIED;
1545 pstrcpy(pathname, lp_pathname(snum));
1546 fstrcpy(comment, lp_comment(snum));
1547 psd = q_u->info.share.info1501.sdb->sec;
1548 map_generic_share_sd_bits(psd);
1549 type = STYPE_DISKTREE;
1552 DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level));
1553 return WERR_UNKNOWN_LEVEL;
1556 /* We can only modify disk shares. */
1557 if (type != STYPE_DISKTREE)
1558 return WERR_ACCESS_DENIED;
1560 /* Check if the pathname is valid. */
1561 if (!(path = valid_share_pathname( pathname )))
1562 return WERR_OBJECT_PATH_INVALID;
1564 /* Ensure share name, pathname and comment don't contain '"' characters. */
1565 string_replace(share_name, '"', ' ');
1566 string_replace(path, '"', ' ');
1567 string_replace(comment, '"', ' ');
1569 DEBUG(10,("_srv_net_share_set_info: change share command = %s\n",
1570 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
1572 /* Only call modify function if something changed. */
1574 if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum))
1575 || (lp_max_connections(snum) != max_connections) )
1577 if (!lp_change_share_cmd() || !*lp_change_share_cmd()) {
1578 DEBUG(10,("_srv_net_share_set_info: No change share command\n"));
1579 return WERR_ACCESS_DENIED;
1582 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1583 lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections );
1585 DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command ));
1587 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1592 if ( (ret = smbrun(command, NULL)) == 0 ) {
1593 /* Tell everyone we updated smb.conf. */
1594 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1600 /********* END SeDiskOperatorPrivilege BLOCK *********/
1602 DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret ));
1605 return WERR_ACCESS_DENIED;
1607 DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name ));
1610 /* Replace SD if changed. */
1615 old_sd = get_share_security(p->mem_ctx, lp_servicename(snum),
1618 if (old_sd && !sec_desc_equal(old_sd, psd)) {
1619 if (!set_share_security(p->mem_ctx, share_name, psd))
1620 DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n",
1625 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1630 /*******************************************************************
1631 Net share add. Call 'add_share_command "sharename" "pathname"
1632 "comment" "max connections = "
1633 ********************************************************************/
1635 WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
1645 SEC_DESC *psd = NULL;
1646 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1648 int max_connections = 0;
1650 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1652 r_u->parm_error = 0;
1654 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1656 if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1657 return WERR_ACCESS_DENIED;
1659 if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
1660 DEBUG(10,("_srv_net_share_add: No add share command\n"));
1661 return WERR_ACCESS_DENIED;
1664 switch (q_u->info_level) {
1666 /* No path. Not enough info in a level 0 to do anything. */
1667 return WERR_ACCESS_DENIED;
1669 /* Not enough info in a level 1 to do anything. */
1670 return WERR_ACCESS_DENIED;
1672 unistr2_to_ascii(share_name, &q_u->info.share.info2.info_2_str.uni_netname, sizeof(share_name));
1673 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name));
1674 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name));
1675 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1676 type = q_u->info.share.info2.info_2.type;
1679 /* No path. Not enough info in a level 501 to do anything. */
1680 return WERR_ACCESS_DENIED;
1682 unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name));
1683 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name));
1684 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name));
1685 type = q_u->info.share.info502.info_502.type;
1686 psd = q_u->info.share.info502.info_502_str.sd;
1687 map_generic_share_sd_bits(psd);
1690 /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */
1696 return WERR_ACCESS_DENIED;
1698 /* DFS only level. */
1699 return WERR_ACCESS_DENIED;
1701 DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level));
1702 return WERR_UNKNOWN_LEVEL;
1705 /* check for invalid share names */
1707 if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, sizeof(share_name) ) ) {
1708 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", share_name));
1709 return WERR_INVALID_NAME;
1712 if ( strequal(share_name,"IPC$") || strequal(share_name,"global")
1713 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) )
1715 return WERR_ACCESS_DENIED;
1718 snum = find_service(share_name);
1720 /* Share already exists. */
1722 return WERR_ALREADY_EXISTS;
1724 /* We can only add disk shares. */
1725 if (type != STYPE_DISKTREE)
1726 return WERR_ACCESS_DENIED;
1728 /* Check if the pathname is valid. */
1729 if (!(path = valid_share_pathname( pathname )))
1730 return WERR_OBJECT_PATH_INVALID;
1732 /* Ensure share name, pathname and comment don't contain '"' characters. */
1733 string_replace(share_name, '"', ' ');
1734 string_replace(path, '"', ' ');
1735 string_replace(comment, '"', ' ');
1737 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1745 DEBUG(10,("_srv_net_share_add: Running [%s]\n", command ));
1747 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1752 if ( (ret = smbrun(command, NULL)) == 0 ) {
1753 /* Tell everyone we updated smb.conf. */
1754 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1760 /********* END SeDiskOperatorPrivilege BLOCK *********/
1762 DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret ));
1765 return WERR_ACCESS_DENIED;
1768 if (!set_share_security(p->mem_ctx, share_name, psd)) {
1769 DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name ));
1774 * We don't call reload_services() here, the message will
1775 * cause this to be done before the next packet is read
1776 * from the client. JRA.
1779 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1784 /*******************************************************************
1785 Net share delete. Call "delete share command" with the share name as
1787 ********************************************************************/
1789 WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1795 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1798 DEBUG(5,("_srv_net_share_del: %d\n", __LINE__));
1800 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1802 if ( strequal(share_name,"IPC$")
1803 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1804 || strequal(share_name,"global") )
1806 return WERR_ACCESS_DENIED;
1809 snum = find_service(share_name);
1812 return WERR_NO_SUCH_SHARE;
1814 /* No change to printer shares. */
1815 if (lp_print_ok(snum))
1816 return WERR_ACCESS_DENIED;
1818 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1820 if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1821 return WERR_ACCESS_DENIED;
1823 if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) {
1824 DEBUG(10,("_srv_net_share_del: No delete share command\n"));
1825 return WERR_ACCESS_DENIED;
1828 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"",
1829 lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum));
1831 DEBUG(10,("_srv_net_share_del: Running [%s]\n", command ));
1833 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1838 if ( (ret = smbrun(command, NULL)) == 0 ) {
1839 /* Tell everyone we updated smb.conf. */
1840 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1846 /********* END SeDiskOperatorPrivilege BLOCK *********/
1848 DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret ));
1851 return WERR_ACCESS_DENIED;
1853 /* Delete the SD in the database. */
1854 delete_share_security(snum);
1856 lp_killservice(snum);
1861 WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1863 DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__));
1865 return _srv_net_share_del(p, q_u, r_u);
1868 /*******************************************************************
1870 ********************************************************************/
1872 WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u)
1874 TIME_OF_DAY_INFO *tod;
1876 time_t unixdate = time(NULL);
1878 /* We do this call first as if we do it *after* the gmtime call
1879 it overwrites the pointed-to values. JRA */
1881 uint32 zone = get_time_zone(unixdate)/60;
1883 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1885 if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) )
1889 r_u->ptr_srv_tod = 0x1;
1890 r_u->status = WERR_OK;
1892 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1894 t = gmtime(&unixdate);
1897 init_time_of_day_info(tod,
1911 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1916 /***********************************************************************************
1917 Win9x NT tools get security descriptor.
1918 ***********************************************************************************/
1920 WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u,
1921 SRV_R_NET_FILE_QUERY_SECDESC *r_u)
1923 SEC_DESC *psd = NULL;
1928 files_struct *fsp = NULL;
1932 connection_struct *conn = NULL;
1933 BOOL became_user = False;
1937 r_u->status = WERR_OK;
1939 unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
1941 /* Null password is ok - we are already an authenticated user... */
1942 null_pw = data_blob(NULL, 0);
1945 conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status);
1949 DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname));
1950 r_u->status = ntstatus_to_werror(nt_status);
1954 if (!become_user(conn, conn->vuid)) {
1955 DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n"));
1956 r_u->status = WERR_ACCESS_DENIED;
1961 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
1962 unix_convert(filename, conn, NULL, &bad_path, &st);
1964 DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename));
1965 r_u->status = WERR_ACCESS_DENIED;
1969 if (!check_name(filename,conn)) {
1970 DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename));
1971 r_u->status = WERR_ACCESS_DENIED;
1975 nt_status = open_file_stat(conn, filename, &st, &fsp);
1976 if (!NT_STATUS_IS_OK(nt_status)) {
1977 /* Perhaps it is a directory */
1978 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
1979 nt_status = open_directory(conn, filename, &st,
1980 READ_CONTROL_ACCESS,
1981 FILE_SHARE_READ|FILE_SHARE_WRITE,
1986 if (!NT_STATUS_IS_OK(nt_status)) {
1987 DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename));
1988 r_u->status = WERR_ACCESS_DENIED;
1993 sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd);
1996 DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename));
1997 r_u->status = WERR_ACCESS_DENIED;
2001 r_u->ptr_response = 1;
2002 r_u->size_response = sd_size;
2003 r_u->ptr_secdesc = 1;
2004 r_u->size_secdesc = sd_size;
2005 r_u->sec_desc = psd;
2007 psd->dacl->revision = (uint16) NT4_ACL_REVISION;
2009 close_file(fsp, NORMAL_CLOSE);
2011 close_cnum(conn, p->pipe_user.vuid);
2017 close_file(fsp, NORMAL_CLOSE);
2024 close_cnum(conn, p->pipe_user.vuid);
2029 /***********************************************************************************
2030 Win9x NT tools set security descriptor.
2031 ***********************************************************************************/
2033 WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u,
2034 SRV_R_NET_FILE_SET_SECDESC *r_u)
2040 files_struct *fsp = NULL;
2044 connection_struct *conn = NULL;
2045 BOOL became_user = False;
2049 r_u->status = WERR_OK;
2051 unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
2053 /* Null password is ok - we are already an authenticated user... */
2054 null_pw = data_blob(NULL, 0);
2057 conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status);
2061 DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname));
2062 r_u->status = ntstatus_to_werror(nt_status);
2066 if (!become_user(conn, conn->vuid)) {
2067 DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n"));
2068 r_u->status = WERR_ACCESS_DENIED;
2073 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
2074 unix_convert(filename, conn, NULL, &bad_path, &st);
2076 DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename));
2077 r_u->status = WERR_ACCESS_DENIED;
2081 if (!check_name(filename,conn)) {
2082 DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename));
2083 r_u->status = WERR_ACCESS_DENIED;
2088 nt_status = open_file_stat(conn, filename, &st, &fsp);
2090 if (!NT_STATUS_IS_OK(nt_status)) {
2091 /* Perhaps it is a directory */
2092 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
2093 nt_status = open_directory(conn, filename, &st,
2094 FILE_READ_ATTRIBUTES,
2095 FILE_SHARE_READ|FILE_SHARE_WRITE,
2100 if (!NT_STATUS_IS_OK(nt_status)) {
2101 DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename));
2102 r_u->status = WERR_ACCESS_DENIED;
2107 ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc);
2110 DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename));
2111 r_u->status = WERR_ACCESS_DENIED;
2115 close_file(fsp, NORMAL_CLOSE);
2117 close_cnum(conn, p->pipe_user.vuid);
2123 close_file(fsp, NORMAL_CLOSE);
2131 close_cnum(conn, p->pipe_user.vuid);
2137 /***********************************************************************************
2138 It may be that we want to limit users to creating shares on certain areas of the UNIX file area.
2139 We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy.
2140 These disks would the disks listed by this function.
2141 Users could then create shares relative to these disks. Watch out for moving these disks around.
2142 "Nigel Williams" <nigel@veritas.com>.
2143 ***********************************************************************************/
2145 static const char *server_disks[] = {"C:"};
2147 static uint32 get_server_disk_count(void)
2149 return sizeof(server_disks)/sizeof(server_disks[0]);
2152 static uint32 init_server_disk_enum(uint32 *resume)
2154 uint32 server_disk_count = get_server_disk_count();
2156 /*resume can be an offset into the list for now*/
2158 if(*resume & 0x80000000)
2161 if(*resume > server_disk_count)
2162 *resume = server_disk_count;
2164 return server_disk_count - *resume;
2167 static const char *next_server_disk_enum(uint32 *resume)
2171 if(init_server_disk_enum(resume) == 0)
2174 disk = server_disks[*resume];
2178 DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume));
2183 WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u)
2186 const char *disk_name;
2187 TALLOC_CTX *ctx = p->mem_ctx;
2188 uint32 resume=get_enum_hnd(&q_u->enum_hnd);
2190 r_u->status=WERR_OK;
2192 r_u->total_entries = init_server_disk_enum(&resume);
2194 r_u->disk_enum_ctr.unknown = 0;
2196 if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) {
2200 r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0;
2202 /*allow one DISK_INFO for null terminator*/
2204 for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
2206 r_u->disk_enum_ctr.entries_read++;
2208 /*copy disk name into a unicode string*/
2210 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name);
2213 /* add a terminating null string. Is this there if there is more data to come? */
2215 r_u->disk_enum_ctr.entries_read++;
2217 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, "");
2219 init_enum_hnd(&r_u->enum_hnd, resume);
2224 /********************************************************************
2225 ********************************************************************/
2227 WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u)
2231 switch ( q_u->type ) {
2233 rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0);
2234 if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) {
2235 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename));
2236 return WERR_INVALID_NAME;
2241 return WERR_UNKNOWN_LEVEL;
2248 /********************************************************************
2249 ********************************************************************/
2251 WERROR _srv_net_file_close(pipes_struct *p, SRV_Q_NET_FILE_CLOSE *q_u, SRV_R_NET_FILE_CLOSE *r_u)
2253 return WERR_ACCESS_DENIED;