Changeset 988 for vendor/current/source4/libnet/groupman.c
- Timestamp:
- Nov 24, 2016, 1:14:11 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source4/libnet/groupman.c
r860 r988 29 29 30 30 struct groupadd_state { 31 struct dcerpc_ pipe *pipe;31 struct dcerpc_binding_handle *binding_handle; 32 32 struct policy_handle domain_handle; 33 33 struct samr_CreateDomainGroup creategroup; … … 42 42 43 43 44 struct composite_context* libnet_rpc_groupadd_send(struct dcerpc_pipe *p, 44 struct composite_context* libnet_rpc_groupadd_send(TALLOC_CTX *mem_ctx, 45 struct tevent_context *ev, 46 struct dcerpc_binding_handle *b, 45 47 struct libnet_rpc_groupadd *io, 46 48 void (*monitor)(struct monitor_msg*)) … … 50 52 struct tevent_req *subreq; 51 53 52 if (! p|| !io) return NULL;54 if (!b || !io) return NULL; 53 55 54 c = composite_create( p, dcerpc_event_context(p));56 c = composite_create(mem_ctx, ev); 55 57 if (c == NULL) return NULL; 56 58 … … 61 63 62 64 s->domain_handle = io->in.domain_handle; 63 s-> pipe = p;65 s->binding_handle= b; 64 66 s->monitor_fn = monitor; 65 67 … … 78 80 79 81 subreq = dcerpc_samr_CreateDomainGroup_r_send(s, c->event_ctx, 80 s-> pipe->binding_handle,82 s->binding_handle, 81 83 &s->creategroup); 82 84 if (composite_nomem(subreq, c)) return c; … … 94 96 95 97 status = composite_wait(c); 96 if (NT_STATUS_IS_OK(status)) { 97 s = talloc_get_type(c, struct groupadd_state); 98 if (NT_STATUS_IS_OK(status) && io) { 99 s = talloc_get_type(c->private_data, struct groupadd_state); 100 io->out.group_handle = s->group_handle; 98 101 } 99 102 103 talloc_free(c); 100 104 return status; 101 105 } … … 115 119 116 120 c->status = s->creategroup.out.result; 117 if (!composite_is_ok(c)) return;118 119 composite_done(c);120 }121 122 123 NTSTATUS libnet_rpc_groupadd(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,124 struct libnet_rpc_groupadd *io)125 {126 struct composite_context *c;127 128 c = libnet_rpc_groupadd_send(p, io, NULL);129 return libnet_rpc_groupadd_recv(c, mem_ctx, io);130 }131 132 133 struct groupdel_state {134 struct dcerpc_pipe *pipe;135 struct policy_handle domain_handle;136 struct policy_handle group_handle;137 struct samr_LookupNames lookupname;138 struct samr_OpenGroup opengroup;139 struct samr_DeleteDomainGroup deletegroup;140 141 /* information about the progress */142 void (*monitor_fn)(struct monitor_msg *);143 };144 145 146 static void continue_groupdel_name_found(struct tevent_req *subreq);147 static void continue_groupdel_group_opened(struct tevent_req *subreq);148 static void continue_groupdel_deleted(struct tevent_req *subreq);149 150 151 struct composite_context* libnet_rpc_groupdel_send(struct dcerpc_pipe *p,152 struct libnet_rpc_groupdel *io,153 void (*monitor)(struct monitor_msg*))154 {155 struct composite_context *c;156 struct groupdel_state *s;157 struct tevent_req *subreq;158 159 /* composite context allocation and setup */160 c = composite_create(p, dcerpc_event_context(p));161 if (c == NULL) return NULL;162 163 s = talloc_zero(c, struct groupdel_state);164 if (composite_nomem(s, c)) return c;165 166 c->private_data = s;167 168 /* store function parameters in the state structure */169 s->pipe = p;170 s->domain_handle = io->in.domain_handle;171 s->monitor_fn = monitor;172 173 /* prepare parameters to send rpc request */174 s->lookupname.in.domain_handle = &io->in.domain_handle;175 s->lookupname.in.num_names = 1;176 s->lookupname.in.names = talloc_zero(s, struct lsa_String);177 s->lookupname.in.names->string = io->in.groupname;178 s->lookupname.out.rids = talloc_zero(s, struct samr_Ids);179 s->lookupname.out.types = talloc_zero(s, struct samr_Ids);180 if (composite_nomem(s->lookupname.out.rids, c)) return c;181 if (composite_nomem(s->lookupname.out.types, c)) return c;182 183 /* send the request */184 subreq = dcerpc_samr_LookupNames_r_send(s, c->event_ctx,185 p->binding_handle,186 &s->lookupname);187 if (composite_nomem(subreq, c)) return c;188 189 tevent_req_set_callback(subreq, continue_groupdel_name_found, c);190 return c;191 }192 193 194 static void continue_groupdel_name_found(struct tevent_req *subreq)195 {196 struct composite_context *c;197 struct groupdel_state *s;198 199 c = tevent_req_callback_data(subreq, struct composite_context);200 s = talloc_get_type(c->private_data, struct groupdel_state);201 202 /* receive samr_LookupNames result */203 c->status = dcerpc_samr_LookupNames_r_recv(subreq, s);204 TALLOC_FREE(subreq);205 if (!composite_is_ok(c)) return;206 207 c->status = s->lookupname.out.result;208 121 if (!NT_STATUS_IS_OK(c->status)) { 209 122 composite_error(c, c->status); … … 211 124 } 212 125 213 /* what to do when there's no group account to delete214 and what if there's more than one rid resolved */215 if (s->lookupname.out.rids->count != s->lookupname.in.num_names) {216 c->status = NT_STATUS_INVALID_NETWORK_RESPONSE;217 composite_error(c, c->status);218 return;219 }220 if (s->lookupname.out.types->count != s->lookupname.in.num_names) {221 c->status = NT_STATUS_INVALID_NETWORK_RESPONSE;222 composite_error(c, c->status);223 return;224 }225 226 /* prepare the arguments for rpc call */227 s->opengroup.in.domain_handle = &s->domain_handle;228 s->opengroup.in.rid = s->lookupname.out.rids->ids[0];229 s->opengroup.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;230 s->opengroup.out.group_handle = &s->group_handle;231 232 /* send rpc request */233 subreq = dcerpc_samr_OpenGroup_r_send(s, c->event_ctx,234 s->pipe->binding_handle,235 &s->opengroup);236 if (composite_nomem(subreq, c)) return;237 238 tevent_req_set_callback(subreq, continue_groupdel_group_opened, c);239 }240 241 242 static void continue_groupdel_group_opened(struct tevent_req *subreq)243 {244 struct composite_context *c;245 struct groupdel_state *s;246 247 c = tevent_req_callback_data(subreq, struct composite_context);248 s = talloc_get_type(c->private_data, struct groupdel_state);249 250 /* receive samr_OpenGroup result */251 c->status = dcerpc_samr_OpenGroup_r_recv(subreq, s);252 TALLOC_FREE(subreq);253 if (!composite_is_ok(c)) return;254 255 c->status = s->opengroup.out.result;256 if (!NT_STATUS_IS_OK(c->status)) {257 composite_error(c, c->status);258 return;259 }260 261 /* prepare the final rpc call arguments */262 s->deletegroup.in.group_handle = &s->group_handle;263 s->deletegroup.out.group_handle = &s->group_handle;264 265 /* send rpc request */266 subreq = dcerpc_samr_DeleteDomainGroup_r_send(s, c->event_ctx,267 s->pipe->binding_handle,268 &s->deletegroup);269 if (composite_nomem(subreq, c)) return;270 271 /* callback handler setup */272 tevent_req_set_callback(subreq, continue_groupdel_deleted, c);273 }274 275 276 static void continue_groupdel_deleted(struct tevent_req *subreq)277 {278 struct composite_context *c;279 struct groupdel_state *s;280 281 c = tevent_req_callback_data(subreq, struct composite_context);282 s = talloc_get_type(c->private_data, struct groupdel_state);283 284 /* receive samr_DeleteGroup result */285 c->status = dcerpc_samr_DeleteDomainGroup_r_recv(subreq, s);286 TALLOC_FREE(subreq);287 if (!composite_is_ok(c)) return;288 289 /* return the actual function call status */290 c->status = s->deletegroup.out.result;291 if (!NT_STATUS_IS_OK(c->status)) {292 composite_error(c, c->status);293 return;294 }295 296 126 composite_done(c); 297 127 } 298 128 299 129 300 NTSTATUS libnet_rpc_groupdel_recv(struct composite_context *c, TALLOC_CTX *mem_ctx, 301 struct libnet_rpc_groupdel *io) 302 { 303 NTSTATUS status; 304 struct groupdel_state *s; 305 306 status = composite_wait(c); 307 if (NT_STATUS_IS_OK(status) && io) { 308 s = talloc_get_type(c->private_data, struct groupdel_state); 309 io->out.group_handle = s->group_handle; 310 } 311 312 talloc_free(c); 313 return status; 314 } 315 316 317 NTSTATUS libnet_rpc_groupdel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 318 struct libnet_rpc_groupdel *io) 130 NTSTATUS libnet_rpc_groupadd(struct tevent_context *ev, 131 struct dcerpc_binding_handle *b, 132 TALLOC_CTX *mem_ctx, 133 struct libnet_rpc_groupadd *io) 319 134 { 320 135 struct composite_context *c; 321 136 322 c = libnet_rpc_group del_send(p, io, NULL);323 return libnet_rpc_group del_recv(c, mem_ctx, io);137 c = libnet_rpc_groupadd_send(mem_ctx, ev, b, io, NULL); 138 return libnet_rpc_groupadd_recv(c, mem_ctx, io); 324 139 }
Note:
See TracChangeset
for help on using the changeset viewer.