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) Jeremy Allison 2001,
8 * Copyright (C) Jim McDonough 2002,
9 * Copyright (C) Anthony Liguori 2003.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 /* This is the interface to the lsa server code. */
31 #define DBGC_CLASS DBGC_RPC_SRV
33 /***************************************************************************
35 ***************************************************************************/
37 static BOOL
api_lsa_open_policy2(pipes_struct
*p
)
41 prs_struct
*data
= &p
->in_data
.data
;
42 prs_struct
*rdata
= &p
->out_data
.rdata
;
47 /* grab the server, object attributes and desired access flag...*/
48 if(!lsa_io_q_open_pol2("", &q_u
, data
, 0)) {
49 DEBUG(0,("api_lsa_open_policy2: unable to unmarshall LSA_Q_OPEN_POL2.\n"));
53 r_u
.status
= _lsa_open_policy2(p
, &q_u
, &r_u
);
55 /* store the response in the SMB stream */
56 if(!lsa_io_r_open_pol2("", &r_u
, rdata
, 0)) {
57 DEBUG(0,("api_lsa_open_policy2: unable to marshall LSA_R_OPEN_POL2.\n"));
64 /***************************************************************************
66 ***************************************************************************/
68 static BOOL
api_lsa_open_policy(pipes_struct
*p
)
72 prs_struct
*data
= &p
->in_data
.data
;
73 prs_struct
*rdata
= &p
->out_data
.rdata
;
78 /* grab the server, object attributes and desired access flag...*/
79 if(!lsa_io_q_open_pol("", &q_u
, data
, 0)) {
80 DEBUG(0,("api_lsa_open_policy: unable to unmarshall LSA_Q_OPEN_POL.\n"));
84 r_u
.status
= _lsa_open_policy(p
, &q_u
, &r_u
);
86 /* store the response in the SMB stream */
87 if(!lsa_io_r_open_pol("", &r_u
, rdata
, 0)) {
88 DEBUG(0,("api_lsa_open_policy: unable to marshall LSA_R_OPEN_POL.\n"));
95 /***************************************************************************
96 api_lsa_enum_trust_dom
97 ***************************************************************************/
99 static BOOL
api_lsa_enum_trust_dom(pipes_struct
*p
)
101 LSA_Q_ENUM_TRUST_DOM q_u
;
102 LSA_R_ENUM_TRUST_DOM r_u
;
103 prs_struct
*data
= &p
->in_data
.data
;
104 prs_struct
*rdata
= &p
->out_data
.rdata
;
109 /* grab the enum trust domain context etc. */
110 if(!lsa_io_q_enum_trust_dom("", &q_u
, data
, 0))
113 /* get required trusted domains information */
114 r_u
.status
= _lsa_enum_trust_dom(p
, &q_u
, &r_u
);
116 /* prepare the response */
117 if(!lsa_io_r_enum_trust_dom("", &r_u
, rdata
, 0))
123 /***************************************************************************
125 ***************************************************************************/
127 static BOOL
api_lsa_query_info(pipes_struct
*p
)
129 LSA_Q_QUERY_INFO q_u
;
130 LSA_R_QUERY_INFO r_u
;
131 prs_struct
*data
= &p
->in_data
.data
;
132 prs_struct
*rdata
= &p
->out_data
.rdata
;
137 /* grab the info class and policy handle */
138 if(!lsa_io_q_query("", &q_u
, data
, 0)) {
139 DEBUG(0,("api_lsa_query_info: failed to unmarshall LSA_Q_QUERY_INFO.\n"));
143 r_u
.status
= _lsa_query_info(p
, &q_u
, &r_u
);
145 /* store the response in the SMB stream */
146 if(!lsa_io_r_query("", &r_u
, rdata
, 0)) {
147 DEBUG(0,("api_lsa_query_info: failed to marshall LSA_R_QUERY_INFO.\n"));
154 /***************************************************************************
156 ***************************************************************************/
158 static BOOL
api_lsa_lookup_sids(pipes_struct
*p
)
160 LSA_Q_LOOKUP_SIDS q_u
;
161 LSA_R_LOOKUP_SIDS r_u
;
162 prs_struct
*data
= &p
->in_data
.data
;
163 prs_struct
*rdata
= &p
->out_data
.rdata
;
168 /* grab the info class and policy handle */
169 if(!lsa_io_q_lookup_sids("", &q_u
, data
, 0)) {
170 DEBUG(0,("api_lsa_lookup_sids: failed to unmarshall LSA_Q_LOOKUP_SIDS.\n"));
174 r_u
.status
= _lsa_lookup_sids(p
, &q_u
, &r_u
);
176 if(!lsa_io_r_lookup_sids("", &r_u
, rdata
, 0)) {
177 DEBUG(0,("api_lsa_lookup_sids: Failed to marshall LSA_R_LOOKUP_SIDS.\n"));
184 /***************************************************************************
186 ***************************************************************************/
188 static BOOL
api_lsa_lookup_names(pipes_struct
*p
)
190 LSA_Q_LOOKUP_NAMES q_u
;
191 LSA_R_LOOKUP_NAMES r_u
;
192 prs_struct
*data
= &p
->in_data
.data
;
193 prs_struct
*rdata
= &p
->out_data
.rdata
;
198 /* grab the info class and policy handle */
199 if(!lsa_io_q_lookup_names("", &q_u
, data
, 0)) {
200 DEBUG(0,("api_lsa_lookup_names: failed to unmarshall LSA_Q_LOOKUP_NAMES.\n"));
204 r_u
.status
= _lsa_lookup_names(p
, &q_u
, &r_u
);
206 /* store the response in the SMB stream */
207 if(!lsa_io_r_lookup_names("", &r_u
, rdata
, 0)) {
208 DEBUG(0,("api_lsa_lookup_names: Failed to marshall LSA_R_LOOKUP_NAMES.\n"));
215 /***************************************************************************
217 ***************************************************************************/
219 static BOOL
api_lsa_close(pipes_struct
*p
)
223 prs_struct
*data
= &p
->in_data
.data
;
224 prs_struct
*rdata
= &p
->out_data
.rdata
;
229 if (!lsa_io_q_close("", &q_u
, data
, 0)) {
230 DEBUG(0,("api_lsa_close: lsa_io_q_close failed.\n"));
234 r_u
.status
= _lsa_close(p
, &q_u
, &r_u
);
236 /* store the response in the SMB stream */
237 if (!lsa_io_r_close("", &r_u
, rdata
, 0)) {
238 DEBUG(0,("api_lsa_close: lsa_io_r_close failed.\n"));
245 /***************************************************************************
247 ***************************************************************************/
249 static BOOL
api_lsa_open_secret(pipes_struct
*p
)
251 LSA_Q_OPEN_SECRET q_u
;
252 LSA_R_OPEN_SECRET r_u
;
253 prs_struct
*data
= &p
->in_data
.data
;
254 prs_struct
*rdata
= &p
->out_data
.rdata
;
259 if(!lsa_io_q_open_secret("", &q_u
, data
, 0)) {
260 DEBUG(0,("api_lsa_open_secret: failed to unmarshall LSA_Q_OPEN_SECRET.\n"));
264 r_u
.status
= _lsa_open_secret(p
, &q_u
, &r_u
);
266 /* store the response in the SMB stream */
267 if(!lsa_io_r_open_secret("", &r_u
, rdata
, 0)) {
268 DEBUG(0,("api_lsa_open_secret: Failed to marshall LSA_R_OPEN_SECRET.\n"));
275 /***************************************************************************
277 ***************************************************************************/
279 static BOOL
api_lsa_enum_privs(pipes_struct
*p
)
281 LSA_Q_ENUM_PRIVS q_u
;
282 LSA_R_ENUM_PRIVS r_u
;
283 prs_struct
*data
= &p
->in_data
.data
;
284 prs_struct
*rdata
= &p
->out_data
.rdata
;
289 if(!lsa_io_q_enum_privs("", &q_u
, data
, 0)) {
290 DEBUG(0,("api_lsa_enum_privs: failed to unmarshall LSA_Q_ENUM_PRIVS.\n"));
294 r_u
.status
= _lsa_enum_privs(p
, &q_u
, &r_u
);
296 /* store the response in the SMB stream */
297 if(!lsa_io_r_enum_privs("", &r_u
, rdata
, 0)) {
298 DEBUG(0,("api_lsa_enum_privs: Failed to marshall LSA_R_ENUM_PRIVS.\n"));
305 /***************************************************************************
307 ***************************************************************************/
309 static BOOL
api_lsa_priv_get_dispname(pipes_struct
*p
)
311 LSA_Q_PRIV_GET_DISPNAME q_u
;
312 LSA_R_PRIV_GET_DISPNAME r_u
;
313 prs_struct
*data
= &p
->in_data
.data
;
314 prs_struct
*rdata
= &p
->out_data
.rdata
;
319 if(!lsa_io_q_priv_get_dispname("", &q_u
, data
, 0)) {
320 DEBUG(0,("api_lsa_priv_get_dispname: failed to unmarshall LSA_Q_PRIV_GET_DISPNAME.\n"));
324 r_u
.status
= _lsa_priv_get_dispname(p
, &q_u
, &r_u
);
326 /* store the response in the SMB stream */
327 if(!lsa_io_r_priv_get_dispname("", &r_u
, rdata
, 0)) {
328 DEBUG(0,("api_lsa_priv_get_dispname: Failed to marshall LSA_R_PRIV_GET_DISPNAME.\n"));
335 /***************************************************************************
337 ***************************************************************************/
339 static BOOL
api_lsa_enum_accounts(pipes_struct
*p
)
341 LSA_Q_ENUM_ACCOUNTS q_u
;
342 LSA_R_ENUM_ACCOUNTS r_u
;
343 prs_struct
*data
= &p
->in_data
.data
;
344 prs_struct
*rdata
= &p
->out_data
.rdata
;
349 if(!lsa_io_q_enum_accounts("", &q_u
, data
, 0)) {
350 DEBUG(0,("api_lsa_enum_accounts: failed to unmarshall LSA_Q_ENUM_ACCOUNTS.\n"));
354 r_u
.status
= _lsa_enum_accounts(p
, &q_u
, &r_u
);
356 /* store the response in the SMB stream */
357 if(!lsa_io_r_enum_accounts("", &r_u
, rdata
, 0)) {
358 DEBUG(0,("api_lsa_enum_accounts: Failed to marshall LSA_R_ENUM_ACCOUNTS.\n"));
365 /***************************************************************************
366 api_lsa_UNK_GET_CONNUSER
367 ***************************************************************************/
369 static BOOL
api_lsa_unk_get_connuser(pipes_struct
*p
)
371 LSA_Q_UNK_GET_CONNUSER q_u
;
372 LSA_R_UNK_GET_CONNUSER r_u
;
374 prs_struct
*data
= &p
->in_data
.data
;
375 prs_struct
*rdata
= &p
->out_data
.rdata
;
380 if(!lsa_io_q_unk_get_connuser("", &q_u
, data
, 0)) {
381 DEBUG(0,("api_lsa_unk_get_connuser: failed to unmarshall LSA_Q_UNK_GET_CONNUSER.\n"));
385 r_u
.status
= _lsa_unk_get_connuser(p
, &q_u
, &r_u
);
387 /* store the response in the SMB stream */
388 if(!lsa_io_r_unk_get_connuser("", &r_u
, rdata
, 0)) {
389 DEBUG(0,("api_lsa_unk_get_connuser: Failed to marshall LSA_R_UNK_GET_CONNUSER.\n"));
396 /***************************************************************************
398 ***************************************************************************/
400 static BOOL
api_lsa_open_account(pipes_struct
*p
)
402 LSA_Q_OPENACCOUNT q_u
;
403 LSA_R_OPENACCOUNT r_u
;
405 prs_struct
*data
= &p
->in_data
.data
;
406 prs_struct
*rdata
= &p
->out_data
.rdata
;
411 if(!lsa_io_q_open_account("", &q_u
, data
, 0)) {
412 DEBUG(0,("api_lsa_open_account: failed to unmarshall LSA_Q_OPENACCOUNT.\n"));
416 r_u
.status
= _lsa_open_account(p
, &q_u
, &r_u
);
418 /* store the response in the SMB stream */
419 if(!lsa_io_r_open_account("", &r_u
, rdata
, 0)) {
420 DEBUG(0,("api_lsa_open_account: Failed to marshall LSA_R_OPENACCOUNT.\n"));
427 /***************************************************************************
429 ***************************************************************************/
431 static BOOL
api_lsa_enum_privsaccount(pipes_struct
*p
)
433 LSA_Q_ENUMPRIVSACCOUNT q_u
;
434 LSA_R_ENUMPRIVSACCOUNT r_u
;
436 prs_struct
*data
= &p
->in_data
.data
;
437 prs_struct
*rdata
= &p
->out_data
.rdata
;
442 if(!lsa_io_q_enum_privsaccount("", &q_u
, data
, 0)) {
443 DEBUG(0,("api_lsa_enum_privsaccount: failed to unmarshall LSA_Q_ENUMPRIVSACCOUNT.\n"));
447 r_u
.status
= _lsa_enum_privsaccount(p
, &q_u
, &r_u
);
449 /* store the response in the SMB stream */
450 if(!lsa_io_r_enum_privsaccount("", &r_u
, rdata
, 0)) {
451 DEBUG(0,("api_lsa_enum_privsaccount: Failed to marshall LSA_R_ENUMPRIVSACCOUNT.\n"));
458 /***************************************************************************
459 api_lsa_getsystemaccount
460 ***************************************************************************/
462 static BOOL
api_lsa_getsystemaccount(pipes_struct
*p
)
464 LSA_Q_GETSYSTEMACCOUNT q_u
;
465 LSA_R_GETSYSTEMACCOUNT r_u
;
467 prs_struct
*data
= &p
->in_data
.data
;
468 prs_struct
*rdata
= &p
->out_data
.rdata
;
473 if(!lsa_io_q_getsystemaccount("", &q_u
, data
, 0)) {
474 DEBUG(0,("api_lsa_getsystemaccount: failed to unmarshall LSA_Q_GETSYSTEMACCOUNT.\n"));
478 r_u
.status
= _lsa_getsystemaccount(p
, &q_u
, &r_u
);
480 /* store the response in the SMB stream */
481 if(!lsa_io_r_getsystemaccount("", &r_u
, rdata
, 0)) {
482 DEBUG(0,("api_lsa_getsystemaccount: Failed to marshall LSA_R_GETSYSTEMACCOUNT.\n"));
490 /***************************************************************************
491 api_lsa_setsystemaccount
492 ***************************************************************************/
494 static BOOL
api_lsa_setsystemaccount(pipes_struct
*p
)
496 LSA_Q_SETSYSTEMACCOUNT q_u
;
497 LSA_R_SETSYSTEMACCOUNT r_u
;
499 prs_struct
*data
= &p
->in_data
.data
;
500 prs_struct
*rdata
= &p
->out_data
.rdata
;
505 if(!lsa_io_q_setsystemaccount("", &q_u
, data
, 0)) {
506 DEBUG(0,("api_lsa_setsystemaccount: failed to unmarshall LSA_Q_SETSYSTEMACCOUNT.\n"));
510 r_u
.status
= _lsa_setsystemaccount(p
, &q_u
, &r_u
);
512 /* store the response in the SMB stream */
513 if(!lsa_io_r_setsystemaccount("", &r_u
, rdata
, 0)) {
514 DEBUG(0,("api_lsa_setsystemaccount: Failed to marshall LSA_R_SETSYSTEMACCOUNT.\n"));
521 /***************************************************************************
523 ***************************************************************************/
525 static BOOL
api_lsa_addprivs(pipes_struct
*p
)
530 prs_struct
*data
= &p
->in_data
.data
;
531 prs_struct
*rdata
= &p
->out_data
.rdata
;
536 if(!lsa_io_q_addprivs("", &q_u
, data
, 0)) {
537 DEBUG(0,("api_lsa_addprivs: failed to unmarshall LSA_Q_ADDPRIVS.\n"));
541 r_u
.status
= _lsa_addprivs(p
, &q_u
, &r_u
);
543 /* store the response in the SMB stream */
544 if(!lsa_io_r_addprivs("", &r_u
, rdata
, 0)) {
545 DEBUG(0,("api_lsa_addprivs: Failed to marshall LSA_R_ADDPRIVS.\n"));
552 /***************************************************************************
554 ***************************************************************************/
556 static BOOL
api_lsa_removeprivs(pipes_struct
*p
)
558 LSA_Q_REMOVEPRIVS q_u
;
559 LSA_R_REMOVEPRIVS r_u
;
561 prs_struct
*data
= &p
->in_data
.data
;
562 prs_struct
*rdata
= &p
->out_data
.rdata
;
567 if(!lsa_io_q_removeprivs("", &q_u
, data
, 0)) {
568 DEBUG(0,("api_lsa_removeprivs: failed to unmarshall LSA_Q_REMOVEPRIVS.\n"));
572 r_u
.status
= _lsa_removeprivs(p
, &q_u
, &r_u
);
574 /* store the response in the SMB stream */
575 if(!lsa_io_r_removeprivs("", &r_u
, rdata
, 0)) {
576 DEBUG(0,("api_lsa_removeprivs: Failed to marshall LSA_R_REMOVEPRIVS.\n"));
583 /***************************************************************************
585 ***************************************************************************/
587 static BOOL
api_lsa_query_secobj(pipes_struct
*p
)
589 LSA_Q_QUERY_SEC_OBJ q_u
;
590 LSA_R_QUERY_SEC_OBJ r_u
;
592 prs_struct
*data
= &p
->in_data
.data
;
593 prs_struct
*rdata
= &p
->out_data
.rdata
;
598 if(!lsa_io_q_query_sec_obj("", &q_u
, data
, 0)) {
599 DEBUG(0,("api_lsa_query_secobj: failed to unmarshall LSA_Q_QUERY_SEC_OBJ.\n"));
603 r_u
.status
= _lsa_query_secobj(p
, &q_u
, &r_u
);
605 /* store the response in the SMB stream */
606 if(!lsa_io_r_query_sec_obj("", &r_u
, rdata
, 0)) {
607 DEBUG(0,("api_lsa_query_secobj: Failed to marshall LSA_R_QUERY_SEC_OBJ.\n"));
614 /***************************************************************************
615 api_lsa_query_dnsdomainfo
616 ***************************************************************************/
618 static BOOL
api_lsa_query_info2(pipes_struct
*p
)
620 LSA_Q_QUERY_INFO2 q_u
;
621 LSA_R_QUERY_INFO2 r_u
;
623 prs_struct
*data
= &p
->in_data
.data
;
624 prs_struct
*rdata
= &p
->out_data
.rdata
;
629 if(!lsa_io_q_query_info2("", &q_u
, data
, 0)) {
630 DEBUG(0,("api_lsa_query_info2: failed to unmarshall LSA_Q_QUERY_INFO2.\n"));
634 r_u
.status
= _lsa_query_info2(p
, &q_u
, &r_u
);
636 if (!lsa_io_r_query_info2("", &r_u
, rdata
, 0)) {
637 DEBUG(0,("api_lsa_query_info2: failed to marshall LSA_R_QUERY_INFO2.\n"));
645 /***************************************************************************
647 ***************************************************************************/
648 #ifdef RPC_LSA_DYNAMIC
649 int rpc_pipe_init(void)
651 int rpc_lsa_init(void)
654 static const struct api_struct api_lsa_cmds
[] =
656 { "LSA_OPENPOLICY2" , LSA_OPENPOLICY2
, api_lsa_open_policy2
},
657 { "LSA_OPENPOLICY" , LSA_OPENPOLICY
, api_lsa_open_policy
},
658 { "LSA_QUERYINFOPOLICY" , LSA_QUERYINFOPOLICY
, api_lsa_query_info
},
659 { "LSA_ENUMTRUSTDOM" , LSA_ENUMTRUSTDOM
, api_lsa_enum_trust_dom
},
660 { "LSA_CLOSE" , LSA_CLOSE
, api_lsa_close
},
661 { "LSA_OPENSECRET" , LSA_OPENSECRET
, api_lsa_open_secret
},
662 { "LSA_LOOKUPSIDS" , LSA_LOOKUPSIDS
, api_lsa_lookup_sids
},
663 { "LSA_LOOKUPNAMES" , LSA_LOOKUPNAMES
, api_lsa_lookup_names
},
664 { "LSA_ENUM_PRIVS" , LSA_ENUM_PRIVS
, api_lsa_enum_privs
},
665 { "LSA_PRIV_GET_DISPNAME",LSA_PRIV_GET_DISPNAME
,api_lsa_priv_get_dispname
},
666 { "LSA_ENUM_ACCOUNTS" , LSA_ENUM_ACCOUNTS
, api_lsa_enum_accounts
},
667 { "LSA_UNK_GET_CONNUSER", LSA_UNK_GET_CONNUSER
, api_lsa_unk_get_connuser
},
668 { "LSA_OPENACCOUNT" , LSA_OPENACCOUNT
, api_lsa_open_account
},
669 { "LSA_ENUMPRIVSACCOUNT", LSA_ENUMPRIVSACCOUNT
, api_lsa_enum_privsaccount
},
670 { "LSA_GETSYSTEMACCOUNT", LSA_GETSYSTEMACCOUNT
, api_lsa_getsystemaccount
},
671 { "LSA_SETSYSTEMACCOUNT", LSA_SETSYSTEMACCOUNT
, api_lsa_setsystemaccount
},
672 { "LSA_ADDPRIVS" , LSA_ADDPRIVS
, api_lsa_addprivs
},
673 { "LSA_REMOVEPRIVS" , LSA_REMOVEPRIVS
, api_lsa_removeprivs
},
674 { "LSA_QUERYSECOBJ" , LSA_QUERYSECOBJ
, api_lsa_query_secobj
},
675 { "LSA_QUERYINFO2" , LSA_QUERYINFO2
, api_lsa_query_info2
}
678 return rpc_pipe_register_commands("lsarpc", "lsass", api_lsa_cmds
,
679 sizeof(api_lsa_cmds
) / sizeof(struct api_struct
));