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;
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 (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False))
1335 r_u->status = WERR_OK;
1339 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1343 SAFE_FREE(session_list);
1348 /*******************************************************************
1350 ********************************************************************/
1352 WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1354 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1356 if (!pipe_access_check(p)) {
1357 DEBUG(3, ("access denied to srv_net_share_enum_all\n"));
1358 return WERR_ACCESS_DENIED;
1361 /* Create the list of shares for the response. */
1362 init_srv_r_net_share_enum(p, r_u,
1363 q_u->ctr.info_level,
1364 get_enum_hnd(&q_u->enum_hnd), True);
1366 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1371 /*******************************************************************
1373 ********************************************************************/
1375 WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1377 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1379 if (!pipe_access_check(p)) {
1380 DEBUG(3, ("access denied to srv_net_share_enum\n"));
1381 return WERR_ACCESS_DENIED;
1384 /* Create the list of shares for the response. */
1385 init_srv_r_net_share_enum(p, r_u,
1386 q_u->ctr.info_level,
1387 get_enum_hnd(&q_u->enum_hnd), False);
1389 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1394 /*******************************************************************
1396 ********************************************************************/
1398 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)
1402 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1404 /* Create the list of shares for the response. */
1405 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1406 init_srv_r_net_share_get_info(p, r_u, share_name, q_u->info_level);
1408 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1413 /*******************************************************************
1414 Check a given DOS pathname is valid for a share.
1415 ********************************************************************/
1417 char *valid_share_pathname(char *dos_pathname)
1421 /* Convert any '\' paths to '/' */
1422 unix_format(dos_pathname);
1423 unix_clean_name(dos_pathname);
1425 /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
1427 if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/')
1430 /* Only absolute paths allowed. */
1437 /*******************************************************************
1438 Net share set info. Modify share details.
1439 ********************************************************************/
1441 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)
1451 SEC_DESC *psd = NULL;
1452 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1453 BOOL is_disk_op = False;
1454 int max_connections = 0;
1456 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1458 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1460 r_u->parm_error = 0;
1462 if ( strequal(share_name,"IPC$")
1463 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1464 || strequal(share_name,"global") )
1466 return WERR_ACCESS_DENIED;
1469 snum = find_service(share_name);
1471 /* Does this share exist ? */
1473 return WERR_NET_NAME_NOT_FOUND;
1475 /* No change to printer shares. */
1476 if (lp_print_ok(snum))
1477 return WERR_ACCESS_DENIED;
1479 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1481 /* fail out now if you are not root and not a disk op */
1483 if ( p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1484 return WERR_ACCESS_DENIED;
1486 switch (q_u->info_level) {
1488 pstrcpy(pathname, lp_pathname(snum));
1489 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1490 type = q_u->info.share.info2.info_2.type;
1494 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1495 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname));
1496 type = q_u->info.share.info2.info_2.type;
1497 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1501 /* not supported on set but here for completeness */
1503 unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment));
1504 type = q_u->info.share.info501.info_501.type;
1509 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment));
1510 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname));
1511 type = q_u->info.share.info502.info_502.type;
1512 psd = q_u->info.share.info502.info_502_str.sd;
1513 map_generic_share_sd_bits(psd);
1516 pstrcpy(pathname, lp_pathname(snum));
1517 unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment));
1518 type = STYPE_DISKTREE;
1521 /* XP re-sets the csc policy even if it wasn't changed by the
1522 user, so we must compare it to see if it's what is set in
1523 smb.conf, so that we can contine other ops like setting
1525 if (((q_u->info.share.info1005.share_info_flags &
1526 SHARE_1005_CSC_POLICY_MASK) >>
1527 SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
1530 DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n"));
1531 return WERR_ACCESS_DENIED;
1535 return WERR_ACCESS_DENIED;
1537 pstrcpy(pathname, lp_pathname(snum));
1538 fstrcpy(comment, lp_comment(snum));
1539 psd = q_u->info.share.info1501.sdb->sec;
1540 map_generic_share_sd_bits(psd);
1541 type = STYPE_DISKTREE;
1544 DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level));
1545 return WERR_UNKNOWN_LEVEL;
1548 /* We can only modify disk shares. */
1549 if (type != STYPE_DISKTREE)
1550 return WERR_ACCESS_DENIED;
1552 /* Check if the pathname is valid. */
1553 if (!(path = valid_share_pathname( pathname )))
1554 return WERR_OBJECT_PATH_INVALID;
1556 /* Ensure share name, pathname and comment don't contain '"' characters. */
1557 string_replace(share_name, '"', ' ');
1558 string_replace(path, '"', ' ');
1559 string_replace(comment, '"', ' ');
1561 DEBUG(10,("_srv_net_share_set_info: change share command = %s\n",
1562 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
1564 /* Only call modify function if something changed. */
1566 if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum))
1567 || (lp_max_connections(snum) != max_connections) )
1569 if (!lp_change_share_cmd() || !*lp_change_share_cmd()) {
1570 DEBUG(10,("_srv_net_share_set_info: No change share command\n"));
1571 return WERR_ACCESS_DENIED;
1574 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1575 lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections );
1577 DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command ));
1579 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1584 if ( (ret = smbrun(command, NULL)) == 0 ) {
1585 /* Tell everyone we updated smb.conf. */
1586 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1592 /********* END SeDiskOperatorPrivilege BLOCK *********/
1594 DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret ));
1597 return WERR_ACCESS_DENIED;
1599 DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name ));
1602 /* Replace SD if changed. */
1607 old_sd = get_share_security(p->mem_ctx, lp_servicename(snum),
1610 if (old_sd && !sec_desc_equal(old_sd, psd)) {
1611 if (!set_share_security(p->mem_ctx, share_name, psd))
1612 DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n",
1617 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1622 /*******************************************************************
1623 Net share add. Call 'add_share_command "sharename" "pathname"
1624 "comment" "max connections = "
1625 ********************************************************************/
1627 WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
1637 SEC_DESC *psd = NULL;
1638 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1640 int max_connections = 0;
1642 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1644 r_u->parm_error = 0;
1646 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1648 if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1649 return WERR_ACCESS_DENIED;
1651 if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
1652 DEBUG(10,("_srv_net_share_add: No add share command\n"));
1653 return WERR_ACCESS_DENIED;
1656 switch (q_u->info_level) {
1658 /* No path. Not enough info in a level 0 to do anything. */
1659 return WERR_ACCESS_DENIED;
1661 /* Not enough info in a level 1 to do anything. */
1662 return WERR_ACCESS_DENIED;
1664 unistr2_to_ascii(share_name, &q_u->info.share.info2.info_2_str.uni_netname, sizeof(share_name));
1665 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name));
1666 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name));
1667 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1668 type = q_u->info.share.info2.info_2.type;
1671 /* No path. Not enough info in a level 501 to do anything. */
1672 return WERR_ACCESS_DENIED;
1674 unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name));
1675 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name));
1676 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name));
1677 type = q_u->info.share.info502.info_502.type;
1678 psd = q_u->info.share.info502.info_502_str.sd;
1679 map_generic_share_sd_bits(psd);
1682 /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */
1688 return WERR_ACCESS_DENIED;
1690 /* DFS only level. */
1691 return WERR_ACCESS_DENIED;
1693 DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level));
1694 return WERR_UNKNOWN_LEVEL;
1697 /* check for invalid share names */
1699 if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, sizeof(share_name) ) ) {
1700 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", share_name));
1701 return WERR_INVALID_NAME;
1704 if ( strequal(share_name,"IPC$") || strequal(share_name,"global")
1705 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) )
1707 return WERR_ACCESS_DENIED;
1710 snum = find_service(share_name);
1712 /* Share already exists. */
1714 return WERR_ALREADY_EXISTS;
1716 /* We can only add disk shares. */
1717 if (type != STYPE_DISKTREE)
1718 return WERR_ACCESS_DENIED;
1720 /* Check if the pathname is valid. */
1721 if (!(path = valid_share_pathname( pathname )))
1722 return WERR_OBJECT_PATH_INVALID;
1724 /* Ensure share name, pathname and comment don't contain '"' characters. */
1725 string_replace(share_name, '"', ' ');
1726 string_replace(path, '"', ' ');
1727 string_replace(comment, '"', ' ');
1729 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1737 DEBUG(10,("_srv_net_share_add: Running [%s]\n", command ));
1739 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1744 if ( (ret = smbrun(command, NULL)) == 0 ) {
1745 /* Tell everyone we updated smb.conf. */
1746 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1752 /********* END SeDiskOperatorPrivilege BLOCK *********/
1754 DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret ));
1757 return WERR_ACCESS_DENIED;
1760 if (!set_share_security(p->mem_ctx, share_name, psd)) {
1761 DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name ));
1766 * We don't call reload_services() here, the message will
1767 * cause this to be done before the next packet is read
1768 * from the client. JRA.
1771 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1776 /*******************************************************************
1777 Net share delete. Call "delete share command" with the share name as
1779 ********************************************************************/
1781 WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1787 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1790 DEBUG(5,("_srv_net_share_del: %d\n", __LINE__));
1792 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1794 if ( strequal(share_name,"IPC$")
1795 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1796 || strequal(share_name,"global") )
1798 return WERR_ACCESS_DENIED;
1801 snum = find_service(share_name);
1804 return WERR_NO_SUCH_SHARE;
1806 /* No change to printer shares. */
1807 if (lp_print_ok(snum))
1808 return WERR_ACCESS_DENIED;
1810 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1812 if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1813 return WERR_ACCESS_DENIED;
1815 if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) {
1816 DEBUG(10,("_srv_net_share_del: No delete share command\n"));
1817 return WERR_ACCESS_DENIED;
1820 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"",
1821 lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum));
1823 DEBUG(10,("_srv_net_share_del: Running [%s]\n", command ));
1825 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1830 if ( (ret = smbrun(command, NULL)) == 0 ) {
1831 /* Tell everyone we updated smb.conf. */
1832 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1838 /********* END SeDiskOperatorPrivilege BLOCK *********/
1840 DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret ));
1843 return WERR_ACCESS_DENIED;
1845 /* Delete the SD in the database. */
1846 delete_share_security(snum);
1848 lp_killservice(snum);
1853 WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1855 DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__));
1857 return _srv_net_share_del(p, q_u, r_u);
1860 /*******************************************************************
1862 ********************************************************************/
1864 WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u)
1866 TIME_OF_DAY_INFO *tod;
1868 time_t unixdate = time(NULL);
1870 /* We do this call first as if we do it *after* the gmtime call
1871 it overwrites the pointed-to values. JRA */
1873 uint32 zone = get_time_zone(unixdate)/60;
1875 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1877 if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) )
1881 r_u->ptr_srv_tod = 0x1;
1882 r_u->status = WERR_OK;
1884 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1886 t = gmtime(&unixdate);
1889 init_time_of_day_info(tod,
1903 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1908 /***********************************************************************************
1909 Win9x NT tools get security descriptor.
1910 ***********************************************************************************/
1912 WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u,
1913 SRV_R_NET_FILE_QUERY_SECDESC *r_u)
1915 SEC_DESC *psd = NULL;
1920 files_struct *fsp = NULL;
1924 connection_struct *conn = NULL;
1925 BOOL became_user = False;
1929 r_u->status = WERR_OK;
1931 unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
1933 /* Null password is ok - we are already an authenticated user... */
1934 null_pw = data_blob(NULL, 0);
1937 conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status);
1941 DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname));
1942 r_u->status = ntstatus_to_werror(nt_status);
1946 if (!become_user(conn, conn->vuid)) {
1947 DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n"));
1948 r_u->status = WERR_ACCESS_DENIED;
1953 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
1954 unix_convert(filename, conn, NULL, &bad_path, &st);
1956 DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename));
1957 r_u->status = WERR_ACCESS_DENIED;
1961 if (!check_name(filename,conn)) {
1962 DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename));
1963 r_u->status = WERR_ACCESS_DENIED;
1967 nt_status = open_file_stat(conn, filename, &st, &fsp);
1968 if (!NT_STATUS_IS_OK(nt_status)) {
1969 /* Perhaps it is a directory */
1970 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
1971 nt_status = open_directory(conn, filename, &st,
1972 READ_CONTROL_ACCESS,
1973 FILE_SHARE_READ|FILE_SHARE_WRITE,
1978 if (!NT_STATUS_IS_OK(nt_status)) {
1979 DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename));
1980 r_u->status = WERR_ACCESS_DENIED;
1985 sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd);
1988 DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename));
1989 r_u->status = WERR_ACCESS_DENIED;
1993 r_u->ptr_response = 1;
1994 r_u->size_response = sd_size;
1995 r_u->ptr_secdesc = 1;
1996 r_u->size_secdesc = sd_size;
1997 r_u->sec_desc = psd;
1999 psd->dacl->revision = (uint16) NT4_ACL_REVISION;
2001 close_file(fsp, NORMAL_CLOSE);
2003 close_cnum(conn, p->pipe_user.vuid);
2009 close_file(fsp, NORMAL_CLOSE);
2016 close_cnum(conn, p->pipe_user.vuid);
2021 /***********************************************************************************
2022 Win9x NT tools set security descriptor.
2023 ***********************************************************************************/
2025 WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u,
2026 SRV_R_NET_FILE_SET_SECDESC *r_u)
2032 files_struct *fsp = NULL;
2036 connection_struct *conn = NULL;
2037 BOOL became_user = False;
2041 r_u->status = WERR_OK;
2043 unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
2045 /* Null password is ok - we are already an authenticated user... */
2046 null_pw = data_blob(NULL, 0);
2049 conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status);
2053 DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname));
2054 r_u->status = ntstatus_to_werror(nt_status);
2058 if (!become_user(conn, conn->vuid)) {
2059 DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n"));
2060 r_u->status = WERR_ACCESS_DENIED;
2065 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
2066 unix_convert(filename, conn, NULL, &bad_path, &st);
2068 DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename));
2069 r_u->status = WERR_ACCESS_DENIED;
2073 if (!check_name(filename,conn)) {
2074 DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename));
2075 r_u->status = WERR_ACCESS_DENIED;
2080 nt_status = open_file_stat(conn, filename, &st, &fsp);
2082 if (!NT_STATUS_IS_OK(nt_status)) {
2083 /* Perhaps it is a directory */
2084 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
2085 nt_status = open_directory(conn, filename, &st,
2086 FILE_READ_ATTRIBUTES,
2087 FILE_SHARE_READ|FILE_SHARE_WRITE,
2092 if (!NT_STATUS_IS_OK(nt_status)) {
2093 DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename));
2094 r_u->status = WERR_ACCESS_DENIED;
2099 ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc);
2102 DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename));
2103 r_u->status = WERR_ACCESS_DENIED;
2107 close_file(fsp, NORMAL_CLOSE);
2109 close_cnum(conn, p->pipe_user.vuid);
2115 close_file(fsp, NORMAL_CLOSE);
2123 close_cnum(conn, p->pipe_user.vuid);
2129 /***********************************************************************************
2130 It may be that we want to limit users to creating shares on certain areas of the UNIX file area.
2131 We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy.
2132 These disks would the disks listed by this function.
2133 Users could then create shares relative to these disks. Watch out for moving these disks around.
2134 "Nigel Williams" <nigel@veritas.com>.
2135 ***********************************************************************************/
2137 static const char *server_disks[] = {"C:"};
2139 static uint32 get_server_disk_count(void)
2141 return sizeof(server_disks)/sizeof(server_disks[0]);
2144 static uint32 init_server_disk_enum(uint32 *resume)
2146 uint32 server_disk_count = get_server_disk_count();
2148 /*resume can be an offset into the list for now*/
2150 if(*resume & 0x80000000)
2153 if(*resume > server_disk_count)
2154 *resume = server_disk_count;
2156 return server_disk_count - *resume;
2159 static const char *next_server_disk_enum(uint32 *resume)
2163 if(init_server_disk_enum(resume) == 0)
2166 disk = server_disks[*resume];
2170 DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume));
2175 WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u)
2178 const char *disk_name;
2179 TALLOC_CTX *ctx = p->mem_ctx;
2180 uint32 resume=get_enum_hnd(&q_u->enum_hnd);
2182 r_u->status=WERR_OK;
2184 r_u->total_entries = init_server_disk_enum(&resume);
2186 r_u->disk_enum_ctr.unknown = 0;
2188 if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) {
2192 r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0;
2194 /*allow one DISK_INFO for null terminator*/
2196 for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
2198 r_u->disk_enum_ctr.entries_read++;
2200 /*copy disk name into a unicode string*/
2202 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name);
2205 /* add a terminating null string. Is this there if there is more data to come? */
2207 r_u->disk_enum_ctr.entries_read++;
2209 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, "");
2211 init_enum_hnd(&r_u->enum_hnd, resume);
2216 /********************************************************************
2217 ********************************************************************/
2219 WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u)
2223 switch ( q_u->type ) {
2225 rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0);
2226 if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) {
2227 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename));
2228 return WERR_INVALID_NAME;
2233 return WERR_UNKNOWN_LEVEL;
2240 /********************************************************************
2241 ********************************************************************/
2243 WERROR _srv_net_file_close(pipes_struct *p, SRV_Q_NET_FILE_CLOSE *q_u, SRV_R_NET_FILE_CLOSE *r_u)
2245 return WERR_ACCESS_DENIED;