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
)
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
, UNI_STR_TERMINATE
);
147 init_unistr2(&info
->uni_trusted_dc_name
, "", UNI_STR_TERMINATE
);
150 /*******************************************************************
151 Reads or writes a NETLOGON_INFO_2 structure.
152 ********************************************************************/
154 static BOOL
net_io_netinfo_2(const 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 static BOOL
net_io_ctrl_data_info_5(const char *desc
, CTRL_DATA_INFO_5
*info
, prs_struct
*ps
, int depth
)
190 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_5");
193 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
196 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
199 if ( info
->ptr_domain
) {
200 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
207 static BOOL
net_io_ctrl_data_info_6(const char *desc
, CTRL_DATA_INFO_6
*info
, prs_struct
*ps
, int depth
)
212 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_6");
215 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
218 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
221 if ( info
->ptr_domain
) {
222 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
229 /*******************************************************************
230 Reads or writes an NET_Q_LOGON_CTRL2 structure.
231 ********************************************************************/
233 BOOL
net_io_q_logon_ctrl2(const char *desc
, NET_Q_LOGON_CTRL2
*q_l
, prs_struct
*ps
, int depth
)
238 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl2");
244 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
247 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
253 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
255 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
257 switch ( q_l
->function_code
) {
258 case NETLOGON_CONTROL_REDISCOVER
:
259 if ( !net_io_ctrl_data_info_5( "ctrl_data_info5", &q_l
->info
.info5
, ps
, depth
) )
263 case NETLOGON_CONTROL_TC_QUERY
:
264 if ( !net_io_ctrl_data_info_6( "ctrl_data_info6", &q_l
->info
.info6
, ps
, depth
) )
269 DEBUG(0,("net_io_q_logon_ctrl2: unknown function_code [%d]\n",
270 q_l
->function_code
));
277 /*******************************************************************
278 Inits an NET_Q_LOGON_CTRL2 structure.
279 ********************************************************************/
281 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2
*q_l
, const char *srv_name
,
284 DEBUG(5,("init_q_logon_ctrl2\n"));
286 q_l
->function_code
= 0x01;
287 q_l
->query_level
= query_level
;
289 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
292 /*******************************************************************
293 Inits an NET_R_LOGON_CTRL2 structure.
294 ********************************************************************/
296 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2
*r_l
, uint32 query_level
,
297 uint32 flags
, uint32 pdc_status
,
298 uint32 logon_attempts
, uint32 tc_status
,
299 const char *trusted_domain_name
)
301 r_l
->switch_value
= query_level
;
303 switch (query_level
) {
305 r_l
->ptr
= 1; /* undocumented pointer */
306 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
307 r_l
->status
= NT_STATUS_OK
;
310 r_l
->ptr
= 1; /* undocumented pointer */
311 init_netinfo_2(&r_l
->logon
.info2
, flags
, pdc_status
,
312 tc_status
, trusted_domain_name
);
313 r_l
->status
= NT_STATUS_OK
;
316 r_l
->ptr
= 1; /* undocumented pointer */
317 init_netinfo_3(&r_l
->logon
.info3
, flags
, logon_attempts
);
318 r_l
->status
= NT_STATUS_OK
;
321 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
323 r_l
->ptr
= 0; /* undocumented pointer */
325 /* take a guess at an error code... */
326 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
331 /*******************************************************************
332 Reads or writes an NET_R_LOGON_CTRL2 structure.
333 ********************************************************************/
335 BOOL
net_io_r_logon_ctrl2(const char *desc
, NET_R_LOGON_CTRL2
*r_l
, prs_struct
*ps
, int depth
)
340 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl2");
343 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
345 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
349 switch (r_l
->switch_value
) {
351 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
355 if(!net_io_netinfo_2("", &r_l
->logon
.info2
, ps
, depth
))
359 if(!net_io_netinfo_3("", &r_l
->logon
.info3
, ps
, depth
))
363 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
369 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
375 /*******************************************************************
376 Reads or writes an NET_Q_LOGON_CTRL structure.
377 ********************************************************************/
379 BOOL
net_io_q_logon_ctrl(const char *desc
, NET_Q_LOGON_CTRL
*q_l
, prs_struct
*ps
,
382 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl");
388 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
391 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
397 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
399 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
405 /*******************************************************************
406 Inits an NET_Q_LOGON_CTRL structure.
407 ********************************************************************/
409 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL
*q_l
, const char *srv_name
,
412 DEBUG(5,("init_q_logon_ctrl\n"));
414 q_l
->function_code
= 0x01; /* ??? */
415 q_l
->query_level
= query_level
;
417 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
420 /*******************************************************************
421 Inits an NET_R_LOGON_CTRL structure.
422 ********************************************************************/
424 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL
*r_l
, uint32 query_level
,
425 uint32 flags
, uint32 pdc_status
)
427 DEBUG(5,("init_r_logon_ctrl\n"));
429 r_l
->switch_value
= query_level
; /* should only be 0x1 */
431 switch (query_level
) {
433 r_l
->ptr
= 1; /* undocumented pointer */
434 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
435 r_l
->status
= NT_STATUS_OK
;
438 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
440 r_l
->ptr
= 0; /* undocumented pointer */
442 /* take a guess at an error code... */
443 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
448 /*******************************************************************
449 Reads or writes an NET_R_LOGON_CTRL structure.
450 ********************************************************************/
452 BOOL
net_io_r_logon_ctrl(const char *desc
, NET_R_LOGON_CTRL
*r_l
, prs_struct
*ps
,
455 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl");
458 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
460 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
464 switch (r_l
->switch_value
) {
466 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
470 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
476 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
482 /*******************************************************************
483 Inits an NET_R_GETDCNAME structure.
484 ********************************************************************/
485 void init_net_q_getdcname(NET_Q_GETDCNAME
*r_t
, const char *logon_server
,
486 const char *domainname
)
488 DEBUG(5,("init_r_getdcname\n"));
490 r_t
->ptr_logon_server
= (logon_server
!= NULL
);
491 init_unistr2(&r_t
->uni_logon_server
, logon_server
, UNI_STR_TERMINATE
);
492 r_t
->ptr_domainname
= (domainname
!= NULL
);
493 init_unistr2(&r_t
->uni_domainname
, domainname
, UNI_STR_TERMINATE
);
496 /*******************************************************************
497 Reads or writes an NET_Q_GETDCNAME structure.
498 ********************************************************************/
500 BOOL
net_io_q_getdcname(const char *desc
, NET_Q_GETDCNAME
*r_t
, prs_struct
*ps
,
506 prs_debug(ps
, depth
, desc
, "net_io_q_getdcname");
509 if (!prs_uint32("ptr_logon_server", ps
, depth
, &r_t
->ptr_logon_server
))
512 if (!smb_io_unistr2("logon_server", &r_t
->uni_logon_server
,
513 r_t
->ptr_logon_server
, ps
, depth
))
519 if (!prs_uint32("ptr_domainname", ps
, depth
, &r_t
->ptr_domainname
))
522 if (!smb_io_unistr2("domainname", &r_t
->uni_domainname
,
523 r_t
->ptr_domainname
, ps
, depth
))
530 /*******************************************************************
531 Inits an NET_R_GETDCNAME structure.
532 ********************************************************************/
533 void init_net_r_getdcname(NET_R_GETDCNAME
*r_t
, const char *dcname
)
535 DEBUG(5,("init_r_getdcname\n"));
537 init_unistr2(&r_t
->uni_dcname
, dcname
, UNI_STR_TERMINATE
);
540 /*******************************************************************
541 Reads or writes an NET_R_GETDCNAME structure.
542 ********************************************************************/
544 BOOL
net_io_r_getdcname(const char *desc
, NET_R_GETDCNAME
*r_t
, prs_struct
*ps
,
550 prs_debug(ps
, depth
, desc
, "net_io_r_getdcname");
553 if (!prs_uint32("ptr_dcname", ps
, depth
, &r_t
->ptr_dcname
))
556 if (!smb_io_unistr2("dcname", &r_t
->uni_dcname
,
557 r_t
->ptr_dcname
, ps
, depth
))
563 if (!prs_ntstatus("status", ps
, depth
, &r_t
->status
))
569 /*******************************************************************
570 Inits an NET_R_TRUST_DOM_LIST structure.
571 ********************************************************************/
573 void init_r_trust_dom(NET_R_TRUST_DOM_LIST
*r_t
,
574 uint32 num_doms
, const char *dom_name
)
578 DEBUG(5,("init_r_trust_dom\n"));
580 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
581 r_t
->uni_trust_dom_name
[i
].uni_str_len
= 0;
582 r_t
->uni_trust_dom_name
[i
].uni_max_len
= 0;
584 if (num_doms
> MAX_TRUST_DOMS
)
585 num_doms
= MAX_TRUST_DOMS
;
587 for (i
= 0; i
< num_doms
; i
++) {
589 fstrcpy(domain_name
, dom_name
);
590 strupper_m(domain_name
);
591 init_unistr2(&r_t
->uni_trust_dom_name
[i
], domain_name
, UNI_STR_TERMINATE
);
592 /* the use of UNISTR2 here is non-standard. */
593 r_t
->uni_trust_dom_name
[i
].offset
= 0x1;
596 r_t
->status
= NT_STATUS_OK
;
599 /*******************************************************************
600 Reads or writes an NET_R_TRUST_DOM_LIST structure.
601 ********************************************************************/
603 BOOL
net_io_r_trust_dom(const char *desc
, NET_R_TRUST_DOM_LIST
*r_t
, prs_struct
*ps
, int depth
)
610 prs_debug(ps
, depth
, desc
, "net_io_r_trust_dom");
613 /* temporary code to give a valid response */
615 if(!prs_uint32("status", ps
, depth
, &value
))
619 if(!prs_uint32("status", ps
, depth
, &value
))
622 if(!prs_uint32("status", ps
, depth
, &value
))
626 if(!prs_uint32("status", ps
, depth
, &value
))
630 if(!prs_uint32("status", ps
, depth
, &value
))
633 /* old non working code */
637 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
638 if (r_t
->uni_trust_dom_name
[i
].uni_str_len
== 0)
640 if(!smb_io_unistr2("", &r_t
->uni_trust_dom_name
[i
], True
, ps
, depth
))
644 if(!prs_ntstatus("status", ps
, depth
, &r_t
->status
))
651 /*******************************************************************
652 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
653 ********************************************************************/
655 BOOL
net_io_q_trust_dom(const char *desc
, NET_Q_TRUST_DOM_LIST
*q_l
, prs_struct
*ps
, int depth
)
660 prs_debug(ps
, depth
, desc
, "net_io_q_trust_dom");
663 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
665 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
671 /*******************************************************************
672 Inits an NET_Q_REQ_CHAL structure.
673 ********************************************************************/
675 void init_q_req_chal(NET_Q_REQ_CHAL
*q_c
,
676 const char *logon_srv
, const char *logon_clnt
,
677 const DOM_CHAL
*clnt_chal
)
679 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
681 q_c
->undoc_buffer
= 1; /* don't know what this buffer is */
683 init_unistr2(&q_c
->uni_logon_srv
, logon_srv
, UNI_STR_TERMINATE
);
684 init_unistr2(&q_c
->uni_logon_clnt
, logon_clnt
, UNI_STR_TERMINATE
);
686 memcpy(q_c
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
688 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
691 /*******************************************************************
692 Reads or writes an NET_Q_REQ_CHAL structure.
693 ********************************************************************/
695 BOOL
net_io_q_req_chal(const char *desc
, NET_Q_REQ_CHAL
*q_c
, prs_struct
*ps
, int depth
)
700 prs_debug(ps
, depth
, desc
, "net_io_q_req_chal");
706 if(!prs_uint32("undoc_buffer", ps
, depth
, &q_c
->undoc_buffer
))
709 if(!smb_io_unistr2("", &q_c
->uni_logon_srv
, True
, ps
, depth
)) /* logon server unicode string */
711 if(!smb_io_unistr2("", &q_c
->uni_logon_clnt
, True
, ps
, depth
)) /* logon client unicode string */
714 if(!smb_io_chal("", &q_c
->clnt_chal
, ps
, depth
))
720 /*******************************************************************
721 Reads or writes a structure.
722 ********************************************************************/
724 BOOL
net_io_r_req_chal(const char *desc
, NET_R_REQ_CHAL
*r_c
, prs_struct
*ps
, int depth
)
729 prs_debug(ps
, depth
, desc
, "net_io_r_req_chal");
735 if(!smb_io_chal("", &r_c
->srv_chal
, ps
, depth
)) /* server challenge */
738 if(!prs_ntstatus("status", ps
, depth
, &r_c
->status
))
745 /*******************************************************************
746 Reads or writes a structure.
747 ********************************************************************/
749 BOOL
net_io_q_auth(const char *desc
, NET_Q_AUTH
*q_a
, prs_struct
*ps
, int depth
)
754 prs_debug(ps
, depth
, desc
, "net_io_q_auth");
760 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
762 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
768 /*******************************************************************
769 Reads or writes a structure.
770 ********************************************************************/
772 BOOL
net_io_r_auth(const char *desc
, NET_R_AUTH
*r_a
, prs_struct
*ps
, int depth
)
777 prs_debug(ps
, depth
, desc
, "net_io_r_auth");
783 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
786 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
792 /*******************************************************************
793 Inits a NET_Q_AUTH_2 struct.
794 ********************************************************************/
796 void init_q_auth_2(NET_Q_AUTH_2
*q_a
,
797 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
798 const DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
800 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
802 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
803 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
804 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
806 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
809 /*******************************************************************
810 Reads or writes a structure.
811 ********************************************************************/
813 BOOL
net_io_q_auth_2(const char *desc
, NET_Q_AUTH_2
*q_a
, prs_struct
*ps
, int depth
)
818 prs_debug(ps
, depth
, desc
, "net_io_q_auth_2");
824 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
826 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
828 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
834 /*******************************************************************
835 Reads or writes a structure.
836 ********************************************************************/
838 BOOL
net_io_r_auth_2(const char *desc
, NET_R_AUTH_2
*r_a
, prs_struct
*ps
, int depth
)
843 prs_debug(ps
, depth
, desc
, "net_io_r_auth_2");
849 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
851 if(!net_io_neg_flags("", &r_a
->srv_flgs
, ps
, depth
))
854 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
860 /*******************************************************************
861 Inits a NET_Q_AUTH_3 struct.
862 ********************************************************************/
864 void init_q_auth_3(NET_Q_AUTH_3
*q_a
,
865 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
866 const DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
868 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
870 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
871 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
872 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
874 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
877 /*******************************************************************
878 Reads or writes a structure.
879 ********************************************************************/
881 BOOL
net_io_q_auth_3(const char *desc
, NET_Q_AUTH_3
*q_a
, prs_struct
*ps
, int depth
)
886 prs_debug(ps
, depth
, desc
, "net_io_q_auth_3");
892 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
894 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
896 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
902 /*******************************************************************
903 Reads or writes a structure.
904 ********************************************************************/
906 BOOL
net_io_r_auth_3(const char *desc
, NET_R_AUTH_3
*r_a
, prs_struct
*ps
, int depth
)
911 prs_debug(ps
, depth
, desc
, "net_io_r_auth_3");
917 if(!smb_io_chal("srv_chal", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
919 if(!net_io_neg_flags("srv_flgs", &r_a
->srv_flgs
, ps
, depth
))
921 if (!prs_uint32("unknown", ps
, depth
, &r_a
->unknown
))
924 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
931 /*******************************************************************
932 Inits a NET_Q_SRV_PWSET.
933 ********************************************************************/
935 void init_q_srv_pwset(NET_Q_SRV_PWSET
*q_s
,
936 const char *logon_srv
, const char *sess_key
, const char *acct_name
,
937 uint16 sec_chan
, const char *comp_name
,
938 DOM_CRED
*cred
, const uchar hashed_mach_pwd
[16])
940 unsigned char nt_cypher
[16];
942 DEBUG(5,("init_q_srv_pwset\n"));
944 /* Process the new password. */
945 cred_hash3( nt_cypher
, hashed_mach_pwd
, (const unsigned char *)sess_key
, 1);
947 init_clnt_info(&q_s
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
, cred
);
949 memcpy(q_s
->pwd
, nt_cypher
, sizeof(q_s
->pwd
));
952 /*******************************************************************
953 Reads or writes a structure.
954 ********************************************************************/
956 BOOL
net_io_q_srv_pwset(const char *desc
, NET_Q_SRV_PWSET
*q_s
, prs_struct
*ps
, int depth
)
961 prs_debug(ps
, depth
, desc
, "net_io_q_srv_pwset");
967 if(!smb_io_clnt_info("", &q_s
->clnt_id
, ps
, depth
)) /* client identification/authentication info */
969 if(!prs_uint8s (False
, "pwd", ps
, depth
, q_s
->pwd
, 16)) /* new password - undocumented */
975 /*******************************************************************
976 Reads or writes a structure.
977 ********************************************************************/
979 BOOL
net_io_r_srv_pwset(const char *desc
, NET_R_SRV_PWSET
*r_s
, prs_struct
*ps
, int depth
)
984 prs_debug(ps
, depth
, desc
, "net_io_r_srv_pwset");
990 if(!smb_io_cred("", &r_s
->srv_cred
, ps
, depth
)) /* server challenge */
993 if(!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
999 /*************************************************************************
1000 Init DOM_SID2 array from a string containing multiple sids
1001 *************************************************************************/
1003 static int init_dom_sid2s(TALLOC_CTX
*ctx
, const char *sids_str
, DOM_SID2
**ppsids
)
1009 DEBUG(4,("init_dom_sid2s: %s\n", sids_str
? sids_str
:""));
1017 /* Count the number of valid SIDs. */
1018 for (count
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
1020 if (string_to_sid(&tmpsid
, s2
))
1024 /* Now allocate space for them. */
1025 *ppsids
= TALLOC_ZERO_ARRAY(ctx
, DOM_SID2
, count
);
1026 if (*ppsids
== NULL
)
1031 for (number
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
1033 if (string_to_sid(&tmpsid
, s2
)) {
1034 /* count only valid sids */
1035 init_dom_sid2(&sids
[number
], &tmpsid
);
1044 /*******************************************************************
1045 Inits a NET_ID_INFO_1 structure.
1046 ********************************************************************/
1048 void init_id_info1(NET_ID_INFO_1
*id
, const char *domain_name
,
1049 uint32 param_ctrl
, uint32 log_id_low
, uint32 log_id_high
,
1050 const char *user_name
, const char *wksta_name
,
1051 const char *sess_key
,
1052 unsigned char lm_cypher
[16], unsigned char nt_cypher
[16])
1054 unsigned char lm_owf
[16];
1055 unsigned char nt_owf
[16];
1057 DEBUG(5,("init_id_info1: %d\n", __LINE__
));
1059 id
->ptr_id_info1
= 1;
1061 id
->param_ctrl
= param_ctrl
;
1062 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1065 if (lm_cypher
&& nt_cypher
) {
1066 unsigned char key
[16];
1067 #ifdef DEBUG_PASSWORD
1068 DEBUG(100,("lm cypher:"));
1069 dump_data(100, (char *)lm_cypher
, 16);
1071 DEBUG(100,("nt cypher:"));
1072 dump_data(100, (char *)nt_cypher
, 16);
1076 memcpy(key
, sess_key
, 8);
1078 memcpy(lm_owf
, lm_cypher
, 16);
1079 SamOEMhash(lm_owf
, key
, 16);
1080 memcpy(nt_owf
, nt_cypher
, 16);
1081 SamOEMhash(nt_owf
, key
, 16);
1083 #ifdef DEBUG_PASSWORD
1084 DEBUG(100,("encrypt of lm owf password:"));
1085 dump_data(100, (char *)lm_owf
, 16);
1087 DEBUG(100,("encrypt of nt owf password:"));
1088 dump_data(100, (char *)nt_owf
, 16);
1090 /* set up pointers to cypher blocks */
1095 init_owf_info(&id
->lm_owf
, lm_cypher
);
1096 init_owf_info(&id
->nt_owf
, nt_cypher
);
1098 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1099 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1100 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1101 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1102 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1103 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1106 /*******************************************************************
1107 Reads or writes an NET_ID_INFO_1 structure.
1108 ********************************************************************/
1110 static BOOL
net_io_id_info1(const char *desc
, NET_ID_INFO_1
*id
, prs_struct
*ps
, int depth
)
1115 prs_debug(ps
, depth
, desc
, "net_io_id_info1");
1121 if(!prs_uint32("ptr_id_info1", ps
, depth
, &id
->ptr_id_info1
))
1124 if (id
->ptr_id_info1
!= 0) {
1125 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1128 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1130 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1133 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1135 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1138 if(!smb_io_owf_info("", &id
->lm_owf
, ps
, depth
))
1140 if(!smb_io_owf_info("", &id
->nt_owf
, ps
, depth
))
1143 if(!smb_io_unistr2("unistr2", &id
->uni_domain_name
,
1144 id
->hdr_domain_name
.buffer
, ps
, depth
))
1146 if(!smb_io_unistr2("unistr2", &id
->uni_user_name
,
1147 id
->hdr_user_name
.buffer
, ps
, depth
))
1149 if(!smb_io_unistr2("unistr2", &id
->uni_wksta_name
,
1150 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1157 /*******************************************************************
1158 Inits a NET_ID_INFO_2 structure.
1160 This is a network logon packet. The log_id parameters
1161 are what an NT server would generate for LUID once the
1162 user is logged on. I don't think we care about them.
1164 Note that this has no access to the NT and LM hashed passwords,
1165 so it forwards the challenge, and the NT and LM responses (24
1166 bytes each) over the secure channel to the Domain controller
1167 for it to say yea or nay. This is the preferred method of
1168 checking for a logon as it doesn't export the password
1169 hashes to anyone who has compromised the secure channel. JRA.
1170 ********************************************************************/
1172 void init_id_info2(NET_ID_INFO_2
* id
, const char *domain_name
,
1174 uint32 log_id_low
, uint32 log_id_high
,
1175 const char *user_name
, const char *wksta_name
,
1176 const uchar lm_challenge
[8],
1177 const uchar
* lm_chal_resp
, size_t lm_chal_resp_len
,
1178 const uchar
* nt_chal_resp
, size_t nt_chal_resp_len
)
1181 DEBUG(5,("init_id_info2: %d\n", __LINE__
));
1183 id
->ptr_id_info2
= 1;
1185 id
->param_ctrl
= param_ctrl
;
1186 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1188 memcpy(id
->lm_chal
, lm_challenge
, sizeof(id
->lm_chal
));
1189 init_str_hdr(&id
->hdr_nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
, (nt_chal_resp
!= NULL
) ? 1 : 0);
1190 init_str_hdr(&id
->hdr_lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
, (lm_chal_resp
!= NULL
) ? 1 : 0);
1192 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1193 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1194 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1195 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1196 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1197 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1199 init_string2(&id
->nt_chal_resp
, (const char *)nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
);
1200 init_string2(&id
->lm_chal_resp
, (const char *)lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
);
1204 /*******************************************************************
1205 Reads or writes an NET_ID_INFO_2 structure.
1206 ********************************************************************/
1208 static BOOL
net_io_id_info2(const char *desc
, NET_ID_INFO_2
*id
, prs_struct
*ps
, int depth
)
1213 prs_debug(ps
, depth
, desc
, "net_io_id_info2");
1219 if(!prs_uint32("ptr_id_info2", ps
, depth
, &id
->ptr_id_info2
))
1222 if (id
->ptr_id_info2
!= 0) {
1223 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1226 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1228 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1231 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1233 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1236 if(!prs_uint8s (False
, "lm_chal", ps
, depth
, id
->lm_chal
, 8)) /* lm 8 byte challenge */
1239 if(!smb_io_strhdr("hdr_nt_chal_resp", &id
->hdr_nt_chal_resp
, ps
, depth
))
1241 if(!smb_io_strhdr("hdr_lm_chal_resp", &id
->hdr_lm_chal_resp
, ps
, depth
))
1244 if(!smb_io_unistr2("uni_domain_name", &id
->uni_domain_name
,
1245 id
->hdr_domain_name
.buffer
, ps
, depth
))
1247 if(!smb_io_unistr2("uni_user_name ", &id
->uni_user_name
,
1248 id
->hdr_user_name
.buffer
, ps
, depth
))
1250 if(!smb_io_unistr2("uni_wksta_name ", &id
->uni_wksta_name
,
1251 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1253 if(!smb_io_string2("nt_chal_resp", &id
->nt_chal_resp
,
1254 id
->hdr_nt_chal_resp
.buffer
, ps
, depth
))
1256 if(!smb_io_string2("lm_chal_resp", &id
->lm_chal_resp
,
1257 id
->hdr_lm_chal_resp
.buffer
, ps
, depth
))
1265 /*******************************************************************
1266 Inits a DOM_SAM_INFO structure.
1267 ********************************************************************/
1269 void init_sam_info(DOM_SAM_INFO
*sam
,
1270 const char *logon_srv
, const char *comp_name
,
1271 DOM_CRED
*clnt_cred
,
1272 DOM_CRED
*rtn_cred
, uint16 logon_level
,
1273 NET_ID_INFO_CTR
*ctr
)
1275 DEBUG(5,("init_sam_info: %d\n", __LINE__
));
1277 init_clnt_info2(&sam
->client
, logon_srv
, comp_name
, clnt_cred
);
1279 if (rtn_cred
!= NULL
) {
1280 sam
->ptr_rtn_cred
= 1;
1281 memcpy(&sam
->rtn_cred
, rtn_cred
, sizeof(sam
->rtn_cred
));
1283 sam
->ptr_rtn_cred
= 0;
1286 sam
->logon_level
= logon_level
;
1290 /*******************************************************************
1291 Reads or writes a DOM_SAM_INFO structure.
1292 ********************************************************************/
1294 static BOOL
net_io_id_info_ctr(const char *desc
, NET_ID_INFO_CTR
**pp_ctr
, prs_struct
*ps
, int depth
)
1296 NET_ID_INFO_CTR
*ctr
= *pp_ctr
;
1298 prs_debug(ps
, depth
, desc
, "smb_io_sam_info_ctr");
1301 if (UNMARSHALLING(ps
)) {
1302 ctr
= *pp_ctr
= PRS_ALLOC_MEM(ps
, NET_ID_INFO_CTR
, 1);
1310 /* don't 4-byte align here! */
1312 if(!prs_uint16("switch_value ", ps
, depth
, &ctr
->switch_value
))
1315 switch (ctr
->switch_value
) {
1317 if(!net_io_id_info1("", &ctr
->auth
.id1
, ps
, depth
))
1321 if(!net_io_id_info2("", &ctr
->auth
.id2
, ps
, depth
))
1326 DEBUG(4,("smb_io_sam_info_ctr: unknown switch_value!\n"));
1333 /*******************************************************************
1334 Reads or writes a DOM_SAM_INFO structure.
1335 ********************************************************************/
1337 static BOOL
smb_io_sam_info(const char *desc
, DOM_SAM_INFO
*sam
, prs_struct
*ps
, int depth
)
1342 prs_debug(ps
, depth
, desc
, "smb_io_sam_info");
1348 if(!smb_io_clnt_info2("", &sam
->client
, ps
, depth
))
1351 if(!prs_uint32("ptr_rtn_cred ", ps
, depth
, &sam
->ptr_rtn_cred
))
1353 if (sam
->ptr_rtn_cred
) {
1354 if(!smb_io_cred("", &sam
->rtn_cred
, ps
, depth
))
1358 if(!prs_uint16("logon_level ", ps
, depth
, &sam
->logon_level
))
1361 if (sam
->logon_level
!= 0) {
1362 if(!net_io_id_info_ctr("logon_info", &sam
->ctr
, ps
, depth
))
1369 /*******************************************************************
1370 Reads or writes a DOM_SAM_INFO_EX structure.
1371 ********************************************************************/
1373 static BOOL
smb_io_sam_info_ex(const char *desc
, DOM_SAM_INFO_EX
*sam
, prs_struct
*ps
, int depth
)
1378 prs_debug(ps
, depth
, desc
, "smb_io_sam_info_ex");
1384 if(!smb_io_clnt_srv("", &sam
->client
, ps
, depth
))
1387 if(!prs_uint16("logon_level ", ps
, depth
, &sam
->logon_level
))
1390 if (sam
->logon_level
!= 0) {
1391 if(!net_io_id_info_ctr("logon_info", &sam
->ctr
, ps
, depth
))
1398 /*************************************************************************
1399 Inits a NET_USER_INFO_3 structure.
1401 This is a network logon reply packet, and contains much information about
1402 the user. This information is passed as a (very long) paramater list
1403 to avoid having to link in the PASSDB code to every program that deals
1405 *************************************************************************/
1407 void init_net_user_info3(TALLOC_CTX
*ctx
, NET_USER_INFO_3
*usr
,
1411 const char* user_name
,
1412 const char* full_name
,
1413 const char* home_dir
,
1414 const char* dir_drive
,
1415 const char* logon_script
,
1416 const char* profile_path
,
1418 time_t unix_logon_time
,
1419 time_t unix_logoff_time
,
1420 time_t unix_kickoff_time
,
1421 time_t unix_pass_last_set_time
,
1422 time_t unix_pass_can_change_time
,
1423 time_t unix_pass_must_change_time
,
1425 uint16 logon_count
, uint16 bad_pw_count
,
1426 uint32 num_groups
, const DOM_GID
*gids
,
1427 uint32 user_flgs
, uint32 acct_flags
,
1428 uchar user_session_key
[16],
1429 uchar lm_session_key
[16],
1430 const char *logon_srv
, const char *logon_dom
,
1431 const DOM_SID
*dom_sid
)
1433 /* only cope with one "other" sid, right now. */
1434 /* need to count the number of space-delimited sids */
1436 int num_other_sids
= 0;
1438 NTTIME logon_time
, logoff_time
, kickoff_time
,
1439 pass_last_set_time
, pass_can_change_time
,
1440 pass_must_change_time
;
1444 usr
->ptr_user_info
= 1; /* yes, we're bothering to put USER_INFO data here */
1446 /* Create NTTIME structs */
1447 unix_to_nt_time (&logon_time
, unix_logon_time
);
1448 unix_to_nt_time (&logoff_time
, unix_logoff_time
);
1449 unix_to_nt_time (&kickoff_time
, unix_kickoff_time
);
1450 unix_to_nt_time (&pass_last_set_time
, unix_pass_last_set_time
);
1451 unix_to_nt_time (&pass_can_change_time
, unix_pass_can_change_time
);
1452 unix_to_nt_time (&pass_must_change_time
, unix_pass_must_change_time
);
1454 usr
->logon_time
= logon_time
;
1455 usr
->logoff_time
= logoff_time
;
1456 usr
->kickoff_time
= kickoff_time
;
1457 usr
->pass_last_set_time
= pass_last_set_time
;
1458 usr
->pass_can_change_time
= pass_can_change_time
;
1459 usr
->pass_must_change_time
= pass_must_change_time
;
1461 usr
->logon_count
= logon_count
;
1462 usr
->bad_pw_count
= bad_pw_count
;
1464 usr
->user_rid
= user_rid
;
1465 usr
->group_rid
= group_rid
;
1466 usr
->num_groups
= num_groups
;
1468 usr
->buffer_groups
= 1; /* indicates fill in groups, below, even if there are none */
1469 usr
->user_flgs
= user_flgs
;
1470 usr
->acct_flags
= acct_flags
;
1472 if (user_session_key
!= NULL
)
1473 memcpy(usr
->user_sess_key
, user_session_key
, sizeof(usr
->user_sess_key
));
1475 memset((char *)usr
->user_sess_key
, '\0', sizeof(usr
->user_sess_key
));
1477 usr
->buffer_dom_id
= dom_sid
? 1 : 0; /* yes, we're bothering to put a domain SID in */
1479 memset((char *)usr
->lm_sess_key
, '\0', sizeof(usr
->lm_sess_key
));
1481 for (i
=0; i
<7; i
++) {
1482 memset(&usr
->unknown
[i
], '\0', sizeof(usr
->unknown
));
1485 if (lm_session_key
!= NULL
) {
1486 memcpy(usr
->lm_sess_key
, lm_session_key
, sizeof(usr
->lm_sess_key
));
1489 num_other_sids
= init_dom_sid2s(ctx
, NULL
, &usr
->other_sids
);
1491 usr
->num_other_sids
= num_other_sids
;
1492 usr
->buffer_other_sids
= (num_other_sids
!= 0) ? 1 : 0;
1494 init_unistr2(&usr
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1495 init_uni_hdr(&usr
->hdr_user_name
, &usr
->uni_user_name
);
1496 init_unistr2(&usr
->uni_full_name
, full_name
, UNI_FLAGS_NONE
);
1497 init_uni_hdr(&usr
->hdr_full_name
, &usr
->uni_full_name
);
1498 init_unistr2(&usr
->uni_logon_script
, logon_script
, UNI_FLAGS_NONE
);
1499 init_uni_hdr(&usr
->hdr_logon_script
, &usr
->uni_logon_script
);
1500 init_unistr2(&usr
->uni_profile_path
, profile_path
, UNI_FLAGS_NONE
);
1501 init_uni_hdr(&usr
->hdr_profile_path
, &usr
->uni_profile_path
);
1502 init_unistr2(&usr
->uni_home_dir
, home_dir
, UNI_FLAGS_NONE
);
1503 init_uni_hdr(&usr
->hdr_home_dir
, &usr
->uni_home_dir
);
1504 init_unistr2(&usr
->uni_dir_drive
, dir_drive
, UNI_FLAGS_NONE
);
1505 init_uni_hdr(&usr
->hdr_dir_drive
, &usr
->uni_dir_drive
);
1507 usr
->num_groups2
= num_groups
;
1509 usr
->gids
= TALLOC_ZERO_ARRAY(ctx
,DOM_GID
,num_groups
);
1510 if (usr
->gids
== NULL
&& num_groups
>0)
1513 for (i
= 0; i
< num_groups
; i
++)
1514 usr
->gids
[i
] = gids
[i
];
1516 init_unistr2(&usr
->uni_logon_srv
, logon_srv
, UNI_FLAGS_NONE
);
1517 init_uni_hdr(&usr
->hdr_logon_srv
, &usr
->uni_logon_srv
);
1518 init_unistr2(&usr
->uni_logon_dom
, logon_dom
, UNI_FLAGS_NONE
);
1519 init_uni_hdr(&usr
->hdr_logon_dom
, &usr
->uni_logon_dom
);
1521 init_dom_sid2(&usr
->dom_sid
, dom_sid
);
1522 /* "other" sids are set up above */
1525 void dump_acct_flags(uint32 acct_flags
) {
1528 DEBUG(lvl
,("dump_acct_flags\n"));
1529 if (acct_flags
& ACB_NORMAL
) {
1530 DEBUGADD(lvl
,("\taccount has ACB_NORMAL\n"));
1532 if (acct_flags
& ACB_PWNOEXP
) {
1533 DEBUGADD(lvl
,("\taccount has ACB_PWNOEXP\n"));
1535 if (acct_flags
& ACB_ENC_TXT_PWD_ALLOWED
) {
1536 DEBUGADD(lvl
,("\taccount has ACB_ENC_TXT_PWD_ALLOWED\n"));
1538 if (acct_flags
& ACB_NOT_DELEGATED
) {
1539 DEBUGADD(lvl
,("\taccount has ACB_NOT_DELEGATED\n"));
1541 if (acct_flags
& ACB_USE_DES_KEY_ONLY
) {
1542 DEBUGADD(lvl
,("\taccount has ACB_USE_DES_KEY_ONLY set, sig verify wont work\n"));
1544 if (acct_flags
& ACB_NO_AUTH_DATA_REQD
) {
1545 DEBUGADD(lvl
,("\taccount has ACB_NO_AUTH_DATA_REQD set\n"));
1547 if (acct_flags
& ACB_PWEXPIRED
) {
1548 DEBUGADD(lvl
,("\taccount has ACB_PWEXPIRED set\n"));
1552 void dump_user_flgs(uint32 user_flags
) {
1555 DEBUG(lvl
,("dump_user_flgs\n"));
1556 if (user_flags
& LOGON_EXTRA_SIDS
) {
1557 DEBUGADD(lvl
,("\taccount has LOGON_EXTRA_SIDS\n"));
1559 if (user_flags
& LOGON_RESOURCE_GROUPS
) {
1560 DEBUGADD(lvl
,("\taccount has LOGON_RESOURCE_GROUPS\n"));
1562 if (user_flags
& LOGON_NTLMV2_ENABLED
) {
1563 DEBUGADD(lvl
,("\taccount has LOGON_NTLMV2_ENABLED\n"));
1565 if (user_flags
& LOGON_CACHED_ACCOUNT
) {
1566 DEBUGADD(lvl
,("\taccount has LOGON_CACHED_ACCOUNT\n"));
1568 if (user_flags
& LOGON_PROFILE_PATH_RETURNED
) {
1569 DEBUGADD(lvl
,("\taccount has LOGON_PROFILE_PATH_RETURNED\n"));
1571 if (user_flags
& LOGON_SERVER_TRUST_ACCOUNT
) {
1572 DEBUGADD(lvl
,("\taccount has LOGON_SERVER_TRUST_ACCOUNT\n"));
1578 /*******************************************************************
1579 This code has been modified to cope with a NET_USER_INFO_2 - which is
1580 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1581 We use validation level to determine if we're marshalling a info 2 or
1582 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1583 Jacobsen at HP. JRA.
1584 ********************************************************************/
1586 BOOL
net_io_user_info3(const char *desc
, NET_USER_INFO_3
*usr
, prs_struct
*ps
,
1587 int depth
, uint16 validation_level
, BOOL kerb_validation_level
)
1594 prs_debug(ps
, depth
, desc
, "net_io_user_info3");
1597 if (UNMARSHALLING(ps
))
1603 if(!prs_uint32("ptr_user_info ", ps
, depth
, &usr
->ptr_user_info
))
1606 if (usr
->ptr_user_info
== 0)
1609 if(!smb_io_time("logon time", &usr
->logon_time
, ps
, depth
)) /* logon time */
1611 if(!smb_io_time("logoff time", &usr
->logoff_time
, ps
, depth
)) /* logoff time */
1613 if(!smb_io_time("kickoff time", &usr
->kickoff_time
, ps
, depth
)) /* kickoff time */
1615 if(!smb_io_time("last set time", &usr
->pass_last_set_time
, ps
, depth
)) /* password last set time */
1617 if(!smb_io_time("can change time", &usr
->pass_can_change_time
, ps
, depth
)) /* password can change time */
1619 if(!smb_io_time("must change time", &usr
->pass_must_change_time
, ps
, depth
)) /* password must change time */
1622 if(!smb_io_unihdr("hdr_user_name", &usr
->hdr_user_name
, ps
, depth
)) /* username unicode string header */
1624 if(!smb_io_unihdr("hdr_full_name", &usr
->hdr_full_name
, ps
, depth
)) /* user's full name unicode string header */
1626 if(!smb_io_unihdr("hdr_logon_script", &usr
->hdr_logon_script
, ps
, depth
)) /* logon script unicode string header */
1628 if(!smb_io_unihdr("hdr_profile_path", &usr
->hdr_profile_path
, ps
, depth
)) /* profile path unicode string header */
1630 if(!smb_io_unihdr("hdr_home_dir", &usr
->hdr_home_dir
, ps
, depth
)) /* home directory unicode string header */
1632 if(!smb_io_unihdr("hdr_dir_drive", &usr
->hdr_dir_drive
, ps
, depth
)) /* home directory drive unicode string header */
1635 if(!prs_uint16("logon_count ", ps
, depth
, &usr
->logon_count
)) /* logon count */
1637 if(!prs_uint16("bad_pw_count ", ps
, depth
, &usr
->bad_pw_count
)) /* bad password count */
1640 if(!prs_uint32("user_rid ", ps
, depth
, &usr
->user_rid
)) /* User RID */
1642 if(!prs_uint32("group_rid ", ps
, depth
, &usr
->group_rid
)) /* Group RID */
1644 if(!prs_uint32("num_groups ", ps
, depth
, &usr
->num_groups
)) /* num groups */
1646 if(!prs_uint32("buffer_groups ", ps
, depth
, &usr
->buffer_groups
)) /* undocumented buffer pointer to groups. */
1648 if(!prs_uint32("user_flgs ", ps
, depth
, &usr
->user_flgs
)) /* user flags */
1650 dump_user_flgs(usr
->user_flgs
);
1651 if(!prs_uint8s(False
, "user_sess_key", ps
, depth
, usr
->user_sess_key
, 16)) /* user session key */
1654 if(!smb_io_unihdr("hdr_logon_srv", &usr
->hdr_logon_srv
, ps
, depth
)) /* logon server unicode string header */
1656 if(!smb_io_unihdr("hdr_logon_dom", &usr
->hdr_logon_dom
, ps
, depth
)) /* logon domain unicode string header */
1659 if(!prs_uint32("buffer_dom_id ", ps
, depth
, &usr
->buffer_dom_id
)) /* undocumented logon domain id pointer */
1662 if(!prs_uint8s(False
, "lm_sess_key", ps
, depth
, usr
->lm_sess_key
, 8)) /* lm session key */
1665 if(!prs_uint32("acct_flags ", ps
, depth
, &usr
->acct_flags
)) /* Account flags */
1667 dump_acct_flags(usr
->acct_flags
);
1668 for (i
= 0; i
< 7; i
++)
1670 if (!prs_uint32("unkown", ps
, depth
, &usr
->unknown
[i
])) /* unknown */
1674 if (validation_level
== 3) {
1675 if(!prs_uint32("num_other_sids", ps
, depth
, &usr
->num_other_sids
)) /* 0 - num_sids */
1677 if(!prs_uint32("buffer_other_sids", ps
, depth
, &usr
->buffer_other_sids
)) /* NULL - undocumented pointer to SIDs. */
1680 if (UNMARSHALLING(ps
)) {
1681 usr
->num_other_sids
= 0;
1682 usr
->buffer_other_sids
= 0;
1686 /* get kerb validation info (not really part of user_info_3) - Guenther */
1688 if (kerb_validation_level
) {
1690 if(!prs_uint32("ptr_res_group_dom_sid", ps
, depth
, &usr
->ptr_res_group_dom_sid
))
1692 if(!prs_uint32("res_group_count", ps
, depth
, &usr
->res_group_count
))
1694 if(!prs_uint32("ptr_res_groups", ps
, depth
, &usr
->ptr_res_groups
))
1698 if(!smb_io_unistr2("uni_user_name", &usr
->uni_user_name
, usr
->hdr_user_name
.buffer
, ps
, depth
)) /* username unicode string */
1700 if(!smb_io_unistr2("uni_full_name", &usr
->uni_full_name
, usr
->hdr_full_name
.buffer
, ps
, depth
)) /* user's full name unicode string */
1702 if(!smb_io_unistr2("uni_logon_script", &usr
->uni_logon_script
, usr
->hdr_logon_script
.buffer
, ps
, depth
)) /* logon script unicode string */
1704 if(!smb_io_unistr2("uni_profile_path", &usr
->uni_profile_path
, usr
->hdr_profile_path
.buffer
, ps
, depth
)) /* profile path unicode string */
1706 if(!smb_io_unistr2("uni_home_dir", &usr
->uni_home_dir
, usr
->hdr_home_dir
.buffer
, ps
, depth
)) /* home directory unicode string */
1708 if(!smb_io_unistr2("uni_dir_drive", &usr
->uni_dir_drive
, usr
->hdr_dir_drive
.buffer
, ps
, depth
)) /* home directory drive unicode string */
1714 if (usr
->num_groups
> 0) {
1716 if(!prs_uint32("num_groups2 ", ps
, depth
, &usr
->num_groups2
)) /* num groups2 */
1719 if (usr
->num_groups
!= usr
->num_groups2
) {
1720 DEBUG(3,("net_io_user_info3: num_groups mismatch! (%d != %d)\n",
1721 usr
->num_groups
, usr
->num_groups2
));
1726 if (UNMARSHALLING(ps
)) {
1727 usr
->gids
= PRS_ALLOC_MEM(ps
, DOM_GID
, usr
->num_groups
);
1728 if (usr
->gids
== NULL
)
1732 for (i
= 0; i
< usr
->num_groups
; i
++) {
1733 if(!smb_io_gid("", &usr
->gids
[i
], ps
, depth
)) /* group info */
1739 if(!smb_io_unistr2("uni_logon_srv", &usr
->uni_logon_srv
, usr
->hdr_logon_srv
.buffer
, ps
, depth
)) /* logon server unicode string */
1741 if(!smb_io_unistr2("uni_logon_dom", &usr
->uni_logon_dom
, usr
->hdr_logon_dom
.buffer
, ps
, depth
)) /* logon domain unicode string */
1744 if(!smb_io_dom_sid2("", &usr
->dom_sid
, ps
, depth
)) /* domain SID */
1747 if (validation_level
== 3 && usr
->buffer_other_sids
) {
1749 uint32 num_other_sids
= usr
->num_other_sids
;
1751 if (!(usr
->user_flgs
& LOGON_EXTRA_SIDS
)) {
1752 DEBUG(10,("net_io_user_info3: user_flgs attribute does not have LOGON_EXTRA_SIDS\n"));
1756 if (!prs_uint32("num_other_sids", ps
, depth
,
1760 if (num_other_sids
!= usr
->num_other_sids
)
1763 if (UNMARSHALLING(ps
)) {
1764 usr
->other_sids
= PRS_ALLOC_MEM(ps
, DOM_SID2
, usr
->num_other_sids
);
1765 usr
->other_sids_attrib
=
1766 PRS_ALLOC_MEM(ps
, uint32
, usr
->num_other_sids
);
1768 if ((num_other_sids
!= 0) &&
1769 ((usr
->other_sids
== NULL
) ||
1770 (usr
->other_sids_attrib
== NULL
)))
1774 /* First the pointers to the SIDS and attributes */
1778 for (i
=0; i
<usr
->num_other_sids
; i
++) {
1781 if (!prs_uint32("sid_ptr", ps
, depth
, &ptr
))
1784 if (UNMARSHALLING(ps
) && (ptr
== 0))
1787 if (!prs_uint32("attribute", ps
, depth
,
1788 &usr
->other_sids_attrib
[i
]))
1792 for (i
= 0; i
< usr
->num_other_sids
; i
++) {
1793 if(!smb_io_dom_sid2("", &usr
->other_sids
[i
], ps
, depth
)) /* other domain SIDs */
1803 /*******************************************************************
1804 Reads or writes a structure.
1805 ********************************************************************/
1807 BOOL
net_io_q_sam_logon(const char *desc
, NET_Q_SAM_LOGON
*q_l
, prs_struct
*ps
, int depth
)
1812 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logon");
1818 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
))
1821 if(!prs_align_uint16(ps
))
1824 if(!prs_uint16("validation_level", ps
, depth
, &q_l
->validation_level
))
1830 /*******************************************************************
1831 Reads or writes a structure.
1832 ********************************************************************/
1834 BOOL
net_io_r_sam_logon(const char *desc
, NET_R_SAM_LOGON
*r_l
, prs_struct
*ps
, int depth
)
1839 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logon");
1842 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1844 if (&r_l
->buffer_creds
) {
1845 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1849 if(!prs_uint16("switch_value", ps
, depth
, &r_l
->switch_value
))
1854 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1855 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1858 if (r_l
->switch_value
!= 0) {
1859 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1864 if(!prs_uint32("auth_resp ", ps
, depth
, &r_l
->auth_resp
)) /* 1 - Authoritative response; 0 - Non-Auth? */
1867 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1876 /*******************************************************************
1877 Reads or writes a structure.
1878 ********************************************************************/
1880 BOOL
net_io_q_sam_logon_ex(const char *desc
, NET_Q_SAM_LOGON_EX
*q_l
, prs_struct
*ps
, int depth
)
1885 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logon_ex");
1891 if(!smb_io_sam_info_ex("", &q_l
->sam_id
, ps
, depth
))
1894 if(!prs_align_uint16(ps
))
1897 if(!prs_uint16("validation_level", ps
, depth
, &q_l
->validation_level
))
1900 if(!prs_uint32("flags ", ps
, depth
, &q_l
->flags
))
1906 /*******************************************************************
1907 Reads or writes a structure.
1908 ********************************************************************/
1910 BOOL
net_io_r_sam_logon_ex(const char *desc
, NET_R_SAM_LOGON_EX
*r_l
, prs_struct
*ps
, int depth
)
1915 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logon_ex");
1918 if(!prs_uint16("switch_value", ps
, depth
, &r_l
->switch_value
))
1923 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1924 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1927 if (r_l
->switch_value
!= 0) {
1928 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1933 if(!prs_uint32("auth_resp ", ps
, depth
, &r_l
->auth_resp
)) /* 1 - Authoritative response; 0 - Non-Auth? */
1936 if(!prs_uint32("flags ", ps
, depth
, &r_l
->flags
))
1939 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1949 /*******************************************************************
1950 Reads or writes a structure.
1951 ********************************************************************/
1953 BOOL
net_io_q_sam_logoff(const char *desc
, NET_Q_SAM_LOGOFF
*q_l
, prs_struct
*ps
, int depth
)
1958 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logoff");
1964 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
)) /* domain SID */
1970 /*******************************************************************
1971 Reads or writes a structure.
1972 ********************************************************************/
1974 BOOL
net_io_r_sam_logoff(const char *desc
, NET_R_SAM_LOGOFF
*r_l
, prs_struct
*ps
, int depth
)
1979 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logoff");
1985 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1987 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1990 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1996 /*******************************************************************
1997 makes a NET_Q_SAM_SYNC structure.
1998 ********************************************************************/
1999 BOOL
init_net_q_sam_sync(NET_Q_SAM_SYNC
* q_s
, const char *srv_name
,
2000 const char *cli_name
, DOM_CRED
*cli_creds
,
2001 DOM_CRED
*ret_creds
, uint32 database_id
,
2004 DEBUG(5, ("init_q_sam_sync\n"));
2006 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
2007 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
2010 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
2013 memcpy(&q_s
->ret_creds
, ret_creds
, sizeof(q_s
->ret_creds
));
2015 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
2017 q_s
->database_id
= database_id
;
2018 q_s
->restart_state
= 0;
2019 q_s
->sync_context
= next_rid
;
2020 q_s
->max_size
= 0xffff;
2025 /*******************************************************************
2026 reads or writes a structure.
2027 ********************************************************************/
2028 BOOL
net_io_q_sam_sync(const char *desc
, NET_Q_SAM_SYNC
* q_s
, prs_struct
*ps
,
2031 prs_debug(ps
, depth
, desc
, "net_io_q_sam_sync");
2034 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
2036 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
2039 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
2041 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
2044 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
2046 if (!prs_uint32("restart_state", ps
, depth
, &q_s
->restart_state
))
2048 if (!prs_uint32("sync_context ", ps
, depth
, &q_s
->sync_context
))
2051 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
2057 /*******************************************************************
2058 reads or writes a structure.
2059 ********************************************************************/
2060 static BOOL
net_io_sam_delta_hdr(const char *desc
, SAM_DELTA_HDR
* delta
,
2061 prs_struct
*ps
, int depth
)
2063 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_hdr");
2066 if (!prs_uint16("type", ps
, depth
, &delta
->type
))
2068 if (!prs_uint16("type2", ps
, depth
, &delta
->type2
))
2070 if (!prs_uint32("target_rid", ps
, depth
, &delta
->target_rid
))
2073 if (!prs_uint32("type3", ps
, depth
, &delta
->type3
))
2076 /* Not sure why we need this but it seems to be necessary to get
2077 sam deltas working. */
2079 if (delta
->type
!= 0x16) {
2080 if (!prs_uint32("ptr_delta", ps
, depth
, &delta
->ptr_delta
))
2087 /*******************************************************************
2088 reads or writes a structure.
2089 ********************************************************************/
2090 static BOOL
net_io_sam_delta_mod_count(const char *desc
, SAM_DELTA_MOD_COUNT
*info
,
2091 prs_struct
*ps
, int depth
)
2093 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_stamp");
2096 if (!prs_uint32("seqnum", ps
, depth
, &info
->seqnum
))
2098 if (!prs_uint32("dom_mod_count_ptr", ps
, depth
,
2099 &info
->dom_mod_count_ptr
))
2102 if (info
->dom_mod_count_ptr
) {
2103 if (!prs_uint64("dom_mod_count", ps
, depth
,
2104 &info
->dom_mod_count
))
2111 /*******************************************************************
2112 reads or writes a structure.
2113 ********************************************************************/
2114 static BOOL
net_io_sam_domain_info(const char *desc
, SAM_DOMAIN_INFO
* info
,
2115 prs_struct
*ps
, int depth
)
2117 prs_debug(ps
, depth
, desc
, "net_io_sam_domain_info");
2120 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
2122 if (!smb_io_unihdr("hdr_oem_info", &info
->hdr_oem_info
, ps
, depth
))
2125 if (!prs_uint64("force_logoff", ps
, depth
, &info
->force_logoff
))
2127 if (!prs_uint16("min_pwd_len", ps
, depth
, &info
->min_pwd_len
))
2129 if (!prs_uint16("pwd_history_len", ps
, depth
, &info
->pwd_history_len
))
2131 if (!prs_uint64("max_pwd_age", ps
, depth
, &info
->max_pwd_age
))
2133 if (!prs_uint64("min_pwd_age", ps
, depth
, &info
->min_pwd_age
))
2135 if (!prs_uint64("dom_mod_count", ps
, depth
, &info
->dom_mod_count
))
2137 if (!smb_io_time("creation_time", &info
->creation_time
, ps
, depth
))
2139 if (!prs_uint32("security_information", ps
, depth
, &info
->security_information
))
2141 if (!smb_io_bufhdr4("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2143 if (!smb_io_lockout_string_hdr("hdr_account_lockout_string", &info
->hdr_account_lockout
, ps
, depth
))
2145 if (!smb_io_unihdr("hdr_unknown2", &info
->hdr_unknown2
, ps
, depth
))
2147 if (!smb_io_unihdr("hdr_unknown3", &info
->hdr_unknown3
, ps
, depth
))
2149 if (!smb_io_unihdr("hdr_unknown4", &info
->hdr_unknown4
, ps
, depth
))
2151 if (!prs_uint32("logon_chgpass", ps
, depth
, &info
->logon_chgpass
))
2153 if (!prs_uint32("unknown6", ps
, depth
, &info
->unknown6
))
2155 if (!prs_uint32("unknown7", ps
, depth
, &info
->unknown7
))
2157 if (!prs_uint32("unknown8", ps
, depth
, &info
->unknown8
))
2160 if (!smb_io_unistr2("uni_dom_name", &info
->uni_dom_name
,
2161 info
->hdr_dom_name
.buffer
, ps
, depth
))
2163 if (!smb_io_unistr2("buf_oem_info", &info
->buf_oem_info
,
2164 info
->hdr_oem_info
.buffer
, ps
, depth
))
2167 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2170 if (!smb_io_account_lockout_str("account_lockout", &info
->account_lockout
,
2171 info
->hdr_account_lockout
.buffer
, ps
, depth
))
2174 if (!smb_io_unistr2("buf_unknown2", &info
->buf_unknown2
,
2175 info
->hdr_unknown2
.buffer
, ps
, depth
))
2177 if (!smb_io_unistr2("buf_unknown3", &info
->buf_unknown3
,
2178 info
->hdr_unknown3
.buffer
, ps
, depth
))
2180 if (!smb_io_unistr2("buf_unknown4", &info
->buf_unknown4
,
2181 info
->hdr_unknown4
.buffer
, ps
, depth
))
2187 /*******************************************************************
2188 reads or writes a structure.
2189 ********************************************************************/
2190 static BOOL
net_io_sam_group_info(const char *desc
, SAM_GROUP_INFO
* info
,
2191 prs_struct
*ps
, int depth
)
2193 prs_debug(ps
, depth
, desc
, "net_io_sam_group_info");
2196 if (!smb_io_unihdr("hdr_grp_name", &info
->hdr_grp_name
, ps
, depth
))
2198 if (!smb_io_gid("gid", &info
->gid
, ps
, depth
))
2200 if (!smb_io_unihdr("hdr_grp_desc", &info
->hdr_grp_desc
, ps
, depth
))
2202 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2205 if (ps
->data_offset
+ 48 > ps
->buffer_size
)
2207 ps
->data_offset
+= 48;
2209 if (!smb_io_unistr2("uni_grp_name", &info
->uni_grp_name
,
2210 info
->hdr_grp_name
.buffer
, ps
, depth
))
2212 if (!smb_io_unistr2("uni_grp_desc", &info
->uni_grp_desc
,
2213 info
->hdr_grp_desc
.buffer
, ps
, depth
))
2215 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2221 /*******************************************************************
2222 reads or writes a structure.
2223 ********************************************************************/
2224 static BOOL
net_io_sam_passwd_info(const char *desc
, SAM_PWD
* pwd
,
2225 prs_struct
*ps
, int depth
)
2227 prs_debug(ps
, depth
, desc
, "net_io_sam_passwd_info");
2230 if (!prs_uint32("unk_0 ", ps
, depth
, &pwd
->unk_0
))
2233 if (!smb_io_unihdr("hdr_lm_pwd", &pwd
->hdr_lm_pwd
, ps
, depth
))
2235 if (!prs_uint8s(False
, "buf_lm_pwd", ps
, depth
, pwd
->buf_lm_pwd
, 16))
2238 if (!smb_io_unihdr("hdr_nt_pwd", &pwd
->hdr_nt_pwd
, ps
, depth
))
2240 if (!prs_uint8s(False
, "buf_nt_pwd", ps
, depth
, pwd
->buf_nt_pwd
, 16))
2243 if (!smb_io_unihdr("", &pwd
->hdr_empty_lm
, ps
, depth
))
2245 if (!smb_io_unihdr("", &pwd
->hdr_empty_nt
, ps
, depth
))
2251 /*******************************************************************
2252 reads or writes a structure.
2253 ********************************************************************/
2254 static BOOL
net_io_sam_account_info(const char *desc
, SAM_ACCOUNT_INFO
*info
,
2255 prs_struct
*ps
, int depth
)
2257 BUFHDR2 hdr_priv_data
;
2260 prs_debug(ps
, depth
, desc
, "net_io_sam_account_info");
2263 if (!smb_io_unihdr("hdr_acct_name", &info
->hdr_acct_name
, ps
, depth
))
2265 if (!smb_io_unihdr("hdr_full_name", &info
->hdr_full_name
, ps
, depth
))
2268 if (!prs_uint32("user_rid ", ps
, depth
, &info
->user_rid
))
2270 if (!prs_uint32("group_rid", ps
, depth
, &info
->group_rid
))
2273 if (!smb_io_unihdr("hdr_home_dir ", &info
->hdr_home_dir
, ps
, depth
))
2275 if (!smb_io_unihdr("hdr_dir_drive", &info
->hdr_dir_drive
, ps
, depth
))
2277 if (!smb_io_unihdr("hdr_logon_script", &info
->hdr_logon_script
, ps
,
2281 if (!smb_io_unihdr("hdr_acct_desc", &info
->hdr_acct_desc
, ps
, depth
))
2283 if (!smb_io_unihdr("hdr_workstations", &info
->hdr_workstations
, ps
,
2287 if (!smb_io_time("logon_time", &info
->logon_time
, ps
, depth
))
2289 if (!smb_io_time("logoff_time", &info
->logoff_time
, ps
, depth
))
2292 if (!prs_uint32("logon_divs ", ps
, depth
, &info
->logon_divs
))
2294 if (!prs_uint32("ptr_logon_hrs", ps
, depth
, &info
->ptr_logon_hrs
))
2297 if (!prs_uint16("bad_pwd_count", ps
, depth
, &info
->bad_pwd_count
))
2299 if (!prs_uint16("logon_count", ps
, depth
, &info
->logon_count
))
2301 if (!smb_io_time("pwd_last_set_time", &info
->pwd_last_set_time
, ps
,
2304 if (!smb_io_time("acct_expiry_time", &info
->acct_expiry_time
, ps
,
2308 if (!prs_uint32("acb_info", ps
, depth
, &info
->acb_info
))
2310 if (!prs_uint8s(False
, "nt_pwd", ps
, depth
, info
->nt_pwd
, 16))
2312 if (!prs_uint8s(False
, "lm_pwd", ps
, depth
, info
->lm_pwd
, 16))
2314 if (!prs_uint8("lm_pwd_present", ps
, depth
, &info
->lm_pwd_present
))
2316 if (!prs_uint8("nt_pwd_present", ps
, depth
, &info
->nt_pwd_present
))
2318 if (!prs_uint8("pwd_expired", ps
, depth
, &info
->pwd_expired
))
2321 if (!smb_io_unihdr("hdr_comment", &info
->hdr_comment
, ps
, depth
))
2323 if (!smb_io_unihdr("hdr_parameters", &info
->hdr_parameters
, ps
,
2326 if (!prs_uint16("country", ps
, depth
, &info
->country
))
2328 if (!prs_uint16("codepage", ps
, depth
, &info
->codepage
))
2331 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data
, ps
, depth
))
2333 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2335 if (!smb_io_unihdr("hdr_profile", &info
->hdr_profile
, ps
, depth
))
2338 for (i
= 0; i
< 3; i
++)
2340 if (!smb_io_unihdr("hdr_reserved", &info
->hdr_reserved
[i
],
2345 for (i
= 0; i
< 4; i
++)
2347 if (!prs_uint32("dw_reserved", ps
, depth
,
2348 &info
->dw_reserved
[i
]))
2352 if (!smb_io_unistr2("uni_acct_name", &info
->uni_acct_name
,
2353 info
->hdr_acct_name
.buffer
, ps
, depth
))
2356 if (!smb_io_unistr2("uni_full_name", &info
->uni_full_name
,
2357 info
->hdr_full_name
.buffer
, ps
, depth
))
2360 if (!smb_io_unistr2("uni_home_dir ", &info
->uni_home_dir
,
2361 info
->hdr_home_dir
.buffer
, ps
, depth
))
2364 if (!smb_io_unistr2("uni_dir_drive", &info
->uni_dir_drive
,
2365 info
->hdr_dir_drive
.buffer
, ps
, depth
))
2368 if (!smb_io_unistr2("uni_logon_script", &info
->uni_logon_script
,
2369 info
->hdr_logon_script
.buffer
, ps
, depth
))
2372 if (!smb_io_unistr2("uni_acct_desc", &info
->uni_acct_desc
,
2373 info
->hdr_acct_desc
.buffer
, ps
, depth
))
2376 if (!smb_io_unistr2("uni_workstations", &info
->uni_workstations
,
2377 info
->hdr_workstations
.buffer
, ps
, depth
))
2381 if (!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2383 if (!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2386 if (!smb_io_rpc_blob("buf_logon_hrs", &info
->buf_logon_hrs
, ps
, depth
))
2389 if (!smb_io_unistr2("uni_comment", &info
->uni_comment
,
2390 info
->hdr_comment
.buffer
, ps
, depth
))
2393 if (!smb_io_unistr2("uni_parameters", &info
->uni_parameters
,
2394 info
->hdr_parameters
.buffer
, ps
, depth
))
2397 if (hdr_priv_data
.buffer
!= 0)
2401 if (!prs_uint32("pwd_len", ps
, depth
, &len
))
2403 old_offset
= ps
->data_offset
;
2409 if (!prs_hash1(ps
, ps
->data_offset
, len
))
2412 if (!net_io_sam_passwd_info("pass", &info
->pass
,
2419 if (!prs_hash1(ps
, old_offset
, len
))
2423 if (old_offset
+ len
> ps
->buffer_size
)
2425 ps
->data_offset
= old_offset
+ len
;
2427 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2430 if (!smb_io_unistr2("uni_profile", &info
->uni_profile
,
2431 info
->hdr_profile
.buffer
, ps
, depth
))
2439 /*******************************************************************
2440 reads or writes a structure.
2441 ********************************************************************/
2442 static BOOL
net_io_sam_group_mem_info(const char *desc
, SAM_GROUP_MEM_INFO
* info
,
2443 prs_struct
*ps
, int depth
)
2448 prs_debug(ps
, depth
, desc
, "net_io_sam_group_mem_info");
2452 if (!prs_uint32("ptr_rids ", ps
, depth
, &info
->ptr_rids
))
2454 if (!prs_uint32("ptr_attribs", ps
, depth
, &info
->ptr_attribs
))
2456 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2459 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2461 ps
->data_offset
+= 16;
2463 if (info
->ptr_rids
!= 0)
2465 if (!prs_uint32("num_members2", ps
, depth
,
2466 &info
->num_members2
))
2469 if (info
->num_members2
!= info
->num_members
)
2475 info
->rids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members2
);
2477 if (info
->rids
== NULL
) {
2478 DEBUG(0, ("out of memory allocating %d rids\n",
2479 info
->num_members2
));
2483 for (i
= 0; i
< info
->num_members2
; i
++)
2485 slprintf(tmp
, sizeof(tmp
) - 1, "rids[%02d]", i
);
2486 if (!prs_uint32(tmp
, ps
, depth
, &info
->rids
[i
]))
2491 if (info
->ptr_attribs
!= 0)
2493 if (!prs_uint32("num_members3", ps
, depth
,
2494 &info
->num_members3
))
2496 if (info
->num_members3
!= info
->num_members
)
2502 info
->attribs
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members3
);
2504 if (info
->attribs
== NULL
) {
2505 DEBUG(0, ("out of memory allocating %d attribs\n",
2506 info
->num_members3
));
2510 for (i
= 0; i
< info
->num_members3
; i
++)
2512 slprintf(tmp
, sizeof(tmp
) - 1, "attribs[%02d]", i
);
2513 if (!prs_uint32(tmp
, ps
, depth
, &info
->attribs
[i
]))
2521 /*******************************************************************
2522 reads or writes a structure.
2523 ********************************************************************/
2524 static BOOL
net_io_sam_alias_info(const char *desc
, SAM_ALIAS_INFO
* info
,
2525 prs_struct
*ps
, int depth
)
2527 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_info");
2530 if (!smb_io_unihdr("hdr_als_name", &info
->hdr_als_name
, ps
, depth
))
2532 if (!prs_uint32("als_rid", ps
, depth
, &info
->als_rid
))
2534 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2536 if (!smb_io_unihdr("hdr_als_desc", &info
->hdr_als_desc
, ps
, depth
))
2539 if (ps
->data_offset
+ 40 > ps
->buffer_size
)
2541 ps
->data_offset
+= 40;
2543 if (!smb_io_unistr2("uni_als_name", &info
->uni_als_name
,
2544 info
->hdr_als_name
.buffer
, ps
, depth
))
2546 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2549 if (!smb_io_unistr2("uni_als_desc", &info
->uni_als_desc
,
2550 info
->hdr_als_desc
.buffer
, ps
, depth
))
2556 /*******************************************************************
2557 reads or writes a structure.
2558 ********************************************************************/
2559 static BOOL
net_io_sam_alias_mem_info(const char *desc
, SAM_ALIAS_MEM_INFO
* info
,
2560 prs_struct
*ps
, int depth
)
2565 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_mem_info");
2569 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2571 if (!prs_uint32("ptr_members", ps
, depth
, &info
->ptr_members
))
2574 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2576 ps
->data_offset
+= 16;
2578 if (info
->ptr_members
!= 0)
2580 if (!prs_uint32("num_sids", ps
, depth
, &info
->num_sids
))
2582 if (info
->num_sids
!= info
->num_members
)
2588 info
->ptr_sids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_sids
);
2590 if (info
->ptr_sids
== NULL
) {
2591 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2596 for (i
= 0; i
< info
->num_sids
; i
++)
2598 slprintf(tmp
, sizeof(tmp
) - 1, "ptr_sids[%02d]", i
);
2599 if (!prs_uint32(tmp
, ps
, depth
, &info
->ptr_sids
[i
]))
2603 info
->sids
= TALLOC_ARRAY(ps
->mem_ctx
, DOM_SID2
, info
->num_sids
);
2605 if (info
->sids
== NULL
) {
2606 DEBUG(0, ("error allocating %d sids\n",
2611 for (i
= 0; i
< info
->num_sids
; i
++)
2613 if (info
->ptr_sids
[i
] != 0)
2615 slprintf(tmp
, sizeof(tmp
) - 1, "sids[%02d]",
2617 if (!smb_io_dom_sid2(tmp
, &info
->sids
[i
],
2627 /*******************************************************************
2628 reads or writes a structure.
2629 ********************************************************************/
2630 static BOOL
net_io_sam_policy_info(const char *desc
, SAM_DELTA_POLICY
*info
,
2631 prs_struct
*ps
, int depth
)
2634 prs_debug(ps
, depth
, desc
, "net_io_sam_policy_info");
2640 if (!prs_uint32("max_log_size", ps
, depth
, &info
->max_log_size
))
2642 if (!prs_uint64("audit_retention_period", ps
, depth
,
2643 &info
->audit_retention_period
))
2645 if (!prs_uint32("auditing_mode", ps
, depth
, &info
->auditing_mode
))
2647 if (!prs_uint32("num_events", ps
, depth
, &info
->num_events
))
2649 if (!prs_uint32("ptr_events", ps
, depth
, &info
->ptr_events
))
2652 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
2655 if (!prs_uint32("sid_ptr", ps
, depth
, &info
->sid_ptr
))
2658 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2660 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2661 &info
->non_paged_pool_limit
))
2663 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2665 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2667 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2669 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2671 if (!smb_io_time("modify_time", &info
->modify_time
, ps
, depth
))
2673 if (!smb_io_time("create_time", &info
->create_time
, ps
, depth
))
2675 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2678 for (i
=0; i
<4; i
++) {
2680 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2684 for (i
=0; i
<4; i
++) {
2686 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2690 if (!prs_uint32("num_event_audit_options", ps
, depth
,
2691 &info
->num_event_audit_options
))
2694 for (i
=0; i
<info
->num_event_audit_options
; i
++)
2695 if (!prs_uint32("event_audit_option", ps
, depth
,
2696 &info
->event_audit_option
))
2699 if (!smb_io_unistr2("domain_name", &info
->domain_name
, True
, ps
, depth
))
2702 if(!smb_io_dom_sid2("domain_sid", &info
->domain_sid
, ps
, depth
))
2705 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2714 /* This function is pretty broken - see bug #334 */
2716 /*******************************************************************
2717 reads or writes a structure.
2718 ********************************************************************/
2719 static BOOL
net_io_sam_trustdoms_info(const char *desc
, SAM_DELTA_TRUSTDOMS
*info
,
2720 prs_struct
*ps
, int depth
)
2724 prs_debug(ps
, depth
, desc
, "net_io_sam_trustdoms_info");
2730 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2733 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2736 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2739 if(!smb_io_unihdr("hdr_domain", &info
->hdr_domain
, ps
, depth
))
2742 if(!prs_uint32("unknown0", ps
, depth
, &info
->unknown0
))
2744 if(!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2746 if(!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2749 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2751 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2754 for (i
=0; i
<12; i
++)
2755 if(!prs_uint32("unknown3", ps
, depth
, &info
->unknown3
))
2758 if (!smb_io_unistr2("domain", &info
->domain
, True
, ps
, depth
))
2768 /* This function doesn't work - see bug #334 */
2770 /*******************************************************************
2771 reads or writes a structure.
2772 ********************************************************************/
2773 static BOOL
net_io_sam_secret_info(const char *desc
, SAM_DELTA_SECRET
*info
,
2774 prs_struct
*ps
, int depth
)
2778 prs_debug(ps
, depth
, desc
, "net_io_sam_secret_info");
2784 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2787 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2790 if (!smb_io_unistr2("secret", &info
->secret
, True
, ps
, depth
))
2796 if(!prs_uint32("count1", ps
, depth
, &info
->count1
))
2798 if(!prs_uint32("count2", ps
, depth
, &info
->count2
))
2800 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2804 if(!smb_io_time("time1", &info
->time1
, ps
, depth
)) /* logon time */
2806 if(!prs_uint32("count3", ps
, depth
, &info
->count3
))
2808 if(!prs_uint32("count4", ps
, depth
, &info
->count4
))
2810 if(!prs_uint32("ptr2", ps
, depth
, &info
->ptr2
))
2812 if(!smb_io_time("time2", &info
->time2
, ps
, depth
)) /* logon time */
2814 if(!prs_uint32("unknow1", ps
, depth
, &info
->unknow1
))
2818 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2820 if(!prs_uint32("ptr3", ps
, depth
, &info
->ptr3
))
2823 if(!prs_uint32("unknow2", ps
, depth
, &info
->unknow2
))
2826 if(!prs_uint32("chal_len", ps
, depth
, &info
->chal_len
))
2828 if(!prs_uint32("reserved1", ps
, depth
, &info
->reserved1
))
2830 if(!prs_uint32("chal_len2", ps
, depth
, &info
->chal_len2
))
2833 if(!prs_uint8s (False
, "chal", ps
, depth
, info
->chal
, info
->chal_len2
))
2836 if(!prs_uint32("key_len", ps
, depth
, &info
->key_len
))
2838 if(!prs_uint32("reserved2", ps
, depth
, &info
->reserved2
))
2840 if(!prs_uint32("key_len2", ps
, depth
, &info
->key_len2
))
2843 if(!prs_uint8s (False
, "key", ps
, depth
, info
->key
, info
->key_len2
))
2847 if(!prs_uint32("buf_size3", ps
, depth
, &info
->buf_size3
))
2850 if(!sec_io_desc("sec_desc2", &info
->sec_desc2
, ps
, depth
))
2859 /*******************************************************************
2860 reads or writes a structure.
2861 ********************************************************************/
2862 static BOOL
net_io_sam_privs_info(const char *desc
, SAM_DELTA_PRIVS
*info
,
2863 prs_struct
*ps
, int depth
)
2867 prs_debug(ps
, depth
, desc
, "net_io_sam_privs_info");
2873 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2876 if(!prs_uint32("priv_count", ps
, depth
, &info
->priv_count
))
2878 if(!prs_uint32("priv_control", ps
, depth
, &info
->priv_control
))
2881 if(!prs_uint32("priv_attr_ptr", ps
, depth
, &info
->priv_attr_ptr
))
2883 if(!prs_uint32("priv_name_ptr", ps
, depth
, &info
->priv_name_ptr
))
2886 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2888 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2889 &info
->non_paged_pool_limit
))
2891 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2893 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2895 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2897 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2899 if (!prs_uint32("system_flags", ps
, depth
, &info
->system_flags
))
2901 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2904 for (i
=0; i
<4; i
++) {
2906 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2910 for (i
=0; i
<4; i
++) {
2912 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2916 if(!prs_uint32("attribute_count", ps
, depth
, &info
->attribute_count
))
2919 info
->attributes
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->attribute_count
);
2921 for (i
=0; i
<info
->attribute_count
; i
++)
2922 if(!prs_uint32("attributes", ps
, depth
, &info
->attributes
[i
]))
2925 if(!prs_uint32("privlist_count", ps
, depth
, &info
->privlist_count
))
2928 info
->hdr_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNIHDR
, info
->privlist_count
);
2929 info
->uni_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNISTR2
, info
->privlist_count
);
2931 for (i
=0; i
<info
->privlist_count
; i
++)
2932 if(!smb_io_unihdr("hdr_privslist", &info
->hdr_privslist
[i
], ps
, depth
))
2935 for (i
=0; i
<info
->privlist_count
; i
++)
2936 if (!smb_io_unistr2("uni_privslist", &info
->uni_privslist
[i
], True
, ps
, depth
))
2939 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2945 /*******************************************************************
2946 reads or writes a structure.
2947 ********************************************************************/
2948 static BOOL
net_io_sam_delta_ctr(const char *desc
,
2949 SAM_DELTA_CTR
* delta
, uint16 type
,
2950 prs_struct
*ps
, int depth
)
2952 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_ctr");
2956 /* Seen in sam deltas */
2957 case SAM_DELTA_MODIFIED_COUNT
:
2958 if (!net_io_sam_delta_mod_count("", &delta
->mod_count
, ps
, depth
))
2962 case SAM_DELTA_DOMAIN_INFO
:
2963 if (!net_io_sam_domain_info("", &delta
->domain_info
, ps
, depth
))
2967 case SAM_DELTA_GROUP_INFO
:
2968 if (!net_io_sam_group_info("", &delta
->group_info
, ps
, depth
))
2972 case SAM_DELTA_ACCOUNT_INFO
:
2973 if (!net_io_sam_account_info("", &delta
->account_info
, ps
, depth
))
2977 case SAM_DELTA_GROUP_MEM
:
2978 if (!net_io_sam_group_mem_info("", &delta
->grp_mem_info
, ps
, depth
))
2982 case SAM_DELTA_ALIAS_INFO
:
2983 if (!net_io_sam_alias_info("", &delta
->alias_info
, ps
, depth
))
2987 case SAM_DELTA_POLICY_INFO
:
2988 if (!net_io_sam_policy_info("", &delta
->policy_info
, ps
, depth
))
2992 case SAM_DELTA_ALIAS_MEM
:
2993 if (!net_io_sam_alias_mem_info("", &delta
->als_mem_info
, ps
, depth
))
2997 case SAM_DELTA_PRIVS_INFO
:
2998 if (!net_io_sam_privs_info("", &delta
->privs_info
, ps
, depth
))
3002 /* These guys are implemented but broken */
3004 case SAM_DELTA_TRUST_DOMS
:
3005 case SAM_DELTA_SECRET_INFO
:
3008 /* These guys are not implemented yet */
3010 case SAM_DELTA_RENAME_GROUP
:
3011 case SAM_DELTA_RENAME_USER
:
3012 case SAM_DELTA_RENAME_ALIAS
:
3013 case SAM_DELTA_DELETE_GROUP
:
3014 case SAM_DELTA_DELETE_USER
:
3016 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type
));
3023 /*******************************************************************
3024 reads or writes a structure.
3025 ********************************************************************/
3026 BOOL
net_io_r_sam_sync(const char *desc
,
3027 NET_R_SAM_SYNC
* r_s
, prs_struct
*ps
, int depth
)
3031 prs_debug(ps
, depth
, desc
, "net_io_r_sam_sync");
3034 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
3036 if (!prs_uint32("sync_context", ps
, depth
, &r_s
->sync_context
))
3039 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
3041 if (r_s
->ptr_deltas
!= 0)
3043 if (!prs_uint32("num_deltas ", ps
, depth
, &r_s
->num_deltas
))
3045 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->ptr_deltas2
))
3047 if (r_s
->ptr_deltas2
!= 0)
3049 if (!prs_uint32("num_deltas2", ps
, depth
,
3053 if (r_s
->num_deltas2
!= r_s
->num_deltas
)
3059 if (r_s
->num_deltas2
> 0) {
3060 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas2
);
3061 if (r_s
->hdr_deltas
== NULL
) {
3062 DEBUG(0, ("error tallocating memory "
3063 "for %d delta headers\n",
3069 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
3071 if (!net_io_sam_delta_hdr("",
3072 &r_s
->hdr_deltas
[i
],
3077 if (r_s
->num_deltas2
> 0) {
3078 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas2
);
3079 if (r_s
->deltas
== NULL
) {
3080 DEBUG(0, ("error tallocating memory "
3087 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
3089 if (!net_io_sam_delta_ctr(
3090 "", &r_s
->deltas
[i
],
3091 r_s
->hdr_deltas
[i
].type3
,
3093 DEBUG(0, ("hmm, failed on i=%d\n", i
));
3101 if (!prs_ntstatus("status", ps
, depth
, &(r_s
->status
)))
3107 /*******************************************************************
3108 makes a NET_Q_SAM_DELTAS structure.
3109 ********************************************************************/
3110 BOOL
init_net_q_sam_deltas(NET_Q_SAM_DELTAS
*q_s
, const char *srv_name
,
3111 const char *cli_name
, DOM_CRED
*cli_creds
,
3112 uint32 database_id
, UINT64_S dom_mod_count
)
3114 DEBUG(5, ("init_net_q_sam_deltas\n"));
3116 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
3117 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
3119 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
3120 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
3122 q_s
->database_id
= database_id
;
3123 q_s
->dom_mod_count
.low
= dom_mod_count
.low
;
3124 q_s
->dom_mod_count
.high
= dom_mod_count
.high
;
3125 q_s
->max_size
= 0xffff;
3130 /*******************************************************************
3131 reads or writes a structure.
3132 ********************************************************************/
3133 BOOL
net_io_q_sam_deltas(const char *desc
, NET_Q_SAM_DELTAS
*q_s
, prs_struct
*ps
,
3136 prs_debug(ps
, depth
, desc
, "net_io_q_sam_deltas");
3139 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
3141 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
3144 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
3146 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
3149 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
3151 if (!prs_uint64("dom_mod_count", ps
, depth
, &q_s
->dom_mod_count
))
3153 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
3159 /*******************************************************************
3160 reads or writes a structure.
3161 ********************************************************************/
3162 BOOL
net_io_r_sam_deltas(const char *desc
,
3163 NET_R_SAM_DELTAS
*r_s
, prs_struct
*ps
, int depth
)
3167 prs_debug(ps
, depth
, desc
, "net_io_r_sam_deltas");
3170 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
3172 if (!prs_uint64("dom_mod_count", ps
, depth
, &r_s
->dom_mod_count
))
3175 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
3177 if (!prs_uint32("num_deltas", ps
, depth
, &r_s
->num_deltas
))
3179 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->num_deltas2
))
3182 if (r_s
->num_deltas2
!= 0)
3184 if (!prs_uint32("num_deltas2 ", ps
, depth
, &r_s
->num_deltas2
))
3187 if (r_s
->ptr_deltas
!= 0)
3189 if (r_s
->num_deltas
> 0) {
3190 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas
);
3191 if (r_s
->hdr_deltas
== NULL
) {
3192 DEBUG(0, ("error tallocating memory "
3193 "for %d delta headers\n",
3199 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3201 net_io_sam_delta_hdr("", &r_s
->hdr_deltas
[i
],
3205 if (r_s
->num_deltas
> 0) {
3206 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas
);
3207 if (r_s
->deltas
== NULL
) {
3208 DEBUG(0, ("error tallocating memory "
3215 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3217 if (!net_io_sam_delta_ctr(
3220 r_s
->hdr_deltas
[i
].type2
,
3229 if (!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
3235 /*******************************************************************
3236 Inits a NET_Q_DSR_GETDCNAME structure.
3237 ********************************************************************/
3239 void init_net_q_dsr_getdcname(NET_Q_DSR_GETDCNAME
*r_t
, const char *server_unc
,
3240 const char *domain_name
,
3241 struct uuid
*domain_guid
,
3242 struct uuid
*site_guid
,
3245 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3247 r_t
->ptr_server_unc
= (server_unc
!= NULL
);
3248 init_unistr2(&r_t
->uni_server_unc
, server_unc
, UNI_STR_TERMINATE
);
3250 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3251 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3253 r_t
->ptr_domain_guid
= (domain_guid
!= NULL
);
3254 r_t
->domain_guid
= domain_guid
;
3256 r_t
->ptr_site_guid
= (site_guid
!= NULL
);
3257 r_t
->site_guid
= site_guid
;
3262 /*******************************************************************
3263 Reads or writes an NET_Q_DSR_GETDCNAME structure.
3264 ********************************************************************/
3266 BOOL
net_io_q_dsr_getdcname(const char *desc
, NET_Q_DSR_GETDCNAME
*r_t
,
3267 prs_struct
*ps
, int depth
)
3272 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getdcname");
3275 if (!prs_uint32("ptr_server_unc", ps
, depth
, &r_t
->ptr_server_unc
))
3278 if (!smb_io_unistr2("server_unc", &r_t
->uni_server_unc
,
3279 r_t
->ptr_server_unc
, ps
, depth
))
3285 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3288 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3289 r_t
->ptr_domain_name
, ps
, depth
))
3295 if (!prs_uint32("ptr_domain_guid", ps
, depth
, &r_t
->ptr_domain_guid
))
3298 if (UNMARSHALLING(ps
) && (r_t
->ptr_domain_guid
)) {
3299 r_t
->domain_guid
= PRS_ALLOC_MEM(ps
, struct uuid
, 1);
3300 if (r_t
->domain_guid
== NULL
)
3304 if ((r_t
->ptr_domain_guid
) &&
3305 (!smb_io_uuid("domain_guid", r_t
->domain_guid
, ps
, depth
)))
3311 if (!prs_uint32("ptr_site_guid", ps
, depth
, &r_t
->ptr_site_guid
))
3314 if (UNMARSHALLING(ps
) && (r_t
->ptr_site_guid
)) {
3315 r_t
->site_guid
= PRS_ALLOC_MEM(ps
, struct uuid
, 1);
3316 if (r_t
->site_guid
== NULL
)
3320 if ((r_t
->ptr_site_guid
) &&
3321 (!smb_io_uuid("site_guid", r_t
->site_guid
, ps
, depth
)))
3327 if (!prs_uint32("flags", ps
, depth
, &r_t
->flags
))
3333 /*******************************************************************
3334 Inits a NET_R_DSR_GETDCNAME structure.
3335 ********************************************************************/
3336 void init_net_r_dsr_getdcname(NET_R_DSR_GETDCNAME
*r_t
, const char *dc_unc
,
3337 const char *dc_address
, int32 dc_address_type
,
3338 struct uuid domain_guid
, const char *domain_name
,
3339 const char *forest_name
, uint32 dc_flags
,
3340 const char *dc_site_name
,
3341 const char *client_site_name
)
3343 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3345 r_t
->ptr_dc_unc
= (dc_unc
!= NULL
);
3346 init_unistr2(&r_t
->uni_dc_unc
, dc_unc
, UNI_STR_TERMINATE
);
3348 r_t
->ptr_dc_address
= (dc_address
!= NULL
);
3349 init_unistr2(&r_t
->uni_dc_address
, dc_address
, UNI_STR_TERMINATE
);
3351 r_t
->dc_address_type
= dc_address_type
;
3352 r_t
->domain_guid
= domain_guid
;
3354 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3355 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3357 r_t
->ptr_forest_name
= (forest_name
!= NULL
);
3358 init_unistr2(&r_t
->uni_forest_name
, forest_name
, UNI_STR_TERMINATE
);
3360 r_t
->dc_flags
= dc_flags
;
3362 r_t
->ptr_dc_site_name
= (dc_site_name
!= NULL
);
3363 init_unistr2(&r_t
->uni_dc_site_name
, dc_site_name
, UNI_STR_TERMINATE
);
3365 r_t
->ptr_client_site_name
= (client_site_name
!= NULL
);
3366 init_unistr2(&r_t
->uni_client_site_name
, client_site_name
,
3370 /*******************************************************************
3371 Reads or writes an NET_R_DSR_GETDCNAME structure.
3372 ********************************************************************/
3374 BOOL
net_io_r_dsr_getdcname(const char *desc
, NET_R_DSR_GETDCNAME
*r_t
,
3375 prs_struct
*ps
, int depth
)
3377 uint32 info_ptr
= 1;
3382 prs_debug(ps
, depth
, desc
, "net_io_r_dsr_getdcname");
3385 /* The reply contains *just* an info struct, this is the ptr to it */
3386 if (!prs_uint32("info_ptr", ps
, depth
, &info_ptr
))
3392 if (!prs_uint32("ptr_dc_unc", ps
, depth
, &r_t
->ptr_dc_unc
))
3395 if (!prs_uint32("ptr_dc_address", ps
, depth
, &r_t
->ptr_dc_address
))
3398 if (!prs_int32("dc_address_type", ps
, depth
, &r_t
->dc_address_type
))
3401 if (!smb_io_uuid("domain_guid", &r_t
->domain_guid
, ps
, depth
))
3404 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3407 if (!prs_uint32("ptr_forest_name", ps
, depth
, &r_t
->ptr_forest_name
))
3410 if (!prs_uint32("dc_flags", ps
, depth
, &r_t
->dc_flags
))
3413 if (!prs_uint32("ptr_dc_site_name", ps
, depth
, &r_t
->ptr_dc_site_name
))
3416 if (!prs_uint32("ptr_client_site_name", ps
, depth
,
3417 &r_t
->ptr_client_site_name
))
3423 if (!smb_io_unistr2("dc_unc", &r_t
->uni_dc_unc
,
3424 r_t
->ptr_dc_unc
, ps
, depth
))
3430 if (!smb_io_unistr2("dc_address", &r_t
->uni_dc_address
,
3431 r_t
->ptr_dc_address
, ps
, depth
))
3437 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3438 r_t
->ptr_domain_name
, ps
, depth
))
3444 if (!smb_io_unistr2("forest_name", &r_t
->uni_forest_name
,
3445 r_t
->ptr_forest_name
, ps
, depth
))
3451 if (!smb_io_unistr2("dc_site_name", &r_t
->uni_dc_site_name
,
3452 r_t
->ptr_dc_site_name
, ps
, depth
))
3458 if (!smb_io_unistr2("client_site_name", &r_t
->uni_client_site_name
,
3459 r_t
->ptr_client_site_name
, ps
, depth
))
3465 if (!prs_werror("result", ps
, depth
, &r_t
->result
))
3471 /*******************************************************************
3472 Inits a NET_Q_DSR_GETSITENAME structure.
3473 ********************************************************************/
3475 void init_net_q_dsr_getsitename(NET_Q_DSR_GETSITENAME
*r_t
, const char *computer_name
)
3477 DEBUG(5, ("init_net_q_dsr_getsitename\n"));
3479 r_t
->ptr_computer_name
= (computer_name
!= NULL
);
3480 init_unistr2(&r_t
->uni_computer_name
, computer_name
, UNI_STR_TERMINATE
);
3483 /*******************************************************************
3484 Reads or writes an NET_Q_DSR_GETSITENAME structure.
3485 ********************************************************************/
3487 BOOL
net_io_q_dsr_getsitename(const char *desc
, NET_Q_DSR_GETSITENAME
*r_t
,
3488 prs_struct
*ps
, int depth
)
3493 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getsitename");
3496 if (!prs_uint32("ptr_computer_name", ps
, depth
, &r_t
->ptr_computer_name
))
3499 if (!smb_io_unistr2("computer_name", &r_t
->uni_computer_name
,
3500 r_t
->ptr_computer_name
, ps
, depth
))
3509 /*******************************************************************
3510 Reads or writes an NET_R_DSR_GETSITENAME structure.
3511 ********************************************************************/
3513 BOOL
net_io_r_dsr_getsitename(const char *desc
, NET_R_DSR_GETSITENAME
*r_t
,
3514 prs_struct
*ps
, int depth
)
3519 prs_debug(ps
, depth
, desc
, "net_io_r_dsr_getsitename");
3522 if (!prs_uint32("ptr_site_name", ps
, depth
, &r_t
->ptr_site_name
))
3528 if (!smb_io_unistr2("site_name", &r_t
->uni_site_name
,
3529 r_t
->ptr_site_name
, ps
, depth
))
3535 if (!prs_werror("result", ps
, depth
, &r_t
->result
))