mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
7f237bde21
The actual design change is relitivly small however: It all goes back to jerry's 'BOOL store', added to many of the elements in a SAM_ACCOUNT. This ensured that smb.conf defaults did not get 'fixed' into ldap. This was a great win for admins, and this patch follows in the same way. This patch extends the concept - we don't store values back into LDAP unless they have been changed. So if we read a value, but don't update it, or we read a value, find it's not there and use a default, we will not update ldap with that value. This reduced clutter in our LDAP DB, and makes it easier to change defaults later on. Metze's particular problem was that when we 'write back' an unchanged value, we would clear any muliple values in that feild. Now he can still have his mulitivalued 'uid' feild, without Samba changing it for *every* other operation. This also applies to many other attributes, and helps to eliminate a nasty race condition. (Time between get and set) This patch is big, and needs more testing, but metze has tested usrmgr, and I've fixed some pdbedit bugs, and tested domain joins, so it isn't compleatly flawed ;-). The same system will be introduced into the SAM code shortly, but this fixes bugs that people were coming across in production uses of Samba 3.0/HEAD, hence it's inclusion here. Andrew Bartlett
105 lines
2.7 KiB
C
105 lines
2.7 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
SAM_ACCOUNT access routines
|
|
Copyright (C) Jeremy Allison 1996-2001
|
|
Copyright (C) Luke Kenneth Casson Leighton 1996-1998
|
|
Copyright (C) Gerald (Jerry) Carter 2000-2001
|
|
Copyright (C) Andrew Bartlett 2001-2002
|
|
Copyright (C) Stefan (metze) Metzmacher 2002
|
|
|
|
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"
|
|
|
|
#undef DBGC_CLASS
|
|
#define DBGC_CLASS DBGC_PASSDB
|
|
|
|
uint32 pdb_get_user_rid (const SAM_ACCOUNT *sampass)
|
|
{
|
|
uint32 u_rid;
|
|
|
|
if (sampass)
|
|
if (sid_peek_check_rid(get_global_sam_sid(), pdb_get_user_sid(sampass),&u_rid))
|
|
return u_rid;
|
|
|
|
return (0);
|
|
}
|
|
|
|
uint32 pdb_get_group_rid (const SAM_ACCOUNT *sampass)
|
|
{
|
|
uint32 g_rid;
|
|
|
|
if (sampass)
|
|
if (sid_peek_check_rid(get_global_sam_sid(), pdb_get_group_sid(sampass),&g_rid))
|
|
return g_rid;
|
|
return (0);
|
|
}
|
|
|
|
BOOL pdb_set_user_sid_from_rid (SAM_ACCOUNT *sampass, uint32 rid, enum pdb_value_state flag)
|
|
{
|
|
DOM_SID u_sid;
|
|
const DOM_SID *global_sam_sid;
|
|
|
|
if (!sampass)
|
|
return False;
|
|
|
|
if (!(global_sam_sid = get_global_sam_sid())) {
|
|
DEBUG(1, ("pdb_set_user_sid_from_rid: Could not read global sam sid!\n"));
|
|
return False;
|
|
}
|
|
|
|
sid_copy(&u_sid, global_sam_sid);
|
|
|
|
if (!sid_append_rid(&u_sid, rid))
|
|
return False;
|
|
|
|
if (!pdb_set_user_sid(sampass, &u_sid, flag))
|
|
return False;
|
|
|
|
DEBUG(10, ("pdb_set_user_sid_from_rid:\n\tsetting user sid %s from rid %d\n",
|
|
sid_string_static(&u_sid),rid));
|
|
|
|
return True;
|
|
}
|
|
|
|
BOOL pdb_set_group_sid_from_rid (SAM_ACCOUNT *sampass, uint32 grid, enum pdb_value_state flag)
|
|
{
|
|
DOM_SID g_sid;
|
|
const DOM_SID *global_sam_sid;
|
|
|
|
if (!sampass)
|
|
return False;
|
|
|
|
if (!(global_sam_sid = get_global_sam_sid())) {
|
|
DEBUG(1, ("pdb_set_user_sid_from_rid: Could not read global sam sid!\n"));
|
|
return False;
|
|
}
|
|
|
|
sid_copy(&g_sid, global_sam_sid);
|
|
|
|
if (!sid_append_rid(&g_sid, grid))
|
|
return False;
|
|
|
|
if (!pdb_set_group_sid(sampass, &g_sid, flag))
|
|
return False;
|
|
|
|
DEBUG(10, ("pdb_set_group_sid_from_rid:\n\tsetting group sid %s from rid %d\n",
|
|
sid_string_static(&g_sid), grid));
|
|
|
|
return True;
|
|
}
|
|
|