LCOV - code coverage report
Current view: top level - source3/winbindd - wb_lookupuseraliases.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 29 42 69.0 %
Date: 2024-04-21 15:09:00 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*
       2             :    Unix SMB/CIFS implementation.
       3             :    async lookupuseraliases
       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             : #include "libcli/security/dom_sid.h"
      24             : 
      25             : struct wb_lookupuseraliases_state {
      26             :         struct tevent_context *ev;
      27             :         struct wbint_SidArray sids;
      28             :         struct wbint_RidArray rids;
      29             : };
      30             : 
      31             : static void wb_lookupuseraliases_done(struct tevent_req *subreq);
      32             : 
      33        4222 : struct tevent_req *wb_lookupuseraliases_send(TALLOC_CTX *mem_ctx,
      34             :                                              struct tevent_context *ev,
      35             :                                              struct winbindd_domain *domain,
      36             :                                              uint32_t num_sids,
      37             :                                              const struct dom_sid *sids)
      38             : {
      39           0 :         struct tevent_req *req, *subreq;
      40           0 :         struct wb_lookupuseraliases_state *state;
      41           0 :         uint32_t i;
      42             : 
      43        4222 :         req = tevent_req_create(mem_ctx, &state,
      44             :                                 struct wb_lookupuseraliases_state);
      45        4222 :         if (req == NULL) {
      46           0 :                 return NULL;
      47             :         }
      48             : 
      49        4222 :         D_INFO("WB command lookupuseraliases start.\n"
      50             :                "Query domain %s for max %"PRIu32" SID(s).\n",
      51             :                domain->name, num_sids);
      52             : 
      53       12930 :         for (i = 0; i < num_sids; i++) {
      54           0 :                 struct dom_sid_buf buf;
      55        8708 :                 D_INFO("%"PRIu32": SID %s\n", i, dom_sid_str_buf(&sids[i], &buf));
      56             :         }
      57        4222 :         state->sids.num_sids = num_sids;
      58        4222 :         state->sids.sids = discard_const_p(struct dom_sid, sids);
      59             : 
      60        4222 :         subreq = dcerpc_wbint_LookupUserAliases_send(
      61        4222 :                 state, ev, dom_child_handle(domain), &state->sids, &state->rids);
      62        4222 :         if (tevent_req_nomem(subreq, req)) {
      63           0 :                 return tevent_req_post(req, ev);
      64             :         }
      65        4222 :         tevent_req_set_callback(subreq, wb_lookupuseraliases_done, req);
      66        4222 :         return req;
      67             : }
      68             : 
      69        4222 : static void wb_lookupuseraliases_done(struct tevent_req *subreq)
      70             : {
      71        4222 :         struct tevent_req *req = tevent_req_callback_data(
      72             :                 subreq, struct tevent_req);
      73        4222 :         struct wb_lookupuseraliases_state *state = tevent_req_data(
      74             :                 req, struct wb_lookupuseraliases_state);
      75           0 :         NTSTATUS status, result;
      76             : 
      77        4222 :         status = dcerpc_wbint_LookupUserAliases_recv(subreq, state, &result);
      78        4222 :         TALLOC_FREE(subreq);
      79        4222 :         if (any_nt_status_not_ok(status, result, &status)) {
      80           0 :                 D_WARNING("LookupUserAliases failed with %s.\n",
      81             :                           nt_errstr(status));
      82           0 :                 tevent_req_nterror(req, status);
      83           0 :                 return;
      84             :         }
      85        4222 :         tevent_req_done(req);
      86             : }
      87             : 
      88        4222 : NTSTATUS wb_lookupuseraliases_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
      89             :                                    uint32_t *num_aliases, uint32_t **aliases)
      90             : {
      91        4222 :         struct wb_lookupuseraliases_state *state = tevent_req_data(
      92             :                 req, struct wb_lookupuseraliases_state);
      93           0 :         NTSTATUS status;
      94           0 :         uint32_t i;
      95             : 
      96        4222 :         if (tevent_req_is_nterror(req, &status)) {
      97           0 :                 return status;
      98             :         }
      99        4222 :         *num_aliases = state->rids.num_rids;
     100        4222 :         D_INFO("WB command lookupuseraliases end.\nGot %"PRIu32" alias(es):\n",
     101             :                *num_aliases);
     102        5267 :         for (i = 0; i < *num_aliases; i++) {
     103        1045 :                 D_INFO("%"PRIu32": RID %"PRIu32"\n", i, state->rids.rids[i]);
     104             :         }
     105             : 
     106        4222 :         *aliases = talloc_move(mem_ctx, &state->rids.rids);
     107        4222 :         return NT_STATUS_OK;
     108             : }

Generated by: LCOV version 1.14