restore structures from previous erroneous commit
[ira/wip.git] / source3 / include / passdb.h
1 /* 
2    Unix SMB/CIFS implementation.
3    passdb structures and parameters
4    Copyright (C) Gerald Carter 2001
5    Copyright (C) Luke Kenneth Casson Leighton 1998 - 2000
6    Copyright (C) Andrew Bartlett 2002
7    Copyright (C) Simo Sorce 2003
8    
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2 of the License, or
12    (at your option) any later version.
13    
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18    
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24 #ifndef _PASSDB_H
25 #define _PASSDB_H
26
27
28 /*
29  * bit flags representing initialized fields in SAM_ACCOUNT
30  */
31 enum pdb_elements {
32         PDB_UNINIT,
33         PDB_SMBHOME,
34         PDB_PROFILE,
35         PDB_DRIVE,
36         PDB_LOGONSCRIPT,
37         PDB_LOGONTIME,
38         PDB_LOGOFFTIME,
39         PDB_KICKOFFTIME,
40         PDB_CANCHANGETIME,
41         PDB_MUSTCHANGETIME,
42         PDB_PLAINTEXT_PW,
43         PDB_USERNAME,
44         PDB_FULLNAME,
45         PDB_DOMAIN,
46         PDB_NTUSERNAME,
47         PDB_HOURSLEN,
48         PDB_LOGONDIVS,
49         PDB_USERSID,
50         PDB_GROUPSID,
51         PDB_ACCTCTRL,
52         PDB_PASSLASTSET,
53         PDB_UNIXHOMEDIR,
54         PDB_ACCTDESC,
55         PDB_WORKSTATIONS,
56         PDB_UNKNOWNSTR,
57         PDB_MUNGEDDIAL,
58         PDB_HOURS,
59         PDB_UNKNOWN3,
60         PDB_UNKNOWN5,
61         PDB_UNKNOWN6,
62         PDB_LMPASSWD,
63         PDB_NTPASSWD,
64
65         /* this must be the last element */
66         PDB_COUNT
67 };
68
69 enum pdb_group_elements {
70         PDB_GROUP_NAME,
71         PDB_GROUP_SID,
72         PDB_GROUP_SID_NAME_USE,
73         PDB_GROUP_MEMBERS,
74
75         /* this must be the last element */
76         PDB_GROUP_COUNT
77 };
78
79
80 enum pdb_value_state {
81         PDB_DEFAULT=0,
82         PDB_SET,
83         PDB_CHANGED
84 };
85
86 #define IS_SAM_SET(x, flag)     (pdb_get_init_flags(x, flag) == PDB_SET)
87 #define IS_SAM_CHANGED(x, flag) (pdb_get_init_flags(x, flag) == PDB_CHANGED)
88 #define IS_SAM_DEFAULT(x, flag) (pdb_get_init_flags(x, flag) == PDB_DEFAULT)
89                 
90 typedef struct sam_passwd
91 {
92         TALLOC_CTX *mem_ctx;
93         
94         void (*free_fn)(struct sam_passwd **);
95
96         struct pdb_methods *methods;
97
98         struct user_data {
99                 /* initiailization flags */
100                 struct bitmap *change_flags;
101                 struct bitmap *set_flags;
102
103                 time_t logon_time;            /* logon time */
104                 time_t logoff_time;           /* logoff time */
105                 time_t kickoff_time;          /* kickoff time */
106                 time_t pass_last_set_time;    /* password last set time */
107                 time_t pass_can_change_time;  /* password can change time */
108                 time_t pass_must_change_time; /* password must change time */
109                 
110                 const char * username;     /* UNIX username string */
111                 const char * domain;       /* Windows Domain name */
112                 const char * nt_username;  /* Windows username string */
113                 const char * full_name;    /* user's full name string */
114                 const char * unix_home_dir;     /* UNIX home directory string */
115                 const char * home_dir;     /* home directory string */
116                 const char * dir_drive;    /* home directory drive string */
117                 const char * logon_script; /* logon script string */
118                 const char * profile_path; /* profile path string */
119                 const char * acct_desc  ;  /* user description string */
120                 const char * workstations; /* login from workstations string */
121                 const char * unknown_str ; /* don't know what this is, yet. */
122                 const char * munged_dial ; /* munged path name and dial-back tel number */
123                 
124                 DOM_SID user_sid;    /* Primary User SID */
125                 DOM_SID group_sid;   /* Primary Group SID */
126                 
127                 DATA_BLOB lm_pw; /* .data is Null if no password */
128                 DATA_BLOB nt_pw; /* .data is Null if no password */
129                 char* plaintext_pw; /* is Null if not available */
130                 
131                 uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
132                 uint32 unknown_3; /* 0x00ff ffff */
133                 
134                 uint16 logon_divs; /* 168 - number of hours in a week */
135                 uint32 hours_len; /* normally 21 bytes */
136                 uint8 hours[MAX_HOURS_LEN];
137                 
138                 uint32 unknown_5; /* 0x0002 0000 */
139                 uint32 unknown_6; /* 0x0000 04ec */
140         } private;
141
142         /* Lets see if the remaining code can get the hint that you
143            are meant to use the pdb_...() functions. */
144         
145 } SAM_ACCOUNT;
146
147 typedef struct sam_group {
148         TALLOC_CTX *mem_ctx;
149         
150         void (*free_fn)(struct sam_group **);
151
152         struct pdb_methods *methods;
153
154         struct group_data {
155                 /* initiailization flags */
156                 struct bitmap *change_flags;
157                 struct bitmap *set_flags;
158
159                 const char *name;               /* Windows group name string */
160
161                 DOM_SID sid;                    /* Group SID */
162                 enum SID_NAME_USE sid_name_use; /* Group type */
163
164                 uint32 mem_num;                 /* Number of member SIDs */
165                 DOM_SID *members;               /* SID array */
166         } private;
167
168 } SAM_GROUP;
169
170
171 /*****************************************************************
172  Functions to be implemented by the new (v2) passdb API 
173 ****************************************************************/
174
175 /*
176  * This next constant specifies the version number of the PASSDB interface
177  * this SAMBA will load. Increment this if *ANY* changes are made to the interface. 
178  */
179
180 #define PASSDB_INTERFACE_VERSION 4
181
182 typedef struct pdb_context 
183 {
184         struct pdb_methods *pdb_methods;
185         struct pdb_methods *pwent_methods;
186         
187         /* These functions are wrappers for the functions listed above.
188            They may do extra things like re-reading a SAM_ACCOUNT on update */
189
190         NTSTATUS (*pdb_setsampwent)(struct pdb_context *, BOOL update);
191         
192         void (*pdb_endsampwent)(struct pdb_context *);
193         
194         NTSTATUS (*pdb_getsampwent)(struct pdb_context *, SAM_ACCOUNT *user);
195         
196         NTSTATUS (*pdb_getsampwnam)(struct pdb_context *, SAM_ACCOUNT *sam_acct, const char *username);
197         
198         NTSTATUS (*pdb_getsampwsid)(struct pdb_context *, SAM_ACCOUNT *sam_acct, const DOM_SID *sid);
199
200         NTSTATUS (*pdb_add_sam_account)(struct pdb_context *, SAM_ACCOUNT *sampass);
201         
202         NTSTATUS (*pdb_update_sam_account)(struct pdb_context *, SAM_ACCOUNT *sampass);
203         
204         NTSTATUS (*pdb_delete_sam_account)(struct pdb_context *, SAM_ACCOUNT *username);
205
206         NTSTATUS (*pdb_getgrsid)(struct pdb_context *context, GROUP_MAP *map,
207                                  DOM_SID sid, BOOL with_priv);
208         
209         NTSTATUS (*pdb_getgrgid)(struct pdb_context *context, GROUP_MAP *map,
210                                  gid_t gid, BOOL with_priv);
211         
212         NTSTATUS (*pdb_getgrnam)(struct pdb_context *context, GROUP_MAP *map,
213                                  char *name, BOOL with_priv);
214         
215         NTSTATUS (*pdb_add_group_mapping_entry)(struct pdb_context *context,
216                                                 GROUP_MAP *map);
217         
218         NTSTATUS (*pdb_update_group_mapping_entry)(struct pdb_context *context,
219                                                    GROUP_MAP *map);
220         
221         NTSTATUS (*pdb_delete_group_mapping_entry)(struct pdb_context *context,
222                                                    DOM_SID sid);
223         
224         NTSTATUS (*pdb_enum_group_mapping)(struct pdb_context *context,
225                                            enum SID_NAME_USE sid_name_use,
226                                            GROUP_MAP **rmap, int *num_entries,
227                                            BOOL unix_only, BOOL with_priv);
228
229         void (*free_fn)(struct pdb_context **);
230         
231         TALLOC_CTX *mem_ctx;
232         
233 } PDB_CONTEXT;
234
235 typedef struct pdb_methods 
236 {
237         const char *name; /* What name got this module */
238         struct pdb_context *parent;
239
240         /* Use macros from dlinklist.h on these two */
241         struct pdb_methods *next;
242         struct pdb_methods *prev;
243
244         NTSTATUS (*setsampwent)(struct pdb_methods *, BOOL update);
245         
246         void (*endsampwent)(struct pdb_methods *);
247         
248         NTSTATUS (*getsampwent)(struct pdb_methods *, SAM_ACCOUNT *user);
249         
250         NTSTATUS (*getsampwnam)(struct pdb_methods *, SAM_ACCOUNT *sam_acct, const char *username);
251         
252         NTSTATUS (*getsampwsid)(struct pdb_methods *, SAM_ACCOUNT *sam_acct, const DOM_SID *sid);
253         
254         NTSTATUS (*add_sam_account)(struct pdb_methods *, SAM_ACCOUNT *sampass);
255         
256         NTSTATUS (*update_sam_account)(struct pdb_methods *, SAM_ACCOUNT *sampass);
257         
258         NTSTATUS (*delete_sam_account)(struct pdb_methods *, SAM_ACCOUNT *username);
259         
260         NTSTATUS (*getgrsid)(struct pdb_methods *methods, GROUP_MAP *map,
261                              DOM_SID sid, BOOL with_priv);
262
263         NTSTATUS (*getgrgid)(struct pdb_methods *methods, GROUP_MAP *map,
264                              gid_t gid, BOOL with_priv);
265
266         NTSTATUS (*getgrnam)(struct pdb_methods *methods, GROUP_MAP *map,
267                              char *name, BOOL with_priv);
268
269         NTSTATUS (*add_group_mapping_entry)(struct pdb_methods *methods,
270                                             GROUP_MAP *map);
271
272         NTSTATUS (*update_group_mapping_entry)(struct pdb_methods *methods,
273                                                GROUP_MAP *map);
274
275         NTSTATUS (*delete_group_mapping_entry)(struct pdb_methods *methods,
276                                                DOM_SID sid);
277
278         NTSTATUS (*enum_group_mapping)(struct pdb_methods *methods,
279                                        enum SID_NAME_USE sid_name_use,
280                                        GROUP_MAP **rmap, int *num_entries,
281                                        BOOL unix_only, BOOL with_priv);
282
283         void *private_data;  /* Private data of some kind */
284         
285         void (*free_private_data)(void **);
286
287 } PDB_METHODS;
288
289 typedef NTSTATUS (*pdb_init_function)(struct pdb_context *, 
290                          struct pdb_methods **, 
291                          const char *);
292
293 struct pdb_init_function_entry {
294         const char *name;
295         /* Function to create a member of the pdb_methods list */
296         pdb_init_function init;
297         struct pdb_init_function_entry *prev, *next;
298 };
299
300 #endif /* _PASSDB_H */