mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
2e69e89456
These variables, of type struct auth_serversupplied_info were poorly named when added into 2001, and in good consistant practice, this has extended all over the codebase in the years since. The structure is also not ideal for it's current purpose. Originally intended to convey the results of the authentication modules, it really describes all the essential attributes of a session. This rename will reduce the volume of a future patch to replaced these with a struct auth_session_info, with auth_serversupplied_info confined to the lower levels of the auth subsystem, and then eliminated. (The new structure will be the output of create_local_token(), and the change in struct definition will ensure that this is always run, populating local groups and privileges). Andrew Bartlett Signed-off-by: Stefan Metzmacher <metze@samba.org>
177 lines
4.5 KiB
C
177 lines
4.5 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
FAKE FILE suppport, for faking up special files windows want access to
|
|
Copyright (C) Stefan (metze) Metzmacher 2003
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
#include "fake_file.h"
|
|
|
|
struct fake_file_type {
|
|
const char *name;
|
|
enum FAKE_FILE_TYPE type;
|
|
void *(*init_pd)(TALLOC_CTX *mem_ctx);
|
|
};
|
|
|
|
static const struct fake_file_type fake_files[] = {
|
|
#ifdef WITH_QUOTAS
|
|
{FAKE_FILE_NAME_QUOTA_UNIX, FAKE_FILE_TYPE_QUOTA, init_quota_handle},
|
|
#endif /* WITH_QUOTAS */
|
|
{NULL, FAKE_FILE_TYPE_NONE, NULL}
|
|
};
|
|
|
|
/****************************************************************************
|
|
Create a fake file handle
|
|
****************************************************************************/
|
|
|
|
static struct fake_file_handle *init_fake_file_handle(enum FAKE_FILE_TYPE type)
|
|
{
|
|
struct fake_file_handle *fh = NULL;
|
|
int i;
|
|
|
|
for (i=0; fake_files[i].name!=NULL; i++) {
|
|
if (fake_files[i].type==type) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (fake_files[i].name == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
DEBUG(5,("init_fake_file_handle: for [%s]\n",fake_files[i].name));
|
|
|
|
fh = talloc(NULL, struct fake_file_handle);
|
|
if (fh == NULL) {
|
|
DEBUG(0,("TALLOC_ZERO() failed.\n"));
|
|
return NULL;
|
|
}
|
|
|
|
fh->type = type;
|
|
|
|
if (fake_files[i].init_pd) {
|
|
fh->private_data = fake_files[i].init_pd(fh);
|
|
}
|
|
return fh;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Does this name match a fake filename ?
|
|
****************************************************************************/
|
|
|
|
enum FAKE_FILE_TYPE is_fake_file_path(const char *path)
|
|
{
|
|
int i;
|
|
|
|
if (!path) {
|
|
return FAKE_FILE_TYPE_NONE;
|
|
}
|
|
|
|
for (i=0;fake_files[i].name!=NULL;i++) {
|
|
if (strncmp(path,fake_files[i].name,strlen(fake_files[i].name))==0) {
|
|
DEBUG(5,("is_fake_file: [%s] is a fake file\n",path));
|
|
return fake_files[i].type;
|
|
}
|
|
}
|
|
|
|
return FAKE_FILE_TYPE_NONE;
|
|
}
|
|
|
|
enum FAKE_FILE_TYPE is_fake_file(const struct smb_filename *smb_fname)
|
|
{
|
|
char *fname = NULL;
|
|
NTSTATUS status;
|
|
enum FAKE_FILE_TYPE ret;
|
|
|
|
if (!smb_fname) {
|
|
return FAKE_FILE_TYPE_NONE;
|
|
}
|
|
|
|
status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
|
|
if (!NT_STATUS_IS_OK(status)) {
|
|
return FAKE_FILE_TYPE_NONE;
|
|
}
|
|
|
|
ret = is_fake_file_path(fname);
|
|
|
|
TALLOC_FREE(fname);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
Open a fake quota file with a share mode.
|
|
****************************************************************************/
|
|
|
|
NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
|
|
uint16_t current_vuid,
|
|
enum FAKE_FILE_TYPE fake_file_type,
|
|
const struct smb_filename *smb_fname,
|
|
uint32 access_mask,
|
|
files_struct **result)
|
|
{
|
|
files_struct *fsp = NULL;
|
|
NTSTATUS status;
|
|
|
|
/* access check */
|
|
if (geteuid() != sec_initial_uid()) {
|
|
DEBUG(3, ("open_fake_file_shared: access_denied to "
|
|
"service[%s] file[%s] user[%s]\n",
|
|
lp_servicename(SNUM(conn)),
|
|
smb_fname_str_dbg(smb_fname),
|
|
conn->session_info->unix_name));
|
|
return NT_STATUS_ACCESS_DENIED;
|
|
|
|
}
|
|
|
|
status = file_new(req, conn, &fsp);
|
|
if(!NT_STATUS_IS_OK(status)) {
|
|
return status;
|
|
}
|
|
|
|
DEBUG(5,("open_fake_file_shared: fname = %s, FID = %d, access_mask = 0x%x\n",
|
|
smb_fname_str_dbg(smb_fname), fsp->fnum,
|
|
(unsigned int)access_mask));
|
|
|
|
fsp->conn = conn;
|
|
fsp->fh->fd = -1;
|
|
fsp->vuid = current_vuid;
|
|
fsp->fh->pos = -1;
|
|
fsp->can_lock = False; /* Should this be true ? - No, JRA */
|
|
fsp->access_mask = access_mask;
|
|
status = fsp_set_smb_fname(fsp, smb_fname);
|
|
if (!NT_STATUS_IS_OK(status)) {
|
|
file_free(req, fsp);
|
|
return NT_STATUS_NO_MEMORY;
|
|
}
|
|
|
|
fsp->fake_file_handle = init_fake_file_handle(fake_file_type);
|
|
|
|
if (fsp->fake_file_handle==NULL) {
|
|
file_free(req, fsp);
|
|
return NT_STATUS_NO_MEMORY;
|
|
}
|
|
|
|
*result = fsp;
|
|
return NT_STATUS_OK;
|
|
}
|
|
|
|
NTSTATUS close_fake_file(struct smb_request *req, files_struct *fsp)
|
|
{
|
|
file_free(req, fsp);
|
|
return NT_STATUS_OK;
|
|
}
|