Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : async implementation of WINBINDD_CHECK_MACHINE_ACCT 4 : Copyright (C) Volker Lendecke 2009 5 : 6 : This program is free software; you can redistribute it and/or modify 7 : it under the terms of the GNU General Public License as published by 8 : the Free Software Foundation; either version 3 of the License, or 9 : (at your option) any later version. 10 : 11 : This program is distributed in the hope that it will be useful, 12 : but WITHOUT ANY WARRANTY; without even the implied warranty of 13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 : GNU General Public License for more details. 15 : 16 : You should have received a copy of the GNU General Public License 17 : along with this program. If not, see <http://www.gnu.org/licenses/>. 18 : */ 19 : 20 : #include "includes.h" 21 : #include "winbindd.h" 22 : #include "librpc/gen_ndr/ndr_winbind_c.h" 23 : 24 : struct winbindd_check_machine_acct_state { 25 : uint8_t dummy; 26 : }; 27 : 28 : static void winbindd_check_machine_acct_done(struct tevent_req *subreq); 29 : 30 22 : struct tevent_req *winbindd_check_machine_acct_send(TALLOC_CTX *mem_ctx, 31 : struct tevent_context *ev, 32 : struct winbindd_cli_state *cli, 33 : struct winbindd_request *request) 34 : { 35 0 : struct tevent_req *req, *subreq; 36 0 : struct winbindd_check_machine_acct_state *state; 37 0 : struct winbindd_domain *domain; 38 : 39 22 : req = tevent_req_create(mem_ctx, &state, 40 : struct winbindd_check_machine_acct_state); 41 22 : if (req == NULL) { 42 0 : return NULL; 43 : } 44 : 45 22 : if (request->domain_name[0] == '\0') { 46 : /* preserve old behavior, when no domain name is given */ 47 4 : domain = find_our_domain(); 48 : } else { 49 18 : domain = find_domain_from_name(request->domain_name); 50 : } 51 22 : if (domain == NULL) { 52 0 : tevent_req_nterror(req, NT_STATUS_NO_SUCH_DOMAIN); 53 0 : return tevent_req_post(req, ev); 54 : } 55 22 : if (domain->internal) { 56 : /* 57 : * Internal domains are passdb based, we can always 58 : * contact them. 59 : */ 60 8 : tevent_req_done(req); 61 8 : return tevent_req_post(req, ev); 62 : } 63 : 64 14 : subreq = dcerpc_wbint_CheckMachineAccount_send(state, ev, 65 : dom_child_handle(domain)); 66 14 : if (tevent_req_nomem(subreq, req)) { 67 0 : return tevent_req_post(req, ev); 68 : } 69 14 : tevent_req_set_callback(subreq, winbindd_check_machine_acct_done, req); 70 14 : return req; 71 : } 72 : 73 14 : static void winbindd_check_machine_acct_done(struct tevent_req *subreq) 74 : { 75 14 : struct tevent_req *req = tevent_req_callback_data( 76 : subreq, struct tevent_req); 77 14 : struct winbindd_check_machine_acct_state *state = tevent_req_data( 78 : req, struct winbindd_check_machine_acct_state); 79 0 : NTSTATUS status, result; 80 : 81 14 : status = dcerpc_wbint_CheckMachineAccount_recv(subreq, state, &result); 82 14 : if (any_nt_status_not_ok(status, result, &status)) { 83 0 : tevent_req_nterror(req, status); 84 0 : return; 85 : } 86 14 : tevent_req_done(req); 87 : } 88 : 89 22 : NTSTATUS winbindd_check_machine_acct_recv(struct tevent_req *req, 90 : struct winbindd_response *presp) 91 : { 92 22 : NTSTATUS status = tevent_req_simple_recv_ntstatus(req); 93 : 94 22 : set_auth_errors(presp, status); 95 22 : return status; 96 : }