1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-27 03:21:53 +03:00

Moving to abstract API interface (sys_get_acl() etc.) to allow system

specific ACL calls to be dealt with elsewhere. This file will eventually
be able to replace the old UNIX acl interface.
Jeremy.
This commit is contained in:
Jeremy Allison 0001-01-01 00:00:00 +00:00
parent fe730614d7
commit b27cac7762

View File

@ -25,8 +25,8 @@
typedef struct canon_ace {
struct canon_ace *next, *prev;
acl_tag_t type;
acl_perm_t perms;
SMB_ACL_TAG_T type;
SMB_ACL_PERM_T perms;
DOM_SID sid;
} canon_ace;
@ -51,9 +51,9 @@ static SEC_ACCESS map_canon_ace_perms(int *pacl_type, DOM_SID *powner_sid, canon
*pacl_type = SEC_ACE_TYPE_ACCESS_ALLOWED;
if((ace->perms & (ACL_READ|ACL_WRITE|ACL_EXECUTE)) == (ACL_READ|ACL_WRITE|ACL_EXECUTE)) {
if((ace->perms & (SMB_ACL_READ|SMB_ACL_WRITE|SMB_ACL_EXECUTE)) == (SMB_ACL_READ|SMB_ACL_WRITE|SMB_ACL_EXECUTE)) {
nt_mask = UNIX_ACCESS_RWX;
} else if((ace->perms & (ACL_READ|ACL_WRITE|ACL_EXECUTE)) == 0) {
} else if((ace->perms & (SMB_ACL_READ|SMB_ACL_WRITE|SMB_ACL_EXECUTE)) == 0) {
/*
* Here we differentiate between the owner and any other user.
*/
@ -65,9 +65,9 @@ static SEC_ACCESS map_canon_ace_perms(int *pacl_type, DOM_SID *powner_sid, canon
*pacl_type = SEC_ACE_TYPE_ACCESS_DENIED;
}
} else {
nt_mask |= (perm & ACL_READ) ? UNIX_ACCESS_R : 0;
nt_mask |= (perm & ACL_WRITE) ? UNIX_ACCESS_W : 0;
nt_mask |= (perm & ACL_EXECUTE) ? UNIX_ACCESS_X : 0;
nt_mask |= (perm & SMB_ACL_READ) ? UNIX_ACCESS_R : 0;
nt_mask |= (perm & SMB_ACL_WRITE) ? UNIX_ACCESS_W : 0;
nt_mask |= (perm & SMB_ACL_EXECUTE) ? UNIX_ACCESS_X : 0;
}
init_sec_access(&sa,nt_mask);
return sa;
@ -309,13 +309,13 @@ static BOOL unpack_nt_permissions(SMB_STRUCT_STAT *psbuf, uid_t *puser, gid_t *p
Map generic UNIX permissions to POSIX ACL perms.
****************************************************************************/
static acl_perm_t unix_perms_to_acl_perms(mode_t mode, int r_mask, int w_mask, int x_mask)
static SMB_ACL_PERM_T unix_perms_to_acl_perms(mode_t mode, int r_mask, int w_mask, int x_mask)
{
acl_perm_t ret = 0;
ret |= (mode & r_mask) ? ACL_READ : 0;
ret |= (mode & w_mask) ? ACL_WRITE : 0;
ret |= (mode & x_mask) ? ACL_EXECUTE : 0;
ret |= (mode & r_mask) ? SMB_ACL_READ : 0;
ret |= (mode & w_mask) ? SMB_ACL_WRITE : 0;
ret |= (mode & x_mask) ? SMB_ACL_EXECUTE : 0;
return ret;
}
@ -382,13 +382,13 @@ static canon_ace *unix_canonicalise_acl(files_struct *fsp, SMB_STRUCT_STAT *psbu
acl_perm_t perms;
DOM_SID sid;
owner_ace->type = ACL_USER_OBJ;
owner_ace->type = SMB_ACL_USER_OBJ;
owner_ace->sid = *powner;
group_ace->type = ACL_GROUP_OBJ;
group_ace->type = SMB_ACL_GROUP_OBJ;
group_ace->sid = *pgroup;
other_ace->type = ACL_OTHER_OBJ;
other_ace->type = SMB_ACL_OTHER_OBJ;
other_ace->sid = global_sid_World;
if (!fsp->is_directory) {
@ -426,21 +426,21 @@ static canon_ace *unix_canonicalise_acl(files_struct *fsp, SMB_STRUCT_STAT *psbu
static canon_ace *canonicalise_acl( acl_t posix_acl, SMB_STRUCT_STAT *psbuf)
{
extern DOM_SID global_sid_World;
acl_permset_t acl_mask = (ACL_READ|ACL_WRITE|ACL_EXECUTE);
SMB_ACL_PERMSET_T acl_mask = (ACL_READ|ACL_WRITE|ACL_EXECUTE);
canon_ace *list_head = NULL;
canon_ace *ace = NULL;
canon_ace *next_ace = NULL;
int entry_id = ACL_FIRST_ENTRY;
acl_entry_t entry;
int entry_id = SMB_ACL_FIRST_ENTRY;
SMB_ACL_ENTRY_T entry;
while ( acl_get_entry(posix_acl, entry_id, &entry) == 1) {
acl_tag_t tagtype;
acl_permset_t permset;
while ( sys_acl_get_entry(posix_acl, entry_id, &entry) == 1) {
SMB_ACL_TAG_T tagtype;
SMB_ACL_PERMSET_T permset;
DOM_SID sid;
/* get_next... */
if (entry_id == ACL_FIRST_ENTRY)
entry_id = ACL_NEXT_ENTRY;
if (entry_id == SMB_ACL_FIRST_ENTRY)
entry_id = SMB_ACL_NEXT_ENTRY;
/* Is this a MASK entry ? */
if (acl_get_tag_type(entry, &tagtype) == -1)
@ -451,13 +451,13 @@ static canon_ace *canonicalise_acl( acl_t posix_acl, SMB_STRUCT_STAT *psbuf)
/* Decide which SID to use based on the ACL type. */
switch(tagtype) {
ACL_USER_OBJ:
SMB_ACL_USER_OBJ:
/* Get the SID from the owner. */
uid_to_sid( &sid, psbuf->st_uid );
break;
ACL_USER:
SMB_ACL_USER:
{
uid_t *puid = (uid_t *)acl_get_qualifier(entry);
uid_t *puid = (uid_t *)sys_acl_get_qualifier(entry);
if (puid == NULL) {
DEBUG(0,("canonicalise_acl: Failed to get uid.\n"));
continue;
@ -465,13 +465,13 @@ static canon_ace *canonicalise_acl( acl_t posix_acl, SMB_STRUCT_STAT *psbuf)
uid_to_sid( &sid, *puid);
break;
}
ACL_GROUP_OBJ:
SMB_ACL_GROUP_OBJ:
/* Get the SID from the owning group. */
gid_to_sid( &sid, psbuf->st_gid );
break;
ACL_GROUP:
SMB_ACL_GROUP:
{
gid_t *pgid = (gid_t *)acl_get_qualifier(entry);
gid_t *pgid = (gid_t *)sys_acl_get_qualifier(entry);
if (pgid == NULL) {
DEBUG(0,("canonicalise_acl: Failed to get gid.\n"));
continue;
@ -479,10 +479,10 @@ static canon_ace *canonicalise_acl( acl_t posix_acl, SMB_STRUCT_STAT *psbuf)
gid_to_sid( &sid, *pgid);
break;
}
ACL_MASK:
SMB_ACL_MASK:
acl_mask = permset;
continue; /* Don't count the mask as an entry. */
ACL_OTHER_OBJ:
SMB_ACL_OTHER_OBJ:
/* Use the Everyone SID */
sid = global_sid_World;
break;
@ -521,13 +521,13 @@ static canon_ace *canonicalise_acl( acl_t posix_acl, SMB_STRUCT_STAT *psbuf)
if (ace->perms == 0) {
switch (ace->type) {
ACL_USER_OBJ:
ACL_GROUP_OBJ:
ACL_OTHER_OBJ:
SMB_ACL_USER_OBJ:
SMB_ACL_GROUP_OBJ:
SMB_ACL_OTHER_OBJ:
DLIST_REMOVE(list_head, ace);
break;
ACL_USER:
ACL_GROUP:
SMB_ACL_USER:
SMB_ACL_GROUP:
DLIST_PROMOTE(list_head, ace);
break;
}
@ -562,8 +562,8 @@ size_t get_nt_acl(files_struct *fsp, SEC_DESC **ppdesc)
size_t num_acls = 0;
size_t num_dir_acls = 0;
size_t num_aces = 0;
acl_t posix_acl = NULL;
acl_t dir_acl = NULL;
SMB_ACL_T posix_acl = NULL;
SMB_ACL_T dir_acl = NULL;
canon_ace *file_ace = NULL;
canon_ace *dir_ace = NULL;
@ -579,14 +579,14 @@ size_t get_nt_acl(files_struct *fsp, SEC_DESC **ppdesc)
* Get the ACL from the path.
*/
posix_acl = acl_get_file( dos_to_unix(fsp->fsp_name, False), ACL_TYPE_ACCESS);
posix_acl = sys_acl_get_file( dos_to_unix(fsp->fsp_name, False), SMB_ACL_TYPE_ACCESS);
/*
* If it's a directory get the default POSIX ACL.
*/
if(fsp->is_directory)
dir_acl = acl_get_file( dos_to_unix(fsp->fsp_name, False), ACL_TYPE_DEFAULT);
dir_acl = sys_acl_get_file( dos_to_unix(fsp->fsp_name, False), SMB_ACL_TYPE_DEFAULT);
} else {
@ -597,7 +597,7 @@ size_t get_nt_acl(files_struct *fsp, SEC_DESC **ppdesc)
/*
* Get the ACL from the fd.
*/
posix_acl = acl_get_fd(fsp->fd);
posix_acl = sys_acl_get_fd(fsp->fd);
}
/*
@ -672,9 +672,9 @@ size_t get_nt_acl(files_struct *fsp, SEC_DESC **ppdesc)
done:
if (posix_acl)
acl_free(posix_acl);
sys_acl_free(posix_acl);
if (directory_acl)
acl_free(directory_acl);
sys_acl_free(directory_acl);
if (file_ace)
free_canon_ace_list(file_ace);
if (dir_ace)