r25130: make use only of base types which are provided by libreplace
[tprouty/samba.git] / source / nsswitch / winbindd_nss.h
1 /* 
2    Unix SMB/CIFS implementation.
3
4    Winbind daemon for ntdom nss module
5
6    Copyright (C) Tim Potter 2000
7    Copyright (C) Gerald Carter 2006
8    
9    You are free to use this interface definition in any way you see
10    fit, including without restriction, using this header in your own
11    products. You do not need to give any attribution.  
12 */
13
14 #ifndef SAFE_FREE
15 #define SAFE_FREE(x) do { if(x) {free(x); x=NULL;} } while(0)
16 #endif
17
18 #ifndef _WINBINDD_NTDOM_H
19 #define _WINBINDD_NTDOM_H
20
21 #define WINBINDD_SOCKET_NAME "pipe"            /* Name of PF_UNIX socket */
22
23 /* Let the build environment override the public winbindd socket location. This
24  * is needed for launchd support -- jpeach.
25  */
26 #ifndef WINBINDD_SOCKET_DIR
27 #define WINBINDD_SOCKET_DIR  "/tmp/.winbindd"  /* Name of PF_UNIX dir */
28 #endif
29
30 #define WINBINDD_PRIV_SOCKET_SUBDIR "winbindd_privileged" /* name of subdirectory of lp_lockdir() to hold the 'privileged' pipe */
31 #define WINBINDD_DOMAIN_ENV  "WINBINDD_DOMAIN" /* Environment variables */
32 #define WINBINDD_DONT_ENV    "_NO_WINBINDD"
33 #define WINBINDD_LOCATOR_KDC_ADDRESS "WINBINDD_LOCATOR_KDC_ADDRESS"
34
35 /* Update this when you change the interface.  */
36
37 #define WINBIND_INTERFACE_VERSION 19
38
39 /* Have to deal with time_t being 4 or 8 bytes due to structure alignment.
40    On a 64bit Linux box, we have to support a constant structure size
41    between /lib/libnss_winbind.so.2 and /li64/libnss_winbind.so.2.
42    The easiest way to do this is to always use 8byte values for time_t. */
43
44 #define SMB_TIME_T int64_t
45
46 /* Socket commands */
47
48 enum winbindd_cmd {
49
50         WINBINDD_INTERFACE_VERSION,    /* Always a well known value */
51
52         /* Get users and groups */
53
54         WINBINDD_GETPWNAM,
55         WINBINDD_GETPWUID,
56         WINBINDD_GETGRNAM,
57         WINBINDD_GETGRGID,
58         WINBINDD_GETGROUPS,
59
60         /* Enumerate users and groups */
61
62         WINBINDD_SETPWENT,
63         WINBINDD_ENDPWENT,
64         WINBINDD_GETPWENT,
65         WINBINDD_SETGRENT,
66         WINBINDD_ENDGRENT,
67         WINBINDD_GETGRENT,
68
69         /* PAM authenticate and password change */
70
71         WINBINDD_PAM_AUTH,
72         WINBINDD_PAM_AUTH_CRAP,
73         WINBINDD_PAM_CHAUTHTOK,
74         WINBINDD_PAM_LOGOFF,
75         WINBINDD_PAM_CHNG_PSWD_AUTH_CRAP,
76
77         /* List various things */
78
79         WINBINDD_LIST_USERS,         /* List w/o rid->id mapping */
80         WINBINDD_LIST_GROUPS,        /* Ditto */
81         WINBINDD_LIST_TRUSTDOM,
82
83         /* SID conversion */
84
85         WINBINDD_LOOKUPSID,
86         WINBINDD_LOOKUPNAME,
87         WINBINDD_LOOKUPRIDS,
88
89         /* Lookup functions */
90
91         WINBINDD_SID_TO_UID,       
92         WINBINDD_SID_TO_GID,
93         WINBINDD_SIDS_TO_XIDS,
94         WINBINDD_UID_TO_SID,
95         WINBINDD_GID_TO_SID,
96
97         WINBINDD_ALLOCATE_UID,
98         WINBINDD_ALLOCATE_GID,
99         WINBINDD_SET_MAPPING,
100         WINBINDD_SET_HWM,
101
102         /* Miscellaneous other stuff */
103
104         WINBINDD_DUMP_MAPS,
105
106         WINBINDD_CHECK_MACHACC,     /* Check machine account pw works */
107         WINBINDD_PING,              /* Just tell me winbind is running */
108         WINBINDD_INFO,              /* Various bit of info.  Currently just tidbits */
109         WINBINDD_DOMAIN_NAME,       /* The domain this winbind server is a member of (lp_workgroup()) */
110
111         WINBINDD_DOMAIN_INFO,   /* Most of what we know from
112                                    struct winbindd_domain */
113         WINBINDD_GETDCNAME,     /* Issue a GetDCName Request */
114         WINBINDD_DSGETDCNAME,   /* Issue a DsGetDCName Request */
115
116         WINBINDD_SHOW_SEQUENCE, /* display sequence numbers of domains */
117
118         /* WINS commands */
119
120         WINBINDD_WINS_BYIP,
121         WINBINDD_WINS_BYNAME,
122
123         /* this is like GETGRENT but gives an empty group list */
124         WINBINDD_GETGRLST,
125
126         WINBINDD_NETBIOS_NAME,       /* The netbios name of the server */
127
128         /* find the location of our privileged pipe */
129         WINBINDD_PRIV_PIPE_DIR,
130
131         /* return a list of group sids for a user sid */
132         WINBINDD_GETUSERSIDS,
133
134         /* Various group queries */
135         WINBINDD_GETUSERDOMGROUPS,
136
137         /* Initialize connection in a child */
138         WINBINDD_INIT_CONNECTION,
139
140         /* Blocking calls that are not allowed on the main winbind pipe, only
141          * between parent and children */
142         WINBINDD_DUAL_SID2UID,
143         WINBINDD_DUAL_SID2GID,
144         WINBINDD_DUAL_SIDS2XIDS,
145         WINBINDD_DUAL_UID2SID,
146         WINBINDD_DUAL_GID2SID,
147         WINBINDD_DUAL_SET_MAPPING,
148         WINBINDD_DUAL_SET_HWM,
149         WINBINDD_DUAL_DUMP_MAPS,
150
151         /* Wrapper around possibly blocking unix nss calls */
152         WINBINDD_DUAL_UID2NAME,
153         WINBINDD_DUAL_NAME2UID,
154         WINBINDD_DUAL_GID2NAME,
155         WINBINDD_DUAL_NAME2GID,
156
157         WINBINDD_DUAL_USERINFO,
158         WINBINDD_DUAL_GETSIDALIASES,
159
160         /* Complete the challenge phase of the NTLM authentication
161            protocol using cached password. */
162         WINBINDD_CCACHE_NTLMAUTH,
163
164         WINBINDD_NUM_CMDS
165 };
166
167 typedef struct winbindd_pw {
168         fstring pw_name;
169         fstring pw_passwd;
170         uid_t pw_uid;
171         gid_t pw_gid;
172         fstring pw_gecos;
173         fstring pw_dir;
174         fstring pw_shell;
175 } WINBINDD_PW;
176
177
178 typedef struct winbindd_gr {
179         fstring gr_name;
180         fstring gr_passwd;
181         gid_t gr_gid;
182         uint32_t num_gr_mem;
183         uint32_t gr_mem_ofs;   /* offset to group membership */
184 } WINBINDD_GR;
185
186 /* PAM specific request flags */
187 #define WBFLAG_PAM_INFO3_NDR            0x00000001
188 #define WBFLAG_PAM_INFO3_TEXT           0x00000002
189 #define WBFLAG_PAM_USER_SESSION_KEY     0x00000004
190 #define WBFLAG_PAM_LMKEY                0x00000008
191 #define WBFLAG_PAM_CONTACT_TRUSTDOM     0x00000010
192 #define WBFLAG_PAM_UNIX_NAME            0x00000080
193 #define WBFLAG_PAM_AFS_TOKEN            0x00000100
194 #define WBFLAG_PAM_NT_STATUS_SQUASH     0x00000200
195 #define WBFLAG_PAM_KRB5                 0x00001000
196 #define WBFLAG_PAM_FALLBACK_AFTER_KRB5  0x00002000
197 #define WBFLAG_PAM_CACHED_LOGIN         0x00004000
198 #define WBFLAG_PAM_GET_PWD_POLICY       0x00008000      /* not used */
199
200 /* generic request flags */
201 #define WBFLAG_QUERY_ONLY               0x00000020      /* not used */
202 /* This is a flag that can only be sent from parent to child */
203 #define WBFLAG_IS_PRIVILEGED            0x00000400      /* not used */
204 /* Flag to say this is a winbindd internal send - don't recurse. */
205 #define WBFLAG_RECURSE                  0x00000800
206
207
208 #define WINBINDD_MAX_EXTRA_DATA (128*1024)
209
210 /* Winbind request structure */
211
212 /*******************************************************************************
213  * This structure MUST be the same size in the 32bit and 64bit builds
214  * for compatibility between /lib64/libnss_winbind.so and /lib/libnss_winbind.so
215  * 
216  * DO NOT CHANGE THIS STRUCTURE WITHOUT TESTING THE 32BIT NSS LIB AGAINST
217  * A 64BIT WINBINDD    --jerry
218  ******************************************************************************/
219
220 struct winbindd_request {
221         uint32_t length;
222         enum winbindd_cmd cmd;   /* Winbindd command to execute */
223         enum winbindd_cmd original_cmd;   /* Original Winbindd command
224                                              issued to parent process */
225         pid_t pid;               /* pid of calling process */
226         uint32_t wb_flags;       /* generic flags */
227         uint32_t flags;          /* flags relevant *only* to a given request */
228         fstring domain_name;    /* name of domain for which the request applies */
229
230         union {
231                 fstring winsreq;     /* WINS request */
232                 fstring username;    /* getpwnam */
233                 fstring groupname;   /* getgrnam */
234                 uid_t uid;           /* getpwuid, uid_to_sid */
235                 gid_t gid;           /* getgrgid, gid_to_sid */
236                 struct {
237                         /* We deliberatedly don't split into domain/user to
238                            avoid having the client know what the separator
239                            character is. */     
240                         fstring user;
241                         fstring pass;
242                         pstring require_membership_of_sid;
243                         fstring krb5_cc_type;
244                         uid_t uid;
245                 } auth;              /* pam_winbind auth module */
246                 struct {
247                         uint8_t chal[8];
248                         uint32_t logon_parameters;
249                         fstring user;
250                         fstring domain;
251                         fstring lm_resp;
252                         uint32_t lm_resp_len;
253                         fstring nt_resp;
254                         uint32_t nt_resp_len;
255                         fstring workstation;
256                         fstring require_membership_of_sid;
257                 } auth_crap;
258                 struct {
259                     fstring user;
260                     fstring oldpass;
261                     fstring newpass;
262                 } chauthtok;         /* pam_winbind passwd module */
263                 struct {
264                         fstring user;
265                         fstring domain;
266                         uint8_t new_nt_pswd[516];
267                         uint16_t new_nt_pswd_len;
268                         uint8_t old_nt_hash_enc[16];
269                         uint16_t old_nt_hash_enc_len;
270                         uint8_t new_lm_pswd[516];
271                         uint16_t new_lm_pswd_len;
272                         uint8_t old_lm_hash_enc[16];
273                         uint16_t old_lm_hash_enc_len;
274                 } chng_pswd_auth_crap;/* pam_winbind passwd module */
275                 struct {
276                         fstring user;
277                         fstring krb5ccname;
278                         uid_t uid;
279                 } logoff;              /* pam_winbind session module */
280                 fstring sid;         /* lookupsid, sid_to_[ug]id */
281                 struct {
282                         fstring dom_name;       /* lookupname */
283                         fstring name;       
284                 } name;
285                 uint32_t num_entries;  /* getpwent, getgrent */
286                 struct {
287                         fstring username;
288                         fstring groupname;
289                 } acct_mgt;
290                 struct {
291                         bool is_primary;
292                         fstring dcname;
293                 } init_conn;
294                 struct {
295                         fstring sid;
296                         fstring name;
297                 } dual_sid2id;
298                 struct {
299                         fstring sid;
300                         uint32_t type;
301                         uint32_t id;
302                 } dual_idmapset;
303                 bool list_all_domains;
304
305                 struct {
306                         uid_t uid;
307                         fstring user;
308                         /* the effective uid of the client, must be the uid for 'user'.
309                            This is checked by the main daemon, trusted by children. */
310                         /* if the blobs are length zero, then this doesn't
311                            produce an actual challenge response. It merely
312                            succeeds if there are cached credentials available
313                            that could be used. */
314                         uint32_t initial_blob_len; /* blobs in extra_data */
315                         uint32_t challenge_blob_len;
316                 } ccache_ntlm_auth;
317
318                 /* padding -- needed to fix alignment between 32bit and 64bit libs.
319                    The size is the sizeof the union without the padding aligned on 
320                    an 8 byte boundary.   --jerry */
321
322                 char padding[1560];
323         } data;
324         union {
325                 SMB_TIME_T padding;
326                 char *data;
327         } extra_data;
328         uint32_t extra_len;
329         char null_term;
330 };
331
332 /* Response values */
333
334 enum winbindd_result {
335         WINBINDD_ERROR,
336         WINBINDD_PENDING,
337         WINBINDD_OK
338 };
339
340 /* Winbind response structure */
341
342 /*******************************************************************************
343  * This structure MUST be the same size in the 32bit and 64bit builds
344  * for compatibility between /lib64/libnss_winbind.so and /lib/libnss_winbind.so
345  * 
346  * DO NOT CHANGE THIS STRUCTURE WITHOUT TESTING THE 32BIT NSS LIB AGAINST
347  * A 64BIT WINBINDD    --jerry
348  ******************************************************************************/
349
350 struct winbindd_response {
351     
352         /* Header information */
353
354         uint32_t length;                      /* Length of response */
355         enum winbindd_result result;          /* Result code */
356
357         /* Fixed length return data */
358         
359         union {
360                 int interface_version;  /* Try to ensure this is always in the same spot... */
361                 
362                 fstring winsresp;               /* WINS response */
363
364                 /* getpwnam, getpwuid */
365                 
366                 struct winbindd_pw pw;
367
368                 /* getgrnam, getgrgid */
369
370                 struct winbindd_gr gr;
371
372                 uint32_t num_entries; /* getpwent, getgrent */
373                 struct winbindd_sid {
374                         fstring sid;        /* lookupname, [ug]id_to_sid */
375                         int type;
376                 } sid;
377                 struct winbindd_name {
378                         fstring dom_name;       /* lookupsid */
379                         fstring name;       
380                         int type;
381                 } name;
382                 uid_t uid;          /* sid_to_uid */
383                 gid_t gid;          /* sid_to_gid */
384                 struct winbindd_info {
385                         char winbind_separator;
386                         fstring samba_version;
387                 } info;
388                 fstring domain_name;
389                 fstring netbios_name;
390                 fstring dc_name;
391
392                 struct auth_reply {
393                         uint32_t nt_status;
394                         fstring nt_status_string;
395                         fstring error_string;
396                         int pam_error;
397                         char user_session_key[16];
398                         char first_8_lm_hash[8];
399                         fstring krb5ccname;
400                         uint32_t reject_reason;
401                         uint32_t padding;
402                         struct policy_settings {
403                                 uint32_t min_length_password;
404                                 uint32_t password_history;
405                                 uint32_t password_properties;
406                                 uint32_t padding;
407                                 SMB_TIME_T expire;
408                                 SMB_TIME_T min_passwordage;
409                         } policy;
410                         struct info3_text {
411                                 SMB_TIME_T logon_time;
412                                 SMB_TIME_T logoff_time;
413                                 SMB_TIME_T kickoff_time;
414                                 SMB_TIME_T pass_last_set_time;
415                                 SMB_TIME_T pass_can_change_time;
416                                 SMB_TIME_T pass_must_change_time;
417                                 uint32_t logon_count;
418                                 uint32_t bad_pw_count;
419                                 uint32_t user_rid;
420                                 uint32_t group_rid;
421                                 uint32_t num_groups;
422                                 uint32_t user_flgs;
423                                 uint32_t acct_flags;
424                                 uint32_t num_other_sids;
425                                 fstring dom_sid;
426                                 fstring user_name;
427                                 fstring full_name;
428                                 fstring logon_script;
429                                 fstring profile_path;
430                                 fstring home_dir;
431                                 fstring dir_drive;
432                                 fstring logon_srv;
433                                 fstring logon_dom;
434                         } info3;
435                 } auth;
436                 struct {
437                         fstring name;
438                         fstring alt_name;
439                         fstring sid;
440                         bool native_mode;
441                         bool active_directory;
442                         bool primary;
443                         uint32_t sequence_number;
444                 } domain_info;
445                 struct {
446                         fstring acct_name;
447                         fstring full_name;
448                         fstring homedir;
449                         fstring shell;
450                         uint32_t primary_gid;
451                         uint32_t group_rid;
452                 } user_info;
453                 struct {
454                         uint32_t auth_blob_len; /* blob in extra_data */
455                 } ccache_ntlm_auth;
456         } data;
457
458         /* Variable length return data */
459
460         union {
461                 SMB_TIME_T padding;
462                 void *data;
463         } extra_data;
464 };
465
466 struct WINBINDD_MEMORY_CREDS {
467         struct WINBINDD_MEMORY_CREDS *next, *prev;
468         const char *username; /* lookup key. */
469         uid_t uid;
470         int ref_count;
471         size_t len;
472         uint8_t *nt_hash; /* Base pointer for the following 2 */
473         uint8_t *lm_hash;
474         char *pass;
475 };
476
477 struct WINBINDD_CCACHE_ENTRY {
478         struct WINBINDD_CCACHE_ENTRY *next, *prev;
479         const char *principal_name;
480         const char *ccname;
481         const char *service;
482         const char *username;
483         const char *realm;
484         struct WINBINDD_MEMORY_CREDS *cred_ptr;
485         int ref_count;
486         uid_t uid;
487         time_t create_time;
488         time_t renew_until;
489         time_t refresh_time;
490         struct timed_event *event;
491 };
492
493 #endif