mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
Added 3 params to manipulate shares. "add share command/change share command/
delete share command". Implemented "delete" - more work to come on add and change. Jeremy.
This commit is contained in:
parent
f50ea32dd0
commit
2e6b1759e1
@ -1646,6 +1646,9 @@ char *lp_ldap_suffix(void);
|
||||
char *lp_ldap_filter(void);
|
||||
char *lp_ldap_root(void);
|
||||
char *lp_ldap_rootpasswd(void);
|
||||
char *lp_add_share_cmd(void);
|
||||
char *lp_change_share_cmd(void);
|
||||
char *lp_delete_share_cmd(void);
|
||||
int lp_ssl_version(void);
|
||||
char *lp_ssl_hosts(void);
|
||||
char *lp_ssl_hosts_resign(void);
|
||||
@ -3625,6 +3628,7 @@ BOOL check_bind_req(char* pipe_name, RPC_IFACE* abstract,
|
||||
RPC_IFACE* transfer);
|
||||
BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p);
|
||||
BOOL api_pipe_auth_process(pipes_struct *p, prs_struct *rpc_in);
|
||||
struct current_user *get_current_user(struct current_user *user, pipes_struct *p);
|
||||
BOOL api_pipe_request(pipes_struct *p);
|
||||
BOOL api_rpcTNP(pipes_struct *p, char *rpc_name,
|
||||
struct api_struct *api_rpc_cmds);
|
||||
|
@ -181,6 +181,9 @@ typedef struct
|
||||
char *szTemplateHomedir;
|
||||
char *szTemplateShell;
|
||||
char *szWinbindSeparator;
|
||||
char *szAddShareCommand;
|
||||
char *szChangeShareCommand;
|
||||
char *szDeleteShareCommand;
|
||||
int max_log_size;
|
||||
int mangled_stack;
|
||||
int max_xmit;
|
||||
@ -960,6 +963,9 @@ static struct parm_struct parm_table[] = {
|
||||
#endif /* WITH_LDAP */
|
||||
|
||||
{"Miscellaneous Options", P_SEP, P_SEPARATOR},
|
||||
{"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, 0},
|
||||
{"change share command", P_STRING, P_GLOBAL, &Globals.szChangeShareCommand, NULL, NULL, 0},
|
||||
{"delete share command", P_STRING, P_GLOBAL, &Globals.szDeleteShareCommand, NULL, NULL, 0},
|
||||
{"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL, NULL, 0},
|
||||
|
||||
{"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
|
||||
@ -1501,6 +1507,9 @@ FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter);
|
||||
FN_GLOBAL_STRING(lp_ldap_root, &Globals.szLdapRoot);
|
||||
FN_GLOBAL_STRING(lp_ldap_rootpasswd, &Globals.szLdapRootPassword);
|
||||
#endif /* WITH_LDAP */
|
||||
FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand);
|
||||
FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand);
|
||||
FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand);
|
||||
|
||||
#ifdef WITH_SSL
|
||||
FN_GLOBAL_INTEGER(lp_ssl_version, &Globals.sslVersion);
|
||||
|
@ -1103,6 +1103,22 @@ BOOL api_pipe_auth_process(pipes_struct *p, prs_struct *rpc_in)
|
||||
return True;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Return a user struct for a pipe user.
|
||||
****************************************************************************/
|
||||
|
||||
struct current_user *get_current_user(struct current_user *user, pipes_struct *p)
|
||||
{
|
||||
if (p->ntlmssp_auth_validated) {
|
||||
memcpy(user, &p->pipe_user, sizeof(struct current_user));
|
||||
} else {
|
||||
extern struct current_user current_user;
|
||||
memcpy(user, ¤t_user, sizeof(struct current_user));
|
||||
}
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Find the correct RPC function to call for this request.
|
||||
If the pipe is authenticated then become the correct UNIX user
|
||||
|
@ -222,22 +222,6 @@ SPOOL_NOTIFY_OPTION *dup_spool_notify_option(SPOOL_NOTIFY_OPTION *sp)
|
||||
return new_sp;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Return a user struct for a pipe user.
|
||||
****************************************************************************/
|
||||
|
||||
static struct current_user *get_current_user(struct current_user *user, pipes_struct *p)
|
||||
{
|
||||
if (p->ntlmssp_auth_validated) {
|
||||
memcpy(user, &p->pipe_user, sizeof(struct current_user));
|
||||
} else {
|
||||
extern struct current_user current_user;
|
||||
memcpy(user, ¤t_user, sizeof(struct current_user));
|
||||
}
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
find printer index by handle
|
||||
****************************************************************************/
|
||||
|
@ -928,12 +928,12 @@ uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET
|
||||
|
||||
uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u)
|
||||
{
|
||||
char *share_name;
|
||||
fstring share_name;
|
||||
|
||||
DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
|
||||
|
||||
/* Create the list of shares for the response. */
|
||||
share_name = dos_unistr2_to_str(&q_u->uni_share_name);
|
||||
unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
|
||||
init_srv_r_net_share_get_info(p->mem_ctx, r_u, share_name, q_u->info_level);
|
||||
|
||||
DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
|
||||
@ -947,13 +947,16 @@ uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S
|
||||
|
||||
uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u)
|
||||
{
|
||||
char *share_name;
|
||||
fstring share_name;
|
||||
uint32 status = NT_STATUS_NOPROBLEMO;
|
||||
int snum;
|
||||
fstring servicename;
|
||||
fstring comment;
|
||||
pstring pathname;
|
||||
|
||||
DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
|
||||
|
||||
share_name = dos_unistr2_to_str(&q_u->uni_share_name);
|
||||
unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
|
||||
|
||||
r_u->switch_value = 0;
|
||||
|
||||
@ -993,29 +996,51 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Net share add. Stub for now. JRA.
|
||||
Net share add. Call 'add_share_command "sharename" "pathname" "comment"'
|
||||
********************************************************************/
|
||||
|
||||
uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
|
||||
{
|
||||
struct current_user user;
|
||||
pstring command;
|
||||
uint32 status = NT_STATUS_NOPROBLEMO;
|
||||
fstring share_name;
|
||||
fstring comment;
|
||||
pstring pathname;
|
||||
char *ptr;
|
||||
int type;
|
||||
int snum;
|
||||
|
||||
DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
|
||||
|
||||
r_u->switch_value = 0;
|
||||
|
||||
get_current_user(&user,p);
|
||||
|
||||
if (user.uid != 0)
|
||||
return ERROR_ACCESS_DENIED;
|
||||
|
||||
if (!lp_add_share_cmd())
|
||||
return ERROR_ACCESS_DENIED;
|
||||
|
||||
switch (q_u->info_level) {
|
||||
case 1:
|
||||
/* Not enough info in a level 1 to do anything. */
|
||||
status = ERROR_ACCESS_DENIED;
|
||||
break;
|
||||
case 2:
|
||||
status = ERROR_ACCESS_DENIED;
|
||||
unistr2_to_ascii(share_name, &q_u->info.share.info2.info_2_str.uni_netname, sizeof(share_name));
|
||||
unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name));
|
||||
unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name));
|
||||
break;
|
||||
case 502:
|
||||
/* we set sd's here. FIXME. JRA */
|
||||
status = ERROR_ACCESS_DENIED;
|
||||
unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name));
|
||||
unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name));
|
||||
unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name));
|
||||
break;
|
||||
case 1005:
|
||||
/* DFS only level. */
|
||||
status = ERROR_ACCESS_DENIED;
|
||||
break;
|
||||
default:
|
||||
@ -1024,6 +1049,26 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S
|
||||
break;
|
||||
}
|
||||
|
||||
snum = find_service(share_name);
|
||||
|
||||
/* Share already exists. */
|
||||
if (snum >= 0)
|
||||
return NT_STATUS_BAD_NETWORK_NAME;
|
||||
|
||||
/* Convert any '\' paths to '/' */
|
||||
unix_format(pathname);
|
||||
unix_clean_name(pathname);
|
||||
|
||||
/* NT is braindead - it wants a C: prefix to a pathname ! */
|
||||
ptr = pathname;
|
||||
if (strlen(pathname) > 2 && ptr[1] == ':' && ptr[0] != '/')
|
||||
ptr += 2;
|
||||
|
||||
slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\"",
|
||||
lp_add_share_cmd(), share_name, ptr, comment );
|
||||
|
||||
/* HERE ! JRA */
|
||||
|
||||
r_u->status = status;
|
||||
|
||||
DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
|
||||
@ -1032,26 +1077,50 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Net share delete. Stub for now. JRA.
|
||||
Net share delete. Call "delete share command" with the share name as
|
||||
a parameter.
|
||||
********************************************************************/
|
||||
|
||||
uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
|
||||
{
|
||||
char *share_name;
|
||||
uint32 status = NT_STATUS_NOPROBLEMO;
|
||||
struct current_user user;
|
||||
pstring command;
|
||||
fstring share_name;
|
||||
int ret;
|
||||
int snum;
|
||||
|
||||
DEBUG(5,("_srv_net_share_del: %d\n", __LINE__));
|
||||
|
||||
share_name = dos_unistr2_to_str(&q_u->uni_share_name);
|
||||
unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
|
||||
|
||||
snum = find_service(share_name);
|
||||
|
||||
if (snum < 0)
|
||||
return NT_STATUS_BAD_NETWORK_NAME;
|
||||
|
||||
/* Stub... */
|
||||
return ERROR_ACCESS_DENIED;
|
||||
get_current_user(&user,p);
|
||||
|
||||
if (user.uid != 0)
|
||||
return ERROR_ACCESS_DENIED;
|
||||
|
||||
if (!lp_delete_share_cmd())
|
||||
return ERROR_ACCESS_DENIED;
|
||||
|
||||
slprintf(command, sizeof(command)-1, "%s \"%s\"", lp_delete_share_cmd(), lp_servicename(snum));
|
||||
dos_to_unix(command, True); /* Convert to unix-codepage */
|
||||
|
||||
DEBUG(10,("_srv_net_share_del: Running [%s]\n", command ));
|
||||
if ((ret = smbrun(command, NULL, False)) != 0) {
|
||||
DEBUG(0,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret ));
|
||||
return ERROR_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
/* Send SIGHUP to process group. */
|
||||
kill(0, SIGHUP);
|
||||
|
||||
lp_killservice(snum);
|
||||
|
||||
return NT_STATUS_NOPROBLEMO;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
|
Loading…
Reference in New Issue
Block a user