mirror of
https://github.com/samba-team/samba.git
synced 2025-02-21 01:59:07 +03:00
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 (This used to be commit 7f237bde212eb188df84a5d8adb598a93fba8155)
116 lines
3.5 KiB
C
116 lines
3.5 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
passdb structures and parameters
|
|
Copyright (C) Gerald Carter 2001
|
|
Copyright (C) Luke Kenneth Casson Leighton 1998 - 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
|
|
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.
|
|
*/
|
|
|
|
#ifndef _PASSDB_H
|
|
#define _PASSDB_H
|
|
|
|
|
|
/*****************************************************************
|
|
Functions to be implemented by the new (v2) passdb API
|
|
****************************************************************/
|
|
|
|
/*
|
|
* This next constant specifies the version number of the PASSDB interface
|
|
* this SAMBA will load. Increment this if *ANY* changes are made to the interface.
|
|
*/
|
|
|
|
#define PASSDB_INTERFACE_VERSION 3
|
|
|
|
/* use this inside a passdb module */
|
|
#define PDB_MODULE_VERSIONING_MAGIC \
|
|
int pdb_version(void)\
|
|
{\
|
|
return PASSDB_INTERFACE_VERSION;\
|
|
}
|
|
|
|
typedef struct pdb_context
|
|
{
|
|
struct pdb_methods *pdb_methods;
|
|
struct pdb_methods *pwent_methods;
|
|
|
|
/* These functions are wrappers for the functions listed above.
|
|
They may do extra things like re-reading a SAM_ACCOUNT on update */
|
|
|
|
NTSTATUS (*pdb_setsampwent)(struct pdb_context *, BOOL update);
|
|
|
|
void (*pdb_endsampwent)(struct pdb_context *);
|
|
|
|
NTSTATUS (*pdb_getsampwent)(struct pdb_context *, SAM_ACCOUNT *user);
|
|
|
|
NTSTATUS (*pdb_getsampwnam)(struct pdb_context *, SAM_ACCOUNT *sam_acct, const char *username);
|
|
|
|
NTSTATUS (*pdb_getsampwsid)(struct pdb_context *, SAM_ACCOUNT *sam_acct, const DOM_SID *sid);
|
|
|
|
NTSTATUS (*pdb_add_sam_account)(struct pdb_context *, SAM_ACCOUNT *sampass);
|
|
|
|
NTSTATUS (*pdb_update_sam_account)(struct pdb_context *, SAM_ACCOUNT *sampass);
|
|
|
|
NTSTATUS (*pdb_delete_sam_account)(struct pdb_context *, SAM_ACCOUNT *username);
|
|
|
|
void (*free_fn)(struct pdb_context **);
|
|
|
|
TALLOC_CTX *mem_ctx;
|
|
|
|
} PDB_CONTEXT;
|
|
|
|
typedef struct pdb_methods
|
|
{
|
|
const char *name; /* What name got this module */
|
|
struct pdb_context *parent;
|
|
|
|
/* Use macros from dlinklist.h on these two */
|
|
struct pdb_methods *next;
|
|
struct pdb_methods *prev;
|
|
|
|
NTSTATUS (*setsampwent)(struct pdb_methods *, BOOL update);
|
|
|
|
void (*endsampwent)(struct pdb_methods *);
|
|
|
|
NTSTATUS (*getsampwent)(struct pdb_methods *, SAM_ACCOUNT *user);
|
|
|
|
NTSTATUS (*getsampwnam)(struct pdb_methods *, SAM_ACCOUNT *sam_acct, const char *username);
|
|
|
|
NTSTATUS (*getsampwsid)(struct pdb_methods *, SAM_ACCOUNT *sam_acct, const DOM_SID *Sid);
|
|
|
|
NTSTATUS (*add_sam_account)(struct pdb_methods *, SAM_ACCOUNT *sampass);
|
|
|
|
NTSTATUS (*update_sam_account)(struct pdb_methods *, SAM_ACCOUNT *sampass);
|
|
|
|
NTSTATUS (*delete_sam_account)(struct pdb_methods *, SAM_ACCOUNT *username);
|
|
|
|
void *private_data; /* Private data of some kind */
|
|
|
|
void (*free_private_data)(void **);
|
|
|
|
} PDB_METHODS;
|
|
|
|
typedef NTSTATUS (*pdb_init_function)(struct pdb_context *,
|
|
struct pdb_methods **,
|
|
const char *);
|
|
|
|
struct pdb_init_function_entry {
|
|
char *name;
|
|
/* Function to create a member of the pdb_methods list */
|
|
pdb_init_function init;
|
|
};
|
|
|
|
#endif /* _PASSDB_H */
|