~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to nsswitch/winbind_struct_protocol.h

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

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