2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Jeremy Allison 2001.
6 * Copyright (C) Nigel Williams 2001.
7 * Copyright (C) Gerald (Jerry) Carter 2006.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 /* This is the implementation of the srvsvc pipe. */
28 extern struct generic_mapping file_generic_mapping;
29 extern userdom_struct current_user_info;
32 #define DBGC_CLASS DBGC_RPC_SRV
34 /* Use for enumerating connections, pipes, & files */
36 struct file_enum_count {
42 struct sess_file_count {
48 /****************************************************************************
49 Count the entries belonging to a service in the connection db.
50 ****************************************************************************/
52 static int pipe_enum_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *p)
54 struct pipe_open_rec prec;
55 struct file_enum_count *fenum = (struct file_enum_count *)p;
57 if (dbuf.dsize != sizeof(struct pipe_open_rec))
60 memcpy(&prec, dbuf.dptr, sizeof(struct pipe_open_rec));
62 if ( process_exists(prec.pid) ) {
67 snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name );
69 f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
71 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
77 init_srv_file_info3( &fenum->info[i],
78 (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum),
79 (FILE_READ_DATA|FILE_WRITE_DATA),
81 uidtoname( prec.uid ),
90 /*******************************************************************
91 ********************************************************************/
93 static WERROR net_enum_pipes( TALLOC_CTX *ctx, FILE_INFO_3 **info,
94 uint32 *count, uint32 resume )
96 struct file_enum_count fenum;
97 TDB_CONTEXT *conn_tdb = conn_tdb_ctx();
100 DEBUG(0,("net_enum_pipes: Failed to retrieve the connections tdb handle!\n"));
101 return WERR_ACCESS_DENIED;
105 fenum.count = *count;
108 if (tdb_traverse(conn_tdb, pipe_enum_fn, &fenum) == -1) {
109 DEBUG(0,("net_enum_pipes: traverse of connections.tdb failed with error %s.\n",
110 tdb_errorstr(conn_tdb) ));
115 *count = fenum.count;
119 /*******************************************************************
120 ********************************************************************/
122 /* global needed to make use of the share_mode_forall() callback */
123 static struct file_enum_count f_enum_cnt;
125 static void enum_file_fn( const struct share_mode_entry *e,
126 const char *sharepath, const char *fname )
128 struct file_enum_count *fenum = &f_enum_cnt;
130 /* If the pid was not found delete the entry from connections.tdb */
132 if ( process_exists(e->pid) ) {
134 int i = fenum->count;
136 struct byte_range_lock *brl;
141 f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
143 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
148 /* need to count the number of locks on a file */
152 fsp.inode = e->inode;
154 if ( (brl = brl_get_locks(NULL,&fsp)) != NULL ) {
155 num_locks = brl->num_locks;
159 if ( strcmp( fname, "." ) == 0 ) {
160 pstr_sprintf( fullpath, "C:%s", sharepath );
162 pstr_sprintf( fullpath, "C:%s/%s", sharepath, fname );
164 string_replace( fullpath, '/', '\\' );
166 /* mask out create (what ever that is) */
167 permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA);
169 /* now fill in the FILE_INFO_3 struct */
170 init_srv_file_info3( &fenum->info[i],
184 /*******************************************************************
185 ********************************************************************/
187 static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info,
188 uint32 *count, uint32 resume )
190 f_enum_cnt.ctx = ctx;
191 f_enum_cnt.count = *count;
192 f_enum_cnt.info = *info;
194 share_mode_forall( enum_file_fn );
196 *info = f_enum_cnt.info;
197 *count = f_enum_cnt.count;
202 /*******************************************************************
203 Utility function to get the 'type' of a share from a share definition.
204 ********************************************************************/
205 static uint32 get_share_type(const struct share_params *params)
207 char *net_name = lp_servicename(params->service);
208 int len_net_name = strlen(net_name);
210 /* work out the share type */
211 uint32 type = STYPE_DISKTREE;
213 if (lp_print_ok(params->service))
215 if (strequal(lp_fstype(params->service), "IPC"))
217 if (net_name[len_net_name] == '$')
218 type |= STYPE_HIDDEN;
223 /*******************************************************************
224 Fill in a share info level 0 structure.
225 ********************************************************************/
227 static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0,
228 const struct share_params *params)
230 char *net_name = lp_servicename(params->service);
231 init_srv_share_info0(&sh0->info_0, net_name);
232 init_srv_share_info0_str(&sh0->info_0_str, net_name);
235 /*******************************************************************
236 Fill in a share info level 1 structure.
237 ********************************************************************/
239 static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1,
240 const struct share_params *params)
242 connection_struct *conn = p->conn;
243 char *net_name = lp_servicename(params->service);
246 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
247 conn->user, conn->connectpath, conn->gid,
248 get_current_username(),
249 current_user_info.domain,
250 lp_comment(params->service));
252 init_srv_share_info1(&sh1->info_1, net_name, get_share_type(params),
254 init_srv_share_info1_str(&sh1->info_1_str, net_name, remark);
257 /*******************************************************************
258 Fill in a share info level 2 structure.
259 ********************************************************************/
261 static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2,
262 const struct share_params *params)
264 connection_struct *conn = p->conn;
267 int max_connections = lp_max_connections(params->service);
268 uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff;
270 char *net_name = lp_servicename(params->service);
272 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
273 conn->user, conn->connectpath, conn->gid,
274 get_current_username(),
275 current_user_info.domain,
276 lp_comment(params->service));
277 path = talloc_asprintf(p->mem_ctx, "C:%s",
278 lp_pathname(params->service));
281 * Change / to \\ so that win2k will see it as a valid path. This was
282 * added to enable use of browsing in win2k add share dialog.
285 string_replace(path, '/', '\\');
287 count = count_current_connections( net_name, False );
288 init_srv_share_info2(&sh2->info_2, net_name, get_share_type(params),
289 remark, 0, max_uses, count, path, "");
291 init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, "");
294 /*******************************************************************
295 Map any generic bits to file specific bits.
296 ********************************************************************/
298 static void map_generic_share_sd_bits(SEC_DESC *psd)
301 SEC_ACL *ps_dacl = NULL;
310 for (i = 0; i < ps_dacl->num_aces; i++) {
311 SEC_ACE *psa = &ps_dacl->ace[i];
312 uint32 orig_mask = psa->info.mask;
314 se_map_generic(&psa->info.mask, &file_generic_mapping);
315 psa->info.mask |= orig_mask;
319 /*******************************************************************
320 Can this user access with share with the required permissions ?
321 ********************************************************************/
323 BOOL share_access_check(const NT_USER_TOKEN *token, const char *sharename,
324 uint32 desired_access)
328 TALLOC_CTX *mem_ctx = NULL;
329 SEC_DESC *psd = NULL;
333 if (!(mem_ctx = talloc_init("share_access_check"))) {
337 psd = get_share_security(mem_ctx, sharename, &sd_size);
340 TALLOC_FREE(mem_ctx);
344 ret = se_access_check(psd, token, desired_access, &granted, &status);
346 talloc_destroy(mem_ctx);
350 /*******************************************************************
351 Fill in a share info level 501 structure.
352 ********************************************************************/
354 static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501,
355 const struct share_params *params)
357 connection_struct *conn = p->conn;
359 const char *net_name = lp_servicename(params->service);
361 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
362 conn->user, conn->connectpath, conn->gid,
363 get_current_username(),
364 current_user_info.domain,
365 lp_comment(params->service));
367 init_srv_share_info501(&sh501->info_501, net_name,
368 get_share_type(params), remark,
369 (lp_csc_policy(params->service) << 4));
370 init_srv_share_info501_str(&sh501->info_501_str, net_name, remark);
373 /*******************************************************************
374 Fill in a share info level 502 structure.
375 ********************************************************************/
377 static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502,
378 const struct share_params *params)
380 connection_struct *conn = p->conn;
386 TALLOC_CTX *ctx = p->mem_ctx;
391 net_name = lp_servicename(params->service);
393 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
394 conn->user, conn->connectpath, conn->gid,
395 get_current_username(),
396 current_user_info.domain,
397 lp_comment(params->service));
399 path = talloc_asprintf(p->mem_ctx, "C:%s",
400 lp_pathname(params->service));
403 * Change / to \\ so that win2k will see it as a valid path. This was
404 * added to enable use of browsing in win2k add share dialog.
407 string_replace(path, '/', '\\');
409 sd = get_share_security(ctx, lp_servicename(params->service),
412 init_srv_share_info502(&sh502->info_502, net_name,
413 get_share_type(params), remark, 0, 0xffffffff,
414 1, path, "", sd, sd_size);
415 init_srv_share_info502_str(&sh502->info_502_str, net_name, remark,
416 path, "", sd, sd_size);
419 /***************************************************************************
420 Fill in a share info level 1004 structure.
421 ***************************************************************************/
423 static void init_srv_share_info_1004(pipes_struct *p,
424 SRV_SHARE_INFO_1004* sh1004,
425 const struct share_params *params)
427 connection_struct *conn = p->conn;
430 remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)),
431 conn->user, conn->connectpath, conn->gid,
432 get_current_username(),
433 current_user_info.domain,
434 lp_comment(params->service));
436 ZERO_STRUCTP(sh1004);
438 init_srv_share_info1004(&sh1004->info_1004, remark);
439 init_srv_share_info1004_str(&sh1004->info_1004_str, remark);
442 /***************************************************************************
443 Fill in a share info level 1005 structure.
444 ***************************************************************************/
446 static void init_srv_share_info_1005(pipes_struct *p,
447 SRV_SHARE_INFO_1005* sh1005,
448 const struct share_params *params)
450 sh1005->share_info_flags = 0;
452 if(lp_host_msdfs() && lp_msdfs_root(params->service))
453 sh1005->share_info_flags |=
454 SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
455 sh1005->share_info_flags |=
456 lp_csc_policy(params->service) << SHARE_1005_CSC_POLICY_SHIFT;
458 /***************************************************************************
459 Fill in a share info level 1006 structure.
460 ***************************************************************************/
462 static void init_srv_share_info_1006(pipes_struct *p,
463 SRV_SHARE_INFO_1006* sh1006,
464 const struct share_params *params)
466 sh1006->max_uses = -1;
469 /***************************************************************************
470 Fill in a share info level 1007 structure.
471 ***************************************************************************/
473 static void init_srv_share_info_1007(pipes_struct *p,
474 SRV_SHARE_INFO_1007* sh1007,
475 const struct share_params *params)
477 pstring alternate_directory_name = "";
480 ZERO_STRUCTP(sh1007);
482 init_srv_share_info1007(&sh1007->info_1007, flags,
483 alternate_directory_name);
484 init_srv_share_info1007_str(&sh1007->info_1007_str,
485 alternate_directory_name);
488 /*******************************************************************
489 Fill in a share info level 1501 structure.
490 ********************************************************************/
492 static void init_srv_share_info_1501(pipes_struct *p,
493 SRV_SHARE_INFO_1501 *sh1501,
494 const struct share_params *params)
498 TALLOC_CTX *ctx = p->mem_ctx;
500 ZERO_STRUCTP(sh1501);
502 sd = get_share_security(ctx, lp_servicename(params->service),
505 sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
508 /*******************************************************************
509 True if it ends in '$'.
510 ********************************************************************/
512 static BOOL is_hidden_share(const struct share_params *params)
514 const char *net_name = lp_servicename(params->service);
516 return (net_name[strlen(net_name) - 1] == '$');
519 /*******************************************************************
520 Fill in a share info structure.
521 ********************************************************************/
523 static WERROR init_srv_share_info_ctr(pipes_struct *p,
524 SRV_SHARE_INFO_CTR *ctr,
525 uint32 info_level, uint32 *resume_hnd,
526 uint32 *total_entries, BOOL all_shares)
529 TALLOC_CTX *ctx = p->mem_ctx;
530 struct share_iterator *shares;
531 struct share_params *share;
533 DEBUG(5,("init_srv_share_info_ctr\n"));
535 ZERO_STRUCT(ctr->share);
537 ctr->info_level = ctr->switch_value = info_level;
540 /* Ensure all the usershares are loaded. */
542 load_usershare_shares();
547 ZERO_STRUCT(ctr->share);
549 if (!(shares = share_list_all(ctx))) {
550 DEBUG(5, ("Could not list shares\n"));
551 return WERR_ACCESS_DENIED;
554 while ((share = next_share(shares)) != NULL) {
555 if (!lp_browseable(share->service)) {
558 if (!all_shares && is_hidden_share(share)) {
562 switch (info_level) {
566 init_srv_share_info_0(p, &i, share);
567 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_0, i,
568 &ctr->share.info0, &num_entries);
569 if (ctr->share.info0 == NULL) {
578 init_srv_share_info_1(p, &i, share);
579 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1, i,
580 &ctr->share.info1, &num_entries);
581 if (ctr->share.info1 == NULL) {
590 init_srv_share_info_2(p, &i, share);
591 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_2, i,
592 &ctr->share.info2, &num_entries);
593 if (ctr->share.info2 == NULL) {
601 SRV_SHARE_INFO_501 i;
602 init_srv_share_info_501(p, &i, share);
603 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_501, i,
604 &ctr->share.info501, &num_entries);
605 if (ctr->share.info501 == NULL) {
613 SRV_SHARE_INFO_502 i;
614 init_srv_share_info_502(p, &i, share);
615 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_502, i,
616 &ctr->share.info502, &num_entries);
617 if (ctr->share.info502 == NULL) {
623 /* here for completeness but not currently used with enum
628 SRV_SHARE_INFO_1004 i;
629 init_srv_share_info_1004(p, &i, share);
630 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1004, i,
631 &ctr->share.info1004, &num_entries);
632 if (ctr->share.info1004 == NULL) {
640 SRV_SHARE_INFO_1005 i;
641 init_srv_share_info_1005(p, &i, share);
642 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1005, i,
643 &ctr->share.info1005, &num_entries);
644 if (ctr->share.info1005 == NULL) {
652 SRV_SHARE_INFO_1006 i;
653 init_srv_share_info_1006(p, &i, share);
654 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1006, i,
655 &ctr->share.info1006, &num_entries);
656 if (ctr->share.info1006 == NULL) {
664 SRV_SHARE_INFO_1007 i;
665 init_srv_share_info_1007(p, &i, share);
666 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1007, i,
667 &ctr->share.info1007, &num_entries);
668 if (ctr->share.info1007 == NULL) {
676 SRV_SHARE_INFO_1501 i;
677 init_srv_share_info_1501(p, &i, share);
678 ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1501, i,
679 &ctr->share.info1501, &num_entries);
680 if (ctr->share.info1501 == NULL) {
686 DEBUG(5,("init_srv_share_info_ctr: unsupported switch "
687 "value %d\n", info_level));
688 return WERR_UNKNOWN_LEVEL;
694 *total_entries = num_entries;
695 ctr->num_entries2 = ctr->num_entries = num_entries;
696 ctr->ptr_share_info = ctr->ptr_entries = 1;
701 /*******************************************************************
702 Inits a SRV_R_NET_SHARE_ENUM structure.
703 ********************************************************************/
705 static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n,
706 uint32 info_level, uint32 resume_hnd, BOOL all)
708 DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__));
710 r_n->status = init_srv_share_info_ctr(p, &r_n->ctr, info_level,
712 &r_n->total_entries, all);
714 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
717 /*******************************************************************
718 Inits a SRV_R_NET_SHARE_GET_INFO structure.
719 ********************************************************************/
721 static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_INFO *r_n,
722 char *share_name, uint32 info_level)
724 WERROR status = WERR_OK;
725 const struct share_params *params;
727 DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__));
729 r_n->info.switch_value = info_level;
731 params = get_share_params(p->mem_ctx, share_name);
733 if (params != NULL) {
734 switch (info_level) {
736 init_srv_share_info_0(p, &r_n->info.share.info0,
740 init_srv_share_info_1(p, &r_n->info.share.info1,
744 init_srv_share_info_2(p, &r_n->info.share.info2,
748 init_srv_share_info_501(p, &r_n->info.share.info501,
752 init_srv_share_info_502(p, &r_n->info.share.info502,
756 /* here for completeness */
758 init_srv_share_info_1004(p, &r_n->info.share.info1004,
762 init_srv_share_info_1005(p, &r_n->info.share.info1005,
766 /* here for completeness 1006 - 1501 */
768 init_srv_share_info_1006(p, &r_n->info.share.info1006,
772 init_srv_share_info_1007(p, &r_n->info.share.info1007,
776 init_srv_share_info_1501(p, &r_n->info.share.info1501,
780 DEBUG(5,("init_srv_net_share_get_info: unsupported "
781 "switch value %d\n", info_level));
782 status = WERR_UNKNOWN_LEVEL;
786 status = WERR_INVALID_NAME;
789 r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0;
790 r_n->status = status;
793 /*******************************************************************
794 fill in a sess info level 0 structure.
795 ********************************************************************/
797 static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot)
799 struct sessionid *session_list;
800 uint32 num_entries = 0;
801 (*stot) = list_sessions(&session_list);
805 SAFE_FREE(session_list);
809 DEBUG(5,("init_srv_sess_0_ss0\n"));
812 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
813 init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine);
817 ss0->num_entries_read = num_entries;
818 ss0->ptr_sess_info = num_entries > 0 ? 1 : 0;
819 ss0->num_entries_read2 = num_entries;
821 if ((*snum) >= (*stot)) {
826 ss0->num_entries_read = 0;
827 ss0->ptr_sess_info = 0;
828 ss0->num_entries_read2 = 0;
830 SAFE_FREE(session_list);
833 /*******************************************************************
834 ********************************************************************/
836 /* global needed to make use of the share_mode_forall() callback */
837 static struct sess_file_count s_file_cnt;
839 static void sess_file_fn( const struct share_mode_entry *e,
840 const char *sharepath, const char *fname )
842 struct sess_file_count *sess = &s_file_cnt;
844 if ( (procid_to_pid(&e->pid) == sess->pid) && (sess->uid == e->uid) ) {
851 /*******************************************************************
852 ********************************************************************/
854 static int net_count_files( uid_t uid, pid_t pid )
856 s_file_cnt.count = 0;
857 s_file_cnt.uid = uid;
858 s_file_cnt.pid = pid;
860 share_mode_forall( sess_file_fn );
862 return s_file_cnt.count;
865 /*******************************************************************
866 fill in a sess info level 1 structure.
867 ********************************************************************/
869 static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot)
871 struct sessionid *session_list;
872 uint32 num_entries = 0;
873 time_t now = time(NULL);
876 ss1->num_entries_read = 0;
877 ss1->ptr_sess_info = 0;
878 ss1->num_entries_read2 = 0;
890 (*stot) = list_sessions(&session_list);
893 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
896 struct passwd *pw = sys_getpwnam(session_list[*snum].username);
900 DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n",
901 session_list[*snum].username));
905 connect_time = (uint32)(now - session_list[*snum].connect_start);
906 num_files = net_count_files(pw->pw_uid, session_list[*snum].pid);
907 guest = strequal( session_list[*snum].username, lp_guestaccount() );
909 init_srv_sess_info1( &ss1->info_1[num_entries],
910 session_list[*snum].remote_machine,
911 session_list[*snum].username,
919 ss1->num_entries_read = num_entries;
920 ss1->ptr_sess_info = num_entries > 0 ? 1 : 0;
921 ss1->num_entries_read2 = num_entries;
923 if ((*snum) >= (*stot)) {
927 SAFE_FREE(session_list);
930 /*******************************************************************
931 makes a SRV_R_NET_SESS_ENUM structure.
932 ********************************************************************/
934 static WERROR init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr,
935 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
937 WERROR status = WERR_OK;
938 DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__));
940 ctr->switch_value = switch_value;
942 switch (switch_value) {
944 init_srv_sess_info_0(&(ctr->sess.info0), resume_hnd, total_entries);
945 ctr->ptr_sess_ctr = 1;
948 init_srv_sess_info_1(&(ctr->sess.info1), resume_hnd, total_entries);
949 ctr->ptr_sess_ctr = 1;
952 DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value));
954 (*total_entries) = 0;
955 ctr->ptr_sess_ctr = 0;
956 status = WERR_UNKNOWN_LEVEL;
963 /*******************************************************************
964 makes a SRV_R_NET_SESS_ENUM structure.
965 ********************************************************************/
967 static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n,
968 uint32 resume_hnd, int sess_level, int switch_value)
970 DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__));
972 r_n->sess_level = sess_level;
974 if (sess_level == -1)
975 r_n->status = WERR_UNKNOWN_LEVEL;
977 r_n->status = init_srv_sess_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
979 if (!W_ERROR_IS_OK(r_n->status))
982 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
985 /*******************************************************************
986 fill in a conn info level 0 structure.
987 ********************************************************************/
989 static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot)
991 uint32 num_entries = 0;
999 DEBUG(5,("init_srv_conn_0_ss0\n"));
1002 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
1004 init_srv_conn_info0(&ss0->info_0[num_entries], (*stot));
1006 /* move on to creating next connection */
1007 /* move on to creating next conn */
1011 ss0->num_entries_read = num_entries;
1012 ss0->ptr_conn_info = num_entries > 0 ? 1 : 0;
1013 ss0->num_entries_read2 = num_entries;
1015 if ((*snum) >= (*stot)) {
1020 ss0->num_entries_read = 0;
1021 ss0->ptr_conn_info = 0;
1022 ss0->num_entries_read2 = 0;
1028 /*******************************************************************
1029 fill in a conn info level 1 structure.
1030 ********************************************************************/
1032 static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1,
1033 uint32 id, uint32 type,
1034 uint32 num_opens, uint32 num_users, uint32 open_time,
1035 const char *usr_name, const char *net_name)
1037 init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name);
1038 init_srv_conn_info1_str(str1, usr_name, net_name);
1041 /*******************************************************************
1042 fill in a conn info level 1 structure.
1043 ********************************************************************/
1045 static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot)
1047 uint32 num_entries = 0;
1055 DEBUG(5,("init_srv_conn_1_ss1\n"));
1058 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
1059 init_srv_conn_1_info(&ss1->info_1[num_entries],
1060 &ss1->info_1_str[num_entries],
1061 (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$");
1063 /* move on to creating next connection */
1064 /* move on to creating next conn */
1068 ss1->num_entries_read = num_entries;
1069 ss1->ptr_conn_info = num_entries > 0 ? 1 : 0;
1070 ss1->num_entries_read2 = num_entries;
1073 if ((*snum) >= (*stot)) {
1078 ss1->num_entries_read = 0;
1079 ss1->ptr_conn_info = 0;
1080 ss1->num_entries_read2 = 0;
1086 /*******************************************************************
1087 makes a SRV_R_NET_CONN_ENUM structure.
1088 ********************************************************************/
1090 static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,
1091 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
1093 WERROR status = WERR_OK;
1094 DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__));
1096 ctr->switch_value = switch_value;
1098 switch (switch_value) {
1100 init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries);
1101 ctr->ptr_conn_ctr = 1;
1104 init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries);
1105 ctr->ptr_conn_ctr = 1;
1108 DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value));
1110 (*total_entries) = 0;
1111 ctr->ptr_conn_ctr = 0;
1112 status = WERR_UNKNOWN_LEVEL;
1119 /*******************************************************************
1120 makes a SRV_R_NET_CONN_ENUM structure.
1121 ********************************************************************/
1123 static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,
1124 uint32 resume_hnd, int conn_level, int switch_value)
1126 DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__));
1128 r_n->conn_level = conn_level;
1129 if (conn_level == -1)
1130 r_n->status = WERR_UNKNOWN_LEVEL;
1132 r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
1134 if (!W_ERROR_IS_OK(r_n->status))
1137 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
1140 /*******************************************************************
1141 makes a SRV_R_NET_FILE_ENUM structure.
1142 ********************************************************************/
1144 static WERROR net_file_enum_3( SRV_R_NET_FILE_ENUM *r, uint32 resume_hnd )
1146 TALLOC_CTX *ctx = get_talloc_ctx();
1147 SRV_FILE_INFO_CTR *ctr = &r->ctr;
1149 /* TODO -- Windows enumerates
1151 (c) open directories and files */
1153 r->status = net_enum_files( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd );
1154 if ( !W_ERROR_IS_OK(r->status))
1157 r->status = net_enum_pipes( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd );
1158 if ( !W_ERROR_IS_OK(r->status))
1161 r->level = ctr->level = 3;
1162 r->total_entries = ctr->num_entries;
1163 /* ctr->num_entries = r->total_entries - resume_hnd; */
1164 ctr->num_entries2 = ctr->num_entries;
1165 ctr->ptr_file_info = 1;
1167 r->status = WERR_OK;
1170 if ( ctr->num_entries > 0 )
1171 ctr->ptr_entries = 1;
1173 init_enum_hnd(&r->enum_hnd, 0);
1178 /*******************************************************************
1179 *******************************************************************/
1181 WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u)
1183 switch ( q_u->level ) {
1185 return net_file_enum_3( r_u, get_enum_hnd(&q_u->enum_hnd) );
1187 return WERR_UNKNOWN_LEVEL;
1193 /*******************************************************************
1195 ********************************************************************/
1197 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)
1199 WERROR status = WERR_OK;
1200 SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR);
1207 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1209 if (!pipe_access_check(p)) {
1210 DEBUG(3, ("access denied to srv_net_srv_get_info\n"));
1211 return WERR_ACCESS_DENIED;
1214 switch (q_u->switch_value) {
1216 /* Technically level 102 should only be available to
1217 Administrators but there isn't anything super-secret
1218 here, as most of it is made up. */
1221 init_srv_info_102(&ctr->srv.sv102,
1222 500, global_myname(),
1223 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH),
1224 lp_major_announce_version(), lp_minor_announce_version(),
1225 lp_default_server_announce(),
1226 0xffffffff, /* users */
1230 3000, /* announce delta */
1231 100000, /* licenses */
1232 "c:\\"); /* user path */
1235 init_srv_info_101(&ctr->srv.sv101,
1236 500, global_myname(),
1237 lp_major_announce_version(), lp_minor_announce_version(),
1238 lp_default_server_announce(),
1239 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH));
1242 init_srv_info_100(&ctr->srv.sv100, 500, global_myname());
1245 status = WERR_UNKNOWN_LEVEL;
1249 /* set up the net server get info structure */
1250 init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status);
1252 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1257 /*******************************************************************
1259 ********************************************************************/
1261 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)
1263 WERROR status = WERR_OK;
1265 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1267 /* Set up the net server set info structure. */
1269 init_srv_r_net_srv_set_info(r_u, 0x0, status);
1271 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1276 /*******************************************************************
1278 ********************************************************************/
1280 WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u)
1282 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1284 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR);
1288 ZERO_STRUCTP(r_u->ctr);
1291 init_srv_r_net_conn_enum(r_u,
1292 get_enum_hnd(&q_u->enum_hnd),
1294 q_u->ctr->switch_value);
1296 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1301 /*******************************************************************
1303 ********************************************************************/
1305 WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u)
1307 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1309 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR);
1313 ZERO_STRUCTP(r_u->ctr);
1316 init_srv_r_net_sess_enum(r_u,
1317 get_enum_hnd(&q_u->enum_hnd),
1319 q_u->ctr->switch_value);
1321 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1326 /*******************************************************************
1328 ********************************************************************/
1330 WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u)
1332 struct sessionid *session_list;
1333 int num_sessions, snum;
1336 BOOL not_root = False;
1338 rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name);
1339 rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name);
1341 /* strip leading backslashes if any */
1342 while (machine[0] == '\\') {
1343 memmove(machine, &machine[1], strlen(machine));
1346 num_sessions = list_sessions(&session_list);
1348 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1350 r_u->status = WERR_ACCESS_DENIED;
1352 /* fail out now if you are not root or not a domain admin */
1354 if ((p->pipe_user.ut.uid != sec_initial_uid()) &&
1355 ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) {
1360 for (snum = 0; snum < num_sessions; snum++) {
1362 if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
1363 strequal(session_list[snum].remote_machine, machine)) {
1365 if (p->pipe_user.ut.uid != sec_initial_uid()) {
1370 if (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False))
1371 r_u->status = WERR_OK;
1378 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1382 SAFE_FREE(session_list);
1387 /*******************************************************************
1389 ********************************************************************/
1391 WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1393 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1395 if (!pipe_access_check(p)) {
1396 DEBUG(3, ("access denied to srv_net_share_enum_all\n"));
1397 return WERR_ACCESS_DENIED;
1400 /* Create the list of shares for the response. */
1401 init_srv_r_net_share_enum(p, r_u,
1402 q_u->ctr.info_level,
1403 get_enum_hnd(&q_u->enum_hnd), True);
1405 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1410 /*******************************************************************
1412 ********************************************************************/
1414 WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1416 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1418 if (!pipe_access_check(p)) {
1419 DEBUG(3, ("access denied to srv_net_share_enum\n"));
1420 return WERR_ACCESS_DENIED;
1423 /* Create the list of shares for the response. */
1424 init_srv_r_net_share_enum(p, r_u,
1425 q_u->ctr.info_level,
1426 get_enum_hnd(&q_u->enum_hnd), False);
1428 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1433 /*******************************************************************
1435 ********************************************************************/
1437 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)
1441 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1443 /* Create the list of shares for the response. */
1444 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1445 init_srv_r_net_share_get_info(p, r_u, share_name, q_u->info_level);
1447 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1452 /*******************************************************************
1453 Check a given DOS pathname is valid for a share.
1454 ********************************************************************/
1456 char *valid_share_pathname(char *dos_pathname)
1460 /* Convert any '\' paths to '/' */
1461 unix_format(dos_pathname);
1462 unix_clean_name(dos_pathname);
1464 /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
1466 if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/')
1469 /* Only absolute paths allowed. */
1476 /*******************************************************************
1477 Net share set info. Modify share details.
1478 ********************************************************************/
1480 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)
1490 SEC_DESC *psd = NULL;
1491 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1492 BOOL is_disk_op = False;
1493 int max_connections = 0;
1495 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1497 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1499 r_u->parm_error = 0;
1501 if ( strequal(share_name,"IPC$")
1502 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1503 || strequal(share_name,"global") )
1505 return WERR_ACCESS_DENIED;
1508 snum = find_service(share_name);
1510 /* Does this share exist ? */
1512 return WERR_NET_NAME_NOT_FOUND;
1514 /* No change to printer shares. */
1515 if (lp_print_ok(snum))
1516 return WERR_ACCESS_DENIED;
1518 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1520 /* fail out now if you are not root and not a disk op */
1522 if ( p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1523 return WERR_ACCESS_DENIED;
1525 switch (q_u->info_level) {
1527 pstrcpy(pathname, lp_pathname(snum));
1528 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1529 type = q_u->info.share.info2.info_2.type;
1533 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1534 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname));
1535 type = q_u->info.share.info2.info_2.type;
1536 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1540 /* not supported on set but here for completeness */
1542 unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment));
1543 type = q_u->info.share.info501.info_501.type;
1548 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment));
1549 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname));
1550 type = q_u->info.share.info502.info_502.type;
1551 psd = q_u->info.share.info502.info_502_str.sd;
1552 map_generic_share_sd_bits(psd);
1555 pstrcpy(pathname, lp_pathname(snum));
1556 unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment));
1557 type = STYPE_DISKTREE;
1560 /* XP re-sets the csc policy even if it wasn't changed by the
1561 user, so we must compare it to see if it's what is set in
1562 smb.conf, so that we can contine other ops like setting
1564 if (((q_u->info.share.info1005.share_info_flags &
1565 SHARE_1005_CSC_POLICY_MASK) >>
1566 SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
1569 DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n"));
1570 return WERR_ACCESS_DENIED;
1574 return WERR_ACCESS_DENIED;
1576 pstrcpy(pathname, lp_pathname(snum));
1577 fstrcpy(comment, lp_comment(snum));
1578 psd = q_u->info.share.info1501.sdb->sec;
1579 map_generic_share_sd_bits(psd);
1580 type = STYPE_DISKTREE;
1583 DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level));
1584 return WERR_UNKNOWN_LEVEL;
1587 /* We can only modify disk shares. */
1588 if (type != STYPE_DISKTREE)
1589 return WERR_ACCESS_DENIED;
1591 /* Check if the pathname is valid. */
1592 if (!(path = valid_share_pathname( pathname )))
1593 return WERR_OBJECT_PATH_INVALID;
1595 /* Ensure share name, pathname and comment don't contain '"' characters. */
1596 string_replace(share_name, '"', ' ');
1597 string_replace(path, '"', ' ');
1598 string_replace(comment, '"', ' ');
1600 DEBUG(10,("_srv_net_share_set_info: change share command = %s\n",
1601 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
1603 /* Only call modify function if something changed. */
1605 if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum))
1606 || (lp_max_connections(snum) != max_connections) )
1608 if (!lp_change_share_cmd() || !*lp_change_share_cmd()) {
1609 DEBUG(10,("_srv_net_share_set_info: No change share command\n"));
1610 return WERR_ACCESS_DENIED;
1613 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1614 lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections );
1616 DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command ));
1618 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1623 if ( (ret = smbrun(command, NULL)) == 0 ) {
1624 /* Tell everyone we updated smb.conf. */
1625 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1631 /********* END SeDiskOperatorPrivilege BLOCK *********/
1633 DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret ));
1636 return WERR_ACCESS_DENIED;
1638 DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name ));
1641 /* Replace SD if changed. */
1646 old_sd = get_share_security(p->mem_ctx, lp_servicename(snum),
1649 if (old_sd && !sec_desc_equal(old_sd, psd)) {
1650 if (!set_share_security(p->mem_ctx, share_name, psd))
1651 DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n",
1656 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1661 /*******************************************************************
1662 Net share add. Call 'add_share_command "sharename" "pathname"
1663 "comment" "max connections = "
1664 ********************************************************************/
1666 WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
1676 SEC_DESC *psd = NULL;
1677 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1679 int max_connections = 0;
1681 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1683 r_u->parm_error = 0;
1685 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1687 if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1688 return WERR_ACCESS_DENIED;
1690 if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
1691 DEBUG(10,("_srv_net_share_add: No add share command\n"));
1692 return WERR_ACCESS_DENIED;
1695 switch (q_u->info_level) {
1697 /* No path. Not enough info in a level 0 to do anything. */
1698 return WERR_ACCESS_DENIED;
1700 /* Not enough info in a level 1 to do anything. */
1701 return WERR_ACCESS_DENIED;
1703 unistr2_to_ascii(share_name, &q_u->info.share.info2.info_2_str.uni_netname, sizeof(share_name));
1704 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name));
1705 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name));
1706 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1707 type = q_u->info.share.info2.info_2.type;
1710 /* No path. Not enough info in a level 501 to do anything. */
1711 return WERR_ACCESS_DENIED;
1713 unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name));
1714 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name));
1715 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name));
1716 type = q_u->info.share.info502.info_502.type;
1717 psd = q_u->info.share.info502.info_502_str.sd;
1718 map_generic_share_sd_bits(psd);
1721 /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */
1727 return WERR_ACCESS_DENIED;
1729 /* DFS only level. */
1730 return WERR_ACCESS_DENIED;
1732 DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level));
1733 return WERR_UNKNOWN_LEVEL;
1736 /* check for invalid share names */
1738 if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, sizeof(share_name) ) ) {
1739 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", share_name));
1740 return WERR_INVALID_NAME;
1743 if ( strequal(share_name,"IPC$") || strequal(share_name,"global")
1744 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) )
1746 return WERR_ACCESS_DENIED;
1749 snum = find_service(share_name);
1751 /* Share already exists. */
1753 return WERR_ALREADY_EXISTS;
1755 /* We can only add disk shares. */
1756 if (type != STYPE_DISKTREE)
1757 return WERR_ACCESS_DENIED;
1759 /* Check if the pathname is valid. */
1760 if (!(path = valid_share_pathname( pathname )))
1761 return WERR_OBJECT_PATH_INVALID;
1763 /* Ensure share name, pathname and comment don't contain '"' characters. */
1764 string_replace(share_name, '"', ' ');
1765 string_replace(path, '"', ' ');
1766 string_replace(comment, '"', ' ');
1768 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1776 DEBUG(10,("_srv_net_share_add: Running [%s]\n", command ));
1778 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1783 if ( (ret = smbrun(command, NULL)) == 0 ) {
1784 /* Tell everyone we updated smb.conf. */
1785 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1791 /********* END SeDiskOperatorPrivilege BLOCK *********/
1793 DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret ));
1796 return WERR_ACCESS_DENIED;
1799 if (!set_share_security(p->mem_ctx, share_name, psd)) {
1800 DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name ));
1805 * We don't call reload_services() here, the message will
1806 * cause this to be done before the next packet is read
1807 * from the client. JRA.
1810 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1815 /*******************************************************************
1816 Net share delete. Call "delete share command" with the share name as
1818 ********************************************************************/
1820 WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1826 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1829 DEBUG(5,("_srv_net_share_del: %d\n", __LINE__));
1831 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1833 if ( strequal(share_name,"IPC$")
1834 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1835 || strequal(share_name,"global") )
1837 return WERR_ACCESS_DENIED;
1840 snum = find_service(share_name);
1843 return WERR_NO_SUCH_SHARE;
1845 /* No change to printer shares. */
1846 if (lp_print_ok(snum))
1847 return WERR_ACCESS_DENIED;
1849 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1851 if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op )
1852 return WERR_ACCESS_DENIED;
1854 if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) {
1855 DEBUG(10,("_srv_net_share_del: No delete share command\n"));
1856 return WERR_ACCESS_DENIED;
1859 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"",
1860 lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum));
1862 DEBUG(10,("_srv_net_share_del: Running [%s]\n", command ));
1864 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1869 if ( (ret = smbrun(command, NULL)) == 0 ) {
1870 /* Tell everyone we updated smb.conf. */
1871 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1877 /********* END SeDiskOperatorPrivilege BLOCK *********/
1879 DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret ));
1882 return WERR_ACCESS_DENIED;
1884 /* Delete the SD in the database. */
1885 delete_share_security(snum);
1887 lp_killservice(snum);
1892 WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1894 DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__));
1896 return _srv_net_share_del(p, q_u, r_u);
1899 /*******************************************************************
1901 ********************************************************************/
1903 WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u)
1905 TIME_OF_DAY_INFO *tod;
1907 time_t unixdate = time(NULL);
1909 /* We do this call first as if we do it *after* the gmtime call
1910 it overwrites the pointed-to values. JRA */
1912 uint32 zone = get_time_zone(unixdate)/60;
1914 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1916 if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) )
1920 r_u->ptr_srv_tod = 0x1;
1921 r_u->status = WERR_OK;
1923 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1925 t = gmtime(&unixdate);
1928 init_time_of_day_info(tod,
1942 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1947 /***********************************************************************************
1948 Win9x NT tools get security descriptor.
1949 ***********************************************************************************/
1951 WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u,
1952 SRV_R_NET_FILE_QUERY_SECDESC *r_u)
1954 SEC_DESC *psd = NULL;
1959 files_struct *fsp = NULL;
1963 connection_struct *conn = NULL;
1964 BOOL became_user = False;
1968 r_u->status = WERR_OK;
1970 unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
1972 /* Null password is ok - we are already an authenticated user... */
1973 null_pw = data_blob(NULL, 0);
1976 conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status);
1980 DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname));
1981 r_u->status = ntstatus_to_werror(nt_status);
1985 if (!become_user(conn, conn->vuid)) {
1986 DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n"));
1987 r_u->status = WERR_ACCESS_DENIED;
1992 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
1993 unix_convert(filename, conn, NULL, &bad_path, &st);
1995 DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename));
1996 r_u->status = WERR_ACCESS_DENIED;
2000 if (!check_name(filename,conn)) {
2001 DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename));
2002 r_u->status = WERR_ACCESS_DENIED;
2006 nt_status = open_file_stat(conn, filename, &st, &fsp);
2007 if (!NT_STATUS_IS_OK(nt_status)) {
2008 /* Perhaps it is a directory */
2009 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
2010 nt_status = open_directory(conn, filename, &st,
2011 READ_CONTROL_ACCESS,
2012 FILE_SHARE_READ|FILE_SHARE_WRITE,
2017 if (!NT_STATUS_IS_OK(nt_status)) {
2018 DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename));
2019 r_u->status = WERR_ACCESS_DENIED;
2024 sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd);
2027 DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename));
2028 r_u->status = WERR_ACCESS_DENIED;
2032 r_u->ptr_response = 1;
2033 r_u->size_response = sd_size;
2034 r_u->ptr_secdesc = 1;
2035 r_u->size_secdesc = sd_size;
2036 r_u->sec_desc = psd;
2038 psd->dacl->revision = (uint16) NT4_ACL_REVISION;
2040 close_file(fsp, NORMAL_CLOSE);
2042 close_cnum(conn, p->pipe_user.vuid);
2048 close_file(fsp, NORMAL_CLOSE);
2055 close_cnum(conn, p->pipe_user.vuid);
2060 /***********************************************************************************
2061 Win9x NT tools set security descriptor.
2062 ***********************************************************************************/
2064 WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u,
2065 SRV_R_NET_FILE_SET_SECDESC *r_u)
2071 files_struct *fsp = NULL;
2075 connection_struct *conn = NULL;
2076 BOOL became_user = False;
2080 r_u->status = WERR_OK;
2082 unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
2084 /* Null password is ok - we are already an authenticated user... */
2085 null_pw = data_blob(NULL, 0);
2088 conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status);
2092 DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname));
2093 r_u->status = ntstatus_to_werror(nt_status);
2097 if (!become_user(conn, conn->vuid)) {
2098 DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n"));
2099 r_u->status = WERR_ACCESS_DENIED;
2104 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
2105 unix_convert(filename, conn, NULL, &bad_path, &st);
2107 DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename));
2108 r_u->status = WERR_ACCESS_DENIED;
2112 if (!check_name(filename,conn)) {
2113 DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename));
2114 r_u->status = WERR_ACCESS_DENIED;
2119 nt_status = open_file_stat(conn, filename, &st, &fsp);
2121 if (!NT_STATUS_IS_OK(nt_status)) {
2122 /* Perhaps it is a directory */
2123 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
2124 nt_status = open_directory(conn, filename, &st,
2125 FILE_READ_ATTRIBUTES,
2126 FILE_SHARE_READ|FILE_SHARE_WRITE,
2131 if (!NT_STATUS_IS_OK(nt_status)) {
2132 DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename));
2133 r_u->status = WERR_ACCESS_DENIED;
2138 ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc);
2141 DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename));
2142 r_u->status = WERR_ACCESS_DENIED;
2146 close_file(fsp, NORMAL_CLOSE);
2148 close_cnum(conn, p->pipe_user.vuid);
2154 close_file(fsp, NORMAL_CLOSE);
2162 close_cnum(conn, p->pipe_user.vuid);
2168 /***********************************************************************************
2169 It may be that we want to limit users to creating shares on certain areas of the UNIX file area.
2170 We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy.
2171 These disks would the disks listed by this function.
2172 Users could then create shares relative to these disks. Watch out for moving these disks around.
2173 "Nigel Williams" <nigel@veritas.com>.
2174 ***********************************************************************************/
2176 static const char *server_disks[] = {"C:"};
2178 static uint32 get_server_disk_count(void)
2180 return sizeof(server_disks)/sizeof(server_disks[0]);
2183 static uint32 init_server_disk_enum(uint32 *resume)
2185 uint32 server_disk_count = get_server_disk_count();
2187 /*resume can be an offset into the list for now*/
2189 if(*resume & 0x80000000)
2192 if(*resume > server_disk_count)
2193 *resume = server_disk_count;
2195 return server_disk_count - *resume;
2198 static const char *next_server_disk_enum(uint32 *resume)
2202 if(init_server_disk_enum(resume) == 0)
2205 disk = server_disks[*resume];
2209 DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume));
2214 WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u)
2217 const char *disk_name;
2218 TALLOC_CTX *ctx = p->mem_ctx;
2219 uint32 resume=get_enum_hnd(&q_u->enum_hnd);
2221 r_u->status=WERR_OK;
2223 r_u->total_entries = init_server_disk_enum(&resume);
2225 r_u->disk_enum_ctr.unknown = 0;
2227 if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) {
2231 r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0;
2233 /*allow one DISK_INFO for null terminator*/
2235 for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
2237 r_u->disk_enum_ctr.entries_read++;
2239 /*copy disk name into a unicode string*/
2241 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name);
2244 /* add a terminating null string. Is this there if there is more data to come? */
2246 r_u->disk_enum_ctr.entries_read++;
2248 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, "");
2250 init_enum_hnd(&r_u->enum_hnd, resume);
2255 /********************************************************************
2256 ********************************************************************/
2258 WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u)
2262 switch ( q_u->type ) {
2264 rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0);
2265 if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) {
2266 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename));
2267 return WERR_INVALID_NAME;
2272 return WERR_UNKNOWN_LEVEL;
2279 /********************************************************************
2280 ********************************************************************/
2282 WERROR _srv_net_file_close(pipes_struct *p, SRV_Q_NET_FILE_CLOSE *q_u, SRV_R_NET_FILE_CLOSE *r_u)
2284 return WERR_ACCESS_DENIED;