2002-08-28 04:54:43 +00:00
/*
Unix SMB / CIFS implementation .
SAM structures
Copyright ( C ) Kai Krueger 2002
Copyright ( C ) Stefan ( metze ) Metzmacher 2002
Copyright ( C ) Simo Sorce 2002
Copyright ( C ) Andrew Bartlett 2002
Copyright ( C ) Jelmer Vernooij 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 0213 9 , USA .
*/
# ifndef _SAM_H
# define _SAM_H
2002-09-06 12:57:12 +00:00
/* We want to track down bugs early */
# if 1
# define SAM_ASSERT(x) SMB_ASSERT(x)
# else
# define SAM_ASSERT(x) while (0) { \
2002-09-06 13:00:37 +00:00
if ( ! ( x ) ) {
DEBUG ( 0 , ( " SAM_ASSERT failed! \n " ) )
return NT_STATUS_FAIL_CHECK ; \
} \
}
2002-09-06 12:57:12 +00:00
# endif
/* let it be 0 until we have a stable interface --metze */
# define SAM_INTERFACE_VERSION 0
2002-08-28 04:54:43 +00:00
/* use this inside a passdb module */
# define SAM_MODULE_VERSIONING_MAGIC \
int sam_version ( void ) \
{ \
return SAM_INTERFACE_VERSION ; \
}
2002-09-19 15:39:00 +00:00
/* Backend to use by default when no backend was specified */
# define SAM_DEFAULT_BACKEND "plugin"
2002-08-29 07:19:05 +00:00
typedef struct sam_domain_handle {
TALLOC_CTX * mem_ctx ;
uint32 access_granted ;
2002-09-15 16:35:44 +00:00
const struct sam_methods * current_sam_methods ; /* sam_methods creating this handle */
2002-08-29 07:19:05 +00:00
void ( * free_fn ) ( struct sam_domain_handle * * ) ;
struct domain_data {
DOM_SID sid ; /*SID of the domain. Should not be changed */
char * name ; /* Name of the domain */
char * servername ; /* */
NTTIME max_passwordage ; /* time till next password expiration */
NTTIME min_passwordage ; /* time till password can be changed again */
NTTIME lockout_duration ; /* time till login is allowed again after lockout*/
NTTIME reset_count ; /* time till bad login counter is reset */
uint16 min_passwordlength ; /* minimum number of characters for a password */
uint16 password_history ; /* number of passwords stored in history */
uint16 lockout_count ; /* number of bad login attempts before lockout */
BOOL force_logoff ; /* force logoff after logon hours have expired */
BOOL login_pwdchange ; /* Users need to logon to change their password */
uint32 num_accounts ; /* number of accounts in the domain */
uint32 num_groups ; /* number of global groups */
uint32 num_aliases ; /* number of local groups */
2002-10-03 03:20:40 +00:00
uint32 sam_sequence_number ; /* global sequence number */
2002-08-29 07:19:05 +00:00
} private ;
2002-08-28 04:54:43 +00:00
} SAM_DOMAIN_HANDLE ;
2002-08-29 07:19:05 +00:00
typedef struct sam_account_handle {
TALLOC_CTX * mem_ctx ;
uint32 access_granted ;
2002-09-15 16:35:44 +00:00
const struct sam_methods * current_sam_methods ; /* sam_methods creating this handle */
2002-08-29 07:19:05 +00:00
void ( * free_fn ) ( struct sam_account_handle * * ) ;
struct sam_account_data {
uint32 init_flag ;
NTTIME logon_time ; /* logon time */
NTTIME logoff_time ; /* logoff time */
NTTIME kickoff_time ; /* kickoff time */
NTTIME pass_last_set_time ; /* password last set time */
NTTIME pass_can_change_time ; /* password can change time */
NTTIME pass_must_change_time ; /* password must change time */
char * account_name ; /* account_name string */
SAM_DOMAIN_HANDLE * domain ; /* domain of account */
char * full_name ; /* account's full name string */
char * unix_home_dir ; /* UNIX home directory string */
char * home_dir ; /* home directory string */
char * dir_drive ; /* home directory drive string */
char * logon_script ; /* logon script string */
char * profile_path ; /* profile path string */
char * acct_desc ; /* account description string */
char * workstations ; /* login from workstations string */
char * unknown_str ; /* don't know what this is, yet. */
char * munged_dial ; /* munged path name and dial-back tel number */
DOM_SID account_sid ; /* Primary Account SID */
DOM_SID group_sid ; /* Primary Group SID */
DATA_BLOB lm_pw ; /* .data is Null if no password */
DATA_BLOB nt_pw ; /* .data is Null if no password */
char * plaintext_pw ; /* if Null not available */
uint16 acct_ctrl ; /* account info (ACB_xxxx bit-mask) */
uint32 unknown_1 ; /* 0x00ff ffff */
uint16 logon_divs ; /* 168 - number of hours in a week */
uint32 hours_len ; /* normally 21 bytes */
uint8 hours [ MAX_HOURS_LEN ] ;
uint32 unknown_2 ; /* 0x0002 0000 */
uint32 unknown_3 ; /* 0x0000 04ec */
} private ;
} SAM_ACCOUNT_HANDLE ;
typedef struct sam_group_handle {
TALLOC_CTX * mem_ctx ;
uint32 access_granted ;
2002-09-15 16:35:44 +00:00
const struct sam_methods * current_sam_methods ; /* sam_methods creating this handle */
2002-08-29 07:19:05 +00:00
void ( * free_fn ) ( struct sam_group_handle * * ) ;
struct sam_group_data {
2002-09-06 12:57:12 +00:00
char * group_name ;
char * group_desc ;
2002-08-29 07:19:05 +00:00
DOM_SID sid ;
2002-09-06 12:57:12 +00:00
uint16 group_ctrl ; /* specifies if the group is a local group or a global group */
2002-08-29 07:19:05 +00:00
uint32 num_members ;
} private ;
2002-08-28 04:54:43 +00:00
} SAM_GROUP_HANDLE ;
typedef struct sam_group_member {
DOM_SID sid ;
2002-08-29 07:19:05 +00:00
BOOL group ; /* specifies if it is a group or a account */
2002-08-28 04:54:43 +00:00
} SAM_GROUP_MEMBER ;
2002-08-29 07:19:05 +00:00
typedef struct sam_account_enum {
2002-08-28 04:54:43 +00:00
DOM_SID sid ;
2002-08-29 07:19:05 +00:00
char * account_name ;
2002-08-28 04:54:43 +00:00
char * full_name ;
2002-08-29 07:19:05 +00:00
char * account_desc ;
2002-09-06 12:57:12 +00:00
uint16 acct_ctrl ;
2002-08-29 07:19:05 +00:00
} SAM_ACCOUNT_ENUM ;
2002-08-28 04:54:43 +00:00
typedef struct sam_group_enum {
DOM_SID sid ;
2002-09-06 12:57:12 +00:00
char * group_name ;
char * group_desc ;
uint16 group_ctrl ;
2002-08-28 04:54:43 +00:00
} SAM_GROUP_ENUM ;
2002-09-06 12:57:12 +00:00
/* bits for group_ctrl: to spezify if the group is global group or alias */
2002-09-25 09:40:45 +00:00
# define GCB_LOCAL_GROUP 0x0001
# define GCB_ALIAS_GROUP (GCB_LOCAL_GROUP |GCB_BUILTIN)
2002-09-06 12:57:12 +00:00
# define GCB_GLOBAL_GROUP 0x0002
2002-09-25 09:40:45 +00:00
# define GCB_BUILTIN 0x1000
2002-09-06 12:57:12 +00:00
2002-08-28 04:54:43 +00:00
typedef struct sam_context
{
struct sam_methods * methods ;
TALLOC_CTX * mem_ctx ;
void ( * free_fn ) ( struct sam_context * * ) ;
} SAM_CONTEXT ;
typedef struct sam_methods
{
2002-08-29 07:19:05 +00:00
struct sam_context * parent ;
struct sam_methods * next ;
struct sam_methods * prev ;
2002-08-28 04:54:43 +00:00
const char * backendname ;
2002-09-24 20:18:39 +00:00
const char * domain_name ;
DOM_SID domain_sid ;
2002-08-28 04:54:43 +00:00
void * private_data ;
/* General API */
2002-08-29 07:19:05 +00:00
NTSTATUS ( * sam_get_sec_desc ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , const DOM_SID * sid , SEC_DESC * * sd ) ;
NTSTATUS ( * sam_set_sec_desc ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , const DOM_SID * sid , const SEC_DESC * sd ) ;
2002-08-28 04:54:43 +00:00
2002-09-28 12:27:04 +00:00
NTSTATUS ( * sam_lookup_sid ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , TALLOC_CTX * mem_ctx , const DOM_SID * sid , char * * name , uint32 * type ) ;
NTSTATUS ( * sam_lookup_name ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , const char * name , DOM_SID * sid , uint32 * type ) ;
2002-08-28 04:54:43 +00:00
/* Domain API */
2002-08-29 07:19:05 +00:00
NTSTATUS ( * sam_update_domain ) ( const struct sam_methods * , const SAM_DOMAIN_HANDLE * domain ) ;
2002-09-06 12:57:12 +00:00
NTSTATUS ( * sam_get_domain_handle ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , uint32 access_desired , SAM_DOMAIN_HANDLE * * domain ) ;
2002-08-28 04:54:43 +00:00
2002-08-29 07:19:05 +00:00
/* Account API */
2002-08-28 04:54:43 +00:00
2002-09-28 14:41:12 +00:00
NTSTATUS ( * sam_create_account ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , uint32 access_desired , const char * account_name , uint16 acct_ctrl , SAM_ACCOUNT_HANDLE * * account ) ;
2002-08-29 07:19:05 +00:00
NTSTATUS ( * sam_add_account ) ( const struct sam_methods * , const SAM_ACCOUNT_HANDLE * account ) ;
NTSTATUS ( * sam_update_account ) ( const struct sam_methods * , const SAM_ACCOUNT_HANDLE * account ) ;
NTSTATUS ( * sam_delete_account ) ( const struct sam_methods * , const SAM_ACCOUNT_HANDLE * account ) ;
2002-09-06 12:57:12 +00:00
NTSTATUS ( * sam_enum_accounts ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , uint16 acct_ctrl , uint32 * account_count , SAM_ACCOUNT_ENUM * * accounts ) ;
2002-08-28 04:54:43 +00:00
2002-09-06 12:57:12 +00:00
NTSTATUS ( * sam_get_account_by_sid ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , uint32 access_desired , const DOM_SID * accountsid , SAM_ACCOUNT_HANDLE * * account ) ;
NTSTATUS ( * sam_get_account_by_name ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , uint32 access_desired , const char * name , SAM_ACCOUNT_HANDLE * * account ) ;
2002-08-28 04:54:43 +00:00
/* Group API */
2002-09-06 12:57:12 +00:00
NTSTATUS ( * sam_create_group ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , uint32 access_desired , const char * group_name , uint16 group_ctrl , SAM_GROUP_HANDLE * * group ) ;
2002-08-29 07:19:05 +00:00
NTSTATUS ( * sam_add_group ) ( const struct sam_methods * , const SAM_GROUP_HANDLE * group ) ;
NTSTATUS ( * sam_update_group ) ( const struct sam_methods * , const SAM_GROUP_HANDLE * group ) ;
NTSTATUS ( * sam_delete_group ) ( const struct sam_methods * , const SAM_GROUP_HANDLE * group ) ;
2002-09-06 12:57:12 +00:00
NTSTATUS ( * sam_enum_groups ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , uint16 group_ctrl , uint32 * groups_count , SAM_GROUP_ENUM * * groups ) ;
NTSTATUS ( * sam_get_group_by_sid ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , uint32 access_desired , const DOM_SID * groupsid , SAM_GROUP_HANDLE * * group ) ;
NTSTATUS ( * sam_get_group_by_name ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , uint32 access_desired , const char * name , SAM_GROUP_HANDLE * * group ) ;
2002-08-28 04:54:43 +00:00
2002-08-29 07:19:05 +00:00
NTSTATUS ( * sam_add_member_to_group ) ( const struct sam_methods * , const SAM_GROUP_HANDLE * group , const SAM_GROUP_MEMBER * member ) ;
NTSTATUS ( * sam_delete_member_from_group ) ( const struct sam_methods * , const SAM_GROUP_HANDLE * group , const SAM_GROUP_MEMBER * member ) ;
NTSTATUS ( * sam_enum_groupmembers ) ( const struct sam_methods * , const SAM_GROUP_HANDLE * group , uint32 * members_count , SAM_GROUP_MEMBER * * members ) ;
2002-08-28 04:54:43 +00:00
2002-09-06 12:57:12 +00:00
NTSTATUS ( * sam_get_groups_of_sid ) ( const struct sam_methods * , const NT_USER_TOKEN * access_token , const DOM_SID * * sids , uint16 group_ctrl , uint32 * group_count , SAM_GROUP_ENUM * * groups ) ;
2002-08-28 04:54:43 +00:00
void ( * free_private_data ) ( void * * ) ;
} SAM_METHODS ;
2002-09-24 20:18:39 +00:00
typedef NTSTATUS ( * sam_init_function ) ( SAM_METHODS * , const char * ) ;
2002-08-28 04:54:43 +00:00
struct sam_init_function_entry {
2002-09-08 15:25:22 +00:00
char * module_name ;
2002-08-28 04:54:43 +00:00
/* Function to create a member of the sam_methods list */
sam_init_function init ;
} ;
2002-09-08 15:25:22 +00:00
typedef struct sam_backend_entry {
char * module_name ;
char * module_params ;
char * domain_name ;
DOM_SID * domain_sid ;
} SAM_BACKEND_ENTRY ;
2002-08-28 04:54:43 +00:00
# endif /* _SAM_H */