21
21
#include "winbindd.h"
22
22
#include "passdb/lookup_sid.h" /* only for LOOKUP_NAME_NO_NSS flag */
23
23
#include "libcli/security/dom_sid.h"
24
+ #include "librpc/gen_ndr/ndr_winbind_c.h"
24
25
25
26
struct winbindd_getgroups_state {
26
27
struct tevent_context * ev ;
28
+ const char * request_name ;
29
+ const char * unmapped_name ;
27
30
char * namespace ;
28
31
char * domname ;
29
32
char * username ;
@@ -38,6 +41,7 @@ struct winbindd_getgroups_state {
38
41
static void winbindd_getgroups_lookupname_done (struct tevent_req * subreq );
39
42
static void winbindd_getgroups_gettoken_done (struct tevent_req * subreq );
40
43
static void winbindd_getgroups_sid2gid_done (struct tevent_req * subreq );
44
+ static void winbindd_getgroups_unmap_done (struct tevent_req * subreq );
41
45
42
46
struct tevent_req * winbindd_getgroups_send (TALLOC_CTX * mem_ctx ,
43
47
struct tevent_context * ev ,
@@ -46,9 +50,6 @@ struct tevent_req *winbindd_getgroups_send(TALLOC_CTX *mem_ctx,
46
50
{
47
51
struct tevent_req * req , * subreq ;
48
52
struct winbindd_getgroups_state * state ;
49
- char * domuser , * mapped_user ;
50
- NTSTATUS status ;
51
- bool ok ;
52
53
53
54
req = tevent_req_create (mem_ctx , & state ,
54
55
struct winbindd_getgroups_state );
@@ -66,37 +67,68 @@ struct tevent_req *winbindd_getgroups_send(TALLOC_CTX *mem_ctx,
66
67
(unsigned int )cli -> pid ,
67
68
request -> data .username );
68
69
69
- domuser = request -> data .username ;
70
+ state -> request_name = talloc_strdup (state , request -> data .username );
71
+ if (tevent_req_nomem (state -> request_name , req )) {
72
+ return tevent_req_post (req , ev );
73
+ }
74
+
75
+ subreq = dcerpc_wbint_NormalizeNameUnmap_send (state ,
76
+ state -> ev ,
77
+ idmap_child_handle (),
78
+ state -> request_name ,
79
+ & state -> unmapped_name );
80
+ if (tevent_req_nomem (subreq , req )) {
81
+ return tevent_req_post (req , ev );
82
+ }
83
+ tevent_req_set_callback (subreq , winbindd_getgroups_unmap_done , req );
84
+ return req ;
85
+ }
86
+
87
+ static void winbindd_getgroups_unmap_done (struct tevent_req * subreq )
88
+ {
89
+ struct tevent_req * req = tevent_req_callback_data (subreq ,
90
+ struct tevent_req );
91
+ struct winbindd_getgroups_state * state = tevent_req_data (
92
+ req , struct winbindd_getgroups_state );
93
+ NTSTATUS status ;
94
+ NTSTATUS result = NT_STATUS_UNSUCCESSFUL ;
95
+ bool ok ;
70
96
71
- status = normalize_name_unmap (state , domuser , & mapped_user );
97
+ status = dcerpc_wbint_NormalizeNameUnmap_recv (subreq , state , & result );
98
+ TALLOC_FREE (subreq );
99
+ if (tevent_req_nterror (req , status )) {
100
+ return ;
101
+ }
72
102
73
- if (NT_STATUS_IS_OK (status )
74
- || NT_STATUS_EQUAL (status , NT_STATUS_FILE_RENAMED )) {
75
- /* normalize_name_unmapped did something */
76
- domuser = mapped_user ;
103
+ if (NT_STATUS_IS_OK (result ) ||
104
+ NT_STATUS_EQUAL (result , NT_STATUS_FILE_RENAMED ))
105
+ {
106
+ /* dcerpc_wbint_NormalizeNameUnmap did something */
107
+ state -> request_name = state -> unmapped_name ;
77
108
}
78
109
79
- ok = parse_domain_user (state , domuser ,
110
+ ok = parse_domain_user (state ,
111
+ state -> request_name ,
80
112
& state -> namespace ,
81
113
& state -> domname ,
82
114
& state -> username );
83
115
if (!ok ) {
84
- D_WARNING ("Could not parse domain user: %s\n" , domuser );
116
+ D_WARNING ("Could not parse domain user: %s\n" , state -> request_name );
85
117
tevent_req_nterror (req , NT_STATUS_INVALID_PARAMETER );
86
- return tevent_req_post ( req , ev ) ;
118
+ return ;
87
119
}
88
120
89
- subreq = wb_lookupname_send (state , ev ,
121
+ subreq = wb_lookupname_send (state ,
122
+ state -> ev ,
90
123
state -> namespace ,
91
124
state -> domname ,
92
125
state -> username ,
93
126
LOOKUP_NAME_NO_NSS );
94
127
if (tevent_req_nomem (subreq , req )) {
95
- return tevent_req_post ( req , ev ) ;
128
+ return ;
96
129
}
97
130
tevent_req_set_callback (subreq , winbindd_getgroups_lookupname_done ,
98
131
req );
99
- return req ;
100
132
}
101
133
102
134
static void winbindd_getgroups_lookupname_done (struct tevent_req * subreq )
0 commit comments