2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-1997,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
7 * Copyright (C) Paul Ashton 1997.
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.
26 extern int DEBUGLEVEL;
28 /*******************************************************************
29 Reads or writes a structure.
30 ********************************************************************/
32 static BOOL net_io_neg_flags(char *desc, NEG_FLAGS *neg, prs_struct *ps, int depth)
37 prs_debug(ps, depth, desc, "net_io_neg_flags");
43 if(!prs_uint32("neg_flags", ps, depth, &neg->neg_flags))
49 /*******************************************************************
50 Inits a NETLOGON_INFO_3 structure.
51 ********************************************************************/
53 static void init_netinfo_3(NETLOGON_INFO_3 *info, uint32 flags, uint32 logon_attempts)
56 info->logon_attempts = logon_attempts;
57 info->reserved_1 = 0x0;
58 info->reserved_2 = 0x0;
59 info->reserved_3 = 0x0;
60 info->reserved_4 = 0x0;
61 info->reserved_5 = 0x0;
64 /*******************************************************************
65 Reads or writes a NETLOGON_INFO_3 structure.
66 ********************************************************************/
68 static BOOL net_io_netinfo_3(char *desc, NETLOGON_INFO_3 *info, prs_struct *ps, int depth)
73 prs_debug(ps, depth, desc, "net_io_netinfo_3");
79 if(!prs_uint32("flags ", ps, depth, &info->flags))
81 if(!prs_uint32("logon_attempts", ps, depth, &info->logon_attempts))
83 if(!prs_uint32("reserved_1 ", ps, depth, &info->reserved_1))
85 if(!prs_uint32("reserved_2 ", ps, depth, &info->reserved_2))
87 if(!prs_uint32("reserved_3 ", ps, depth, &info->reserved_3))
89 if(!prs_uint32("reserved_4 ", ps, depth, &info->reserved_4))
91 if(!prs_uint32("reserved_5 ", ps, depth, &info->reserved_5))
98 /*******************************************************************
99 Inits a NETLOGON_INFO_1 structure.
100 ********************************************************************/
102 static void init_netinfo_1(NETLOGON_INFO_1 *info, uint32 flags, uint32 pdc_status)
105 info->pdc_status = pdc_status;
108 /*******************************************************************
109 Reads or writes a NETLOGON_INFO_1 structure.
110 ********************************************************************/
112 static BOOL net_io_netinfo_1(char *desc, NETLOGON_INFO_1 *info, prs_struct *ps, int depth)
117 prs_debug(ps, depth, desc, "net_io_netinfo_1");
123 if(!prs_uint32("flags ", ps, depth, &info->flags))
125 if(!prs_uint32("pdc_status", ps, depth, &info->pdc_status))
131 /*******************************************************************
132 Inits a NETLOGON_INFO_2 structure.
133 ********************************************************************/
135 static void init_netinfo_2(NETLOGON_INFO_2 *info, uint32 flags, uint32 pdc_status,
136 uint32 tc_status, char *trusted_dc_name)
138 int len_dc_name = strlen(trusted_dc_name);
140 info->pdc_status = pdc_status;
141 info->ptr_trusted_dc_name = 1;
142 info->tc_status = tc_status;
144 if (trusted_dc_name != NULL)
145 init_unistr2(&(info->uni_trusted_dc_name), trusted_dc_name, len_dc_name+1);
147 init_unistr2(&(info->uni_trusted_dc_name), "", 1);
150 /*******************************************************************
151 Reads or writes a NETLOGON_INFO_2 structure.
152 ********************************************************************/
154 static BOOL net_io_netinfo_2(char *desc, NETLOGON_INFO_2 *info, prs_struct *ps, int depth)
159 prs_debug(ps, depth, desc, "net_io_netinfo_2");
165 if(!prs_uint32("flags ", ps, depth, &info->flags))
167 if(!prs_uint32("pdc_status ", ps, depth, &info->pdc_status))
169 if(!prs_uint32("ptr_trusted_dc_name", ps, depth, &info->ptr_trusted_dc_name))
171 if(!prs_uint32("tc_status ", ps, depth, &info->tc_status))
174 if (info->ptr_trusted_dc_name != 0) {
175 if(!smb_io_unistr2("unistr2", &info->uni_trusted_dc_name, info->ptr_trusted_dc_name, ps, depth))
185 /*******************************************************************
186 Reads or writes an NET_Q_LOGON_CTRL2 structure.
187 ********************************************************************/
189 BOOL net_io_q_logon_ctrl2(char *desc, NET_Q_LOGON_CTRL2 *q_l, prs_struct *ps, int depth)
194 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl2");
200 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
203 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
209 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
211 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
213 if(!prs_uint32("switch_value ", ps, depth, &q_l->switch_value))
219 /*******************************************************************
220 Inits an NET_R_LOGON_CTRL2 structure.
221 ********************************************************************/
223 void init_r_logon_ctrl2(NET_R_LOGON_CTRL2 *r_l, uint32 query_level,
224 uint32 flags, uint32 pdc_status, uint32 logon_attempts,
225 uint32 tc_status, char *trusted_domain_name)
227 DEBUG(5,("make_r_logon_ctrl2\n"));
229 r_l->switch_value = query_level; /* should only be 0x1 */
231 switch (query_level) {
233 r_l->ptr = 1; /* undocumented pointer */
234 init_netinfo_1(&r_l->logon.info1, flags, pdc_status);
238 r_l->ptr = 1; /* undocumented pointer */
239 init_netinfo_2(&r_l->logon.info2, flags, pdc_status,
240 tc_status, trusted_domain_name);
244 r_l->ptr = 1; /* undocumented pointer */
245 init_netinfo_3(&(r_l->logon.info3), flags, logon_attempts);
249 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
251 r_l->ptr = 0; /* undocumented pointer */
253 /* take a guess at an error code... */
254 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
259 /*******************************************************************
260 Reads or writes an NET_R_LOGON_CTRL2 structure.
261 ********************************************************************/
263 BOOL net_io_r_logon_ctrl2(char *desc, NET_R_LOGON_CTRL2 *r_l, prs_struct *ps, int depth)
268 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl2");
271 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
273 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
277 switch (r_l->switch_value) {
279 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
283 if(!net_io_netinfo_2("", &r_l->logon.info2, ps, depth))
287 if(!net_io_netinfo_3("", &r_l->logon.info3, ps, depth))
291 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
297 if(!prs_uint32("status ", ps, depth, &r_l->status))
303 /*******************************************************************
304 Inits an NET_R_TRUST_DOM_LIST structure.
305 ********************************************************************/
307 void init_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
308 uint32 num_doms, char *dom_name)
312 DEBUG(5,("make_r_trust_dom\n"));
314 for (i = 0; i < MAX_TRUST_DOMS; i++) {
315 r_t->uni_trust_dom_name[i].uni_str_len = 0;
316 r_t->uni_trust_dom_name[i].uni_max_len = 0;
318 if (num_doms > MAX_TRUST_DOMS)
319 num_doms = MAX_TRUST_DOMS;
321 for (i = 0; i < num_doms; i++) {
323 fstrcpy(domain_name, dom_name);
324 strupper(domain_name);
325 init_unistr2(&r_t->uni_trust_dom_name[i], domain_name, strlen(domain_name)+1);
326 /* the use of UNISTR2 here is non-standard. */
327 r_t->uni_trust_dom_name[i].undoc = 0x1;
333 /*******************************************************************
334 Reads or writes an NET_R_TRUST_DOM_LIST structure.
335 ********************************************************************/
337 BOOL net_io_r_trust_dom(char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth)
344 prs_debug(ps, depth, desc, "net_io_r_trust_dom");
347 /* temporary code to give a valid response */
349 if(!prs_uint32("status", ps, depth, &value))
353 if(!prs_uint32("status", ps, depth, &value))
356 if(!prs_uint32("status", ps, depth, &value))
360 if(!prs_uint32("status", ps, depth, &value))
364 if(!prs_uint32("status", ps, depth, &value))
367 /* old non working code */
371 for (i = 0; i < MAX_TRUST_DOMS; i++) {
372 if (r_t->uni_trust_dom_name[i].uni_str_len == 0)
374 if(!smb_io_unistr2("", &r_t->uni_trust_dom_name[i], True, ps, depth))
378 if(!prs_uint32("status", ps, depth, &r_t->status))
385 /*******************************************************************
386 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
387 ********************************************************************/
389 BOOL net_io_q_trust_dom(char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth)
394 prs_debug(ps, depth, desc, "net_io_q_trust_dom");
397 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
399 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
405 /*******************************************************************
406 Inits an NET_Q_REQ_CHAL structure.
407 ********************************************************************/
409 void init_q_req_chal(NET_Q_REQ_CHAL *q_c,
410 char *logon_srv, char *logon_clnt,
413 DEBUG(5,("make_q_req_chal: %d\n", __LINE__));
415 q_c->undoc_buffer = 1; /* don't know what this buffer is */
417 init_unistr2(&q_c->uni_logon_srv, logon_srv , strlen(logon_srv )+1);
418 init_unistr2(&q_c->uni_logon_clnt, logon_clnt, strlen(logon_clnt)+1);
420 memcpy(q_c->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
422 DEBUG(5,("make_q_req_chal: %d\n", __LINE__));
425 /*******************************************************************
426 Reads or writes an NET_Q_REQ_CHAL structure.
427 ********************************************************************/
429 BOOL net_io_q_req_chal(char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth)
436 prs_debug(ps, depth, desc, "net_io_q_req_chal");
442 if(!prs_uint32("undoc_buffer", ps, depth, &q_c->undoc_buffer))
445 if(!smb_io_unistr2("", &q_c->uni_logon_srv, True, ps, depth)) /* logon server unicode string */
447 if(!smb_io_unistr2("", &q_c->uni_logon_clnt, True, ps, depth)) /* logon client unicode string */
450 old_align = ps->align;
452 /* client challenge is _not_ aligned after the unicode strings */
453 if(!smb_io_chal("", &q_c->clnt_chal, ps, depth)) {
454 /* client challenge */
455 ps->align = old_align;
458 ps->align = old_align;
463 /*******************************************************************
464 Reads or writes a structure.
465 ********************************************************************/
467 BOOL net_io_r_req_chal(char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth)
472 prs_debug(ps, depth, desc, "net_io_r_req_chal");
478 if(!smb_io_chal("", &r_c->srv_chal, ps, depth)) /* server challenge */
481 if(!prs_uint32("status", ps, depth, &r_c->status))
488 /*******************************************************************
489 Inits a NET_Q_AUTH_2 struct.
490 ********************************************************************/
492 void init_q_auth_2(NET_Q_AUTH_2 *q_a,
493 char *logon_srv, char *acct_name, uint16 sec_chan, char *comp_name,
494 DOM_CHAL *clnt_chal, uint32 clnt_flgs)
496 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
498 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
499 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
500 q_a->clnt_flgs.neg_flags = clnt_flgs;
502 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
505 /*******************************************************************
506 Reads or writes a structure.
507 ********************************************************************/
509 BOOL net_io_q_auth_2(char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth)
515 prs_debug(ps, depth, desc, "net_io_q_auth_2");
521 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
523 /* client challenge is _not_ aligned */
524 old_align = ps->align;
526 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth)) {
527 /* client-calculated credentials */
528 ps->align = old_align;
531 ps->align = old_align;
532 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
538 /*******************************************************************
539 Reads or writes a structure.
540 ********************************************************************/
542 BOOL net_io_r_auth_2(char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth)
547 prs_debug(ps, depth, desc, "net_io_r_auth_2");
553 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
555 if(!net_io_neg_flags("", &r_a->srv_flgs, ps, depth))
558 if(!prs_uint32("status", ps, depth, &r_a->status))
565 /*******************************************************************
566 Inits a NET_Q_SRV_PWSET.
567 ********************************************************************/
569 void init_q_srv_pwset(NET_Q_SRV_PWSET *q_s, char *logon_srv, char *acct_name,
570 uint16 sec_chan, char *comp_name, DOM_CRED *cred, char nt_cypher[16])
572 DEBUG(5,("make_q_srv_pwset\n"));
574 init_clnt_info(&q_s->clnt_id, logon_srv, acct_name, sec_chan, comp_name, cred);
576 memcpy(q_s->pwd, nt_cypher, sizeof(q_s->pwd));
579 /*******************************************************************
580 Reads or writes a structure.
581 ********************************************************************/
583 BOOL net_io_q_srv_pwset(char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth)
588 prs_debug(ps, depth, desc, "net_io_q_srv_pwset");
594 if(!smb_io_clnt_info("", &q_s->clnt_id, ps, depth)) /* client identification/authentication info */
596 if(!prs_uint8s (False, "pwd", ps, depth, q_s->pwd, 16)) /* new password - undocumented */
602 /*******************************************************************
603 Reads or writes a structure.
604 ********************************************************************/
606 BOOL net_io_r_srv_pwset(char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth)
611 prs_debug(ps, depth, desc, "net_io_r_srv_pwset");
617 if(!smb_io_cred("", &r_s->srv_cred, ps, depth)) /* server challenge */
620 if(!prs_uint32("status", ps, depth, &r_s->status))
626 /*************************************************************************
627 Init DOM_SID2 array from a string containing multiple sids
628 *************************************************************************/
630 static int init_dom_sid2s(TALLOC_CTX *ctx, char *sids_str, DOM_SID2 **ppsids)
636 DEBUG(4,("init_dom_sid2s: %s\n", sids_str ? sids_str:""));
644 /* Count the number of SIDs. */
645 for (count = 0, ptr = sids_str;
646 next_token(&ptr, s2, NULL, sizeof(s2)); count++)
649 /* Now allocate space for them. */
650 *ppsids = (DOM_SID2 *)talloc_zero(ctx, count * sizeof(DOM_SID2));
656 for (number = 0, ptr = sids_str;
657 next_token(&ptr, s2, NULL, sizeof(s2)); number++) {
659 string_to_sid(&tmpsid, s2);
660 init_dom_sid2(&sids[number], &tmpsid);
667 /*******************************************************************
668 Inits a NET_ID_INFO_1 structure.
669 ********************************************************************/
671 void init_id_info1(NET_ID_INFO_1 *id, char *domain_name,
672 uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
673 char *user_name, char *wksta_name,
675 unsigned char lm_cypher[16], unsigned char nt_cypher[16])
677 int len_domain_name = strlen(domain_name);
678 int len_user_name = strlen(user_name );
679 int len_wksta_name = strlen(wksta_name );
681 unsigned char lm_owf[16];
682 unsigned char nt_owf[16];
684 DEBUG(5,("make_id_info1: %d\n", __LINE__));
686 id->ptr_id_info1 = 1;
688 init_uni_hdr(&id->hdr_domain_name, len_domain_name);
690 id->param_ctrl = param_ctrl;
691 init_logon_id(&id->logon_id, log_id_low, log_id_high);
693 init_uni_hdr(&id->hdr_user_name, len_user_name);
694 init_uni_hdr(&id->hdr_wksta_name, len_wksta_name);
696 if (lm_cypher && nt_cypher) {
697 unsigned char key[16];
698 #ifdef DEBUG_PASSWORD
699 DEBUG(100,("lm cypher:"));
700 dump_data(100, (char *)lm_cypher, 16);
702 DEBUG(100,("nt cypher:"));
703 dump_data(100, (char *)nt_cypher, 16);
707 memcpy(key, sess_key, 8);
709 memcpy(lm_owf, lm_cypher, 16);
710 SamOEMhash(lm_owf, key, False);
711 memcpy(nt_owf, nt_cypher, 16);
712 SamOEMhash(nt_owf, key, False);
714 #ifdef DEBUG_PASSWORD
715 DEBUG(100,("encrypt of lm owf password:"));
716 dump_data(100, (char *)lm_owf, 16);
718 DEBUG(100,("encrypt of nt owf password:"));
719 dump_data(100, (char *)nt_owf, 16);
721 /* set up pointers to cypher blocks */
726 init_owf_info(&id->lm_owf, lm_cypher);
727 init_owf_info(&id->nt_owf, nt_cypher);
729 init_unistr2(&id->uni_domain_name, domain_name, len_domain_name);
730 init_unistr2(&id->uni_user_name, user_name, len_user_name);
731 init_unistr2(&id->uni_wksta_name, wksta_name, len_wksta_name);
734 /*******************************************************************
735 Reads or writes an NET_ID_INFO_1 structure.
736 ********************************************************************/
738 static BOOL net_io_id_info1(char *desc, NET_ID_INFO_1 *id, prs_struct *ps, int depth)
743 prs_debug(ps, depth, desc, "net_io_id_info1");
749 if(!prs_uint32("ptr_id_info1", ps, depth, &id->ptr_id_info1))
752 if (id->ptr_id_info1 != 0) {
753 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
756 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
758 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
761 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
763 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
766 if(!smb_io_owf_info("", &id->lm_owf, ps, depth))
768 if(!smb_io_owf_info("", &id->nt_owf, ps, depth))
771 if(!smb_io_unistr2("unistr2", &id->uni_domain_name,
772 id->hdr_domain_name.buffer, ps, depth))
774 if(!smb_io_unistr2("unistr2", &id->uni_user_name,
775 id->hdr_user_name.buffer, ps, depth))
777 if(!smb_io_unistr2("unistr2", &id->uni_wksta_name,
778 id->hdr_wksta_name.buffer, ps, depth))
785 /*******************************************************************
786 Inits a NET_ID_INFO_2 structure.
788 This is a network logon packet. The log_id parameters
789 are what an NT server would generate for LUID once the
790 user is logged on. I don't think we care about them.
792 Note that this has no access to the NT and LM hashed passwords,
793 so it forwards the challenge, and the NT and LM responses (24
794 bytes each) over the secure channel to the Domain controller
795 for it to say yea or nay. This is the preferred method of
796 checking for a logon as it doesn't export the password
797 hashes to anyone who has compromised the secure channel. JRA.
798 ********************************************************************/
800 void init_id_info2(NET_ID_INFO_2 *id, char *domain_name,
801 uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
802 char *user_name, char *wksta_name,
803 unsigned char lm_challenge[8],
804 unsigned char *lm_chal_resp,
805 unsigned char *nt_chal_resp)
807 int len_domain_name = strlen(domain_name);
808 int len_user_name = strlen(user_name );
809 int len_wksta_name = strlen(wksta_name );
810 int nt_chal_resp_len = ((nt_chal_resp != NULL) ? 24 : 0);
811 int lm_chal_resp_len = ((lm_chal_resp != NULL) ? 24 : 0);
812 unsigned char lm_owf[24];
813 unsigned char nt_owf[24];
815 DEBUG(5,("init_id_info2: %d\n", __LINE__));
817 id->ptr_id_info2 = 1;
819 init_uni_hdr(&id->hdr_domain_name, len_domain_name);
821 id->param_ctrl = param_ctrl;
822 init_logon_id(&id->logon_id, log_id_low, log_id_high);
824 init_uni_hdr(&id->hdr_user_name, len_user_name);
825 init_uni_hdr(&id->hdr_wksta_name, len_wksta_name);
828 /* oops. can only send what-ever-it-is direct */
829 memcpy(nt_owf, nt_chal_resp, 24);
830 nt_chal_resp = nt_owf;
833 /* oops. can only send what-ever-it-is direct */
834 memcpy(lm_owf, lm_chal_resp, 24);
835 lm_chal_resp = lm_owf;
838 memcpy(id->lm_chal, lm_challenge, sizeof(id->lm_chal));
839 init_str_hdr(&id->hdr_nt_chal_resp, 24, nt_chal_resp_len, (nt_chal_resp != NULL) ? 1 : 0);
840 init_str_hdr(&id->hdr_lm_chal_resp, 24, lm_chal_resp_len, (lm_chal_resp != NULL) ? 1 : 0);
842 init_unistr2(&id->uni_domain_name, domain_name, len_domain_name);
843 init_unistr2(&id->uni_user_name, user_name, len_user_name);
844 init_unistr2(&id->uni_wksta_name, wksta_name, len_wksta_name);
846 init_string2(&id->nt_chal_resp, (char *)nt_chal_resp, nt_chal_resp_len);
847 init_string2(&id->lm_chal_resp, (char *)lm_chal_resp, lm_chal_resp_len);
850 /*******************************************************************
851 Reads or writes an NET_ID_INFO_2 structure.
852 ********************************************************************/
854 static BOOL net_io_id_info2(char *desc, NET_ID_INFO_2 *id, prs_struct *ps, int depth)
859 prs_debug(ps, depth, desc, "net_io_id_info2");
865 if(!prs_uint32("ptr_id_info2", ps, depth, &id->ptr_id_info2))
868 if (id->ptr_id_info2 != 0) {
869 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
872 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
874 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
877 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
879 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
882 if(!prs_uint8s (False, "lm_chal", ps, depth, id->lm_chal, 8)) /* lm 8 byte challenge */
885 if(!smb_io_strhdr("hdr_nt_chal_resp", &id->hdr_nt_chal_resp, ps, depth))
887 if(!smb_io_strhdr("hdr_lm_chal_resp", &id->hdr_lm_chal_resp, ps, depth))
890 if(!smb_io_unistr2("uni_domain_name", &id->uni_domain_name,
891 id->hdr_domain_name.buffer, ps, depth))
893 if(!smb_io_unistr2("uni_user_name ", &id->uni_user_name,
894 id->hdr_user_name.buffer, ps, depth))
896 if(!smb_io_unistr2("uni_wksta_name ", &id->uni_wksta_name,
897 id->hdr_wksta_name.buffer, ps, depth))
899 if(!smb_io_string2("nt_chal_resp", &id->nt_chal_resp,
900 id->hdr_nt_chal_resp.buffer, ps, depth))
902 if(!smb_io_string2("lm_chal_resp", &id->lm_chal_resp,
903 id->hdr_lm_chal_resp.buffer, ps, depth))
911 /*******************************************************************
912 Inits a DOM_SAM_INFO structure.
913 ********************************************************************/
915 void init_sam_info(DOM_SAM_INFO *sam,
916 char *logon_srv, char *comp_name, DOM_CRED *clnt_cred,
917 DOM_CRED *rtn_cred, uint16 logon_level,
918 NET_ID_INFO_CTR *ctr)
920 DEBUG(5,("init_sam_info: %d\n", __LINE__));
922 init_clnt_info2(&(sam->client), logon_srv, comp_name, clnt_cred);
924 if (rtn_cred != NULL) {
925 sam->ptr_rtn_cred = 1;
926 memcpy(&sam->rtn_cred, rtn_cred, sizeof(sam->rtn_cred));
928 sam->ptr_rtn_cred = 0;
931 sam->logon_level = logon_level;
935 /*******************************************************************
936 Reads or writes a DOM_SAM_INFO structure.
937 ********************************************************************/
939 static BOOL net_io_id_info_ctr(char *desc, NET_ID_INFO_CTR **pp_ctr, prs_struct *ps, int depth)
941 NET_ID_INFO_CTR *ctr = *pp_ctr;
943 prs_debug(ps, depth, desc, "smb_io_sam_info");
946 if (UNMARSHALLING(ps)) {
947 ctr = *pp_ctr = (NET_ID_INFO_CTR *)prs_alloc_mem(ps, sizeof(NET_ID_INFO_CTR));
955 /* don't 4-byte align here! */
957 if(!prs_uint16("switch_value ", ps, depth, &ctr->switch_value))
960 switch (ctr->switch_value) {
962 if(!net_io_id_info1("", &ctr->auth.id1, ps, depth))
966 if(!net_io_id_info2("", &ctr->auth.id2, ps, depth))
971 DEBUG(4,("smb_io_sam_info: unknown switch_value!\n"));
978 /*******************************************************************
979 Reads or writes a DOM_SAM_INFO structure.
980 ********************************************************************/
982 static BOOL smb_io_sam_info(char *desc, DOM_SAM_INFO *sam, prs_struct *ps, int depth)
987 prs_debug(ps, depth, desc, "smb_io_sam_info");
993 if(!smb_io_clnt_info2("", &sam->client, ps, depth))
996 if(!prs_uint32("ptr_rtn_cred ", ps, depth, &sam->ptr_rtn_cred))
998 if(!smb_io_cred("", &sam->rtn_cred, ps, depth))
1001 if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level))
1004 if (sam->logon_level != 0) {
1005 if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth))
1012 /*************************************************************************
1014 *************************************************************************/
1016 void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr, SAM_ACCOUNT *sampw,
1017 uint16 logon_count, uint16 bad_pw_count,
1018 uint32 num_groups, DOM_GID *gids,
1019 uint32 user_flgs, char *sess_key,
1020 char *logon_srv, char *logon_dom,
1021 DOM_SID *dom_sid, char *other_sids)
1023 /* only cope with one "other" sid, right now. */
1024 /* need to count the number of space-delimited sids */
1026 int num_other_sids = 0;
1028 NTTIME logon_time, logoff_time, kickoff_time,
1029 pass_last_set_time, pass_can_change_time,
1030 pass_must_change_time;
1032 int len_user_name, len_full_name, len_home_dir,
1033 len_dir_drive, len_logon_script, len_profile_path;
1035 char* user_name = pdb_get_username(sampw);
1036 char* full_name = pdb_get_fullname(sampw);
1037 char* home_dir = pdb_get_homedir(sampw);
1038 char* dir_drive = pdb_get_dirdrive(sampw);
1039 char* logon_script = pdb_get_logon_script(sampw);
1040 char* profile_path = pdb_get_profile_path(sampw);
1042 int len_logon_srv = strlen(logon_srv);
1043 int len_logon_dom = strlen(logon_dom);
1045 len_user_name = strlen(user_name );
1046 len_full_name = strlen(full_name );
1047 len_home_dir = strlen(home_dir );
1048 len_dir_drive = strlen(dir_drive );
1049 len_logon_script = strlen(logon_script);
1050 len_profile_path = strlen(profile_path);
1055 usr->ptr_user_info = 1; /* yes, we're bothering to put USER_INFO data here */
1058 /* Create NTTIME structs */
1059 unix_to_nt_time (&logon_time, pdb_get_logon_time(sampw));
1060 unix_to_nt_time (&logoff_time, pdb_get_logoff_time(sampw));
1061 unix_to_nt_time (&kickoff_time, pdb_get_kickoff_time(sampw));
1062 unix_to_nt_time (&pass_last_set_time, pdb_get_pass_last_set_time(sampw));
1063 unix_to_nt_time (&pass_can_change_time, pdb_get_pass_can_change_time(sampw));
1064 unix_to_nt_time (&pass_must_change_time,pdb_get_pass_must_change_time(sampw));
1066 usr->logon_time = logon_time;
1067 usr->logoff_time = logoff_time;
1068 usr->kickoff_time = kickoff_time;
1069 usr->pass_last_set_time = pass_last_set_time;
1070 usr->pass_can_change_time = pass_can_change_time;
1071 usr->pass_must_change_time = pass_must_change_time;
1073 init_uni_hdr(&usr->hdr_user_name, len_user_name);
1074 init_uni_hdr(&usr->hdr_full_name, len_full_name);
1075 init_uni_hdr(&usr->hdr_logon_script, len_logon_script);
1076 init_uni_hdr(&usr->hdr_profile_path, len_profile_path);
1077 init_uni_hdr(&usr->hdr_home_dir, len_home_dir);
1078 init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive);
1080 usr->logon_count = logon_count;
1081 usr->bad_pw_count = bad_pw_count;
1083 usr->user_id = pdb_get_user_rid(sampw);
1084 usr->group_id = pdb_get_group_rid(sampw);
1085 usr->num_groups = num_groups;
1086 usr->buffer_groups = 1; /* indicates fill in groups, below, even if there are none */
1087 usr->user_flgs = user_flgs;
1089 if (sess_key != NULL)
1090 memcpy(usr->user_sess_key, sess_key, sizeof(usr->user_sess_key));
1092 memset((char *)usr->user_sess_key, '\0', sizeof(usr->user_sess_key));
1094 init_uni_hdr(&usr->hdr_logon_srv, len_logon_srv);
1095 init_uni_hdr(&usr->hdr_logon_dom, len_logon_dom);
1097 usr->buffer_dom_id = dom_sid ? 1 : 0; /* yes, we're bothering to put a domain SID in */
1099 memset((char *)usr->padding, '\0', sizeof(usr->padding));
1101 num_other_sids = init_dom_sid2s(ctx, other_sids, &usr->other_sids);
1103 usr->num_other_sids = num_other_sids;
1104 usr->buffer_other_sids = (num_other_sids != 0) ? 1 : 0;
1106 init_unistr2(&usr->uni_user_name, user_name, len_user_name);
1107 init_unistr2(&usr->uni_full_name, full_name, len_full_name);
1108 init_unistr2(&usr->uni_logon_script, logon_script, len_logon_script);
1109 init_unistr2(&usr->uni_profile_path, profile_path, len_profile_path);
1110 init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir);
1111 init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive);
1113 usr->num_groups2 = num_groups;
1115 if (num_groups > 0) {
1116 usr->gids = (DOM_GID *)talloc_zero(ctx,sizeof(DOM_GID) * num_groups);
1117 if (usr->gids == NULL)
1119 for (i = 0; i < num_groups; i++)
1120 usr->gids[i] = gids[i];
1123 init_unistr2(&usr->uni_logon_srv, logon_srv, len_logon_srv);
1124 init_unistr2(&usr->uni_logon_dom, logon_dom, len_logon_dom);
1126 init_dom_sid2(&usr->dom_sid, dom_sid);
1127 /* "other" sids are set up above */
1130 /*******************************************************************
1131 This code has been modified to cope with a NET_USER_INFO_2 - which is
1132 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1133 We use validation level to determine if we're marshalling a info 2 or
1134 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1135 Jacobsen at HP. JRA.
1136 ********************************************************************/
1138 static BOOL net_io_user_info3(char *desc, NET_USER_INFO_3 *usr, prs_struct *ps, int depth, uint16 validation_level)
1145 prs_debug(ps, depth, desc, "lsa_io_lsa_user_info");
1148 if (UNMARSHALLING(ps))
1154 if(!prs_uint32("ptr_user_info ", ps, depth, &usr->ptr_user_info))
1157 if (usr->ptr_user_info == 0)
1160 if(!smb_io_time("time", &usr->logon_time, ps, depth)) /* logon time */
1162 if(!smb_io_time("time", &usr->logoff_time, ps, depth)) /* logoff time */
1164 if(!smb_io_time("time", &usr->kickoff_time, ps, depth)) /* kickoff time */
1166 if(!smb_io_time("time", &usr->pass_last_set_time, ps, depth)) /* password last set time */
1168 if(!smb_io_time("time", &usr->pass_can_change_time , ps, depth)) /* password can change time */
1170 if(!smb_io_time("time", &usr->pass_must_change_time, ps, depth)) /* password must change time */
1173 if(!smb_io_unihdr("unihdr", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
1175 if(!smb_io_unihdr("unihdr", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
1177 if(!smb_io_unihdr("unihdr", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
1179 if(!smb_io_unihdr("unihdr", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
1181 if(!smb_io_unihdr("unihdr", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
1183 if(!smb_io_unihdr("unihdr", &usr->hdr_dir_drive, ps, depth)) /* home directory drive unicode string header */
1186 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count)) /* logon count */
1188 if(!prs_uint16("bad_pw_count ", ps, depth, &usr->bad_pw_count)) /* bad password count */
1191 if(!prs_uint32("user_id ", ps, depth, &usr->user_id)) /* User ID */
1193 if(!prs_uint32("group_id ", ps, depth, &usr->group_id)) /* Group ID */
1195 if(!prs_uint32("num_groups ", ps, depth, &usr->num_groups)) /* num groups */
1197 if(!prs_uint32("buffer_groups ", ps, depth, &usr->buffer_groups)) /* undocumented buffer pointer to groups. */
1199 if(!prs_uint32("user_flgs ", ps, depth, &usr->user_flgs)) /* user flags */
1202 if(!prs_uint8s(False, "user_sess_key", ps, depth, usr->user_sess_key, 16)) /* unused user session key */
1205 if(!smb_io_unihdr("unihdr", &usr->hdr_logon_srv, ps, depth)) /* logon server unicode string header */
1207 if(!smb_io_unihdr("unihdr", &usr->hdr_logon_dom, ps, depth)) /* logon domain unicode string header */
1210 if(!prs_uint32("buffer_dom_id ", ps, depth, &usr->buffer_dom_id)) /* undocumented logon domain id pointer */
1212 if(!prs_uint8s (False, "padding ", ps, depth, usr->padding, 40)) /* unused padding bytes? */
1215 if (validation_level == 3) {
1216 if(!prs_uint32("num_other_sids", ps, depth, &usr->num_other_sids)) /* 0 - num_sids */
1218 if(!prs_uint32("buffer_other_sids", ps, depth, &usr->buffer_other_sids)) /* NULL - undocumented pointer to SIDs. */
1221 if (UNMARSHALLING(ps)) {
1222 usr->num_other_sids = 0;
1223 usr->buffer_other_sids = 0;
1227 if(!smb_io_unistr2("unistr2", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
1229 if(!smb_io_unistr2("unistr2", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
1231 if(!smb_io_unistr2("unistr2", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
1233 if(!smb_io_unistr2("unistr2", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
1235 if(!smb_io_unistr2("unistr2", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
1237 if(!smb_io_unistr2("unistr2", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
1242 if(!prs_uint32("num_groups2 ", ps, depth, &usr->num_groups2)) /* num groups */
1245 if (UNMARSHALLING(ps) && usr->num_groups2 > 0) {
1246 usr->gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_groups2);
1247 if (usr->gids == NULL)
1251 for (i = 0; i < usr->num_groups2; i++) {
1252 if(!smb_io_gid("", &usr->gids[i], ps, depth)) /* group info */
1256 if(!smb_io_unistr2("unistr2", &usr->uni_logon_srv, usr->hdr_logon_srv.buffer, ps, depth)) /* logon server unicode string */
1258 if(!smb_io_unistr2("unistr2", &usr->uni_logon_dom, usr->hdr_logon_srv.buffer, ps, depth)) /* logon domain unicode string */
1261 if(!smb_io_dom_sid2("", &usr->dom_sid, ps, depth)) /* domain SID */
1264 if (usr->num_other_sids) {
1266 if (UNMARSHALLING(ps)) {
1267 usr->other_sids = (DOM_SID2 *)prs_alloc_mem(ps, sizeof(DOM_SID2)*usr->num_other_sids);
1268 if (usr->other_sids == NULL)
1272 if(!prs_uint32("num_other_groups", ps, depth, &usr->num_other_groups))
1275 if (UNMARSHALLING(ps) && usr->num_other_groups > 0) {
1276 usr->other_gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_other_groups);
1277 if (usr->other_gids == NULL)
1281 for (i = 0; i < usr->num_other_groups; i++) {
1282 if(!smb_io_gid("", &usr->other_gids[i], ps, depth)) /* other GIDs */
1285 for (i = 0; i < usr->num_other_sids; i++) {
1286 if(!smb_io_dom_sid2("", &usr->other_sids[i], ps, depth)) /* other domain SIDs */
1294 /*******************************************************************
1295 Reads or writes a structure.
1296 ********************************************************************/
1298 BOOL net_io_q_sam_logon(char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth)
1303 prs_debug(ps, depth, desc, "net_io_q_sam_logon");
1309 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth)) /* domain SID */
1312 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
1318 /*******************************************************************
1319 Reads or writes a structure.
1320 ********************************************************************/
1322 BOOL net_io_r_sam_logon(char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth)
1327 prs_debug(ps, depth, desc, "net_io_r_sam_logon");
1330 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1332 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1335 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
1340 if (r_l->switch_value != 0) {
1341 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value))
1345 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
1348 if(!prs_uint32("status ", ps, depth, &r_l->status))
1357 /*******************************************************************
1358 Reads or writes a structure.
1359 ********************************************************************/
1361 BOOL net_io_q_sam_logoff(char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth)
1366 prs_debug(ps, depth, desc, "net_io_q_sam_logoff");
1372 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth)) /* domain SID */
1378 /*******************************************************************
1379 Reads or writes a structure.
1380 ********************************************************************/
1382 BOOL net_io_r_sam_logoff(char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth)
1387 prs_debug(ps, depth, desc, "net_io_r_sam_logoff");
1393 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1395 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1398 if(!prs_uint32("status ", ps, depth, &r_l->status))