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,
129 struct file_enum_count *fenum = &f_enum_cnt;
131 /* If the pid was not found delete the entry from connections.tdb */
133 if ( process_exists(e->pid) ) {
135 int i = fenum->count;
137 struct byte_range_lock *brl;
142 f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
144 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
149 /* need to count the number of locks on a file */
153 fsp.inode = e->inode;
155 if ( (brl = brl_get_locks(NULL,&fsp)) != NULL ) {
156 num_locks = brl->num_locks;
160 if ( strcmp( fname, "." ) == 0 ) {
161 pstr_sprintf( fullpath, "C:%s", sharepath );
163 pstr_sprintf( fullpath, "C:%s/%s", sharepath, fname );
165 string_replace( fullpath, '/', '\\' );
167 /* mask out create (what ever that is) */
168 permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA);
170 /* now fill in the FILE_INFO_3 struct */
171 init_srv_file_info3( &fenum->info[i],
185 /*******************************************************************
186 ********************************************************************/
188 static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info,
189 uint32 *count, uint32 resume )
191 f_enum_cnt.ctx = ctx;
192 f_enum_cnt.count = *count;
193 f_enum_cnt.info = *info;
195 share_mode_forall( enum_file_fn, NULL );
197 *info = f_enum_cnt.info;
198 *count = f_enum_cnt.count;
203 /*******************************************************************
204 Utility function to get the 'type' of a share from a share definition.
205 ********************************************************************/
206 static uint32 get_share_type(const struct share_params *params)
208 char *net_name = lp_servicename(params->service);
209 int len_net_name = strlen(net_name);
211 /* work out the share type */
212 uint32 type = STYPE_DISKTREE;
214 if (lp_print_ok(params->service))
216 if (strequal(lp_fstype(params->service), "IPC"))
218 if (net_name[len_net_name] == '$')
219 type |= STYPE_HIDDEN;
224 /*******************************************************************
225 Fill in a share info level 0 structure.
226 ********************************************************************/
228 static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0,
229 const struct share_params *params)
231 char *net_name = lp_servicename(params->service);
232 init_srv_share_info0(&sh0->info_0, net_name);
233 init_srv_share_info0_str(&sh0->info_0_str, net_name);
236 /*******************************************************************
237 Fill in a share info level 1 structure.
238 ********************************************************************/
240 static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1,
241 const struct share_params *params)
243 connection_struct *conn = p->conn;
244 char *net_name = lp_servicename(params->service);
247 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
248 conn->user, conn->connectpath, conn->gid,
249 get_current_username(),
250 current_user_info.domain,
251 lp_comment(params->service));
253 init_srv_share_info1(&sh1->info_1, net_name, get_share_type(params),
255 init_srv_share_info1_str(&sh1->info_1_str, net_name, remark);
258 /*******************************************************************
259 Fill in a share info level 2 structure.
260 ********************************************************************/
262 static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2,
263 const struct share_params *params)
265 connection_struct *conn = p->conn;
268 int max_connections = lp_max_connections(params->service);
269 uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff;
271 char *net_name = lp_servicename(params->service);
273 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
274 conn->user, conn->connectpath, conn->gid,
275 get_current_username(),
276 current_user_info.domain,
277 lp_comment(params->service));
278 path = talloc_asprintf(p->mem_ctx, "C:%s",
279 lp_pathname(params->service));
282 * Change / to \\ so that win2k will see it as a valid path. This was
283 * added to enable use of browsing in win2k add share dialog.
286 string_replace(path, '/', '\\');
288 count = count_current_connections( net_name, False );
289 init_srv_share_info2(&sh2->info_2, net_name, get_share_type(params),
290 remark, 0, max_uses, count, path, "");
292 init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, "");
295 /*******************************************************************
296 Map any generic bits to file specific bits.
297 ********************************************************************/
299 static void map_generic_share_sd_bits(SEC_DESC *psd)
302 SEC_ACL *ps_dacl = NULL;
311 for (i = 0; i < ps_dacl->num_aces; i++) {
312 SEC_ACE *psa = &ps_dacl->ace[i];
313 uint32 orig_mask = psa->info.mask;
315 se_map_generic(&psa->info.mask, &file_generic_mapping);
316 psa->info.mask |= orig_mask;
320 /*******************************************************************
321 Fill in a share info level 501 structure.
322 ********************************************************************/
324 static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501,
325 const struct share_params *params)
327 connection_struct *conn = p->conn;
329 const char *net_name = lp_servicename(params->service);
331 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
332 conn->user, conn->connectpath, conn->gid,
333 get_current_username(),
334 current_user_info.domain,
335 lp_comment(params->service));
337 init_srv_share_info501(&sh501->info_501, net_name,
338 get_share_type(params), remark,
339 (lp_csc_policy(params->service) << 4));
340 init_srv_share_info501_str(&sh501->info_501_str, net_name, remark);
343 /*******************************************************************
344 Fill in a share info level 502 structure.
345 ********************************************************************/
347 static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502,
348 const struct share_params *params)
350 connection_struct *conn = p->conn;
356 TALLOC_CTX *ctx = p->mem_ctx;
361 net_name = lp_servicename(params->service);
363 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
364 conn->user, conn->connectpath, conn->gid,
365 get_current_username(),
366 current_user_info.domain,
367 lp_comment(params->service));
369 path = talloc_asprintf(p->mem_ctx, "C:%s",
370 lp_pathname(params->service));
373 * Change / to \\ so that win2k will see it as a valid path. This was
374 * added to enable use of browsing in win2k add share dialog.
377 string_replace(path, '/', '\\');
379 sd = get_share_security(ctx, lp_servicename(params->service),
382 init_srv_share_info502(&sh502->info_502, net_name,
383 get_share_type(params), remark, 0, 0xffffffff,
384 1, path, "", sd, sd_size);
385 init_srv_share_info502_str(&sh502->info_502_str, net_name, remark,
386 path, "", sd, sd_size);
389 /***************************************************************************
390 Fill in a share info level 1004 structure.
391 ***************************************************************************/
393 static void init_srv_share_info_1004(pipes_struct *p,
394 SRV_SHARE_INFO_1004* sh1004,
395 const struct share_params *params)
397 connection_struct *conn = p->conn;
400 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
401 conn->user, conn->connectpath, conn->gid,
402 get_current_username(),
403 current_user_info.domain,
404 lp_comment(params->service));
406 ZERO_STRUCTP(sh1004);
408 init_srv_share_info1004(&sh1004->info_1004, remark);
409 init_srv_share_info1004_str(&sh1004->info_1004_str, remark);
412 /***************************************************************************
413 Fill in a share info level 1005 structure.
414 ***************************************************************************/
416 static void init_srv_share_info_1005(pipes_struct *p,
417 SRV_SHARE_INFO_1005* sh1005,
418 const struct share_params *params)
420 sh1005->share_info_flags = 0;
422 if(lp_host_msdfs() && lp_msdfs_root(params->service))
423 sh1005->share_info_flags |=
424 SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
425 sh1005->share_info_flags |=
426 lp_csc_policy(params->service) << SHARE_1005_CSC_POLICY_SHIFT;
428 /***************************************************************************
429 Fill in a share info level 1006 structure.
430 ***************************************************************************/
432 static void init_srv_share_info_1006(pipes_struct *p,
433 SRV_SHARE_INFO_1006* sh1006,
434 const struct share_params *params)
436 sh1006->max_uses = -1;
439 /***************************************************************************
440 Fill in a share info level 1007 structure.
441 ***************************************************************************/
443 static void init_srv_share_info_1007(pipes_struct *p,
444 SRV_SHARE_INFO_1007* sh1007,
445 const struct share_params *params)
447 pstring alternate_directory_name = "";
450 ZERO_STRUCTP(sh1007);
452 init_srv_share_info1007(&sh1007->info_1007, flags,
453 alternate_directory_name);
454 init_srv_share_info1007_str(&sh1007->info_1007_str,
455 alternate_directory_name);
458 /*******************************************************************
459 Fill in a share info level 1501 structure.
460 ********************************************************************/
462 static void init_srv_share_info_1501(pipes_struct *p,
463 SRV_SHARE_INFO_1501 *sh1501,
464 const struct share_params *params)
468 TALLOC_CTX *ctx = p->mem_ctx;
470 ZERO_STRUCTP(sh1501);
472 sd = get_share_security(ctx, lp_servicename(params->service),
475 sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
478 /*******************************************************************
479 True if it ends in '$'.
480 ********************************************************************/
482 static BOOL is_hidden_share(const struct share_params *params)
484 const char *net_name = lp_servicename(params->service);
486 return (net_name[strlen(net_name) - 1] == '$');
489 /*******************************************************************
490 Fill in a share info structure.
491 ********************************************************************/
493 static WERROR init_srv_share_info_ctr(pipes_struct *p,
494 SRV_SHARE_INFO_CTR *ctr,
495 uint32 info_level, uint32 *resume_hnd,
496 uint32 *total_entries, BOOL all_shares)
499 TALLOC_CTX *ctx = p->mem_ctx;
500 struct share_iterator *shares;
501 struct share_params *share;
503 DEBUG(5,("init_srv_share_info_ctr\n"));
505 ZERO_STRUCT(ctr->share);
507 ctr->info_level = ctr->switch_value = info_level;
510 /* Ensure all the usershares are loaded. */
512 load_usershare_shares();
517 ZERO_STRUCT(ctr->share);
519 if (!(shares = share_list_all(ctx))) {
520 DEBUG(5, ("Could not list shares\n"));
521 return WERR_ACCESS_DENIED;
524 while ((share = next_share(shares)) != NULL) {
525 if (!lp_browseable(share->service)) {
528 if (!all_shares && is_hidden_share(share)) {
532 switch (info_level) {
536 init_srv_share_info_0(p, &i, share);
537 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_0, i,
538 &ctr->share.info0, &num_entries);
539 if (ctr->share.info0 == NULL) {
548 init_srv_share_info_1(p, &i, share);
549 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1, i,
550 &ctr->share.info1, &num_entries);
551 if (ctr->share.info1 == NULL) {
560 init_srv_share_info_2(p, &i, share);
561 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_2, i,
562 &ctr->share.info2, &num_entries);
563 if (ctr->share.info2 == NULL) {
571 SRV_SHARE_INFO_501 i;
572 init_srv_share_info_501(p, &i, share);
573 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_501, i,
574 &ctr->share.info501, &num_entries);
575 if (ctr->share.info501 == NULL) {
583 SRV_SHARE_INFO_502 i;
584 init_srv_share_info_502(p, &i, share);
585 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_502, i,
586 &ctr->share.info502, &num_entries);
587 if (ctr->share.info502 == NULL) {
593 /* here for completeness but not currently used with enum
598 SRV_SHARE_INFO_1004 i;
599 init_srv_share_info_1004(p, &i, share);
600 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1004, i,
601 &ctr->share.info1004, &num_entries);
602 if (ctr->share.info1004 == NULL) {
610 SRV_SHARE_INFO_1005 i;
611 init_srv_share_info_1005(p, &i, share);
612 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1005, i,
613 &ctr->share.info1005, &num_entries);
614 if (ctr->share.info1005 == NULL) {
622 SRV_SHARE_INFO_1006 i;
623 init_srv_share_info_1006(p, &i, share);
624 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1006, i,
625 &ctr->share.info1006, &num_entries);
626 if (ctr->share.info1006 == NULL) {
634 SRV_SHARE_INFO_1007 i;
635 init_srv_share_info_1007(p, &i, share);
636 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1007, i,
637 &ctr->share.info1007, &num_entries);
638 if (ctr->share.info1007 == NULL) {
646 SRV_SHARE_INFO_1501 i;
647 init_srv_share_info_1501(p, &i, share);
648 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1501, i,
649 &ctr->share.info1501, &num_entries);
650 if (ctr->share.info1501 == NULL) {
656 DEBUG(5,("init_srv_share_info_ctr: unsupported switch "
657 "value %d\n", info_level));
658 return WERR_UNKNOWN_LEVEL;
664 *total_entries = num_entries;
665 ctr->num_entries2 = ctr->num_entries = num_entries;
666 ctr->ptr_share_info = ctr->ptr_entries = 1;
671 /*******************************************************************
672 Inits a SRV_R_NET_SHARE_ENUM structure.
673 ********************************************************************/
675 static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n,
676 uint32 info_level, uint32 resume_hnd, BOOL all)
678 DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__));
680 r_n->status = init_srv_share_info_ctr(p, &r_n->ctr, info_level,
682 &r_n->total_entries, all);
684 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
687 /*******************************************************************
688 Inits a SRV_R_NET_SHARE_GET_INFO structure.
689 ********************************************************************/
691 static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_INFO *r_n,
692 char *share_name, uint32 info_level)
694 WERROR status = WERR_OK;
695 const struct share_params *params;
697 DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__));
699 r_n->info.switch_value = info_level;
701 params = get_share_params(p->mem_ctx, share_name);
703 if (params != NULL) {
704 switch (info_level) {
706 init_srv_share_info_0(p, &r_n->info.share.info0,
710 init_srv_share_info_1(p, &r_n->info.share.info1,
714 init_srv_share_info_2(p, &r_n->info.share.info2,
718 init_srv_share_info_501(p, &r_n->info.share.info501,
722 init_srv_share_info_502(p, &r_n->info.share.info502,
726 /* here for completeness */
728 init_srv_share_info_1004(p, &r_n->info.share.info1004,
732 init_srv_share_info_1005(p, &r_n->info.share.info1005,
736 /* here for completeness 1006 - 1501 */
738 init_srv_share_info_1006(p, &r_n->info.share.info1006,
742 init_srv_share_info_1007(p, &r_n->info.share.info1007,
746 init_srv_share_info_1501(p, &r_n->info.share.info1501,
750 DEBUG(5,("init_srv_net_share_get_info: unsupported "
751 "switch value %d\n", info_level));
752 status = WERR_UNKNOWN_LEVEL;
756 status = WERR_INVALID_NAME;
759 r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0;
760 r_n->status = status;
763 /*******************************************************************
764 fill in a sess info level 0 structure.
765 ********************************************************************/
767 static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot)
769 struct sessionid *session_list;
770 uint32 num_entries = 0;
771 (*stot) = list_sessions(&session_list);
775 SAFE_FREE(session_list);
779 DEBUG(5,("init_srv_sess_0_ss0\n"));
782 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
783 init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine);
787 ss0->num_entries_read = num_entries;
788 ss0->ptr_sess_info = num_entries > 0 ? 1 : 0;
789 ss0->num_entries_read2 = num_entries;
791 if ((*snum) >= (*stot)) {
796 ss0->num_entries_read = 0;
797 ss0->ptr_sess_info = 0;
798 ss0->num_entries_read2 = 0;
800 SAFE_FREE(session_list);
803 /*******************************************************************
804 ********************************************************************/
806 static void sess_file_fn( const struct share_mode_entry *e,
807 const char *sharepath, const char *fname,
810 struct sess_file_count *sess = (struct sess_file_count *)private_data;
812 if ( (procid_to_pid(&e->pid) == sess->pid) && (sess->uid == e->uid) ) {
819 /*******************************************************************
820 ********************************************************************/
822 static int net_count_files( uid_t uid, pid_t pid )
824 struct sess_file_count s_file_cnt;
826 s_file_cnt.count = 0;
827 s_file_cnt.uid = uid;
828 s_file_cnt.pid = pid;
830 share_mode_forall( sess_file_fn, (void *)&s_file_cnt );
832 return s_file_cnt.count;
835 /*******************************************************************
836 fill in a sess info level 1 structure.
837 ********************************************************************/
839 static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot)
841 struct sessionid *session_list;
842 uint32 num_entries = 0;
843 time_t now = time(NULL);
846 ss1->num_entries_read = 0;
847 ss1->ptr_sess_info = 0;
848 ss1->num_entries_read2 = 0;
860 (*stot) = list_sessions(&session_list);
863 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
866 struct passwd *pw = sys_getpwnam(session_list[*snum].username);
870 DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n",
871 session_list[*snum].username));
875 connect_time = (uint32)(now - session_list[*snum].connect_start);
876 num_files = net_count_files(pw->pw_uid, session_list[*snum].pid);
877 guest = strequal( session_list[*snum].username, lp_guestaccount() );
879 init_srv_sess_info1( &ss1->info_1[num_entries],
880 session_list[*snum].remote_machine,
881 session_list[*snum].username,
889 ss1->num_entries_read = num_entries;
890 ss1->ptr_sess_info = num_entries > 0 ? 1 : 0;
891 ss1->num_entries_read2 = num_entries;
893 if ((*snum) >= (*stot)) {
897 SAFE_FREE(session_list);
900 /*******************************************************************
901 makes a SRV_R_NET_SESS_ENUM structure.
902 ********************************************************************/
904 static WERROR init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr,
905 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
907 WERROR status = WERR_OK;
908 DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__));
910 ctr->switch_value = switch_value;
912 switch (switch_value) {
914 init_srv_sess_info_0(&(ctr->sess.info0), resume_hnd, total_entries);
915 ctr->ptr_sess_ctr = 1;
918 init_srv_sess_info_1(&(ctr->sess.info1), resume_hnd, total_entries);
919 ctr->ptr_sess_ctr = 1;
922 DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value));
924 (*total_entries) = 0;
925 ctr->ptr_sess_ctr = 0;
926 status = WERR_UNKNOWN_LEVEL;
933 /*******************************************************************
934 makes a SRV_R_NET_SESS_ENUM structure.
935 ********************************************************************/
937 static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n,
938 uint32 resume_hnd, int sess_level, int switch_value)
940 DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__));
942 r_n->sess_level = sess_level;
944 if (sess_level == -1)
945 r_n->status = WERR_UNKNOWN_LEVEL;
947 r_n->status = init_srv_sess_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
949 if (!W_ERROR_IS_OK(r_n->status))
952 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
955 /*******************************************************************
956 fill in a conn info level 0 structure.
957 ********************************************************************/
959 static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot)
961 uint32 num_entries = 0;
969 DEBUG(5,("init_srv_conn_0_ss0\n"));
972 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
974 init_srv_conn_info0(&ss0->info_0[num_entries], (*stot));
976 /* move on to creating next connection */
977 /* move on to creating next conn */
981 ss0->num_entries_read = num_entries;
982 ss0->ptr_conn_info = num_entries > 0 ? 1 : 0;
983 ss0->num_entries_read2 = num_entries;
985 if ((*snum) >= (*stot)) {
990 ss0->num_entries_read = 0;
991 ss0->ptr_conn_info = 0;
992 ss0->num_entries_read2 = 0;
998 /*******************************************************************
999 fill in a conn info level 1 structure.
1000 ********************************************************************/
1002 static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1,
1003 uint32 id, uint32 type,
1004 uint32 num_opens, uint32 num_users, uint32 open_time,
1005 const char *usr_name, const char *net_name)
1007 init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name);
1008 init_srv_conn_info1_str(str1, usr_name, net_name);
1011 /*******************************************************************
1012 fill in a conn info level 1 structure.
1013 ********************************************************************/
1015 static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot)
1017 uint32 num_entries = 0;
1025 DEBUG(5,("init_srv_conn_1_ss1\n"));
1028 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
1029 init_srv_conn_1_info(&ss1->info_1[num_entries],
1030 &ss1->info_1_str[num_entries],
1031 (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$");
1033 /* move on to creating next connection */
1034 /* move on to creating next conn */
1038 ss1->num_entries_read = num_entries;
1039 ss1->ptr_conn_info = num_entries > 0 ? 1 : 0;
1040 ss1->num_entries_read2 = num_entries;
1043 if ((*snum) >= (*stot)) {
1048 ss1->num_entries_read = 0;
1049 ss1->ptr_conn_info = 0;
1050 ss1->num_entries_read2 = 0;
1056 /*******************************************************************
1057 makes a SRV_R_NET_CONN_ENUM structure.
1058 ********************************************************************/
1060 static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,
1061 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
1063 WERROR status = WERR_OK;
1064 DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__));
1066 ctr->switch_value = switch_value;
1068 switch (switch_value) {
1070 init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries);
1071 ctr->ptr_conn_ctr = 1;
1074 init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries);
1075 ctr->ptr_conn_ctr = 1;
1078 DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value));
1080 (*total_entries) = 0;
1081 ctr->ptr_conn_ctr = 0;
1082 status = WERR_UNKNOWN_LEVEL;
1089 /*******************************************************************
1090 makes a SRV_R_NET_CONN_ENUM structure.
1091 ********************************************************************/
1093 static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,
1094 uint32 resume_hnd, int conn_level, int switch_value)
1096 DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__));
1098 r_n->conn_level = conn_level;
1099 if (conn_level == -1)
1100 r_n->status = WERR_UNKNOWN_LEVEL;
1102 r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
1104 if (!W_ERROR_IS_OK(r_n->status))
1107 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
1110 /*******************************************************************
1111 makes a SRV_R_NET_FILE_ENUM structure.
1112 ********************************************************************/
1114 static WERROR net_file_enum_3( SRV_R_NET_FILE_ENUM *r, uint32 resume_hnd )
1116 TALLOC_CTX *ctx = get_talloc_ctx();
1117 SRV_FILE_INFO_CTR *ctr = &r->ctr;
1119 /* TODO -- Windows enumerates
1121 (c) open directories and files */
1123 r->status = net_enum_files( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd );
1124 if ( !W_ERROR_IS_OK(r->status))
1127 r->status = net_enum_pipes( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd );
1128 if ( !W_ERROR_IS_OK(r->status))
1131 r->level = ctr->level = 3;
1132 r->total_entries = ctr->num_entries;
1133 /* ctr->num_entries = r->total_entries - resume_hnd; */
1134 ctr->num_entries2 = ctr->num_entries;
1135 ctr->ptr_file_info = 1;
1137 r->status = WERR_OK;
1140 if ( ctr->num_entries > 0 )
1141 ctr->ptr_entries = 1;
1143 init_enum_hnd(&r->enum_hnd, 0);
1148 /*******************************************************************
1149 *******************************************************************/
1151 WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u)
1153 switch ( q_u->level ) {
1155 return net_file_enum_3( r_u, get_enum_hnd(&q_u->enum_hnd) );
1157 return WERR_UNKNOWN_LEVEL;
1163 /*******************************************************************
1165 ********************************************************************/
1167 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)
1169 WERROR status = WERR_OK;
1170 SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR);
1177 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1179 if (!pipe_access_check(p)) {
1180 DEBUG(3, ("access denied to srv_net_srv_get_info\n"));
1181 return WERR_ACCESS_DENIED;
1184 switch (q_u->switch_value) {
1186 /* Technically level 102 should only be available to
1187 Administrators but there isn't anything super-secret
1188 here, as most of it is made up. */
1191 init_srv_info_102(&ctr->srv.sv102,
1192 500, global_myname(),
1193 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH),
1194 lp_major_announce_version(), lp_minor_announce_version(),
1195 lp_default_server_announce(),
1196 0xffffffff, /* users */
1200 3000, /* announce delta */
1201 100000, /* licenses */
1202 "c:\\"); /* user path */
1205 init_srv_info_101(&ctr->srv.sv101,
1206 500, global_myname(),
1207 lp_major_announce_version(), lp_minor_announce_version(),
1208 lp_default_server_announce(),
1209 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH));
1212 init_srv_info_100(&ctr->srv.sv100, 500, global_myname());
1215 status = WERR_UNKNOWN_LEVEL;
1219 /* set up the net server get info structure */
1220 init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status);
1222 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1227 /*******************************************************************
1229 ********************************************************************/
1231 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)
1233 WERROR status = WERR_OK;
1235 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1237 /* Set up the net server set info structure. */
1239 init_srv_r_net_srv_set_info(r_u, 0x0, status);
1241 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1246 /*******************************************************************
1248 ********************************************************************/
1250 WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u)
1252 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1254 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR);
1258 ZERO_STRUCTP(r_u->ctr);
1261 init_srv_r_net_conn_enum(r_u,
1262 get_enum_hnd(&q_u->enum_hnd),
1264 q_u->ctr->switch_value);
1266 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1271 /*******************************************************************
1273 ********************************************************************/
1275 WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u)
1277 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1279 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR);
1283 ZERO_STRUCTP(r_u->ctr);
1286 init_srv_r_net_sess_enum(r_u,
1287 get_enum_hnd(&q_u->enum_hnd),
1289 q_u->ctr->switch_value);
1291 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1296 /*******************************************************************
1298 ********************************************************************/
1300 WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u)
1302 struct sessionid *session_list;
1303 int num_sessions, snum;
1306 BOOL not_root = False;
1308 rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name);
1309 rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name);
1311 /* strip leading backslashes if any */
1312 while (machine[0] == '\\') {
1313 memmove(machine, &machine[1], strlen(machine));
1316 num_sessions = list_sessions(&session_list);
1318 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1320 r_u->status = WERR_ACCESS_DENIED;
1322 /* fail out now if you are not root or not a domain admin */
1324 if ((p->pipe_user.ut.uid != sec_initial_uid()) &&
1325 ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) {
1330 for (snum = 0; snum < num_sessions; snum++) {
1332 if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
1333 strequal(session_list[snum].remote_machine, machine)) {
1335 if (p->pipe_user.ut.uid != sec_initial_uid()) {
1340 if (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False))
1341 r_u->status = WERR_OK;
1348 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1352 SAFE_FREE(session_list);
1357 /*******************************************************************
1359 ********************************************************************/
1361 WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1363 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1365 if (!pipe_access_check(p)) {
1366 DEBUG(3, ("access denied to srv_net_share_enum_all\n"));
1367 return WERR_ACCESS_DENIED;
1370 /* Create the list of shares for the response. */
1371 init_srv_r_net_share_enum(p, r_u,
1372 q_u->ctr.info_level,
1373 get_enum_hnd(&q_u->enum_hnd), True);
1375 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1380 /*******************************************************************
1382 ********************************************************************/
1384 WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1386 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1388 if (!pipe_access_check(p)) {
1389 DEBUG(3, ("access denied to srv_net_share_enum\n"));
1390 return WERR_ACCESS_DENIED;
1393 /* Create the list of shares for the response. */
1394 init_srv_r_net_share_enum(p, r_u,
1395 q_u->ctr.info_level,
1396 get_enum_hnd(&q_u->enum_hnd), False);
1398 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1403 /*******************************************************************
1405 ********************************************************************/
1407 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)
1411 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1413 /* Create the list of shares for the response. */
1414 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1415 init_srv_r_net_share_get_info(p, r_u, share_name, q_u->info_level);
1417 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1422 /*******************************************************************
1423 Check a given DOS pathname is valid for a share.
1424 ********************************************************************/
1426 char *valid_share_pathname(char *dos_pathname)
1430 /* Convert any '\' paths to '/' */
1431 unix_format(dos_pathname);
1432 unix_clean_name(dos_pathname);
1434 /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
1436 if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/')
1439 /* Only absolute paths allowed. */
1446 /*******************************************************************
1447 Net share set info. Modify share details.
1448 ********************************************************************/
1450 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)
1460 SEC_DESC *psd = NULL;
1461 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1462 BOOL is_disk_op = False;
1463 int max_connections = 0;
1465 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1467 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1469 r_u->parm_error = 0;
1471 if ( strequal(share_name,"IPC$")
1472 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1473 || strequal(share_name,"global") )
1475 return WERR_ACCESS_DENIED;
1478 snum = find_service(share_name);
1480 /* Does this share exist ? */
1482 return WERR_NET_NAME_NOT_FOUND;
1484 /* No change to printer shares. */
1485 if (lp_print_ok(snum))
1486 return WERR_ACCESS_DENIED;
1488 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1490 /* fail out now if you are not root and not a disk op */
1492 if ( p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1493 return WERR_ACCESS_DENIED;
1495 switch (q_u->info_level) {
1497 pstrcpy(pathname, lp_pathname(snum));
1498 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1499 type = q_u->info.share.info2.info_2.type;
1503 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1504 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname));
1505 type = q_u->info.share.info2.info_2.type;
1506 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1510 /* not supported on set but here for completeness */
1512 unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment));
1513 type = q_u->info.share.info501.info_501.type;
1518 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment));
1519 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname));
1520 type = q_u->info.share.info502.info_502.type;
1521 psd = q_u->info.share.info502.info_502_str.sd;
1522 map_generic_share_sd_bits(psd);
1525 pstrcpy(pathname, lp_pathname(snum));
1526 unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment));
1527 type = STYPE_DISKTREE;
1530 /* XP re-sets the csc policy even if it wasn't changed by the
1531 user, so we must compare it to see if it's what is set in
1532 smb.conf, so that we can contine other ops like setting
1534 if (((q_u->info.share.info1005.share_info_flags &
1535 SHARE_1005_CSC_POLICY_MASK) >>
1536 SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
1539 DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n"));
1540 return WERR_ACCESS_DENIED;
1544 return WERR_ACCESS_DENIED;
1546 pstrcpy(pathname, lp_pathname(snum));
1547 fstrcpy(comment, lp_comment(snum));
1548 psd = q_u->info.share.info1501.sdb->sec;
1549 map_generic_share_sd_bits(psd);
1550 type = STYPE_DISKTREE;
1553 DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level));
1554 return WERR_UNKNOWN_LEVEL;
1557 /* We can only modify disk shares. */
1558 if (type != STYPE_DISKTREE)
1559 return WERR_ACCESS_DENIED;
1561 /* Check if the pathname is valid. */
1562 if (!(path = valid_share_pathname( pathname )))
1563 return WERR_OBJECT_PATH_INVALID;
1565 /* Ensure share name, pathname and comment don't contain '"' characters. */
1566 string_replace(share_name, '"', ' ');
1567 string_replace(path, '"', ' ');
1568 string_replace(comment, '"', ' ');
1570 DEBUG(10,("_srv_net_share_set_info: change share command = %s\n",
1571 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
1573 /* Only call modify function if something changed. */
1575 if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum))
1576 || (lp_max_connections(snum) != max_connections) )
1578 if (!lp_change_share_cmd() || !*lp_change_share_cmd()) {
1579 DEBUG(10,("_srv_net_share_set_info: No change share command\n"));
1580 return WERR_ACCESS_DENIED;
1583 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1584 lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections );
1586 DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command ));
1588 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1593 if ( (ret = smbrun(command, NULL)) == 0 ) {
1594 /* Tell everyone we updated smb.conf. */
1595 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1601 /********* END SeDiskOperatorPrivilege BLOCK *********/
1603 DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret ));
1606 return WERR_ACCESS_DENIED;
1608 DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name ));
1611 /* Replace SD if changed. */
1616 old_sd = get_share_security(p->mem_ctx, lp_servicename(snum),
1619 if (old_sd && !sec_desc_equal(old_sd, psd)) {
1620 if (!set_share_security(p->mem_ctx, share_name, psd))
1621 DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n",
1626 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1631 /*******************************************************************
1632 Net share add. Call 'add_share_command "sharename" "pathname"
1633 "comment" "max connections = "
1634 ********************************************************************/
1636 WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
1646 SEC_DESC *psd = NULL;
1647 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1649 int max_connections = 0;
1651 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1653 r_u->parm_error = 0;
1655 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1657 if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1658 return WERR_ACCESS_DENIED;
1660 if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
1661 DEBUG(10,("_srv_net_share_add: No add share command\n"));
1662 return WERR_ACCESS_DENIED;
1665 switch (q_u->info_level) {
1667 /* No path. Not enough info in a level 0 to do anything. */
1668 return WERR_ACCESS_DENIED;
1670 /* Not enough info in a level 1 to do anything. */
1671 return WERR_ACCESS_DENIED;
1673 unistr2_to_ascii(share_name, &q_u->info.share.info2.info_2_str.uni_netname, sizeof(share_name));
1674 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name));
1675 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name));
1676 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1677 type = q_u->info.share.info2.info_2.type;
1680 /* No path. Not enough info in a level 501 to do anything. */
1681 return WERR_ACCESS_DENIED;
1683 unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name));
1684 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name));
1685 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name));
1686 type = q_u->info.share.info502.info_502.type;
1687 psd = q_u->info.share.info502.info_502_str.sd;
1688 map_generic_share_sd_bits(psd);
1691 /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */
1697 return WERR_ACCESS_DENIED;
1699 /* DFS only level. */
1700 return WERR_ACCESS_DENIED;
1702 DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level));
1703 return WERR_UNKNOWN_LEVEL;
1706 /* check for invalid share names */
1708 if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, sizeof(share_name) ) ) {
1709 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", share_name));
1710 return WERR_INVALID_NAME;
1713 if ( strequal(share_name,"IPC$") || strequal(share_name,"global")
1714 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) )
1716 return WERR_ACCESS_DENIED;
1719 snum = find_service(share_name);
1721 /* Share already exists. */
1723 return WERR_ALREADY_EXISTS;
1725 /* We can only add disk shares. */
1726 if (type != STYPE_DISKTREE)
1727 return WERR_ACCESS_DENIED;
1729 /* Check if the pathname is valid. */
1730 if (!(path = valid_share_pathname( pathname )))
1731 return WERR_OBJECT_PATH_INVALID;
1733 /* Ensure share name, pathname and comment don't contain '"' characters. */
1734 string_replace(share_name, '"', ' ');
1735 string_replace(path, '"', ' ');
1736 string_replace(comment, '"', ' ');
1738 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1746 DEBUG(10,("_srv_net_share_add: Running [%s]\n", command ));
1748 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1753 if ( (ret = smbrun(command, NULL)) == 0 ) {
1754 /* Tell everyone we updated smb.conf. */
1755 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1761 /********* END SeDiskOperatorPrivilege BLOCK *********/
1763 DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret ));
1766 return WERR_ACCESS_DENIED;
1769 if (!set_share_security(p->mem_ctx, share_name, psd)) {
1770 DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name ));
1775 * We don't call reload_services() here, the message will
1776 * cause this to be done before the next packet is read
1777 * from the client. JRA.
1780 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1785 /*******************************************************************
1786 Net share delete. Call "delete share command" with the share name as
1788 ********************************************************************/
1790 WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1796 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1799 DEBUG(5,("_srv_net_share_del: %d\n", __LINE__));
1801 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1803 if ( strequal(share_name,"IPC$")
1804 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1805 || strequal(share_name,"global") )
1807 return WERR_ACCESS_DENIED;
1810 snum = find_service(share_name);
1813 return WERR_NO_SUCH_SHARE;
1815 /* No change to printer shares. */
1816 if (lp_print_ok(snum))
1817 return WERR_ACCESS_DENIED;
1819 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1821 if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1822 return WERR_ACCESS_DENIED;
1824 if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) {
1825 DEBUG(10,("_srv_net_share_del: No delete share command\n"));
1826 return WERR_ACCESS_DENIED;
1829 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"",
1830 lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum));
1832 DEBUG(10,("_srv_net_share_del: Running [%s]\n", command ));
1834 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1839 if ( (ret = smbrun(command, NULL)) == 0 ) {
1840 /* Tell everyone we updated smb.conf. */
1841 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1847 /********* END SeDiskOperatorPrivilege BLOCK *********/
1849 DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret ));
1852 return WERR_ACCESS_DENIED;
1854 /* Delete the SD in the database. */
1855 delete_share_security(snum);
1857 lp_killservice(snum);
1862 WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1864 DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__));
1866 return _srv_net_share_del(p, q_u, r_u);
1869 /*******************************************************************
1871 ********************************************************************/
1873 WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u)
1875 TIME_OF_DAY_INFO *tod;
1877 time_t unixdate = time(NULL);
1879 /* We do this call first as if we do it *after* the gmtime call
1880 it overwrites the pointed-to values. JRA */
1882 uint32 zone = get_time_zone(unixdate)/60;
1884 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1886 if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) )
1890 r_u->ptr_srv_tod = 0x1;
1891 r_u->status = WERR_OK;
1893 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1895 t = gmtime(&unixdate);
1898 init_time_of_day_info(tod,
1912 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1917 /***********************************************************************************
1918 Win9x NT tools get security descriptor.
1919 ***********************************************************************************/
1921 WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u,
1922 SRV_R_NET_FILE_QUERY_SECDESC *r_u)
1924 SEC_DESC *psd = NULL;
1929 files_struct *fsp = NULL;
1933 connection_struct *conn = NULL;
1934 BOOL became_user = False;
1938 r_u->status = WERR_OK;
1940 unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
1942 /* Null password is ok - we are already an authenticated user... */
1943 null_pw = data_blob(NULL, 0);
1946 conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status);
1950 DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname));
1951 r_u->status = ntstatus_to_werror(nt_status);
1955 if (!become_user(conn, conn->vuid)) {
1956 DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n"));
1957 r_u->status = WERR_ACCESS_DENIED;
1962 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
1963 unix_convert(filename, conn, NULL, &bad_path, &st);
1965 DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename));
1966 r_u->status = WERR_ACCESS_DENIED;
1970 if (!check_name(filename,conn)) {
1971 DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename));
1972 r_u->status = WERR_ACCESS_DENIED;
1976 nt_status = open_file_stat(conn, filename, &st, &fsp);
1977 if (!NT_STATUS_IS_OK(nt_status)) {
1978 /* Perhaps it is a directory */
1979 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
1980 nt_status = open_directory(conn, filename, &st,
1981 READ_CONTROL_ACCESS,
1982 FILE_SHARE_READ|FILE_SHARE_WRITE,
1987 if (!NT_STATUS_IS_OK(nt_status)) {
1988 DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename));
1989 r_u->status = WERR_ACCESS_DENIED;
1994 sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd);
1997 DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename));
1998 r_u->status = WERR_ACCESS_DENIED;
2002 r_u->ptr_response = 1;
2003 r_u->size_response = sd_size;
2004 r_u->ptr_secdesc = 1;
2005 r_u->size_secdesc = sd_size;
2006 r_u->sec_desc = psd;
2008 psd->dacl->revision = (uint16) NT4_ACL_REVISION;
2010 close_file(fsp, NORMAL_CLOSE);
2012 close_cnum(conn, p->pipe_user.vuid);
2018 close_file(fsp, NORMAL_CLOSE);
2025 close_cnum(conn, p->pipe_user.vuid);
2030 /***********************************************************************************
2031 Win9x NT tools set security descriptor.
2032 ***********************************************************************************/
2034 WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u,
2035 SRV_R_NET_FILE_SET_SECDESC *r_u)
2041 files_struct *fsp = NULL;
2045 connection_struct *conn = NULL;
2046 BOOL became_user = False;
2050 r_u->status = WERR_OK;
2052 unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
2054 /* Null password is ok - we are already an authenticated user... */
2055 null_pw = data_blob(NULL, 0);
2058 conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status);
2062 DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname));
2063 r_u->status = ntstatus_to_werror(nt_status);
2067 if (!become_user(conn, conn->vuid)) {
2068 DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n"));
2069 r_u->status = WERR_ACCESS_DENIED;
2074 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
2075 unix_convert(filename, conn, NULL, &bad_path, &st);
2077 DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename));
2078 r_u->status = WERR_ACCESS_DENIED;
2082 if (!check_name(filename,conn)) {
2083 DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename));
2084 r_u->status = WERR_ACCESS_DENIED;
2089 nt_status = open_file_stat(conn, filename, &st, &fsp);
2091 if (!NT_STATUS_IS_OK(nt_status)) {
2092 /* Perhaps it is a directory */
2093 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
2094 nt_status = open_directory(conn, filename, &st,
2095 FILE_READ_ATTRIBUTES,
2096 FILE_SHARE_READ|FILE_SHARE_WRITE,
2101 if (!NT_STATUS_IS_OK(nt_status)) {
2102 DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename));
2103 r_u->status = WERR_ACCESS_DENIED;
2108 ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc);
2111 DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename));
2112 r_u->status = WERR_ACCESS_DENIED;
2116 close_file(fsp, NORMAL_CLOSE);
2118 close_cnum(conn, p->pipe_user.vuid);
2124 close_file(fsp, NORMAL_CLOSE);
2132 close_cnum(conn, p->pipe_user.vuid);
2138 /***********************************************************************************
2139 It may be that we want to limit users to creating shares on certain areas of the UNIX file area.
2140 We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy.
2141 These disks would the disks listed by this function.
2142 Users could then create shares relative to these disks. Watch out for moving these disks around.
2143 "Nigel Williams" <nigel@veritas.com>.
2144 ***********************************************************************************/
2146 static const char *server_disks[] = {"C:"};
2148 static uint32 get_server_disk_count(void)
2150 return sizeof(server_disks)/sizeof(server_disks[0]);
2153 static uint32 init_server_disk_enum(uint32 *resume)
2155 uint32 server_disk_count = get_server_disk_count();
2157 /*resume can be an offset into the list for now*/
2159 if(*resume & 0x80000000)
2162 if(*resume > server_disk_count)
2163 *resume = server_disk_count;
2165 return server_disk_count - *resume;
2168 static const char *next_server_disk_enum(uint32 *resume)
2172 if(init_server_disk_enum(resume) == 0)
2175 disk = server_disks[*resume];
2179 DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume));
2184 WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u)
2187 const char *disk_name;
2188 TALLOC_CTX *ctx = p->mem_ctx;
2189 uint32 resume=get_enum_hnd(&q_u->enum_hnd);
2191 r_u->status=WERR_OK;
2193 r_u->total_entries = init_server_disk_enum(&resume);
2195 r_u->disk_enum_ctr.unknown = 0;
2197 if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) {
2201 r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0;
2203 /*allow one DISK_INFO for null terminator*/
2205 for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
2207 r_u->disk_enum_ctr.entries_read++;
2209 /*copy disk name into a unicode string*/
2211 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name);
2214 /* add a terminating null string. Is this there if there is more data to come? */
2216 r_u->disk_enum_ctr.entries_read++;
2218 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, "");
2220 init_enum_hnd(&r_u->enum_hnd, resume);
2225 /********************************************************************
2226 ********************************************************************/
2228 WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u)
2232 switch ( q_u->type ) {
2234 rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0);
2235 if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) {
2236 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename));
2237 return WERR_INVALID_NAME;
2242 return WERR_UNKNOWN_LEVEL;
2249 /********************************************************************
2250 ********************************************************************/
2252 WERROR _srv_net_file_close(pipes_struct *p, SRV_Q_NET_FILE_CLOSE *q_u, SRV_R_NET_FILE_CLOSE *r_u)
2254 return WERR_ACCESS_DENIED;