diff options
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/util_seaccess.c | 114 |
1 files changed, 32 insertions, 82 deletions
diff --git a/source3/lib/util_seaccess.c b/source3/lib/util_seaccess.c index 52696d2d30..28e8a43c4e 100644 --- a/source3/lib/util_seaccess.c +++ b/source3/lib/util_seaccess.c @@ -3,6 +3,7 @@ Version 2.0 Copyright (C) Luke Kenneth Casson Leighton 1996-2000. Copyright (C) Tim Potter 2000. + Copyright (C) Jeremy Allison 2000. 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 @@ -25,6 +26,22 @@ extern int DEBUGLEVEL; +/* + * Guest token used when there is no NT_USER_TOKEN available. + */ + +static DOM_SID builtin_guest = { + 1, /* sid_rev_num */ + 2, /* num_auths */ + { 0, 0, 0, 0, 0, 5}, /* id_auth[6] */ + { 32, 546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* sub_auth[15] */ +}; + +static NT_USER_TOKEN guest_token = { + 1, + &builtin_guest +}; + /* Process an access allowed ACE */ static BOOL ace_grant(uint32 mask, uint32 *acc_desired, uint32 *acc_granted) @@ -207,14 +224,11 @@ static BOOL check_ace(SEC_ACE *ace, BOOL is_owner, DOM_SID *sid, BOOL se_access_check(SEC_DESC *sd, struct current_user *user, uint32 acc_desired, uint32 *acc_granted, uint32 *status) { - DOM_SID user_sid, group_sid; - DOM_SID owner_sid; - DOM_SID **group_sids = NULL; int i, j; - uint ngroup_sids = 0; SEC_ACL *acl; uint8 check_ace_type; fstring sid_str; + NT_USER_TOKEN *token = user->nt_user_token ? user->nt_user_token : &guest_token; if (!status || !acc_granted) return False; @@ -250,70 +264,21 @@ BOOL se_access_check(SEC_DESC *sd, struct current_user *user, goto done; } - /* Create user sid */ + /* The user sid is the first in the token */ - if (!uid_to_sid(&user_sid, user->uid)) { - DEBUG(3, ("could not lookup sid for uid %d\n", user->uid)); - goto done; - } - - DEBUG(3, ("se_access_check: user sid is %s\n", sid_to_string(sid_str, &user_sid) )); + DEBUG(3, ("se_access_check: user sid is %s\n", sid_to_string(sid_str, &token->user_sids[0]) )); /* If we're the owner, then we can do anything */ - if (sid_equal(&user_sid, sd->owner_sid)) { + if (sid_equal(&token->user_sids[0], sd->owner_sid)) { *status = NT_STATUS_NOPROBLEMO; *acc_granted = acc_desired; acc_desired = 0; DEBUG(3, ("is owner, access allowed\n")); - - goto done; - } - - /* Create group sid */ - - if (!gid_to_sid(&group_sid, user->gid)) { - DEBUG(3, ("could not lookup sid for gid %d\n", user->gid)); goto done; } - sid_to_string(sid_str, &group_sid); - DEBUG(3, ("group sid is %s\n", sid_str)); - - /* Create array of group sids */ - - add_sid_to_array(&ngroup_sids, &group_sids, &group_sid); - - for (i = 0; i < user->ngroups; i++) { - if (user->groups[i] != user->gid) { - if (gid_to_sid(&group_sid, user->groups[i])) { - - /* If we're a group member then we can also - do anything */ - - if (sid_equal(&group_sid, sd->grp_sid)) { - *status = NT_STATUS_NOPROBLEMO; - *acc_granted = acc_desired; - acc_desired = 0; - DEBUG(3, ("is group member " - "access allowed\n")); - - goto done; - } - - add_sid_to_array(&ngroup_sids, &group_sids, - &group_sid); - } else { - DEBUG(3, ("could not lookup sid for gid %d\n", - user->gid)); - } - - sid_to_string(sid_str, &group_sid); - DEBUG(3, ("supplementary group %s\n", sid_str)); - } - } - - /* ACL must have something in it */ + /* ACL must have something in it */ acl = sd->dacl; @@ -340,34 +305,21 @@ BOOL se_access_check(SEC_DESC *sd, struct current_user *user, check_ace_type = SEC_ACE_TYPE_ACCESS_DENIED; - check_aces: - - for (i = 0; i < acl->num_aces; i++) { - SEC_ACE *ace = &acl->ace[i]; - BOOL is_group_owner; - - /* Check user sid */ - - if (ace->type == check_ace_type && - check_ace(ace, False, &user_sid, &acc_desired, - acc_granted, status)) { - goto done; - } + check_aces: - /* Check group sids */ + for (i = 0; i < acl->num_aces; i++) { + SEC_ACE *ace = &acl->ace[i]; - for (j = 0; j < ngroup_sids; j++) { + /* Check sids */ - is_group_owner = sd->grp_sid ? - sid_equal(group_sids[j], sd->grp_sid) : False; + for (j = 0; j < token->num_sids; j++) { + BOOL is_owner = sid_equal(&token->user_sids[j], sd->owner_sid); - if (ace->type == check_ace_type && - check_ace(ace, is_group_owner, group_sids[j], - &acc_desired, acc_granted, status)) { + if (ace->type == check_ace_type && check_ace(ace, is_owner, &token->user_sids[j], &acc_desired, acc_granted, status)) { goto done; - } - } - } + } + } + } /* Check access allowed ACEs */ @@ -378,8 +330,6 @@ BOOL se_access_check(SEC_DESC *sd, struct current_user *user, done: - free_sid_array(ngroup_sids, group_sids); - /* If any access desired bits are still on, return access denied and turn off any bits already granted. */ |