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.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 /* This is the implementation of the srvsvc pipe. */
28 #define DBGC_CLASS DBGC_RPC_SRV
30 /*******************************************************************
31 Utility function to get the 'type' of a share from an snum.
32 ********************************************************************/
33 static uint32 get_share_type(int snum)
35 char *net_name = lp_servicename(snum);
36 int len_net_name = strlen(net_name);
38 /* work out the share type */
39 uint32 type = STYPE_DISKTREE;
41 if (lp_print_ok(snum))
43 if (strequal(lp_fstype(snum), "IPC"))
45 if (net_name[len_net_name] == '$')
51 /*******************************************************************
52 Fill in a share info level 0 structure.
53 ********************************************************************/
55 static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int snum)
59 pstrcpy(net_name, lp_servicename(snum));
61 init_srv_share_info0(&sh0->info_0, net_name);
62 init_srv_share_info0_str(&sh0->info_0_str, net_name);
65 /*******************************************************************
66 Fill in a share info level 1 structure.
67 ********************************************************************/
69 static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum)
73 char *net_name = lp_servicename(snum);
74 pstrcpy(remark, lp_comment(snum));
75 standard_sub_conn(p->conn, remark,sizeof(remark));
77 init_srv_share_info1(&sh1->info_1, net_name, get_share_type(snum), remark);
78 init_srv_share_info1_str(&sh1->info_1_str, net_name, remark);
81 /*******************************************************************
82 Fill in a share info level 2 structure.
83 ********************************************************************/
85 static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum)
91 char *net_name = lp_servicename(snum);
92 pstrcpy(remark, lp_comment(snum));
93 standard_sub_conn(p->conn, remark,sizeof(remark));
95 pstrcat(path, lp_pathname(snum));
98 * Change / to \\ so that win2k will see it as a valid path. This was added to
99 * enable use of browsing in win2k add share dialog.
102 string_replace(path, '/', '\\');
106 init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd);
107 init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd);
110 /*******************************************************************
111 What to do when smb.conf is updated.
112 ********************************************************************/
114 static void smb_conf_updated(int msg_type, pid_t src, void *buf, size_t len)
116 DEBUG(10,("smb_conf_updated: Got message saying smb.conf was updated. Reloading.\n"));
117 reload_services(False);
120 /*******************************************************************
121 Create the share security tdb.
122 ********************************************************************/
124 static TDB_CONTEXT *share_tdb; /* used for share security descriptors */
125 #define SHARE_DATABASE_VERSION_V1 1
126 #define SHARE_DATABASE_VERSION_V2 2 /* version id in little endian. */
128 BOOL share_info_db_init(void)
130 static pid_t local_pid;
131 const char *vstring = "INFO/version";
134 if (share_tdb && local_pid == sys_getpid())
136 share_tdb = tdb_open_log(lock_path("share_info.tdb"), 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
138 DEBUG(0,("Failed to open share info database %s (%s)\n",
139 lock_path("share_info.tdb"), strerror(errno) ));
143 local_pid = sys_getpid();
145 /* handle a Samba upgrade */
146 tdb_lock_bystring(share_tdb, vstring, 0);
148 /* Cope with byte-reversed older versions of the db. */
149 vers_id = tdb_fetch_int32(share_tdb, vstring);
150 if ((vers_id == SHARE_DATABASE_VERSION_V1) || (IREV(vers_id) == SHARE_DATABASE_VERSION_V1)) {
151 /* Written on a bigendian machine with old fetch_int code. Save as le. */
152 tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION_V2);
153 vers_id = SHARE_DATABASE_VERSION_V2;
156 if (vers_id != SHARE_DATABASE_VERSION_V2) {
157 tdb_traverse(share_tdb, tdb_traverse_delete_fn, NULL);
158 tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION_V2);
160 tdb_unlock_bystring(share_tdb, vstring);
162 message_register(MSG_SMB_CONF_UPDATED, smb_conf_updated);
167 /*******************************************************************
168 Fake up a Everyone, full access as a default.
169 ********************************************************************/
171 static SEC_DESC *get_share_security_default( TALLOC_CTX *ctx, int snum, size_t *psize)
173 extern DOM_SID global_sid_World;
174 extern struct generic_mapping file_generic_mapping;
178 SEC_DESC *psd = NULL;
179 uint32 def_access = GENERIC_ALL_ACCESS;
181 se_map_generic(&def_access, &file_generic_mapping);
183 init_sec_access(&sa, GENERIC_ALL_ACCESS | def_access );
184 init_sec_ace(&ace, &global_sid_World, SEC_ACE_TYPE_ACCESS_ALLOWED, sa, 0);
186 if ((psa = make_sec_acl(ctx, NT4_ACL_REVISION, 1, &ace)) != NULL) {
187 psd = make_sec_desc(ctx, SEC_DESC_REVISION, SEC_DESC_SELF_RELATIVE, NULL, NULL, NULL, psa, psize);
191 DEBUG(0,("get_share_security: Failed to make SEC_DESC.\n"));
198 /*******************************************************************
199 Pull a security descriptor from the share tdb.
200 ********************************************************************/
202 static SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize)
206 SEC_DESC *psd = NULL;
210 /* Fetch security descriptor from tdb */
212 slprintf(key, sizeof(key)-1, "SECDESC/%s", lp_servicename(snum));
214 if (tdb_prs_fetch(share_tdb, key, &ps, ctx)!=0 ||
215 !sec_io_desc("get_share_security", &psd, &ps, 1)) {
217 DEBUG(4,("get_share_security: using default secdesc for %s\n", lp_servicename(snum) ));
219 return get_share_security_default(ctx, snum, psize);
223 *psize = sec_desc_size(psd);
229 /*******************************************************************
230 Store a security descriptor in the share db.
231 ********************************************************************/
233 static BOOL set_share_security(TALLOC_CTX *ctx, const char *share_name, SEC_DESC *psd)
236 TALLOC_CTX *mem_ctx = NULL;
240 mem_ctx = talloc_init("set_share_security");
244 prs_init(&ps, (uint32)sec_desc_size(psd), mem_ctx, MARSHALL);
246 if (!sec_io_desc("share_security", &psd, &ps, 1))
249 slprintf(key, sizeof(key)-1, "SECDESC/%s", share_name);
251 if (tdb_prs_store(share_tdb, key, &ps)==0) {
253 DEBUG(5,("set_share_security: stored secdesc for %s\n", share_name ));
255 DEBUG(1,("set_share_security: Failed to store secdesc for %s\n", share_name ));
258 /* Free malloc'ed memory */
264 talloc_destroy(mem_ctx);
268 /*******************************************************************
269 Delete a security descriptor.
270 ********************************************************************/
272 static BOOL delete_share_security(int snum)
277 slprintf(key, sizeof(key)-1, "SECDESC/%s", lp_servicename(snum));
279 kbuf.dsize = strlen(key)+1;
281 if (tdb_delete(share_tdb, kbuf) != 0) {
282 DEBUG(0,("delete_share_security: Failed to delete entry for share %s\n",
283 lp_servicename(snum) ));
290 /*******************************************************************
291 Map any generic bits to file specific bits.
292 ********************************************************************/
294 void map_generic_share_sd_bits(SEC_DESC *psd)
296 extern struct generic_mapping file_generic_mapping;
298 SEC_ACL *ps_dacl = NULL;
307 for (i = 0; i < ps_dacl->num_aces; i++) {
308 SEC_ACE *psa = &ps_dacl->ace[i];
309 uint32 orig_mask = psa->info.mask;
311 se_map_generic(&psa->info.mask, &file_generic_mapping);
312 psa->info.mask |= orig_mask;
316 /*******************************************************************
317 Can this user access with share with the required permissions ?
318 ********************************************************************/
320 BOOL share_access_check(connection_struct *conn, int snum, user_struct *vuser, uint32 desired_access)
324 TALLOC_CTX *mem_ctx = NULL;
325 SEC_DESC *psd = NULL;
327 NT_USER_TOKEN *token = NULL;
330 mem_ctx = talloc_init("share_access_check");
334 psd = get_share_security(mem_ctx, snum, &sd_size);
339 if (conn->nt_user_token)
340 token = conn->nt_user_token;
342 token = vuser->nt_user_token;
344 ret = se_access_check(psd, token, desired_access, &granted, &status);
348 talloc_destroy(mem_ctx);
353 /*******************************************************************
354 Fill in a share info level 501 structure.
355 ********************************************************************/
357 static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum)
361 const char *net_name = lp_servicename(snum);
362 pstrcpy(remark, lp_comment(snum));
363 standard_sub_conn(p->conn, remark, sizeof(remark));
365 init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), remark, (lp_csc_policy(snum) << 4));
366 init_srv_share_info501_str(&sh501->info_501_str, net_name, remark);
369 /*******************************************************************
370 Fill in a share info level 502 structure.
371 ********************************************************************/
373 static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum)
381 TALLOC_CTX *ctx = p->mem_ctx;
386 pstrcpy(net_name, lp_servicename(snum));
387 pstrcpy(remark, lp_comment(snum));
388 standard_sub_conn(p->conn, remark,sizeof(remark));
390 pstrcat(path, lp_pathname(snum));
393 * Change / to \\ so that win2k will see it as a valid path. This was added to
394 * enable use of browsing in win2k add share dialog.
397 string_replace(path, '/', '\\');
401 sd = get_share_security(ctx, snum, &sd_size);
403 init_srv_share_info502(&sh502->info_502, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size);
404 init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, path, passwd, sd, sd_size);
407 /***************************************************************************
408 Fill in a share info level 1004 structure.
409 ***************************************************************************/
411 static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum)
415 pstrcpy(remark, lp_comment(snum));
416 standard_sub_conn(p->conn, remark, sizeof(remark));
418 ZERO_STRUCTP(sh1004);
420 init_srv_share_info1004(&sh1004->info_1004, remark);
421 init_srv_share_info1004_str(&sh1004->info_1004_str, remark);
424 /***************************************************************************
425 Fill in a share info level 1005 structure.
426 ***************************************************************************/
428 static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum)
430 sh1005->share_info_flags = 0;
432 if(lp_host_msdfs() && lp_msdfs_root(snum))
433 sh1005->share_info_flags |=
434 SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
435 sh1005->share_info_flags |=
436 lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT;
438 /***************************************************************************
439 Fill in a share info level 1006 structure.
440 ***************************************************************************/
442 static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh1006, int snum)
444 sh1006->max_uses = -1;
447 /***************************************************************************
448 Fill in a share info level 1007 structure.
449 ***************************************************************************/
451 static void init_srv_share_info_1007(pipes_struct *p, SRV_SHARE_INFO_1007* sh1007, int snum)
453 pstring alternate_directory_name = "";
456 ZERO_STRUCTP(sh1007);
458 init_srv_share_info1007(&sh1007->info_1007, flags, alternate_directory_name);
459 init_srv_share_info1007_str(&sh1007->info_1007_str, alternate_directory_name);
462 /*******************************************************************
463 Fill in a share info level 1501 structure.
464 ********************************************************************/
466 static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh1501, int snum)
470 TALLOC_CTX *ctx = p->mem_ctx;
472 ZERO_STRUCTP(sh1501);
474 sd = get_share_security(ctx, snum, &sd_size);
476 sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
479 /*******************************************************************
480 True if it ends in '$'.
481 ********************************************************************/
483 static BOOL is_hidden_share(int snum)
485 const char *net_name = lp_servicename(snum);
487 return (net_name[strlen(net_name) - 1] == '$') ? True : False;
490 /*******************************************************************
491 Fill in a share info structure.
492 ********************************************************************/
494 static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr,
495 uint32 info_level, uint32 *resume_hnd, uint32 *total_entries, BOOL all_shares)
498 int num_services = lp_numservices();
500 TALLOC_CTX *ctx = p->mem_ctx;
502 DEBUG(5,("init_srv_share_info_ctr\n"));
506 ctr->info_level = ctr->switch_value = info_level;
509 /* Count the number of entries. */
510 for (snum = 0; snum < num_services; snum++) {
511 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) )
515 *total_entries = num_entries;
516 ctr->num_entries2 = ctr->num_entries = num_entries;
517 ctr->ptr_share_info = ctr->ptr_entries = 1;
522 switch (info_level) {
525 SRV_SHARE_INFO_0 *info0 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_0, num_entries);
532 for (snum = *resume_hnd; snum < num_services; snum++) {
533 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
534 init_srv_share_info_0(p, &info0[i++], snum);
538 ctr->share.info0 = info0;
545 SRV_SHARE_INFO_1 *info1 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1, num_entries);
552 for (snum = *resume_hnd; snum < num_services; snum++) {
553 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
554 init_srv_share_info_1(p, &info1[i++], snum);
558 ctr->share.info1 = info1;
564 SRV_SHARE_INFO_2 *info2 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_2, num_entries);
571 for (snum = *resume_hnd; snum < num_services; snum++) {
572 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
573 init_srv_share_info_2(p, &info2[i++], snum);
577 ctr->share.info2 = info2;
583 SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries);
590 for (snum = *resume_hnd; snum < num_services; snum++) {
591 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
592 init_srv_share_info_501(p, &info501[i++], snum);
596 ctr->share.info501 = info501;
602 SRV_SHARE_INFO_502 *info502 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_502, num_entries);
609 for (snum = *resume_hnd; snum < num_services; snum++) {
610 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
611 init_srv_share_info_502(p, &info502[i++], snum);
615 ctr->share.info502 = info502;
619 /* here for completeness but not currently used with enum (1004 - 1501)*/
623 SRV_SHARE_INFO_1004 *info1004 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1004, num_entries);
630 for (snum = *resume_hnd; snum < num_services; snum++) {
631 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
632 init_srv_share_info_1004(p, &info1004[i++], snum);
636 ctr->share.info1004 = info1004;
642 SRV_SHARE_INFO_1005 *info1005 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1005, num_entries);
649 for (snum = *resume_hnd; snum < num_services; snum++) {
650 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
651 init_srv_share_info_1005(p, &info1005[i++], snum);
655 ctr->share.info1005 = info1005;
661 SRV_SHARE_INFO_1006 *info1006 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1006, num_entries);
668 for (snum = *resume_hnd; snum < num_services; snum++) {
669 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
670 init_srv_share_info_1006(p, &info1006[i++], snum);
674 ctr->share.info1006 = info1006;
680 SRV_SHARE_INFO_1007 *info1007 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1007, num_entries);
687 for (snum = *resume_hnd; snum < num_services; snum++) {
688 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
689 init_srv_share_info_1007(p, &info1007[i++], snum);
693 ctr->share.info1007 = info1007;
699 SRV_SHARE_INFO_1501 *info1501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1501, num_entries);
706 for (snum = *resume_hnd; snum < num_services; snum++) {
707 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
708 init_srv_share_info_1501(p, &info1501[i++], snum);
712 ctr->share.info1501 = info1501;
716 DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level));
723 /*******************************************************************
724 Inits a SRV_R_NET_SHARE_ENUM structure.
725 ********************************************************************/
727 static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n,
728 uint32 info_level, uint32 resume_hnd, BOOL all)
730 DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__));
732 if (init_srv_share_info_ctr(p, &r_n->ctr, info_level,
733 &resume_hnd, &r_n->total_entries, all)) {
734 r_n->status = WERR_OK;
736 r_n->status = WERR_UNKNOWN_LEVEL;
739 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
742 /*******************************************************************
743 Inits a SRV_R_NET_SHARE_GET_INFO structure.
744 ********************************************************************/
746 static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_INFO *r_n,
747 char *share_name, uint32 info_level)
749 WERROR status = WERR_OK;
752 DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__));
754 r_n->info.switch_value = info_level;
756 snum = find_service(share_name);
759 switch (info_level) {
761 init_srv_share_info_0(p, &r_n->info.share.info0, snum);
764 init_srv_share_info_1(p, &r_n->info.share.info1, snum);
767 init_srv_share_info_2(p, &r_n->info.share.info2, snum);
770 init_srv_share_info_501(p, &r_n->info.share.info501, snum);
773 init_srv_share_info_502(p, &r_n->info.share.info502, snum);
776 /* here for completeness */
778 init_srv_share_info_1004(p, &r_n->info.share.info1004, snum);
781 init_srv_share_info_1005(p, &r_n->info.share.info1005, snum);
784 /* here for completeness 1006 - 1501 */
786 init_srv_share_info_1006(p, &r_n->info.share.info1006, snum);
789 init_srv_share_info_1007(p, &r_n->info.share.info1007, snum);
792 init_srv_share_info_1501(p, &r_n->info.share.info1501, snum);
795 DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level));
796 status = WERR_UNKNOWN_LEVEL;
800 status = WERR_INVALID_NAME;
803 r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0;
804 r_n->status = status;
807 /*******************************************************************
808 fill in a sess info level 1 structure.
809 ********************************************************************/
811 static void init_srv_sess_0_info(SESS_INFO_0 *se0, SESS_INFO_0_STR *str0, char *name)
813 init_srv_sess_info0(se0, name);
814 init_srv_sess_info0_str(str0, name);
817 /*******************************************************************
818 fill in a sess info level 0 structure.
819 ********************************************************************/
821 static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot)
823 struct sessionid *session_list;
824 uint32 num_entries = 0;
825 (*stot) = list_sessions(&session_list);
829 SAFE_FREE(session_list);
833 DEBUG(5,("init_srv_sess_0_ss0\n"));
836 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
837 init_srv_sess_0_info(&ss0->info_0[num_entries],
838 &ss0->info_0_str[num_entries], session_list[(*snum)].remote_machine);
840 /* move on to creating next session */
841 /* move on to creating next sess */
845 ss0->num_entries_read = num_entries;
846 ss0->ptr_sess_info = num_entries > 0 ? 1 : 0;
847 ss0->num_entries_read2 = num_entries;
849 if ((*snum) >= (*stot)) {
854 ss0->num_entries_read = 0;
855 ss0->ptr_sess_info = 0;
856 ss0->num_entries_read2 = 0;
858 SAFE_FREE(session_list);
861 /*******************************************************************
862 fill in a sess info level 1 structure.
863 ********************************************************************/
865 static void init_srv_sess_1_info(SESS_INFO_1 *se1, SESS_INFO_1_STR *str1,
866 char *name, char *user,
868 uint32 open_time, uint32 idle_time,
871 init_srv_sess_info1(se1 , name, user, num_opens, open_time, idle_time, usr_flgs);
872 init_srv_sess_info1_str(str1, name, user);
875 /*******************************************************************
876 fill in a sess info level 1 structure.
877 ********************************************************************/
879 static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot)
881 struct sessionid *session_list;
882 uint32 num_entries = 0;
883 (*stot) = list_sessions(&session_list);
887 SAFE_FREE(session_list);
891 DEBUG(5,("init_srv_sess_1_ss1\n"));
894 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
895 init_srv_sess_1_info(&ss1->info_1[num_entries],
896 &ss1->info_1_str[num_entries],
897 session_list[*snum].remote_machine,
898 session_list[*snum].username,
901 /* move on to creating next session */
902 /* move on to creating next sess */
906 ss1->num_entries_read = num_entries;
907 ss1->ptr_sess_info = num_entries > 0 ? 1 : 0;
908 ss1->num_entries_read2 = num_entries;
910 if ((*snum) >= (*stot)) {
915 ss1->num_entries_read = 0;
916 ss1->ptr_sess_info = 0;
917 ss1->num_entries_read2 = 0;
923 /*******************************************************************
924 makes a SRV_R_NET_SESS_ENUM structure.
925 ********************************************************************/
927 static WERROR init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr,
928 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
930 WERROR status = WERR_OK;
931 DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__));
933 ctr->switch_value = switch_value;
935 switch (switch_value) {
937 init_srv_sess_info_0(&(ctr->sess.info0), resume_hnd, total_entries);
938 ctr->ptr_sess_ctr = 1;
941 init_srv_sess_info_1(&(ctr->sess.info1), resume_hnd, total_entries);
942 ctr->ptr_sess_ctr = 1;
945 DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value));
947 (*total_entries) = 0;
948 ctr->ptr_sess_ctr = 0;
949 status = WERR_UNKNOWN_LEVEL;
956 /*******************************************************************
957 makes a SRV_R_NET_SESS_ENUM structure.
958 ********************************************************************/
960 static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n,
961 uint32 resume_hnd, int sess_level, int switch_value)
963 DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__));
965 r_n->sess_level = sess_level;
967 if (sess_level == -1)
968 r_n->status = WERR_UNKNOWN_LEVEL;
970 r_n->status = init_srv_sess_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
972 if (!W_ERROR_IS_OK(r_n->status))
975 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
978 /*******************************************************************
979 fill in a conn info level 0 structure.
980 ********************************************************************/
982 static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot)
984 uint32 num_entries = 0;
992 DEBUG(5,("init_srv_conn_0_ss0\n"));
995 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
997 init_srv_conn_info0(&ss0->info_0[num_entries], (*stot));
999 /* move on to creating next connection */
1000 /* move on to creating next conn */
1004 ss0->num_entries_read = num_entries;
1005 ss0->ptr_conn_info = num_entries > 0 ? 1 : 0;
1006 ss0->num_entries_read2 = num_entries;
1008 if ((*snum) >= (*stot)) {
1013 ss0->num_entries_read = 0;
1014 ss0->ptr_conn_info = 0;
1015 ss0->num_entries_read2 = 0;
1021 /*******************************************************************
1022 fill in a conn info level 1 structure.
1023 ********************************************************************/
1025 static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1,
1026 uint32 id, uint32 type,
1027 uint32 num_opens, uint32 num_users, uint32 open_time,
1028 const char *usr_name, const char *net_name)
1030 init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name);
1031 init_srv_conn_info1_str(str1, usr_name, net_name);
1034 /*******************************************************************
1035 fill in a conn info level 1 structure.
1036 ********************************************************************/
1038 static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot)
1040 uint32 num_entries = 0;
1048 DEBUG(5,("init_srv_conn_1_ss1\n"));
1051 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
1052 init_srv_conn_1_info(&ss1->info_1[num_entries],
1053 &ss1->info_1_str[num_entries],
1054 (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$");
1056 /* move on to creating next connection */
1057 /* move on to creating next conn */
1061 ss1->num_entries_read = num_entries;
1062 ss1->ptr_conn_info = num_entries > 0 ? 1 : 0;
1063 ss1->num_entries_read2 = num_entries;
1066 if ((*snum) >= (*stot)) {
1071 ss1->num_entries_read = 0;
1072 ss1->ptr_conn_info = 0;
1073 ss1->num_entries_read2 = 0;
1079 /*******************************************************************
1080 makes a SRV_R_NET_CONN_ENUM structure.
1081 ********************************************************************/
1083 static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,
1084 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
1086 WERROR status = WERR_OK;
1087 DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__));
1089 ctr->switch_value = switch_value;
1091 switch (switch_value) {
1093 init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries);
1094 ctr->ptr_conn_ctr = 1;
1097 init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries);
1098 ctr->ptr_conn_ctr = 1;
1101 DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value));
1103 (*total_entries) = 0;
1104 ctr->ptr_conn_ctr = 0;
1105 status = WERR_UNKNOWN_LEVEL;
1112 /*******************************************************************
1113 makes a SRV_R_NET_CONN_ENUM structure.
1114 ********************************************************************/
1116 static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,
1117 uint32 resume_hnd, int conn_level, int switch_value)
1119 DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__));
1121 r_n->conn_level = conn_level;
1122 if (conn_level == -1)
1123 r_n->status = WERR_UNKNOWN_LEVEL;
1125 r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
1127 if (!W_ERROR_IS_OK(r_n->status))
1130 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
1133 /*******************************************************************
1134 makes a SRV_R_NET_FILE_ENUM structure.
1135 ********************************************************************/
1137 static WERROR init_srv_file_info_ctr(pipes_struct *p, SRV_FILE_INFO_CTR *ctr,
1138 int switch_value, uint32 *resume_hnd,
1139 uint32 *total_entries)
1141 WERROR status = WERR_OK;
1142 TALLOC_CTX *ctx = p->mem_ctx;
1143 DEBUG(5,("init_srv_file_info_ctr: %d\n", __LINE__));
1144 *total_entries = 1; /* dummy entries only, for */
1146 ctr->switch_value = switch_value;
1147 ctr->num_entries = *total_entries - *resume_hnd;
1148 ctr->num_entries2 = ctr->num_entries;
1150 switch (switch_value) {
1153 if (*total_entries > 0) {
1154 ctr->ptr_entries = 1;
1155 ctr->file.info3 = TALLOC_ARRAY(ctx, SRV_FILE_INFO_3, ctr->num_entries);
1157 for (i=0 ;i<ctr->num_entries;i++) {
1158 init_srv_file_info3(&ctr->file.info3[i].info_3, i+*resume_hnd, 0x35, 0, "\\PIPE\\samr", "dummy user");
1159 init_srv_file_info3_str(&ctr->file.info3[i].info_3_str, "\\PIPE\\samr", "dummy user");
1162 ctr->ptr_file_info = 1;
1167 DEBUG(5,("init_srv_file_info_ctr: unsupported switch value %d\n", switch_value));
1169 (*total_entries) = 0;
1170 ctr->ptr_entries = 0;
1171 status = WERR_UNKNOWN_LEVEL;
1178 /*******************************************************************
1179 makes a SRV_R_NET_FILE_ENUM structure.
1180 ********************************************************************/
1182 static void init_srv_r_net_file_enum(pipes_struct *p, SRV_R_NET_FILE_ENUM *r_n,
1183 uint32 resume_hnd, int file_level, int switch_value)
1185 DEBUG(5,("init_srv_r_net_file_enum: %d\n", __LINE__));
1187 r_n->file_level = file_level;
1188 if (file_level == 0)
1189 r_n->status = WERR_UNKNOWN_LEVEL;
1191 r_n->status = init_srv_file_info_ctr(p, &r_n->ctr, switch_value, &resume_hnd, &(r_n->total_entries));
1193 if (!W_ERROR_IS_OK(r_n->status))
1196 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
1199 /*******************************************************************
1201 ********************************************************************/
1203 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)
1205 WERROR status = WERR_OK;
1206 SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR);
1213 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1215 if (!pipe_access_check(p)) {
1216 DEBUG(3, ("access denied to srv_net_srv_get_info\n"));
1217 return WERR_ACCESS_DENIED;
1220 switch (q_u->switch_value) {
1222 /* Technically level 102 should only be available to
1223 Administrators but there isn't anything super-secret
1224 here, as most of it is made up. */
1227 init_srv_info_102(&ctr->srv.sv102,
1228 500, global_myname(),
1229 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH),
1230 lp_major_announce_version(), lp_minor_announce_version(),
1231 lp_default_server_announce(),
1232 0xffffffff, /* users */
1236 3000, /* announce delta */
1237 100000, /* licenses */
1238 "c:\\"); /* user path */
1241 init_srv_info_101(&ctr->srv.sv101,
1242 500, global_myname(),
1243 lp_major_announce_version(), lp_minor_announce_version(),
1244 lp_default_server_announce(),
1245 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH));
1248 init_srv_info_100(&ctr->srv.sv100, 500, global_myname());
1251 status = WERR_UNKNOWN_LEVEL;
1255 /* set up the net server get info structure */
1256 init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status);
1258 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1263 /*******************************************************************
1265 ********************************************************************/
1267 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)
1269 WERROR status = WERR_OK;
1271 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1273 /* Set up the net server set info structure. */
1275 init_srv_r_net_srv_set_info(r_u, 0x0, status);
1277 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1282 /*******************************************************************
1284 ********************************************************************/
1286 WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u)
1288 DEBUG(5,("srv_net_file_enum: %d\n", __LINE__));
1291 init_srv_r_net_file_enum(p, r_u,
1292 get_enum_hnd(&q_u->enum_hnd),
1294 q_u->ctr.switch_value);
1296 DEBUG(5,("srv_net_file_enum: %d\n", __LINE__));
1301 /*******************************************************************
1303 ********************************************************************/
1305 WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u)
1307 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1309 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR);
1313 ZERO_STRUCTP(r_u->ctr);
1316 init_srv_r_net_conn_enum(r_u,
1317 get_enum_hnd(&q_u->enum_hnd),
1319 q_u->ctr->switch_value);
1321 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1326 /*******************************************************************
1328 ********************************************************************/
1330 WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u)
1332 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1334 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR);
1338 ZERO_STRUCTP(r_u->ctr);
1341 init_srv_r_net_sess_enum(r_u,
1342 get_enum_hnd(&q_u->enum_hnd),
1344 q_u->ctr->switch_value);
1346 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1351 /*******************************************************************
1353 ********************************************************************/
1355 WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u)
1357 struct current_user user;
1358 struct sessionid *session_list;
1359 int num_sessions, snum, ret;
1362 SE_PRIV se_diskop = SE_DISK_OPERATOR; /* Is disk op appropriate here ? JRA. */
1363 BOOL is_disk_op = False;
1365 rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name);
1366 rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name);
1368 /* strip leading backslashes if any */
1369 while (machine[0] == '\\') {
1370 memmove(machine, &machine[1], strlen(machine));
1373 num_sessions = list_sessions(&session_list);
1375 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1377 get_current_user(&user,p);
1379 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1381 /* fail out now if you are not root and not a disk op */
1383 if ( user.uid != sec_initial_uid() && !is_disk_op )
1384 return WERR_ACCESS_DENIED;
1386 r_u->status = WERR_ACCESS_DENIED;
1388 for (snum = 0; snum < num_sessions; snum++) {
1390 if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
1391 strequal(session_list[snum].remote_machine, machine)) {
1393 if ((ret = message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) {
1394 r_u->status = WERR_OK;
1396 r_u->status = WERR_ACCESS_DENIED;
1401 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1406 /*******************************************************************
1408 ********************************************************************/
1410 WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1412 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1414 if (!pipe_access_check(p)) {
1415 DEBUG(3, ("access denied to srv_net_share_enum_all\n"));
1416 return WERR_ACCESS_DENIED;
1419 /* Create the list of shares for the response. */
1420 init_srv_r_net_share_enum(p, r_u,
1421 q_u->ctr.info_level,
1422 get_enum_hnd(&q_u->enum_hnd), True);
1424 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1429 /*******************************************************************
1431 ********************************************************************/
1433 WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1435 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1437 if (!pipe_access_check(p)) {
1438 DEBUG(3, ("access denied to srv_net_share_enum\n"));
1439 return WERR_ACCESS_DENIED;
1442 /* Create the list of shares for the response. */
1443 init_srv_r_net_share_enum(p, r_u,
1444 q_u->ctr.info_level,
1445 get_enum_hnd(&q_u->enum_hnd), False);
1447 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1452 /*******************************************************************
1454 ********************************************************************/
1456 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)
1460 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1462 /* Create the list of shares for the response. */
1463 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1464 init_srv_r_net_share_get_info(p, r_u, share_name, q_u->info_level);
1466 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1471 /*******************************************************************
1472 Check a given DOS pathname is valid for a share.
1473 ********************************************************************/
1475 static char *valid_share_pathname(char *dos_pathname)
1479 /* Convert any '\' paths to '/' */
1480 unix_format(dos_pathname);
1481 unix_clean_name(dos_pathname);
1483 /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
1485 if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/')
1488 /* Only abolute paths allowed. */
1495 /*******************************************************************
1496 Net share set info. Modify share details.
1497 ********************************************************************/
1499 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)
1501 struct current_user user;
1510 SEC_DESC *psd = NULL;
1511 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1512 BOOL is_disk_op = False;
1514 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1516 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1518 r_u->parm_error = 0;
1520 if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global"))
1521 return WERR_ACCESS_DENIED;
1523 snum = find_service(share_name);
1525 /* Does this share exist ? */
1527 return WERR_INVALID_NAME;
1529 /* No change to printer shares. */
1530 if (lp_print_ok(snum))
1531 return WERR_ACCESS_DENIED;
1533 get_current_user(&user,p);
1535 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1537 /* fail out now if you are not root and not a disk op */
1539 if ( user.uid != sec_initial_uid() && !is_disk_op )
1540 return WERR_ACCESS_DENIED;
1542 switch (q_u->info_level) {
1544 pstrcpy(pathname, lp_pathname(snum));
1545 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1546 type = q_u->info.share.info2.info_2.type;
1550 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment));
1551 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname));
1552 type = q_u->info.share.info2.info_2.type;
1556 /* not supported on set but here for completeness */
1558 unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment));
1559 type = q_u->info.share.info501.info_501.type;
1564 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment));
1565 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname));
1566 type = q_u->info.share.info502.info_502.type;
1567 psd = q_u->info.share.info502.info_502_str.sd;
1568 map_generic_share_sd_bits(psd);
1571 pstrcpy(pathname, lp_pathname(snum));
1572 unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment));
1573 type = STYPE_DISKTREE;
1576 /* XP re-sets the csc policy even if it wasn't changed by the
1577 user, so we must compare it to see if it's what is set in
1578 smb.conf, so that we can contine other ops like setting
1580 if (((q_u->info.share.info1005.share_info_flags &
1581 SHARE_1005_CSC_POLICY_MASK) >>
1582 SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
1585 DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n"));
1586 return WERR_ACCESS_DENIED;
1591 return WERR_ACCESS_DENIED;
1594 pstrcpy(pathname, lp_pathname(snum));
1595 fstrcpy(comment, lp_comment(snum));
1596 psd = q_u->info.share.info1501.sdb->sec;
1597 map_generic_share_sd_bits(psd);
1598 type = STYPE_DISKTREE;
1601 DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level));
1602 return WERR_UNKNOWN_LEVEL;
1605 /* We can only modify disk shares. */
1606 if (type != STYPE_DISKTREE)
1607 return WERR_ACCESS_DENIED;
1609 /* Check if the pathname is valid. */
1610 if (!(path = valid_share_pathname( pathname )))
1611 return WERR_OBJECT_PATH_INVALID;
1613 /* Ensure share name, pathname and comment don't contain '"' characters. */
1614 string_replace(share_name, '"', ' ');
1615 string_replace(path, '"', ' ');
1616 string_replace(comment, '"', ' ');
1618 DEBUG(10,("_srv_net_share_set_info: change share command = %s\n",
1619 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
1621 /* Only call modify function if something changed. */
1623 if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) )
1625 if (!lp_change_share_cmd() || !*lp_change_share_cmd())
1626 return WERR_ACCESS_DENIED;
1628 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"",
1629 lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment);
1631 DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command ));
1633 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1638 if ( (ret = smbrun(command, NULL)) == 0 ) {
1639 /* Tell everyone we updated smb.conf. */
1640 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1646 /********* END SeDiskOperatorPrivilege BLOCK *********/
1648 DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret ));
1651 return WERR_ACCESS_DENIED;
1653 DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name ));
1656 /* Replace SD if changed. */
1661 old_sd = get_share_security(p->mem_ctx, snum, &sd_size);
1663 if (old_sd && !sec_desc_equal(old_sd, psd)) {
1664 if (!set_share_security(p->mem_ctx, share_name, psd))
1665 DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n",
1670 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1675 /*******************************************************************
1676 Net share add. Call 'add_share_command "sharename" "pathname" "comment" "read only = xxx"'
1677 ********************************************************************/
1679 WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
1681 struct current_user user;
1690 SEC_DESC *psd = NULL;
1691 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1694 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1696 r_u->parm_error = 0;
1698 get_current_user(&user,p);
1700 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1702 if (user.uid != sec_initial_uid() && !is_disk_op )
1703 return WERR_ACCESS_DENIED;
1705 if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
1706 DEBUG(10,("_srv_net_share_add: No add share command\n"));
1707 return WERR_ACCESS_DENIED;
1710 switch (q_u->info_level) {
1712 /* No path. Not enough info in a level 0 to do anything. */
1713 return WERR_ACCESS_DENIED;
1715 /* Not enough info in a level 1 to do anything. */
1716 return WERR_ACCESS_DENIED;
1718 unistr2_to_ascii(share_name, &q_u->info.share.info2.info_2_str.uni_netname, sizeof(share_name));
1719 unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name));
1720 unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name));
1721 type = q_u->info.share.info2.info_2.type;
1724 /* No path. Not enough info in a level 501 to do anything. */
1725 return WERR_ACCESS_DENIED;
1727 unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name));
1728 unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name));
1729 unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name));
1730 type = q_u->info.share.info502.info_502.type;
1731 psd = q_u->info.share.info502.info_502_str.sd;
1732 map_generic_share_sd_bits(psd);
1735 /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */
1741 return WERR_ACCESS_DENIED;
1744 /* DFS only level. */
1745 return WERR_ACCESS_DENIED;
1747 DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level));
1748 return WERR_UNKNOWN_LEVEL;
1751 if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global"))
1752 return WERR_ACCESS_DENIED;
1754 snum = find_service(share_name);
1756 /* Share already exists. */
1758 return WERR_ALREADY_EXISTS;
1760 /* We can only add disk shares. */
1761 if (type != STYPE_DISKTREE)
1762 return WERR_ACCESS_DENIED;
1764 /* Check if the pathname is valid. */
1765 if (!(path = valid_share_pathname( pathname )))
1766 return WERR_OBJECT_PATH_INVALID;
1768 /* Ensure share name, pathname and comment don't contain '"' characters. */
1769 string_replace(share_name, '"', ' ');
1770 string_replace(path, '"', ' ');
1771 string_replace(comment, '"', ' ');
1773 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"",
1774 lp_add_share_cmd(), dyn_CONFIGFILE, share_name, path, comment);
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)
1822 struct current_user user;
1827 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1830 DEBUG(5,("_srv_net_share_del: %d\n", __LINE__));
1832 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1834 if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global"))
1835 return WERR_ACCESS_DENIED;
1837 snum = find_service(share_name);
1840 return WERR_NO_SUCH_SHARE;
1842 /* No change to printer shares. */
1843 if (lp_print_ok(snum))
1844 return WERR_ACCESS_DENIED;
1846 get_current_user(&user,p);
1848 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1850 if (user.uid != sec_initial_uid() && !is_disk_op )
1851 return WERR_ACCESS_DENIED;
1853 if (!lp_delete_share_cmd() || !*lp_delete_share_cmd())
1854 return WERR_ACCESS_DENIED;
1856 slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"",
1857 lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum));
1859 DEBUG(10,("_srv_net_share_del: Running [%s]\n", command ));
1861 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1866 if ( (ret = smbrun(command, NULL)) == 0 ) {
1867 /* Tell everyone we updated smb.conf. */
1868 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
1874 /********* END SeDiskOperatorPrivilege BLOCK *********/
1876 DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret ));
1879 return WERR_ACCESS_DENIED;
1881 /* Delete the SD in the database. */
1882 delete_share_security(snum);
1884 lp_killservice(snum);
1889 WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1891 DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__));
1893 return _srv_net_share_del(p, q_u, r_u);
1896 /*******************************************************************
1898 ********************************************************************/
1900 WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u)
1902 TIME_OF_DAY_INFO *tod;
1904 time_t unixdate = time(NULL);
1906 tod = TALLOC_P(p->mem_ctx, TIME_OF_DAY_INFO);
1913 r_u->ptr_srv_tod = 0x1;
1914 r_u->status = WERR_OK;
1916 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1918 t = gmtime(&unixdate);
1921 init_time_of_day_info(tod,
1928 TimeDiff(unixdate)/60,
1935 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
1940 /***********************************************************************************
1941 Win9x NT tools get security descriptor.
1942 ***********************************************************************************/
1944 WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u,
1945 SRV_R_NET_FILE_QUERY_SECDESC *r_u)
1947 SEC_DESC *psd = NULL;
1952 files_struct *fsp = NULL;
1958 struct current_user user;
1959 connection_struct *conn = NULL;
1960 BOOL became_user = False;
1964 r_u->status = WERR_OK;
1966 unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
1968 /* Null password is ok - we are already an authenticated user... */
1969 null_pw = data_blob(NULL, 0);
1971 get_current_user(&user, p);
1974 conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
1978 DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname));
1979 r_u->status = ntstatus_to_werror(nt_status);
1983 if (!become_user(conn, conn->vuid)) {
1984 DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n"));
1985 r_u->status = WERR_ACCESS_DENIED;
1990 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
1991 unix_convert(filename, conn, NULL, &bad_path, &st);
1993 DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename));
1994 r_u->status = WERR_ACCESS_DENIED;
1998 if (!check_name(filename,conn)) {
1999 DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename));
2000 r_u->status = WERR_ACCESS_DENIED;
2004 fsp = open_file_shared(conn, filename, &st, SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_RDONLY),
2005 (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, INTERNAL_OPEN_ONLY,
2006 &access_mode, &action);
2009 /* Perhaps it is a directory */
2010 if (errno == EISDIR)
2011 fsp = open_directory(conn, filename, &st,FILE_READ_ATTRIBUTES,0,
2012 (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), &action);
2015 DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename));
2016 r_u->status = WERR_ACCESS_DENIED;
2021 sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd);
2024 DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename));
2025 r_u->status = WERR_ACCESS_DENIED;
2029 r_u->ptr_response = 1;
2030 r_u->size_response = sd_size;
2031 r_u->ptr_secdesc = 1;
2032 r_u->size_secdesc = sd_size;
2033 r_u->sec_desc = psd;
2035 psd->dacl->revision = (uint16) NT4_ACL_REVISION;
2037 close_file(fsp, True);
2039 close_cnum(conn, user.vuid);
2045 close_file(fsp, True);
2052 close_cnum(conn, user.vuid);
2057 /***********************************************************************************
2058 Win9x NT tools set security descriptor.
2059 ***********************************************************************************/
2061 WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u,
2062 SRV_R_NET_FILE_SET_SECDESC *r_u)
2068 files_struct *fsp = NULL;
2074 struct current_user user;
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);
2087 get_current_user(&user, p);
2090 conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
2094 DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname));
2095 r_u->status = ntstatus_to_werror(nt_status);
2099 if (!become_user(conn, conn->vuid)) {
2100 DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n"));
2101 r_u->status = WERR_ACCESS_DENIED;
2106 unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
2107 unix_convert(filename, conn, NULL, &bad_path, &st);
2109 DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename));
2110 r_u->status = WERR_ACCESS_DENIED;
2114 if (!check_name(filename,conn)) {
2115 DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename));
2116 r_u->status = WERR_ACCESS_DENIED;
2121 fsp = open_file_shared(conn, filename, &st, SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_RDWR),
2122 (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, INTERNAL_OPEN_ONLY,
2123 &access_mode, &action);
2126 /* Perhaps it is a directory */
2127 if (errno == EISDIR)
2128 fsp = open_directory(conn, filename, &st,FILE_READ_ATTRIBUTES,0,
2129 (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), &action);
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, True);
2148 close_cnum(conn, user.vuid);
2154 close_file(fsp, True);
2161 close_cnum(conn, user.vuid);
2166 /***********************************************************************************
2167 It may be that we want to limit users to creating shares on certain areas of the UNIX file area.
2168 We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy.
2169 These disks would the disks listed by this function.
2170 Users could then create shares relative to these disks. Watch out for moving these disks around.
2171 "Nigel Williams" <nigel@veritas.com>.
2172 ***********************************************************************************/
2174 static const char *server_disks[] = {"C:"};
2176 static uint32 get_server_disk_count(void)
2178 return sizeof(server_disks)/sizeof(server_disks[0]);
2181 static uint32 init_server_disk_enum(uint32 *resume)
2183 uint32 server_disk_count = get_server_disk_count();
2185 /*resume can be an offset into the list for now*/
2187 if(*resume & 0x80000000)
2190 if(*resume > server_disk_count)
2191 *resume = server_disk_count;
2193 return server_disk_count - *resume;
2196 static const char *next_server_disk_enum(uint32 *resume)
2200 if(init_server_disk_enum(resume) == 0)
2203 disk = server_disks[*resume];
2207 DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume));
2212 WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u)
2215 const char *disk_name;
2216 TALLOC_CTX *ctx = p->mem_ctx;
2217 uint32 resume=get_enum_hnd(&q_u->enum_hnd);
2219 r_u->status=WERR_OK;
2221 r_u->total_entries = init_server_disk_enum(&resume);
2223 r_u->disk_enum_ctr.unknown = 0;
2225 if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) {
2229 r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0;
2231 /*allow one DISK_INFO for null terminator*/
2233 for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
2235 r_u->disk_enum_ctr.entries_read++;
2237 /*copy disk name into a unicode string*/
2239 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name);
2242 /* add a terminating null string. Is this there if there is more data to come? */
2244 r_u->disk_enum_ctr.entries_read++;
2246 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, "");
2248 init_enum_hnd(&r_u->enum_hnd, resume);
2253 WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u)
2258 r_u->status=WERR_OK;
2264 /*check if share name is ok*/
2265 /*also check if we already have a share with this name*/
2267 unistr2_to_ascii(share_name, &q_u->uni_name, sizeof(share_name));
2268 snum = find_service(share_name);
2270 /* Share already exists. */
2272 r_u->status = WERR_ALREADY_EXISTS;
2276 /*unsupported type*/
2277 r_u->status = WERR_UNKNOWN_LEVEL;