2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997.
7 * Copyright (C) Jean François Micouleau 2002.
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.
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.
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.
27 #define DBGC_CLASS DBGC_RPC_PARSE
29 /*******************************************************************
30 Reads or writes a structure.
31 ********************************************************************/
33 static BOOL net_io_neg_flags(const char *desc, NEG_FLAGS *neg, prs_struct *ps, int depth)
38 prs_debug(ps, depth, desc, "net_io_neg_flags");
44 if(!prs_uint32("neg_flags", ps, depth, &neg->neg_flags))
50 /*******************************************************************
51 Inits a NETLOGON_INFO_3 structure.
52 ********************************************************************/
54 static void init_netinfo_3(NETLOGON_INFO_3 *info, uint32 flags, uint32 logon_attempts)
57 info->logon_attempts = logon_attempts;
58 info->reserved_1 = 0x0;
59 info->reserved_2 = 0x0;
60 info->reserved_3 = 0x0;
61 info->reserved_4 = 0x0;
62 info->reserved_5 = 0x0;
65 /*******************************************************************
66 Reads or writes a NETLOGON_INFO_3 structure.
67 ********************************************************************/
69 static BOOL net_io_netinfo_3(const char *desc, NETLOGON_INFO_3 *info, prs_struct *ps, int depth)
74 prs_debug(ps, depth, desc, "net_io_netinfo_3");
80 if(!prs_uint32("flags ", ps, depth, &info->flags))
82 if(!prs_uint32("logon_attempts", ps, depth, &info->logon_attempts))
84 if(!prs_uint32("reserved_1 ", ps, depth, &info->reserved_1))
86 if(!prs_uint32("reserved_2 ", ps, depth, &info->reserved_2))
88 if(!prs_uint32("reserved_3 ", ps, depth, &info->reserved_3))
90 if(!prs_uint32("reserved_4 ", ps, depth, &info->reserved_4))
92 if(!prs_uint32("reserved_5 ", ps, depth, &info->reserved_5))
99 /*******************************************************************
100 Inits a NETLOGON_INFO_1 structure.
101 ********************************************************************/
103 static void init_netinfo_1(NETLOGON_INFO_1 *info, uint32 flags, uint32 pdc_status)
106 info->pdc_status = pdc_status;
109 /*******************************************************************
110 Reads or writes a NETLOGON_INFO_1 structure.
111 ********************************************************************/
113 static BOOL net_io_netinfo_1(const char *desc, NETLOGON_INFO_1 *info, prs_struct *ps, int depth)
118 prs_debug(ps, depth, desc, "net_io_netinfo_1");
124 if(!prs_uint32("flags ", ps, depth, &info->flags))
126 if(!prs_uint32("pdc_status", ps, depth, &info->pdc_status))
132 /*******************************************************************
133 Inits a NETLOGON_INFO_2 structure.
134 ********************************************************************/
136 static void init_netinfo_2(NETLOGON_INFO_2 *info, uint32 flags, uint32 pdc_status,
137 uint32 tc_status, const char *trusted_dc_name)
139 int len_dc_name = strlen(trusted_dc_name);
141 info->pdc_status = pdc_status;
142 info->ptr_trusted_dc_name = 1;
143 info->tc_status = tc_status;
145 if (trusted_dc_name != NULL)
146 init_unistr2(&info->uni_trusted_dc_name, trusted_dc_name, len_dc_name+1);
148 init_unistr2(&info->uni_trusted_dc_name, "", 1);
151 /*******************************************************************
152 Reads or writes a NETLOGON_INFO_2 structure.
153 ********************************************************************/
155 static BOOL net_io_netinfo_2(const char *desc, NETLOGON_INFO_2 *info, prs_struct *ps, int depth)
160 prs_debug(ps, depth, desc, "net_io_netinfo_2");
166 if(!prs_uint32("flags ", ps, depth, &info->flags))
168 if(!prs_uint32("pdc_status ", ps, depth, &info->pdc_status))
170 if(!prs_uint32("ptr_trusted_dc_name", ps, depth, &info->ptr_trusted_dc_name))
172 if(!prs_uint32("tc_status ", ps, depth, &info->tc_status))
175 if (info->ptr_trusted_dc_name != 0) {
176 if(!smb_io_unistr2("unistr2", &info->uni_trusted_dc_name, info->ptr_trusted_dc_name, ps, depth))
186 /*******************************************************************
187 Reads or writes an NET_Q_LOGON_CTRL2 structure.
188 ********************************************************************/
190 BOOL net_io_q_logon_ctrl2(const char *desc, NET_Q_LOGON_CTRL2 *q_l, prs_struct *ps, int depth)
195 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl2");
201 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
204 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
210 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
212 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
214 if(!prs_uint32("switch_value ", ps, depth, &q_l->switch_value))
220 /*******************************************************************
221 Inits an NET_Q_LOGON_CTRL2 structure.
222 ********************************************************************/
224 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l, const char *srv_name,
227 DEBUG(5,("init_q_logon_ctrl2\n"));
229 q_l->function_code = 0x01;
230 q_l->query_level = query_level;
231 q_l->switch_value = 0x01;
233 init_unistr2(&q_l->uni_server_name, srv_name, strlen(srv_name) + 1);
236 /*******************************************************************
237 Inits an NET_R_LOGON_CTRL2 structure.
238 ********************************************************************/
240 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2 *r_l, uint32 query_level,
241 uint32 flags, uint32 pdc_status,
242 uint32 logon_attempts, uint32 tc_status,
243 const char *trusted_domain_name)
245 DEBUG(5,("init_r_logon_ctrl2\n"));
247 r_l->switch_value = query_level; /* should only be 0x1 */
249 switch (query_level) {
251 r_l->ptr = 1; /* undocumented pointer */
252 init_netinfo_1(&r_l->logon.info1, flags, pdc_status);
253 r_l->status = NT_STATUS_OK;
256 r_l->ptr = 1; /* undocumented pointer */
257 init_netinfo_2(&r_l->logon.info2, flags, pdc_status,
258 tc_status, trusted_domain_name);
259 r_l->status = NT_STATUS_OK;
262 r_l->ptr = 1; /* undocumented pointer */
263 init_netinfo_3(&r_l->logon.info3, flags, logon_attempts);
264 r_l->status = NT_STATUS_OK;
267 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
269 r_l->ptr = 0; /* undocumented pointer */
271 /* take a guess at an error code... */
272 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
277 /*******************************************************************
278 Reads or writes an NET_R_LOGON_CTRL2 structure.
279 ********************************************************************/
281 BOOL net_io_r_logon_ctrl2(const char *desc, NET_R_LOGON_CTRL2 *r_l, prs_struct *ps, int depth)
286 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl2");
289 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
291 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
295 switch (r_l->switch_value) {
297 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
301 if(!net_io_netinfo_2("", &r_l->logon.info2, ps, depth))
305 if(!net_io_netinfo_3("", &r_l->logon.info3, ps, depth))
309 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
315 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
321 /*******************************************************************
322 Reads or writes an NET_Q_LOGON_CTRL structure.
323 ********************************************************************/
325 BOOL net_io_q_logon_ctrl(const char *desc, NET_Q_LOGON_CTRL *q_l, prs_struct *ps,
328 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl");
334 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
337 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
343 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
345 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
351 /*******************************************************************
352 Inits an NET_Q_LOGON_CTRL structure.
353 ********************************************************************/
355 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL *q_l, const char *srv_name,
358 DEBUG(5,("init_q_logon_ctrl\n"));
360 q_l->function_code = 0x01; /* ??? */
361 q_l->query_level = query_level;
363 init_unistr2(&q_l->uni_server_name, srv_name, strlen(srv_name) + 1);
366 /*******************************************************************
367 Inits an NET_R_LOGON_CTRL structure.
368 ********************************************************************/
370 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL *r_l, uint32 query_level,
371 uint32 flags, uint32 pdc_status)
373 DEBUG(5,("init_r_logon_ctrl\n"));
375 r_l->switch_value = query_level; /* should only be 0x1 */
377 switch (query_level) {
379 r_l->ptr = 1; /* undocumented pointer */
380 init_netinfo_1(&r_l->logon.info1, flags, pdc_status);
381 r_l->status = NT_STATUS_OK;
384 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
386 r_l->ptr = 0; /* undocumented pointer */
388 /* take a guess at an error code... */
389 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
394 /*******************************************************************
395 Reads or writes an NET_R_LOGON_CTRL structure.
396 ********************************************************************/
398 BOOL net_io_r_logon_ctrl(const char *desc, NET_R_LOGON_CTRL *r_l, prs_struct *ps,
401 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl");
404 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
406 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
410 switch (r_l->switch_value) {
412 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
416 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
422 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
428 /*******************************************************************
429 Inits an NET_R_TRUST_DOM_LIST structure.
430 ********************************************************************/
432 void init_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
433 uint32 num_doms, const char *dom_name)
437 DEBUG(5,("init_r_trust_dom\n"));
439 for (i = 0; i < MAX_TRUST_DOMS; i++) {
440 r_t->uni_trust_dom_name[i].uni_str_len = 0;
441 r_t->uni_trust_dom_name[i].uni_max_len = 0;
443 if (num_doms > MAX_TRUST_DOMS)
444 num_doms = MAX_TRUST_DOMS;
446 for (i = 0; i < num_doms; i++) {
448 fstrcpy(domain_name, dom_name);
449 strupper_m(domain_name);
450 init_unistr2(&r_t->uni_trust_dom_name[i], domain_name, strlen(domain_name)+1);
451 /* the use of UNISTR2 here is non-standard. */
452 r_t->uni_trust_dom_name[i].undoc = 0x1;
455 r_t->status = NT_STATUS_OK;
458 /*******************************************************************
459 Reads or writes an NET_R_TRUST_DOM_LIST structure.
460 ********************************************************************/
462 BOOL net_io_r_trust_dom(const char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth)
469 prs_debug(ps, depth, desc, "net_io_r_trust_dom");
472 /* temporary code to give a valid response */
474 if(!prs_uint32("status", ps, depth, &value))
478 if(!prs_uint32("status", ps, depth, &value))
481 if(!prs_uint32("status", ps, depth, &value))
485 if(!prs_uint32("status", ps, depth, &value))
489 if(!prs_uint32("status", ps, depth, &value))
492 /* old non working code */
496 for (i = 0; i < MAX_TRUST_DOMS; i++) {
497 if (r_t->uni_trust_dom_name[i].uni_str_len == 0)
499 if(!smb_io_unistr2("", &r_t->uni_trust_dom_name[i], True, ps, depth))
503 if(!prs_ntstatus("status", ps, depth, &r_t->status))
510 /*******************************************************************
511 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
512 ********************************************************************/
514 BOOL net_io_q_trust_dom(const char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth)
519 prs_debug(ps, depth, desc, "net_io_q_trust_dom");
522 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
524 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
530 /*******************************************************************
531 Inits an NET_Q_REQ_CHAL structure.
532 ********************************************************************/
534 void init_q_req_chal(NET_Q_REQ_CHAL *q_c,
535 const char *logon_srv, const char *logon_clnt,
538 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
540 q_c->undoc_buffer = 1; /* don't know what this buffer is */
542 init_unistr2(&q_c->uni_logon_srv, logon_srv , strlen(logon_srv )+1);
543 init_unistr2(&q_c->uni_logon_clnt, logon_clnt, strlen(logon_clnt)+1);
545 memcpy(q_c->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
547 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
550 /*******************************************************************
551 Reads or writes an NET_Q_REQ_CHAL structure.
552 ********************************************************************/
554 BOOL net_io_q_req_chal(const char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth)
559 prs_debug(ps, depth, desc, "net_io_q_req_chal");
565 if(!prs_uint32("undoc_buffer", ps, depth, &q_c->undoc_buffer))
568 if(!smb_io_unistr2("", &q_c->uni_logon_srv, True, ps, depth)) /* logon server unicode string */
570 if(!smb_io_unistr2("", &q_c->uni_logon_clnt, True, ps, depth)) /* logon client unicode string */
573 if(!smb_io_chal("", &q_c->clnt_chal, ps, depth))
579 /*******************************************************************
580 Reads or writes a structure.
581 ********************************************************************/
583 BOOL net_io_r_req_chal(const char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth)
588 prs_debug(ps, depth, desc, "net_io_r_req_chal");
594 if(!smb_io_chal("", &r_c->srv_chal, ps, depth)) /* server challenge */
597 if(!prs_ntstatus("status", ps, depth, &r_c->status))
604 /*******************************************************************
605 Reads or writes a structure.
606 ********************************************************************/
608 BOOL net_io_q_auth(const char *desc, NET_Q_AUTH *q_a, prs_struct *ps, int depth)
613 prs_debug(ps, depth, desc, "net_io_q_auth");
619 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
621 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
627 /*******************************************************************
628 Reads or writes a structure.
629 ********************************************************************/
631 BOOL net_io_r_auth(const char *desc, NET_R_AUTH *r_a, prs_struct *ps, int depth)
636 prs_debug(ps, depth, desc, "net_io_r_auth");
642 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
645 if(!prs_ntstatus("status", ps, depth, &r_a->status))
651 /*******************************************************************
652 Inits a NET_Q_AUTH_2 struct.
653 ********************************************************************/
655 void init_q_auth_2(NET_Q_AUTH_2 *q_a,
656 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
657 DOM_CHAL *clnt_chal, uint32 clnt_flgs)
659 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
661 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
662 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
663 q_a->clnt_flgs.neg_flags = clnt_flgs;
665 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
668 /*******************************************************************
669 Reads or writes a structure.
670 ********************************************************************/
672 BOOL net_io_q_auth_2(const char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth)
677 prs_debug(ps, depth, desc, "net_io_q_auth_2");
683 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
685 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
687 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
693 /*******************************************************************
694 Reads or writes a structure.
695 ********************************************************************/
697 BOOL net_io_r_auth_2(const char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth)
702 prs_debug(ps, depth, desc, "net_io_r_auth_2");
708 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
710 if(!net_io_neg_flags("", &r_a->srv_flgs, ps, depth))
713 if(!prs_ntstatus("status", ps, depth, &r_a->status))
719 /*******************************************************************
720 Inits a NET_Q_AUTH_3 struct.
721 ********************************************************************/
723 void init_q_auth_3(NET_Q_AUTH_3 *q_a,
724 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
725 DOM_CHAL *clnt_chal, uint32 clnt_flgs)
727 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
729 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
730 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
731 q_a->clnt_flgs.neg_flags = clnt_flgs;
733 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
736 /*******************************************************************
737 Reads or writes a structure.
738 ********************************************************************/
740 BOOL net_io_q_auth_3(const char *desc, NET_Q_AUTH_3 *q_a, prs_struct *ps, int depth)
745 prs_debug(ps, depth, desc, "net_io_q_auth_3");
751 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
753 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
755 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
761 /*******************************************************************
762 Reads or writes a structure.
763 ********************************************************************/
765 BOOL net_io_r_auth_3(const char *desc, NET_R_AUTH_3 *r_a, prs_struct *ps, int depth)
770 prs_debug(ps, depth, desc, "net_io_r_auth_3");
776 if(!smb_io_chal("srv_chal", &r_a->srv_chal, ps, depth)) /* server challenge */
778 if(!net_io_neg_flags("srv_flgs", &r_a->srv_flgs, ps, depth))
780 if (!prs_uint32("unknown", ps, depth, &r_a->unknown))
783 if(!prs_ntstatus("status", ps, depth, &r_a->status))
790 /*******************************************************************
791 Inits a NET_Q_SRV_PWSET.
792 ********************************************************************/
794 void init_q_srv_pwset(NET_Q_SRV_PWSET *q_s,
795 const char *logon_srv, const char *sess_key, const char *acct_name,
796 uint16 sec_chan, const char *comp_name,
797 DOM_CRED *cred, uchar hashed_mach_pwd[16])
799 unsigned char nt_cypher[16];
801 DEBUG(5,("init_q_srv_pwset\n"));
803 /* Process the new password. */
804 cred_hash3( nt_cypher, hashed_mach_pwd, sess_key, 1);
806 init_clnt_info(&q_s->clnt_id, logon_srv, acct_name, sec_chan, comp_name, cred);
808 memcpy(q_s->pwd, nt_cypher, sizeof(q_s->pwd));
811 /*******************************************************************
812 Reads or writes a structure.
813 ********************************************************************/
815 BOOL net_io_q_srv_pwset(const char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth)
820 prs_debug(ps, depth, desc, "net_io_q_srv_pwset");
826 if(!smb_io_clnt_info("", &q_s->clnt_id, ps, depth)) /* client identification/authentication info */
828 if(!prs_uint8s (False, "pwd", ps, depth, q_s->pwd, 16)) /* new password - undocumented */
834 /*******************************************************************
835 Reads or writes a structure.
836 ********************************************************************/
838 BOOL net_io_r_srv_pwset(const char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth)
843 prs_debug(ps, depth, desc, "net_io_r_srv_pwset");
849 if(!smb_io_cred("", &r_s->srv_cred, ps, depth)) /* server challenge */
852 if(!prs_ntstatus("status", ps, depth, &r_s->status))
858 /*************************************************************************
859 Init DOM_SID2 array from a string containing multiple sids
860 *************************************************************************/
862 static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsids)
868 DEBUG(4,("init_dom_sid2s: %s\n", sids_str ? sids_str:""));
876 /* Count the number of valid SIDs. */
877 for (count = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
879 if (string_to_sid(&tmpsid, s2))
883 /* Now allocate space for them. */
884 *ppsids = (DOM_SID2 *)talloc_zero(ctx, count * sizeof(DOM_SID2));
890 for (number = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
892 if (string_to_sid(&tmpsid, s2)) {
893 /* count only valid sids */
894 init_dom_sid2(&sids[number], &tmpsid);
903 /*******************************************************************
904 Inits a NET_ID_INFO_1 structure.
905 ********************************************************************/
907 void init_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
908 uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
909 const char *user_name, const char *wksta_name,
910 const char *sess_key,
911 unsigned char lm_cypher[16], unsigned char nt_cypher[16])
913 int len_domain_name = strlen(domain_name);
914 int len_user_name = strlen(user_name );
915 int len_wksta_name = strlen(wksta_name );
917 unsigned char lm_owf[16];
918 unsigned char nt_owf[16];
920 DEBUG(5,("init_id_info1: %d\n", __LINE__));
922 id->ptr_id_info1 = 1;
924 init_uni_hdr(&id->hdr_domain_name, len_domain_name);
926 id->param_ctrl = param_ctrl;
927 init_logon_id(&id->logon_id, log_id_low, log_id_high);
929 init_uni_hdr(&id->hdr_user_name, len_user_name);
930 init_uni_hdr(&id->hdr_wksta_name, len_wksta_name);
932 if (lm_cypher && nt_cypher) {
933 unsigned char key[16];
934 #ifdef DEBUG_PASSWORD
935 DEBUG(100,("lm cypher:"));
936 dump_data(100, (char *)lm_cypher, 16);
938 DEBUG(100,("nt cypher:"));
939 dump_data(100, (char *)nt_cypher, 16);
943 memcpy(key, sess_key, 8);
945 memcpy(lm_owf, lm_cypher, 16);
946 SamOEMhash(lm_owf, key, 16);
947 memcpy(nt_owf, nt_cypher, 16);
948 SamOEMhash(nt_owf, key, 16);
950 #ifdef DEBUG_PASSWORD
951 DEBUG(100,("encrypt of lm owf password:"));
952 dump_data(100, (char *)lm_owf, 16);
954 DEBUG(100,("encrypt of nt owf password:"));
955 dump_data(100, (char *)nt_owf, 16);
957 /* set up pointers to cypher blocks */
962 init_owf_info(&id->lm_owf, lm_cypher);
963 init_owf_info(&id->nt_owf, nt_cypher);
965 init_unistr2(&id->uni_domain_name, domain_name, len_domain_name);
966 init_unistr2(&id->uni_user_name, user_name, len_user_name);
967 init_unistr2(&id->uni_wksta_name, wksta_name, len_wksta_name);
970 /*******************************************************************
971 Reads or writes an NET_ID_INFO_1 structure.
972 ********************************************************************/
974 static BOOL net_io_id_info1(const char *desc, NET_ID_INFO_1 *id, prs_struct *ps, int depth)
979 prs_debug(ps, depth, desc, "net_io_id_info1");
985 if(!prs_uint32("ptr_id_info1", ps, depth, &id->ptr_id_info1))
988 if (id->ptr_id_info1 != 0) {
989 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
992 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
994 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
997 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
999 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1002 if(!smb_io_owf_info("", &id->lm_owf, ps, depth))
1004 if(!smb_io_owf_info("", &id->nt_owf, ps, depth))
1007 if(!smb_io_unistr2("unistr2", &id->uni_domain_name,
1008 id->hdr_domain_name.buffer, ps, depth))
1010 if(!smb_io_unistr2("unistr2", &id->uni_user_name,
1011 id->hdr_user_name.buffer, ps, depth))
1013 if(!smb_io_unistr2("unistr2", &id->uni_wksta_name,
1014 id->hdr_wksta_name.buffer, ps, depth))
1021 /*******************************************************************
1022 Inits a NET_ID_INFO_2 structure.
1024 This is a network logon packet. The log_id parameters
1025 are what an NT server would generate for LUID once the
1026 user is logged on. I don't think we care about them.
1028 Note that this has no access to the NT and LM hashed passwords,
1029 so it forwards the challenge, and the NT and LM responses (24
1030 bytes each) over the secure channel to the Domain controller
1031 for it to say yea or nay. This is the preferred method of
1032 checking for a logon as it doesn't export the password
1033 hashes to anyone who has compromised the secure channel. JRA.
1034 ********************************************************************/
1036 void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name,
1038 uint32 log_id_low, uint32 log_id_high,
1039 const char *user_name, const char *wksta_name,
1040 const uchar lm_challenge[8],
1041 const uchar * lm_chal_resp, size_t lm_chal_resp_len,
1042 const uchar * nt_chal_resp, size_t nt_chal_resp_len)
1044 size_t len_domain_name = strlen(domain_name);
1045 size_t len_user_name = strlen(user_name );
1046 size_t len_wksta_name = strlen(wksta_name );
1047 unsigned char lm_owf[24];
1048 unsigned char nt_owf[128];
1050 DEBUG(5,("init_id_info2: %d\n", __LINE__));
1052 id->ptr_id_info2 = 1;
1054 init_uni_hdr(&id->hdr_domain_name, len_domain_name);
1056 id->param_ctrl = param_ctrl;
1057 init_logon_id(&id->logon_id, log_id_low, log_id_high);
1059 init_uni_hdr(&id->hdr_user_name, len_user_name);
1060 init_uni_hdr(&id->hdr_wksta_name, len_wksta_name);
1063 /* oops. can only send what-ever-it-is direct */
1064 memcpy(nt_owf, nt_chal_resp, MIN(sizeof(nt_owf), nt_chal_resp_len));
1065 nt_chal_resp = nt_owf;
1068 /* oops. can only send what-ever-it-is direct */
1069 memcpy(lm_owf, lm_chal_resp, MIN(sizeof(lm_owf), lm_chal_resp_len));
1070 lm_chal_resp = lm_owf;
1073 memcpy(id->lm_chal, lm_challenge, sizeof(id->lm_chal));
1074 init_str_hdr(&id->hdr_nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len, (nt_chal_resp != NULL) ? 1 : 0);
1075 init_str_hdr(&id->hdr_lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len, (lm_chal_resp != NULL) ? 1 : 0);
1077 init_unistr2(&id->uni_domain_name, domain_name, len_domain_name);
1078 init_unistr2(&id->uni_user_name, user_name, len_user_name);
1079 init_unistr2(&id->uni_wksta_name, wksta_name, len_wksta_name);
1081 init_string2(&id->nt_chal_resp, (const char *)nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len);
1082 init_string2(&id->lm_chal_resp, (const char *)lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len);
1086 /*******************************************************************
1087 Reads or writes an NET_ID_INFO_2 structure.
1088 ********************************************************************/
1090 static BOOL net_io_id_info2(const char *desc, NET_ID_INFO_2 *id, prs_struct *ps, int depth)
1095 prs_debug(ps, depth, desc, "net_io_id_info2");
1101 if(!prs_uint32("ptr_id_info2", ps, depth, &id->ptr_id_info2))
1104 if (id->ptr_id_info2 != 0) {
1105 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
1108 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
1110 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
1113 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
1115 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1118 if(!prs_uint8s (False, "lm_chal", ps, depth, id->lm_chal, 8)) /* lm 8 byte challenge */
1121 if(!smb_io_strhdr("hdr_nt_chal_resp", &id->hdr_nt_chal_resp, ps, depth))
1123 if(!smb_io_strhdr("hdr_lm_chal_resp", &id->hdr_lm_chal_resp, ps, depth))
1126 if(!smb_io_unistr2("uni_domain_name", &id->uni_domain_name,
1127 id->hdr_domain_name.buffer, ps, depth))
1129 if(!smb_io_unistr2("uni_user_name ", &id->uni_user_name,
1130 id->hdr_user_name.buffer, ps, depth))
1132 if(!smb_io_unistr2("uni_wksta_name ", &id->uni_wksta_name,
1133 id->hdr_wksta_name.buffer, ps, depth))
1135 if(!smb_io_string2("nt_chal_resp", &id->nt_chal_resp,
1136 id->hdr_nt_chal_resp.buffer, ps, depth))
1138 if(!smb_io_string2("lm_chal_resp", &id->lm_chal_resp,
1139 id->hdr_lm_chal_resp.buffer, ps, depth))
1147 /*******************************************************************
1148 Inits a DOM_SAM_INFO structure.
1149 ********************************************************************/
1151 void init_sam_info(DOM_SAM_INFO *sam,
1152 const char *logon_srv, const char *comp_name,
1153 DOM_CRED *clnt_cred,
1154 DOM_CRED *rtn_cred, uint16 logon_level,
1155 NET_ID_INFO_CTR *ctr)
1157 DEBUG(5,("init_sam_info: %d\n", __LINE__));
1159 init_clnt_info2(&sam->client, logon_srv, comp_name, clnt_cred);
1161 if (rtn_cred != NULL) {
1162 sam->ptr_rtn_cred = 1;
1163 memcpy(&sam->rtn_cred, rtn_cred, sizeof(sam->rtn_cred));
1165 sam->ptr_rtn_cred = 0;
1168 sam->logon_level = logon_level;
1172 /*******************************************************************
1173 Reads or writes a DOM_SAM_INFO structure.
1174 ********************************************************************/
1176 static BOOL net_io_id_info_ctr(const char *desc, NET_ID_INFO_CTR **pp_ctr, prs_struct *ps, int depth)
1178 NET_ID_INFO_CTR *ctr = *pp_ctr;
1180 prs_debug(ps, depth, desc, "smb_io_sam_info");
1183 if (UNMARSHALLING(ps)) {
1184 ctr = *pp_ctr = (NET_ID_INFO_CTR *)prs_alloc_mem(ps, sizeof(NET_ID_INFO_CTR));
1192 /* don't 4-byte align here! */
1194 if(!prs_uint16("switch_value ", ps, depth, &ctr->switch_value))
1197 switch (ctr->switch_value) {
1199 if(!net_io_id_info1("", &ctr->auth.id1, ps, depth))
1203 if(!net_io_id_info2("", &ctr->auth.id2, ps, depth))
1208 DEBUG(4,("smb_io_sam_info: unknown switch_value!\n"));
1215 /*******************************************************************
1216 Reads or writes a DOM_SAM_INFO structure.
1217 ********************************************************************/
1219 static BOOL smb_io_sam_info(const char *desc, DOM_SAM_INFO *sam, prs_struct *ps, int depth)
1224 prs_debug(ps, depth, desc, "smb_io_sam_info");
1230 if(!smb_io_clnt_info2("", &sam->client, ps, depth))
1233 if(!prs_uint32("ptr_rtn_cred ", ps, depth, &sam->ptr_rtn_cred))
1235 if(!smb_io_cred("", &sam->rtn_cred, ps, depth))
1238 if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level))
1241 if (sam->logon_level != 0) {
1242 if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth))
1249 /*************************************************************************
1250 Inits a NET_USER_INFO_3 structure.
1252 This is a network logon reply packet, and contains much information about
1253 the user. This information is passed as a (very long) paramater list
1254 to avoid having to link in the PASSDB code to every program that deals
1256 *************************************************************************/
1258 void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
1262 const char* user_name,
1263 const char* full_name,
1264 const char* home_dir,
1265 const char* dir_drive,
1266 const char* logon_script,
1267 const char* profile_path,
1269 time_t unix_logon_time,
1270 time_t unix_logoff_time,
1271 time_t unix_kickoff_time,
1272 time_t unix_pass_last_set_time,
1273 time_t unix_pass_can_change_time,
1274 time_t unix_pass_must_change_time,
1276 uint16 logon_count, uint16 bad_pw_count,
1277 uint32 num_groups, const DOM_GID *gids,
1278 uint32 user_flgs, uchar sess_key[16],
1279 const char *logon_srv, const char *logon_dom,
1280 const DOM_SID *dom_sid, const char *other_sids)
1282 /* only cope with one "other" sid, right now. */
1283 /* need to count the number of space-delimited sids */
1285 int num_other_sids = 0;
1287 NTTIME logon_time, logoff_time, kickoff_time,
1288 pass_last_set_time, pass_can_change_time,
1289 pass_must_change_time;
1291 int len_user_name, len_full_name, len_home_dir,
1292 len_dir_drive, len_logon_script, len_profile_path;
1294 int len_logon_srv = strlen(logon_srv);
1295 int len_logon_dom = strlen(logon_dom);
1297 len_user_name = strlen(user_name );
1298 len_full_name = strlen(full_name );
1299 len_home_dir = strlen(home_dir );
1300 len_dir_drive = strlen(dir_drive );
1301 len_logon_script = strlen(logon_script);
1302 len_profile_path = strlen(profile_path);
1307 usr->ptr_user_info = 1; /* yes, we're bothering to put USER_INFO data here */
1311 /* Create NTTIME structs */
1312 unix_to_nt_time (&logon_time, unix_logon_time);
1313 unix_to_nt_time (&logoff_time, unix_logoff_time);
1314 unix_to_nt_time (&kickoff_time, unix_kickoff_time);
1315 unix_to_nt_time (&pass_last_set_time, unix_pass_last_set_time);
1316 unix_to_nt_time (&pass_can_change_time, unix_pass_can_change_time);
1317 unix_to_nt_time (&pass_must_change_time, unix_pass_must_change_time);
1319 usr->logon_time = logon_time;
1320 usr->logoff_time = logoff_time;
1321 usr->kickoff_time = kickoff_time;
1322 usr->pass_last_set_time = pass_last_set_time;
1323 usr->pass_can_change_time = pass_can_change_time;
1324 usr->pass_must_change_time = pass_must_change_time;
1326 init_uni_hdr(&usr->hdr_user_name, len_user_name);
1327 init_uni_hdr(&usr->hdr_full_name, len_full_name);
1328 init_uni_hdr(&usr->hdr_logon_script, len_logon_script);
1329 init_uni_hdr(&usr->hdr_profile_path, len_profile_path);
1330 init_uni_hdr(&usr->hdr_home_dir, len_home_dir);
1331 init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive);
1333 usr->logon_count = logon_count;
1334 usr->bad_pw_count = bad_pw_count;
1336 usr->user_rid = user_rid;
1337 usr->group_rid = group_rid;
1338 usr->num_groups = num_groups;
1340 usr->buffer_groups = 1; /* indicates fill in groups, below, even if there are none */
1341 usr->user_flgs = user_flgs;
1343 if (sess_key != NULL)
1344 memcpy(usr->user_sess_key, sess_key, sizeof(usr->user_sess_key));
1346 memset((char *)usr->user_sess_key, '\0', sizeof(usr->user_sess_key));
1348 init_uni_hdr(&usr->hdr_logon_srv, len_logon_srv);
1349 init_uni_hdr(&usr->hdr_logon_dom, len_logon_dom);
1351 usr->buffer_dom_id = dom_sid ? 1 : 0; /* yes, we're bothering to put a domain SID in */
1353 memset((char *)usr->padding, '\0', sizeof(usr->padding));
1355 num_other_sids = init_dom_sid2s(ctx, other_sids, &usr->other_sids);
1357 usr->num_other_sids = num_other_sids;
1358 usr->buffer_other_sids = (num_other_sids != 0) ? 1 : 0;
1360 init_unistr2(&usr->uni_user_name, user_name, len_user_name);
1361 init_unistr2(&usr->uni_full_name, full_name, len_full_name);
1362 init_unistr2(&usr->uni_logon_script, logon_script, len_logon_script);
1363 init_unistr2(&usr->uni_profile_path, profile_path, len_profile_path);
1364 init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir);
1365 init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive);
1367 usr->num_groups2 = num_groups;
1369 usr->gids = (DOM_GID *)talloc_zero(ctx,sizeof(DOM_GID) * (num_groups));
1370 if (usr->gids == NULL && num_groups>0)
1373 for (i = 0; i < num_groups; i++)
1374 usr->gids[i] = gids[i];
1376 init_unistr2(&usr->uni_logon_srv, logon_srv, len_logon_srv);
1377 init_unistr2(&usr->uni_logon_dom, logon_dom, len_logon_dom);
1379 init_dom_sid2(&usr->dom_sid, dom_sid);
1380 /* "other" sids are set up above */
1383 /*******************************************************************
1384 This code has been modified to cope with a NET_USER_INFO_2 - which is
1385 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1386 We use validation level to determine if we're marshalling a info 2 or
1387 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1388 Jacobsen at HP. JRA.
1389 ********************************************************************/
1391 BOOL net_io_user_info3(const char *desc, NET_USER_INFO_3 *usr, prs_struct *ps,
1392 int depth, uint16 validation_level)
1399 prs_debug(ps, depth, desc, "net_io_user_info3");
1402 if (UNMARSHALLING(ps))
1408 if(!prs_uint32("ptr_user_info ", ps, depth, &usr->ptr_user_info))
1411 if (usr->ptr_user_info == 0)
1414 if(!smb_io_time("logon time", &usr->logon_time, ps, depth)) /* logon time */
1416 if(!smb_io_time("logoff time", &usr->logoff_time, ps, depth)) /* logoff time */
1418 if(!smb_io_time("kickoff time", &usr->kickoff_time, ps, depth)) /* kickoff time */
1420 if(!smb_io_time("last set time", &usr->pass_last_set_time, ps, depth)) /* password last set time */
1422 if(!smb_io_time("can change time", &usr->pass_can_change_time , ps, depth)) /* password can change time */
1424 if(!smb_io_time("must change time", &usr->pass_must_change_time, ps, depth)) /* password must change time */
1427 if(!smb_io_unihdr("hdr_user_name", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
1429 if(!smb_io_unihdr("hdr_full_name", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
1431 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
1433 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
1435 if(!smb_io_unihdr("hdr_home_dir", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
1437 if(!smb_io_unihdr("hdr_dir_drive", &usr->hdr_dir_drive, ps, depth)) /* home directory drive unicode string header */
1440 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count)) /* logon count */
1442 if(!prs_uint16("bad_pw_count ", ps, depth, &usr->bad_pw_count)) /* bad password count */
1445 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User RID */
1447 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group RID */
1449 if(!prs_uint32("num_groups ", ps, depth, &usr->num_groups)) /* num groups */
1451 if(!prs_uint32("buffer_groups ", ps, depth, &usr->buffer_groups)) /* undocumented buffer pointer to groups. */
1453 if(!prs_uint32("user_flgs ", ps, depth, &usr->user_flgs)) /* user flags */
1456 if(!prs_uint8s(False, "user_sess_key", ps, depth, usr->user_sess_key, 16)) /* user session key */
1459 if(!smb_io_unihdr("hdr_logon_srv", &usr->hdr_logon_srv, ps, depth)) /* logon server unicode string header */
1461 if(!smb_io_unihdr("hdr_logon_dom", &usr->hdr_logon_dom, ps, depth)) /* logon domain unicode string header */
1464 if(!prs_uint32("buffer_dom_id ", ps, depth, &usr->buffer_dom_id)) /* undocumented logon domain id pointer */
1466 if(!prs_uint8s (False, "padding ", ps, depth, usr->padding, 40)) /* unused padding bytes? */
1469 if (validation_level == 3) {
1470 if(!prs_uint32("num_other_sids", ps, depth, &usr->num_other_sids)) /* 0 - num_sids */
1472 if(!prs_uint32("buffer_other_sids", ps, depth, &usr->buffer_other_sids)) /* NULL - undocumented pointer to SIDs. */
1475 if (UNMARSHALLING(ps)) {
1476 usr->num_other_sids = 0;
1477 usr->buffer_other_sids = 0;
1481 if(!smb_io_unistr2("uni_user_name", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
1483 if(!smb_io_unistr2("uni_full_name", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
1485 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
1487 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
1489 if(!smb_io_unistr2("uni_home_dir", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
1491 if(!smb_io_unistr2("uni_dir_drive", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
1496 if(!prs_uint32("num_groups2 ", ps, depth, &usr->num_groups2)) /* num groups */
1499 if (UNMARSHALLING(ps) && usr->num_groups2 > 0) {
1500 usr->gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_groups2);
1501 if (usr->gids == NULL)
1505 for (i = 0; i < usr->num_groups2; i++) {
1506 if(!smb_io_gid("", &usr->gids[i], ps, depth)) /* group info */
1510 if(!smb_io_unistr2("uni_logon_srv", &usr->uni_logon_srv, usr->hdr_logon_srv.buffer, ps, depth)) /* logon server unicode string */
1512 if(!smb_io_unistr2("uni_logon_dom", &usr->uni_logon_dom, usr->hdr_logon_srv.buffer, ps, depth)) /* logon domain unicode string */
1515 if(!smb_io_dom_sid2("", &usr->dom_sid, ps, depth)) /* domain SID */
1518 if (usr->num_other_sids) {
1520 if (UNMARSHALLING(ps)) {
1521 usr->other_sids = (DOM_SID2 *)prs_alloc_mem(ps, sizeof(DOM_SID2)*usr->num_other_sids);
1522 if (usr->other_sids == NULL)
1526 if(!prs_uint32("num_other_groups", ps, depth, &usr->num_other_groups))
1529 if (UNMARSHALLING(ps) && usr->num_other_groups > 0) {
1530 usr->other_gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_other_groups);
1531 if (usr->other_gids == NULL)
1535 for (i = 0; i < usr->num_other_groups; i++) {
1536 if(!smb_io_gid("", &usr->other_gids[i], ps, depth)) /* other GIDs */
1539 for (i = 0; i < usr->num_other_sids; i++) {
1540 if(!smb_io_dom_sid2("", &usr->other_sids[i], ps, depth)) /* other domain SIDs */
1548 /*******************************************************************
1549 Reads or writes a structure.
1550 ********************************************************************/
1552 BOOL net_io_q_sam_logon(const char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth)
1557 prs_debug(ps, depth, desc, "net_io_q_sam_logon");
1563 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth))
1566 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
1572 /*******************************************************************
1573 Reads or writes a structure.
1574 ********************************************************************/
1576 BOOL net_io_r_sam_logon(const char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth)
1581 prs_debug(ps, depth, desc, "net_io_r_sam_logon");
1584 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1586 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1589 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
1594 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1595 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value))
1598 if (r_l->switch_value != 0) {
1599 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value))
1604 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
1607 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1616 /*******************************************************************
1617 Reads or writes a structure.
1618 ********************************************************************/
1620 BOOL net_io_q_sam_logoff(const char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth)
1625 prs_debug(ps, depth, desc, "net_io_q_sam_logoff");
1631 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth)) /* domain SID */
1637 /*******************************************************************
1638 Reads or writes a structure.
1639 ********************************************************************/
1641 BOOL net_io_r_sam_logoff(const char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth)
1646 prs_debug(ps, depth, desc, "net_io_r_sam_logoff");
1652 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1654 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1657 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1663 /*******************************************************************
1664 makes a NET_Q_SAM_SYNC structure.
1665 ********************************************************************/
1666 BOOL init_net_q_sam_sync(NET_Q_SAM_SYNC * q_s, const char *srv_name,
1667 const char *cli_name, DOM_CRED *cli_creds,
1668 DOM_CRED *ret_creds, uint32 database_id,
1671 DEBUG(5, ("init_q_sam_sync\n"));
1673 init_unistr2(&q_s->uni_srv_name, srv_name, strlen(srv_name) + 1);
1674 init_unistr2(&q_s->uni_cli_name, cli_name, strlen(cli_name) + 1);
1677 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
1680 memcpy(&q_s->ret_creds, ret_creds, sizeof(q_s->ret_creds));
1682 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
1684 q_s->database_id = database_id;
1685 q_s->restart_state = 0;
1686 q_s->sync_context = next_rid;
1687 q_s->max_size = 0xffff;
1692 /*******************************************************************
1693 reads or writes a structure.
1694 ********************************************************************/
1695 BOOL net_io_q_sam_sync(const char *desc, NET_Q_SAM_SYNC * q_s, prs_struct *ps,
1698 prs_debug(ps, depth, desc, "net_io_q_sam_sync");
1701 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
1703 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
1706 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
1708 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
1711 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
1713 if (!prs_uint32("restart_state", ps, depth, &q_s->restart_state))
1715 if (!prs_uint32("sync_context ", ps, depth, &q_s->sync_context))
1718 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
1724 /*******************************************************************
1725 reads or writes a structure.
1726 ********************************************************************/
1727 static BOOL net_io_sam_delta_hdr(const char *desc, SAM_DELTA_HDR * delta,
1728 prs_struct *ps, int depth)
1730 prs_debug(ps, depth, desc, "net_io_sam_delta_hdr");
1733 if (!prs_uint16("type", ps, depth, &delta->type))
1735 if (!prs_uint16("type2", ps, depth, &delta->type2))
1737 if (!prs_uint32("target_rid", ps, depth, &delta->target_rid))
1740 if (!prs_uint32("type3", ps, depth, &delta->type3))
1743 /* Not sure why we need this but it seems to be necessary to get
1744 sam deltas working. */
1746 if (delta->type != 0x16) {
1747 if (!prs_uint32("ptr_delta", ps, depth, &delta->ptr_delta))
1754 /*******************************************************************
1755 reads or writes a structure.
1756 ********************************************************************/
1757 static BOOL net_io_sam_delta_mod_count(const char *desc, SAM_DELTA_MOD_COUNT *info,
1758 prs_struct *ps, int depth)
1760 prs_debug(ps, depth, desc, "net_io_sam_delta_stamp");
1763 if (!prs_uint32("seqnum", ps, depth, &info->seqnum))
1765 if (!prs_uint32("dom_mod_count_ptr", ps, depth,
1766 &info->dom_mod_count_ptr))
1769 if (info->dom_mod_count_ptr) {
1770 if (!prs_uint64("dom_mod_count", ps, depth,
1771 &info->dom_mod_count))
1778 /*******************************************************************
1779 reads or writes a structure.
1780 ********************************************************************/
1781 static BOOL net_io_sam_domain_info(const char *desc, SAM_DOMAIN_INFO * info,
1782 prs_struct *ps, int depth)
1784 prs_debug(ps, depth, desc, "net_io_sam_domain_info");
1787 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
1789 if (!smb_io_unihdr("hdr_oem_info", &info->hdr_oem_info, ps, depth))
1792 if (!prs_uint64("force_logoff", ps, depth, &info->force_logoff))
1794 if (!prs_uint16("min_pwd_len", ps, depth, &info->min_pwd_len))
1796 if (!prs_uint16("pwd_history_len", ps, depth, &info->pwd_history_len))
1798 if (!prs_uint64("max_pwd_age", ps, depth, &info->max_pwd_age))
1800 if (!prs_uint64("min_pwd_age", ps, depth, &info->min_pwd_age))
1802 if (!prs_uint64("dom_mod_count", ps, depth, &info->dom_mod_count))
1804 if (!smb_io_time("creation_time", &info->creation_time, ps, depth))
1807 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
1809 if (!smb_io_unihdr("hdr_unknown", &info->hdr_unknown, ps, depth))
1812 if (ps->data_offset + 40 > ps->buffer_size)
1814 ps->data_offset += 40;
1816 if (!smb_io_unistr2("uni_dom_name", &info->uni_dom_name,
1817 info->hdr_dom_name.buffer, ps, depth))
1819 if (!smb_io_unistr2("buf_oem_info", &info->buf_oem_info,
1820 info->hdr_oem_info.buffer, ps, depth))
1823 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
1824 info->hdr_sec_desc.buffer, ps, depth))
1826 if (!smb_io_unistr2("buf_unknown", &info->buf_unknown,
1827 info->hdr_unknown.buffer, ps, depth))
1833 /*******************************************************************
1834 reads or writes a structure.
1835 ********************************************************************/
1836 static BOOL net_io_sam_group_info(const char *desc, SAM_GROUP_INFO * info,
1837 prs_struct *ps, int depth)
1839 prs_debug(ps, depth, desc, "net_io_sam_group_info");
1842 if (!smb_io_unihdr("hdr_grp_name", &info->hdr_grp_name, ps, depth))
1844 if (!smb_io_gid("gid", &info->gid, ps, depth))
1846 if (!smb_io_unihdr("hdr_grp_desc", &info->hdr_grp_desc, ps, depth))
1848 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
1851 if (ps->data_offset + 48 > ps->buffer_size)
1853 ps->data_offset += 48;
1855 if (!smb_io_unistr2("uni_grp_name", &info->uni_grp_name,
1856 info->hdr_grp_name.buffer, ps, depth))
1858 if (!smb_io_unistr2("uni_grp_desc", &info->uni_grp_desc,
1859 info->hdr_grp_desc.buffer, ps, depth))
1861 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
1862 info->hdr_sec_desc.buffer, ps, depth))
1868 /*******************************************************************
1869 reads or writes a structure.
1870 ********************************************************************/
1871 static BOOL net_io_sam_passwd_info(const char *desc, SAM_PWD * pwd,
1872 prs_struct *ps, int depth)
1874 prs_debug(ps, depth, desc, "net_io_sam_passwd_info");
1877 if (!prs_uint32("unk_0 ", ps, depth, &pwd->unk_0))
1880 if (!smb_io_unihdr("hdr_lm_pwd", &pwd->hdr_lm_pwd, ps, depth))
1882 if (!prs_uint8s(False, "buf_lm_pwd", ps, depth, pwd->buf_lm_pwd, 16))
1885 if (!smb_io_unihdr("hdr_nt_pwd", &pwd->hdr_nt_pwd, ps, depth))
1887 if (!prs_uint8s(False, "buf_nt_pwd", ps, depth, pwd->buf_nt_pwd, 16))
1890 if (!smb_io_unihdr("", &pwd->hdr_empty_lm, ps, depth))
1892 if (!smb_io_unihdr("", &pwd->hdr_empty_nt, ps, depth))
1898 /*******************************************************************
1899 makes a SAM_ACCOUNT_INFO structure.
1900 ********************************************************************/
1901 BOOL make_sam_account_info(SAM_ACCOUNT_INFO * info,
1902 const UNISTR2 *user_name,
1903 const UNISTR2 *full_name,
1904 uint32 user_rid, uint32 group_rid,
1905 const UNISTR2 *home_dir,
1906 const UNISTR2 *dir_drive,
1907 const UNISTR2 *log_scr,
1908 const UNISTR2 *desc,
1910 const UNISTR2 *prof_path,
1911 const UNISTR2 *wkstas,
1912 const UNISTR2 *unk_str, const UNISTR2 *mung_dial)
1914 int len_user_name = user_name != NULL ? user_name->uni_str_len : 0;
1915 int len_full_name = full_name != NULL ? full_name->uni_str_len : 0;
1916 int len_home_dir = home_dir != NULL ? home_dir->uni_str_len : 0;
1917 int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0;
1918 int len_logon_script = log_scr != NULL ? log_scr->uni_str_len : 0;
1919 int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0;
1920 int len_description = desc != NULL ? desc->uni_str_len : 0;
1921 int len_workstations = wkstas != NULL ? wkstas->uni_str_len : 0;
1922 int len_unknown_str = unk_str != NULL ? unk_str->uni_str_len : 0;
1923 int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0;
1925 DEBUG(5, ("make_sam_account_info\n"));
1927 make_uni_hdr(&info->hdr_acct_name, len_user_name);
1928 make_uni_hdr(&info->hdr_full_name, len_full_name);
1929 make_uni_hdr(&info->hdr_home_dir, len_home_dir);
1930 make_uni_hdr(&info->hdr_dir_drive, len_dir_drive);
1931 make_uni_hdr(&info->hdr_logon_script, len_logon_script);
1932 make_uni_hdr(&info->hdr_profile, len_profile_path);
1933 make_uni_hdr(&info->hdr_acct_desc, len_description);
1934 make_uni_hdr(&info->hdr_workstations, len_workstations);
1935 make_uni_hdr(&info->hdr_comment, len_unknown_str);
1936 make_uni_hdr(&info->hdr_parameters, len_munged_dial);
1939 make_bufhdr2(&info->hdr_sec_desc, 0, 0, 0);
1941 info->user_rid = user_rid;
1942 info->group_rid = group_rid;
1944 init_nt_time(&info->logon_time);
1945 init_nt_time(&info->logoff_time);
1946 init_nt_time(&info->pwd_last_set_time);
1947 init_nt_time(&info->acct_expiry_time);
1949 info->logon_divs = 0xA8;
1950 info->ptr_logon_hrs = 0; /* Don't care right now */
1952 info->bad_pwd_count = 0;
1953 info->logon_count = 0;
1954 info->acb_info = acb_info;
1955 info->nt_pwd_present = 0;
1956 info->lm_pwd_present = 0;
1957 info->pwd_expired = 0;
1961 info->unknown1 = 0x4EC;
1964 copy_unistr2(&info->uni_acct_name, user_name);
1965 copy_unistr2(&info->uni_full_name, full_name);
1966 copy_unistr2(&info->uni_home_dir, home_dir);
1967 copy_unistr2(&info->uni_dir_drive, dir_drive);
1968 copy_unistr2(&info->uni_logon_script, log_scr);
1969 copy_unistr2(&info->uni_profile, prof_path);
1970 copy_unistr2(&info->uni_acct_desc, desc);
1971 copy_unistr2(&info->uni_workstations, wkstas);
1972 copy_unistr2(&info->uni_comment, unk_str);
1973 copy_unistr2(&info->uni_parameters, mung_dial);
1978 /*******************************************************************
1979 reads or writes a structure.
1980 ********************************************************************/
1981 static BOOL net_io_sam_account_info(const char *desc, uint8 sess_key[16],
1982 SAM_ACCOUNT_INFO * info, prs_struct *ps,
1985 BUFHDR2 hdr_priv_data;
1988 prs_debug(ps, depth, desc, "net_io_sam_account_info");
1991 if (!smb_io_unihdr("hdr_acct_name", &info->hdr_acct_name, ps, depth))
1993 if (!smb_io_unihdr("hdr_full_name", &info->hdr_full_name, ps, depth))
1996 if (!prs_uint32("user_rid ", ps, depth, &info->user_rid))
1998 if (!prs_uint32("group_rid", ps, depth, &info->group_rid))
2001 if (!smb_io_unihdr("hdr_home_dir ", &info->hdr_home_dir, ps, depth))
2003 if (!smb_io_unihdr("hdr_dir_drive", &info->hdr_dir_drive, ps, depth))
2005 if (!smb_io_unihdr("hdr_logon_script", &info->hdr_logon_script, ps,
2009 if (!smb_io_unihdr("hdr_acct_desc", &info->hdr_acct_desc, ps, depth))
2011 if (!smb_io_unihdr("hdr_workstations", &info->hdr_workstations, ps,
2015 if (!smb_io_time("logon_time", &info->logon_time, ps, depth))
2017 if (!smb_io_time("logoff_time", &info->logoff_time, ps, depth))
2020 if (!prs_uint32("logon_divs ", ps, depth, &info->logon_divs))
2022 if (!prs_uint32("ptr_logon_hrs", ps, depth, &info->ptr_logon_hrs))
2025 if (!prs_uint16("bad_pwd_count", ps, depth, &info->bad_pwd_count))
2027 if (!prs_uint16("logon_count", ps, depth, &info->logon_count))
2029 if (!smb_io_time("pwd_last_set_time", &info->pwd_last_set_time, ps,
2032 if (!smb_io_time("acct_expiry_time", &info->acct_expiry_time, ps,
2036 if (!prs_uint32("acb_info", ps, depth, &info->acb_info))
2038 if (!prs_uint8s(False, "nt_pwd", ps, depth, info->nt_pwd, 16))
2040 if (!prs_uint8s(False, "lm_pwd", ps, depth, info->lm_pwd, 16))
2042 if (!prs_uint8("lm_pwd_present", ps, depth, &info->lm_pwd_present))
2044 if (!prs_uint8("nt_pwd_present", ps, depth, &info->nt_pwd_present))
2046 if (!prs_uint8("pwd_expired", ps, depth, &info->pwd_expired))
2049 if (!smb_io_unihdr("hdr_comment", &info->hdr_comment, ps, depth))
2051 if (!smb_io_unihdr("hdr_parameters", &info->hdr_parameters, ps,
2054 if (!prs_uint16("country", ps, depth, &info->country))
2056 if (!prs_uint16("codepage", ps, depth, &info->codepage))
2059 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data, ps, depth))
2061 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2063 if (!smb_io_unihdr("hdr_profile", &info->hdr_profile, ps, depth))
2066 for (i = 0; i < 3; i++)
2068 if (!smb_io_unihdr("hdr_reserved", &info->hdr_reserved[i],
2073 for (i = 0; i < 4; i++)
2075 if (!prs_uint32("dw_reserved", ps, depth,
2076 &info->dw_reserved[i]))
2080 if (!smb_io_unistr2("uni_acct_name", &info->uni_acct_name,
2081 info->hdr_acct_name.buffer, ps, depth))
2084 if (!smb_io_unistr2("uni_full_name", &info->uni_full_name,
2085 info->hdr_full_name.buffer, ps, depth))
2088 if (!smb_io_unistr2("uni_home_dir ", &info->uni_home_dir,
2089 info->hdr_home_dir.buffer, ps, depth))
2092 if (!smb_io_unistr2("uni_dir_drive", &info->uni_dir_drive,
2093 info->hdr_dir_drive.buffer, ps, depth))
2096 if (!smb_io_unistr2("uni_logon_script", &info->uni_logon_script,
2097 info->hdr_logon_script.buffer, ps, depth))
2100 if (!smb_io_unistr2("uni_acct_desc", &info->uni_acct_desc,
2101 info->hdr_acct_desc.buffer, ps, depth))
2104 if (!smb_io_unistr2("uni_workstations", &info->uni_workstations,
2105 info->hdr_workstations.buffer, ps, depth))
2109 if (!prs_uint32("unknown1", ps, depth, &info->unknown1))
2111 if (!prs_uint32("unknown2", ps, depth, &info->unknown2))
2114 if (!smb_io_buffer4("buf_logon_hrs", &info->buf_logon_hrs,
2115 info->ptr_logon_hrs, ps, depth))
2118 if (!smb_io_unistr2("uni_comment", &info->uni_comment,
2119 info->hdr_comment.buffer, ps, depth))
2122 if (!smb_io_unistr2("uni_parameters", &info->uni_parameters,
2123 info->hdr_parameters.buffer, ps, depth))
2126 if (hdr_priv_data.buffer != 0)
2130 if (!prs_uint32("pwd_len", ps, depth, &len))
2132 old_offset = ps->data_offset;
2138 if (!prs_hash1(ps, ps->data_offset, sess_key, len))
2141 if (!net_io_sam_passwd_info("pass", &info->pass,
2148 if (!prs_hash1(ps, old_offset, sess_key, len))
2152 if (old_offset + len > ps->buffer_size)
2154 ps->data_offset = old_offset + len;
2156 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2157 info->hdr_sec_desc.buffer, ps, depth))
2160 if (!smb_io_unistr2("uni_profile", &info->uni_profile,
2161 info->hdr_profile.buffer, ps, depth))
2169 /*******************************************************************
2170 reads or writes a structure.
2171 ********************************************************************/
2172 static BOOL net_io_sam_group_mem_info(const char *desc, SAM_GROUP_MEM_INFO * info,
2173 prs_struct *ps, int depth)
2178 prs_debug(ps, depth, desc, "net_io_sam_group_mem_info");
2182 if (!prs_uint32("ptr_rids ", ps, depth, &info->ptr_rids))
2184 if (!prs_uint32("ptr_attribs", ps, depth, &info->ptr_attribs))
2186 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2189 if (ps->data_offset + 16 > ps->buffer_size)
2191 ps->data_offset += 16;
2193 if (info->ptr_rids != 0)
2195 if (!prs_uint32("num_members2", ps, depth,
2196 &info->num_members2))
2199 if (info->num_members2 != info->num_members)
2205 info->rids = talloc(ps->mem_ctx, sizeof(uint32) *
2206 info->num_members2);
2208 if (info->rids == NULL) {
2209 DEBUG(0, ("out of memory allocating %d rids\n",
2210 info->num_members2));
2214 for (i = 0; i < info->num_members2; i++)
2216 slprintf(tmp, sizeof(tmp) - 1, "rids[%02d]", i);
2217 if (!prs_uint32(tmp, ps, depth, &info->rids[i]))
2222 if (info->ptr_attribs != 0)
2224 if (!prs_uint32("num_members3", ps, depth,
2225 &info->num_members3))
2227 if (info->num_members3 != info->num_members)
2233 info->attribs = talloc(ps->mem_ctx, sizeof(uint32) *
2234 info->num_members3);
2236 if (info->attribs == NULL) {
2237 DEBUG(0, ("out of memory allocating %d attribs\n",
2238 info->num_members3));
2242 for (i = 0; i < info->num_members3; i++)
2244 slprintf(tmp, sizeof(tmp) - 1, "attribs[%02d]", i);
2245 if (!prs_uint32(tmp, ps, depth, &info->attribs[i]))
2253 /*******************************************************************
2254 reads or writes a structure.
2255 ********************************************************************/
2256 static BOOL net_io_sam_alias_info(const char *desc, SAM_ALIAS_INFO * info,
2257 prs_struct *ps, int depth)
2259 prs_debug(ps, depth, desc, "net_io_sam_alias_info");
2262 if (!smb_io_unihdr("hdr_als_name", &info->hdr_als_name, ps, depth))
2264 if (!prs_uint32("als_rid", ps, depth, &info->als_rid))
2266 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2268 if (!smb_io_unihdr("hdr_als_desc", &info->hdr_als_desc, ps, depth))
2271 if (ps->data_offset + 40 > ps->buffer_size)
2273 ps->data_offset += 40;
2275 if (!smb_io_unistr2("uni_als_name", &info->uni_als_name,
2276 info->hdr_als_name.buffer, ps, depth))
2278 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2279 info->hdr_sec_desc.buffer, ps, depth))
2282 if (info->hdr_als_desc.buffer != 0) {
2283 if (!smb_io_unistr2("uni_als_desc", &info->uni_als_desc,
2284 info->hdr_als_name.buffer, ps, depth))
2291 /*******************************************************************
2292 reads or writes a structure.
2293 ********************************************************************/
2294 static BOOL net_io_sam_alias_mem_info(const char *desc, SAM_ALIAS_MEM_INFO * info,
2295 prs_struct *ps, int depth)
2300 prs_debug(ps, depth, desc, "net_io_sam_alias_mem_info");
2304 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2306 if (!prs_uint32("ptr_members", ps, depth, &info->ptr_members))
2309 if (info->ptr_members != 0)
2311 if (ps->data_offset + 16 > ps->buffer_size)
2313 ps->data_offset += 16;
2315 if (!prs_uint32("num_sids", ps, depth, &info->num_sids))
2317 if (info->num_sids != info->num_members)
2323 info->ptr_sids = talloc(ps->mem_ctx, sizeof(uint32) *
2326 if (info->ptr_sids == NULL) {
2327 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2332 for (i = 0; i < info->num_sids; i++)
2334 slprintf(tmp, sizeof(tmp) - 1, "ptr_sids[%02d]", i);
2335 if (!prs_uint32(tmp, ps, depth, &info->ptr_sids[i]))
2339 info->sids = talloc(ps->mem_ctx, sizeof(DOM_SID2) *
2342 if (info->sids == NULL) {
2343 DEBUG(0, ("error allocating %d sids\n",
2348 for (i = 0; i < info->num_sids; i++)
2350 if (info->ptr_sids[i] != 0)
2352 slprintf(tmp, sizeof(tmp) - 1, "sids[%02d]",
2354 if (!smb_io_dom_sid2(tmp, &info->sids[i],
2364 /*******************************************************************
2365 reads or writes a structure.
2366 ********************************************************************/
2367 static BOOL net_io_sam_policy_info(const char *desc, SAM_DELTA_POLICY *info,
2368 prs_struct *ps, int depth)
2371 prs_debug(ps, depth, desc, "net_io_sam_policy_info");
2377 if (!prs_uint32("max_log_size", ps, depth, &info->max_log_size))
2379 if (!prs_uint64("audit_retention_period", ps, depth,
2380 &info->audit_retention_period))
2382 if (!prs_uint32("auditing_mode", ps, depth, &info->auditing_mode))
2384 if (!prs_uint32("num_events", ps, depth, &info->num_events))
2386 if (!prs_uint32("ptr_events", ps, depth, &info->ptr_events))
2389 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
2392 if (!prs_uint32("sid_ptr", ps, depth, &info->sid_ptr))
2395 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
2397 if (!prs_uint32("non_paged_pool_limit", ps, depth,
2398 &info->non_paged_pool_limit))
2400 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
2402 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
2404 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
2406 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
2408 if (!smb_io_time("modify_time", &info->modify_time, ps, depth))
2410 if (!smb_io_time("create_time", &info->create_time, ps, depth))
2412 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2415 for (i=0; i<4; i++) {
2417 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
2421 for (i=0; i<4; i++) {
2423 if (!prs_uint32("reserved", ps, depth, &reserved))
2427 if (!prs_uint32("num_event_audit_options", ps, depth,
2428 &info->num_event_audit_options))
2431 for (i=0; i<info->num_event_audit_options; i++)
2432 if (!prs_uint32("event_audit_option", ps, depth,
2433 &info->event_audit_option))
2436 if (!smb_io_unistr2("domain_name", &info->domain_name, True, ps, depth))
2439 if(!smb_io_dom_sid2("domain_sid", &info->domain_sid, ps, depth))
2442 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2443 info->hdr_sec_desc.buffer, ps, depth))
2450 /*******************************************************************
2451 reads or writes a structure.
2452 ********************************************************************/
2453 static BOOL net_io_sam_trustdoms_info(const char *desc, SAM_DELTA_TRUSTDOMS *info,
2454 prs_struct *ps, int depth)
2458 prs_debug(ps, depth, desc, "net_io_sam_trustdoms_info");
2464 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2467 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2470 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2473 if(!smb_io_unihdr("hdr_domain", &info->hdr_domain, ps, depth))
2476 if(!prs_uint32("unknown0", ps, depth, &info->unknown0))
2478 if(!prs_uint32("unknown1", ps, depth, &info->unknown1))
2480 if(!prs_uint32("unknown2", ps, depth, &info->unknown2))
2483 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2485 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2488 for (i=0; i<12; i++)
2489 if(!prs_uint32("unknown3", ps, depth, &info->unknown3))
2492 if (!smb_io_unistr2("domain", &info->domain, True, ps, depth))
2498 /*******************************************************************
2499 reads or writes a structure.
2500 ********************************************************************/
2501 static BOOL net_io_sam_secret_info(const char *desc, SAM_DELTA_SECRET *info,
2502 prs_struct *ps, int depth)
2506 prs_debug(ps, depth, desc, "net_io_sam_secret_info");
2512 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2515 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2518 if (!smb_io_unistr2("secret", &info->secret, True, ps, depth))
2524 if(!prs_uint32("count1", ps, depth, &info->count1))
2526 if(!prs_uint32("count2", ps, depth, &info->count2))
2528 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2532 if(!smb_io_time("time1", &info->time1, ps, depth)) /* logon time */
2534 if(!prs_uint32("count3", ps, depth, &info->count3))
2536 if(!prs_uint32("count4", ps, depth, &info->count4))
2538 if(!prs_uint32("ptr2", ps, depth, &info->ptr2))
2540 if(!smb_io_time("time2", &info->time2, ps, depth)) /* logon time */
2542 if(!prs_uint32("unknow1", ps, depth, &info->unknow1))
2546 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2548 if(!prs_uint32("ptr3", ps, depth, &info->ptr3))
2551 if(!prs_uint32("unknow2", ps, depth, &info->unknow2))
2554 if(!prs_uint32("chal_len", ps, depth, &info->chal_len))
2556 if(!prs_uint32("reserved1", ps, depth, &info->reserved1))
2558 if(!prs_uint32("chal_len2", ps, depth, &info->chal_len2))
2561 if(!prs_uint8s (False, "chal", ps, depth, info->chal, info->chal_len2))
2564 if(!prs_uint32("key_len", ps, depth, &info->key_len))
2566 if(!prs_uint32("reserved2", ps, depth, &info->reserved2))
2568 if(!prs_uint32("key_len2", ps, depth, &info->key_len2))
2571 if(!prs_uint8s (False, "key", ps, depth, info->key, info->key_len2))
2575 if(!prs_uint32("buf_size3", ps, depth, &info->buf_size3))
2578 if(!sec_io_desc("sec_desc2", &info->sec_desc2, ps, depth))
2585 /*******************************************************************
2586 reads or writes a structure.
2587 ********************************************************************/
2588 static BOOL net_io_sam_privs_info(const char *desc, SAM_DELTA_PRIVS *info,
2589 prs_struct *ps, int depth)
2593 prs_debug(ps, depth, desc, "net_io_sam_privs_info");
2599 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2602 if(!prs_uint32("priv_count", ps, depth, &info->priv_count))
2604 if(!prs_uint32("priv_control", ps, depth, &info->priv_control))
2607 if(!prs_uint32("priv_attr_ptr", ps, depth, &info->priv_attr_ptr))
2609 if(!prs_uint32("priv_name_ptr", ps, depth, &info->priv_name_ptr))
2612 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
2614 if (!prs_uint32("non_paged_pool_limit", ps, depth,
2615 &info->non_paged_pool_limit))
2617 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
2619 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
2621 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
2623 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
2625 if (!prs_uint32("system_flags", ps, depth, &info->system_flags))
2627 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2630 for (i=0; i<4; i++) {
2632 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
2636 for (i=0; i<4; i++) {
2638 if (!prs_uint32("reserved", ps, depth, &reserved))
2642 if(!prs_uint32("attribute_count", ps, depth, &info->attribute_count))
2645 info->attributes = talloc(ps->mem_ctx, sizeof(uint32) * info->attribute_count);
2647 for (i=0; i<info->attribute_count; i++)
2648 if(!prs_uint32("attributes", ps, depth, &info->attributes[i]))
2651 if(!prs_uint32("privlist_count", ps, depth, &info->privlist_count))
2654 info->hdr_privslist = talloc(ps->mem_ctx, sizeof(UNIHDR) * info->privlist_count);
2655 info->uni_privslist = talloc(ps->mem_ctx, sizeof(UNISTR2) * info->privlist_count);
2657 for (i=0; i<info->privlist_count; i++)
2658 if(!smb_io_unihdr("hdr_privslist", &info->hdr_privslist[i], ps, depth))
2661 for (i=0; i<info->privlist_count; i++)
2662 if (!smb_io_unistr2("uni_privslist", &info->uni_privslist[i], True, ps, depth))
2665 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2666 info->hdr_sec_desc.buffer, ps, depth))
2672 /*******************************************************************
2673 reads or writes a structure.
2674 ********************************************************************/
2675 static BOOL net_io_sam_delta_ctr(const char *desc, uint8 sess_key[16],
2676 SAM_DELTA_CTR * delta, uint16 type,
2677 prs_struct *ps, int depth)
2679 prs_debug(ps, depth, desc, "net_io_sam_delta_ctr");
2683 /* Seen in sam deltas */
2684 case SAM_DELTA_MODIFIED_COUNT:
2685 if (!net_io_sam_delta_mod_count("", &delta->mod_count, ps, depth))
2689 case SAM_DELTA_DOMAIN_INFO:
2690 if (!net_io_sam_domain_info("", &delta->domain_info, ps, depth))
2694 case SAM_DELTA_GROUP_INFO:
2695 if (!net_io_sam_group_info("", &delta->group_info, ps, depth))
2699 case SAM_DELTA_ACCOUNT_INFO:
2700 if (!net_io_sam_account_info("", sess_key, &delta->account_info, ps, depth))
2704 case SAM_DELTA_GROUP_MEM:
2705 if (!net_io_sam_group_mem_info("", &delta->grp_mem_info, ps, depth))
2709 case SAM_DELTA_ALIAS_INFO:
2710 if (!net_io_sam_alias_info("", &delta->alias_info, ps, depth))
2714 case SAM_DELTA_POLICY_INFO:
2715 if (!net_io_sam_policy_info("", &delta->policy_info, ps, depth))
2719 case SAM_DELTA_ALIAS_MEM:
2720 if (!net_io_sam_alias_mem_info("", &delta->als_mem_info, ps, depth))
2724 case SAM_DELTA_PRIVS_INFO:
2725 if (!net_io_sam_privs_info("", &delta->privs_info, ps, depth))
2729 case SAM_DELTA_TRUST_DOMS:
2730 if (!net_io_sam_trustdoms_info("", &delta->trustdoms_info, ps, depth))
2734 case SAM_DELTA_SECRET_INFO:
2735 if (!net_io_sam_secret_info("", &delta->secret_info, ps, depth))
2739 /* These guys are not implemented yet */
2741 case SAM_DELTA_RENAME_GROUP:
2742 case SAM_DELTA_RENAME_USER:
2743 case SAM_DELTA_RENAME_ALIAS:
2744 case SAM_DELTA_DELETE_GROUP:
2745 case SAM_DELTA_DELETE_USER:
2747 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type));
2754 /*******************************************************************
2755 reads or writes a structure.
2756 ********************************************************************/
2757 BOOL net_io_r_sam_sync(const char *desc, uint8 sess_key[16],
2758 NET_R_SAM_SYNC * r_s, prs_struct *ps, int depth)
2762 prs_debug(ps, depth, desc, "net_io_r_sam_sync");
2765 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
2767 if (!prs_uint32("sync_context", ps, depth, &r_s->sync_context))
2770 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
2772 if (r_s->ptr_deltas != 0)
2774 if (!prs_uint32("num_deltas ", ps, depth, &r_s->num_deltas))
2776 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->ptr_deltas2))
2778 if (r_s->ptr_deltas2 != 0)
2780 if (!prs_uint32("num_deltas2", ps, depth,
2784 if (r_s->num_deltas2 != r_s->num_deltas)
2790 if (r_s->num_deltas2 > 0) {
2791 r_s->hdr_deltas = (SAM_DELTA_HDR *)
2792 talloc(ps->mem_ctx, r_s->num_deltas2 *
2793 sizeof(SAM_DELTA_HDR));
2795 if (r_s->hdr_deltas == NULL) {
2796 DEBUG(0, ("error tallocating memory "
2797 "for %d delta headers\n",
2803 for (i = 0; i < r_s->num_deltas2; i++)
2805 if (!net_io_sam_delta_hdr("",
2806 &r_s->hdr_deltas[i],
2811 if (r_s->num_deltas2 > 0) {
2812 r_s->deltas = (SAM_DELTA_CTR *)
2813 talloc(ps->mem_ctx, r_s->num_deltas2 *
2814 sizeof(SAM_DELTA_CTR));
2816 if (r_s->deltas == NULL) {
2817 DEBUG(0, ("error tallocating memory "
2824 for (i = 0; i < r_s->num_deltas2; i++)
2826 if (!net_io_sam_delta_ctr(
2827 "", sess_key, &r_s->deltas[i],
2828 r_s->hdr_deltas[i].type3,
2830 DEBUG(0, ("hmm, failed on i=%d\n", i));
2838 if (!prs_ntstatus("status", ps, depth, &(r_s->status)))
2844 /*******************************************************************
2845 makes a NET_Q_SAM_DELTAS structure.
2846 ********************************************************************/
2847 BOOL init_net_q_sam_deltas(NET_Q_SAM_DELTAS *q_s, const char *srv_name,
2848 const char *cli_name, DOM_CRED *cli_creds,
2849 uint32 database_id, UINT64_S dom_mod_count)
2851 DEBUG(5, ("init_net_q_sam_deltas\n"));
2853 init_unistr2(&q_s->uni_srv_name, srv_name, strlen(srv_name) + 1);
2854 init_unistr2(&q_s->uni_cli_name, cli_name, strlen(cli_name) + 1);
2856 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
2857 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
2859 q_s->database_id = database_id;
2860 q_s->dom_mod_count.low = dom_mod_count.low;
2861 q_s->dom_mod_count.high = dom_mod_count.high;
2862 q_s->max_size = 0xffff;
2867 /*******************************************************************
2868 reads or writes a structure.
2869 ********************************************************************/
2870 BOOL net_io_q_sam_deltas(const char *desc, NET_Q_SAM_DELTAS *q_s, prs_struct *ps,
2873 prs_debug(ps, depth, desc, "net_io_q_sam_deltas");
2876 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
2878 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
2881 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
2883 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
2886 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
2888 if (!prs_uint64("dom_mod_count", ps, depth, &q_s->dom_mod_count))
2890 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
2896 /*******************************************************************
2897 reads or writes a structure.
2898 ********************************************************************/
2899 BOOL net_io_r_sam_deltas(const char *desc, uint8 sess_key[16],
2900 NET_R_SAM_DELTAS *r_s, prs_struct *ps, int depth)
2904 prs_debug(ps, depth, desc, "net_io_r_sam_deltas");
2907 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
2909 if (!prs_uint64("dom_mod_count", ps, depth, &r_s->dom_mod_count))
2912 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
2914 if (!prs_uint32("num_deltas", ps, depth, &r_s->num_deltas))
2916 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->num_deltas2))
2919 if (r_s->num_deltas2 != 0)
2921 if (!prs_uint32("num_deltas2 ", ps, depth, &r_s->num_deltas2))
2924 if (r_s->ptr_deltas != 0)
2926 if (r_s->num_deltas > 0) {
2927 r_s->hdr_deltas = (SAM_DELTA_HDR *)
2928 talloc(ps->mem_ctx, r_s->num_deltas *
2929 sizeof(SAM_DELTA_HDR));
2930 if (r_s->hdr_deltas == NULL) {
2931 DEBUG(0, ("error tallocating memory "
2932 "for %d delta headers\n",
2938 for (i = 0; i < r_s->num_deltas; i++)
2940 net_io_sam_delta_hdr("", &r_s->hdr_deltas[i],
2944 if (r_s->num_deltas > 0) {
2945 r_s->deltas = (SAM_DELTA_CTR *)
2946 talloc(ps->mem_ctx, r_s->num_deltas *
2947 sizeof(SAM_DELTA_CTR));
2949 if (r_s->deltas == NULL) {
2950 DEBUG(0, ("error tallocating memory "
2957 for (i = 0; i < r_s->num_deltas; i++)
2959 if (!net_io_sam_delta_ctr(
2962 r_s->hdr_deltas[i].type2,
2971 if (!prs_ntstatus("status", ps, depth, &r_s->status))