1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +03:00

r4151: added privilege attribute handling on samdb.

pvfs will now honor some privileges on ACLs, and it will be quite easy
to add the checks for more privileges in the necessary places, by
making calls to sec_privilege_check().
(This used to be commit 3549039d0fbc54f87ae679e7288b82b28713e487)
This commit is contained in:
Andrew Tridgell 2004-12-11 13:19:41 +00:00 committed by Gerald (Jerry) Carter
parent 02a9aa0892
commit adbdb055ee
5 changed files with 136 additions and 5 deletions

View File

@ -353,6 +353,7 @@ NTSTATUS create_security_token(TALLOC_CTX *mem_ctx,
{
struct security_token *ptoken;
int i;
NTSTATUS status;
ptoken = security_token_initialise(mem_ctx);
if (ptoken == NULL) {
@ -397,6 +398,13 @@ NTSTATUS create_security_token(TALLOC_CTX *mem_ctx,
ptoken->sids[ptoken->num_sids++] = groupSIDs[i];
}
}
/* setup the privilege mask for this token */
status = samdb_privilege_setup(ptoken);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(ptoken);
return status;
}
debug_security_token(DBGC_AUTH, 10, ptoken);

View File

@ -6,6 +6,7 @@
INIT_OBJ_FILES = \
dsdb/samdb/samdb.o
ADD_OBJ_FILES = \
dsdb/samdb/samdb_privilege.o \
dsdb/common/flag_mapping.o
REQUIRED_SUBSYSTEMS = \
DCERPC_COMMON \

View File

@ -0,0 +1,107 @@
/*
Unix SMB/CIFS implementation.
manipulate privilege records in samdb
Copyright (C) Andrew Tridgell 2004
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 2 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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "includes.h"
#include "librpc/gen_ndr/ndr_security.h"
#include "lib/ldb/include/ldb.h"
/*
add privilege bits for one sid to a security_token
*/
static NTSTATUS samdb_privilege_setup_sid(void *samctx, TALLOC_CTX *mem_ctx,
const struct dom_sid *sid,
uint64_t *mask)
{
char *sidstr;
const char * const attrs[] = { "privilege", NULL };
struct ldb_message **res = NULL;
struct ldb_message_element *el;
int ret, i;
*mask = 0;
sidstr = dom_sid_string(mem_ctx, sid);
if (sidstr == NULL) {
return NT_STATUS_NO_MEMORY;
}
ret = samdb_search(samctx, mem_ctx, NULL, &res, attrs, "objectSid=%s", sidstr);
if (ret != 1) {
talloc_free(sidstr);
/* not an error to not match */
return NT_STATUS_OK;
}
el = ldb_msg_find_element(res[0], "privilege");
if (el == NULL) {
talloc_free(sidstr);
return NT_STATUS_OK;
}
for (i=0;i<el->num_values;i++) {
const char *priv_str = el->values[i].data;
int privilege = sec_privilege_id(priv_str);
if (privilege == -1) {
DEBUG(1,("Unknown privilege '%s' in samdb\n",
priv_str));
continue;
}
*mask |= sec_privilege_mask(privilege);
}
return NT_STATUS_OK;
}
/*
setup the privilege mask for this security token based on our
local SAM
*/
NTSTATUS samdb_privilege_setup(struct security_token *token)
{
void *samctx;
TALLOC_CTX *mem_ctx = talloc(token, 0);
int i;
NTSTATUS status;
samctx = samdb_connect(mem_ctx);
if (samctx == NULL) {
talloc_free(mem_ctx);
return NT_STATUS_INTERNAL_DB_CORRUPTION;
}
token->privilege_mask = 0;
for (i=0;i<token->num_sids;i++) {
uint64_t mask;
status = samdb_privilege_setup_sid(samctx, mem_ctx,
token->sids[i], &mask);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(mem_ctx);
return status;
}
token->privilege_mask |= mask;
}
talloc_free(mem_ctx);
return NT_STATUS_OK;
}

View File

@ -716,6 +716,13 @@ static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security
= dom_sid_add_rid(session_info, sid,
logon_info->groups[ptoken->num_sids - 2].rid);
}
/* setup any privileges for this token */
nt_status = samdb_privilege_setup(ptoken);
if (!NT_STATUS_IS_OK(nt_status)) {
talloc_free(ptoken);
return nt_status;
}
debug_security_token(DBGC_AUTH, 0, ptoken);

View File

@ -84,13 +84,23 @@ int sec_privilege_id(const char *name)
}
/*
return a privilege mask given a privilege id
*/
uint64_t sec_privilege_mask(unsigned int privilege)
{
uint64_t mask = 1;
mask <<= (privilege-1);
return mask;
}
/*
return True if a security_token has a particular privilege bit set
*/
BOOL sec_privilege_check(const struct security_token *token, unsigned int privilege)
{
uint64_t mask = 1;
mask <<= (privilege-1);
uint64_t mask = sec_privilege_mask(privilege);
if (token->privilege_mask & mask) {
return True;
}
@ -102,7 +112,5 @@ BOOL sec_privilege_check(const struct security_token *token, unsigned int privil
*/
void sec_privilege_set(struct security_token *token, unsigned int privilege)
{
uint64_t mask = 1;
mask <<= (privilege-1);
token->privilege_mask |= mask;
token->privilege_mask |= sec_privilege_mask(privilege);
}