Changeset 740 for vendor/current/source4/libnet
- Timestamp:
- Nov 14, 2012, 12:59:34 PM (13 years ago)
- Location:
- vendor/current/source4/libnet
- Files:
-
- 1 added
- 2 deleted
- 26 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source4/libnet/groupinfo.c
r414 r740 47 47 48 48 49 static void continue_groupinfo_lookup(struct rpc_request *req);50 static void continue_groupinfo_opengroup(struct rpc_request *req);51 static void continue_groupinfo_getgroup(struct rpc_request *req);52 static void continue_groupinfo_closegroup(struct rpc_request *req);49 static void continue_groupinfo_lookup(struct tevent_req *subreq); 50 static void continue_groupinfo_opengroup(struct tevent_req *subreq); 51 static void continue_groupinfo_getgroup(struct tevent_req *subreq); 52 static void continue_groupinfo_closegroup(struct tevent_req *subreq); 53 53 54 54 … … 56 56 * Stage 1 (optional): Look for a group name in SAM server. 57 57 */ 58 static void continue_groupinfo_lookup(struct rpc_request *req) 59 { 60 struct composite_context *c; 61 struct groupinfo_state *s; 62 struct rpc_request *opengroup_req; 58 static void continue_groupinfo_lookup(struct tevent_req *subreq) 59 { 60 struct composite_context *c; 61 struct groupinfo_state *s; 63 62 struct monitor_msg msg; 64 63 struct msg_rpc_lookup_name *msg_lookup; 65 64 66 c = t alloc_get_type(req->async.private_data, struct composite_context);65 c = tevent_req_callback_data(subreq, struct composite_context); 67 66 s = talloc_get_type(c->private_data, struct groupinfo_state); 68 67 69 68 /* receive samr_Lookup reply */ 70 c->status = dcerpc_ndr_request_recv(req); 69 c->status = dcerpc_samr_LookupNames_r_recv(subreq, s); 70 TALLOC_FREE(subreq); 71 71 if (!composite_is_ok(c)) return; 72 72 … … 105 105 106 106 /* send request */ 107 opengroup_req = dcerpc_samr_OpenGroup_send(s->pipe, c, &s->opengroup); 108 if (composite_nomem(opengroup_req, c)) return; 109 110 composite_continue_rpc(c, opengroup_req, continue_groupinfo_opengroup, c); 107 subreq = dcerpc_samr_OpenGroup_r_send(s, c->event_ctx, 108 s->pipe->binding_handle, 109 &s->opengroup); 110 if (composite_nomem(subreq, c)) return; 111 112 tevent_req_set_callback(subreq, continue_groupinfo_opengroup, c); 111 113 } 112 114 … … 115 117 * Stage 2: Open group policy handle. 116 118 */ 117 static void continue_groupinfo_opengroup(struct rpc_request *req) 118 { 119 struct composite_context *c; 120 struct groupinfo_state *s; 121 struct rpc_request *querygroup_req; 119 static void continue_groupinfo_opengroup(struct tevent_req *subreq) 120 { 121 struct composite_context *c; 122 struct groupinfo_state *s; 122 123 struct monitor_msg msg; 123 124 struct msg_rpc_open_group *msg_open; 124 125 125 c = t alloc_get_type(req->async.private_data, struct composite_context);126 c = tevent_req_callback_data(subreq, struct composite_context); 126 127 s = talloc_get_type(c->private_data, struct groupinfo_state); 127 128 128 129 /* receive samr_OpenGroup reply */ 129 c->status = dcerpc_ndr_request_recv(req); 130 c->status = dcerpc_samr_OpenGroup_r_recv(subreq, s); 131 TALLOC_FREE(subreq); 130 132 if (!composite_is_ok(c)) return; 131 133 … … 154 156 155 157 /* queue rpc call, set event handling and new state */ 156 querygroup_req = dcerpc_samr_QueryGroupInfo_send(s->pipe, c, &s->querygroupinfo); 157 if (composite_nomem(querygroup_req, c)) return; 158 159 composite_continue_rpc(c, querygroup_req, continue_groupinfo_getgroup, c); 158 subreq = dcerpc_samr_QueryGroupInfo_r_send(s, 159 c->event_ctx, 160 s->pipe->binding_handle, 161 &s->querygroupinfo); 162 if (composite_nomem(subreq, c)) return; 163 164 tevent_req_set_callback(subreq, continue_groupinfo_getgroup, c); 160 165 } 161 166 … … 164 169 * Stage 3: Get requested group information. 165 170 */ 166 static void continue_groupinfo_getgroup(struct rpc_request *req) 167 { 168 struct composite_context *c; 169 struct groupinfo_state *s; 170 struct rpc_request *close_req; 171 static void continue_groupinfo_getgroup(struct tevent_req *subreq) 172 { 173 struct composite_context *c; 174 struct groupinfo_state *s; 171 175 struct monitor_msg msg; 172 176 struct msg_rpc_query_group *msg_query; 173 177 174 c = t alloc_get_type(req->async.private_data, struct composite_context);178 c = tevent_req_callback_data(subreq, struct composite_context); 175 179 s = talloc_get_type(c->private_data, struct groupinfo_state); 176 180 177 181 /* receive samr_QueryGroupInfo reply */ 178 c->status = dcerpc_ndr_request_recv(req); 182 c->status = dcerpc_samr_QueryGroupInfo_r_recv(subreq, s); 183 TALLOC_FREE(subreq); 179 184 if (!composite_is_ok(c)) return; 180 185 … … 203 208 204 209 /* queue rpc call, set event handling and new state */ 205 close_req = dcerpc_samr_Close_send(s->pipe, c, &s->samrclose); 206 if (composite_nomem(close_req, c)) return; 207 208 composite_continue_rpc(c, close_req, continue_groupinfo_closegroup, c); 210 subreq = dcerpc_samr_Close_r_send(s, c->event_ctx, 211 s->pipe->binding_handle, 212 &s->samrclose); 213 if (composite_nomem(subreq, c)) return; 214 215 tevent_req_set_callback(subreq, continue_groupinfo_closegroup, c); 209 216 } 210 217 … … 213 220 * Stage 4: Close policy handle associated with opened group. 214 221 */ 215 static void continue_groupinfo_closegroup(struct rpc_request *req)222 static void continue_groupinfo_closegroup(struct tevent_req *subreq) 216 223 { 217 224 struct composite_context *c; … … 220 227 struct msg_rpc_close_group *msg_close; 221 228 222 c = t alloc_get_type(req->async.private_data, struct composite_context);229 c = tevent_req_callback_data(subreq, struct composite_context); 223 230 s = talloc_get_type(c->private_data, struct groupinfo_state); 224 231 225 232 /* receive samr_Close reply */ 226 c->status = dcerpc_ndr_request_recv(req); 233 c->status = dcerpc_samr_Close_r_recv(subreq, s); 234 TALLOC_FREE(subreq); 227 235 if (!composite_is_ok(c)) return; 228 236 … … 260 268 struct groupinfo_state *s; 261 269 struct dom_sid *sid; 262 struct rpc_request *opengroup_req, *lookup_req;270 struct tevent_req *subreq; 263 271 264 272 if (!p || !io) return NULL; … … 287 295 288 296 /* send request */ 289 opengroup_req = dcerpc_samr_OpenGroup_send(p, c, &s->opengroup); 290 if (composite_nomem(opengroup_req, c)) return c; 291 292 composite_continue_rpc(c, opengroup_req, continue_groupinfo_opengroup, c); 297 subreq = dcerpc_samr_OpenGroup_r_send(s, c->event_ctx, 298 p->binding_handle, 299 &s->opengroup); 300 if (composite_nomem(subreq, c)) return c; 301 302 tevent_req_set_callback(subreq, continue_groupinfo_opengroup, c); 293 303 294 304 } else { … … 307 317 308 318 /* send request */ 309 lookup_req = dcerpc_samr_LookupNames_send(p, c, &s->lookup); 310 if (composite_nomem(lookup_req, c)) return c; 311 312 composite_continue_rpc(c, lookup_req, continue_groupinfo_lookup, c); 319 subreq = dcerpc_samr_LookupNames_r_send(s, c->event_ctx, 320 p->binding_handle, 321 &s->lookup); 322 if (composite_nomem(subreq, c)) return c; 323 324 tevent_req_set_callback(subreq, continue_groupinfo_lookup, c); 313 325 } 314 326 -
vendor/current/source4/libnet/groupman.c
r414 r740 39 39 40 40 41 static void continue_groupadd_created(struct rpc_request *req);41 static void continue_groupadd_created(struct tevent_req *subreq); 42 42 43 43 … … 48 48 struct composite_context *c; 49 49 struct groupadd_state *s; 50 struct rpc_request *create_req;50 struct tevent_req *subreq; 51 51 52 52 if (!p || !io) return NULL; … … 77 77 s->creategroup.out.rid = &s->group_rid; 78 78 79 create_req = dcerpc_samr_CreateDomainGroup_send(s->pipe, c, &s->creategroup); 80 if (composite_nomem(create_req, c)) return c; 81 82 composite_continue_rpc(c, create_req, continue_groupadd_created, c); 79 subreq = dcerpc_samr_CreateDomainGroup_r_send(s, c->event_ctx, 80 s->pipe->binding_handle, 81 &s->creategroup); 82 if (composite_nomem(subreq, c)) return c; 83 84 tevent_req_set_callback(subreq, continue_groupadd_created, c); 83 85 return c; 84 86 } … … 100 102 101 103 102 static void continue_groupadd_created(struct rpc_request *req)104 static void continue_groupadd_created(struct tevent_req *subreq) 103 105 { 104 106 struct composite_context *c; 105 107 struct groupadd_state *s; 106 108 107 c = t alloc_get_type(req->async.private_data, struct composite_context);109 c = tevent_req_callback_data(subreq, struct composite_context); 108 110 s = talloc_get_type(c->private_data, struct groupadd_state); 109 111 110 c->status = dcerpc_ndr_request_recv(req); 112 c->status = dcerpc_samr_CreateDomainGroup_r_recv(subreq, s); 113 TALLOC_FREE(subreq); 111 114 if (!composite_is_ok(c)) return; 112 115 … … 141 144 142 145 143 static void continue_groupdel_name_found(struct rpc_request *req);144 static void continue_groupdel_group_opened(struct rpc_request *req);145 static void continue_groupdel_deleted(struct rpc_request *req);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); 146 149 147 150 … … 152 155 struct composite_context *c; 153 156 struct groupdel_state *s; 154 struct rpc_request *lookup_req;157 struct tevent_req *subreq; 155 158 156 159 /* composite context allocation and setup */ … … 179 182 180 183 /* send the request */ 181 lookup_req = dcerpc_samr_LookupNames_send(p, c, &s->lookupname); 182 if (composite_nomem(lookup_req, c)) return c; 183 184 composite_continue_rpc(c, lookup_req, continue_groupdel_name_found, c); 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); 185 190 return c; 186 191 } 187 192 188 193 189 static void continue_groupdel_name_found(struct rpc_request *req) 190 { 191 struct composite_context *c; 192 struct groupdel_state *s; 193 struct rpc_request *opengroup_req; 194 195 c = talloc_get_type(req->async.private_data, struct composite_context); 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); 196 200 s = talloc_get_type(c->private_data, struct groupdel_state); 197 201 198 202 /* receive samr_LookupNames result */ 199 c->status = dcerpc_ndr_request_recv(req); 203 c->status = dcerpc_samr_LookupNames_r_recv(subreq, s); 204 TALLOC_FREE(subreq); 200 205 if (!composite_is_ok(c)) return; 201 206 … … 226 231 227 232 /* send rpc request */ 228 opengroup_req = dcerpc_samr_OpenGroup_send(s->pipe, c, &s->opengroup); 229 if (composite_nomem(opengroup_req, c)) return; 230 231 composite_continue_rpc(c, opengroup_req, continue_groupdel_group_opened, c); 232 } 233 234 235 static void continue_groupdel_group_opened(struct rpc_request *req) 236 { 237 struct composite_context *c; 238 struct groupdel_state *s; 239 struct rpc_request *delgroup_req; 240 241 c = talloc_get_type(req->async.private_data, struct composite_context); 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); 242 248 s = talloc_get_type(c->private_data, struct groupdel_state); 243 249 244 250 /* receive samr_OpenGroup result */ 245 c->status = dcerpc_ndr_request_recv(req); 251 c->status = dcerpc_samr_OpenGroup_r_recv(subreq, s); 252 TALLOC_FREE(subreq); 246 253 if (!composite_is_ok(c)) return; 247 254 … … 257 264 258 265 /* send rpc request */ 259 delgroup_req = dcerpc_samr_DeleteDomainGroup_send(s->pipe, c, &s->deletegroup); 260 if (composite_nomem(delgroup_req, c)) return; 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; 261 270 262 271 /* callback handler setup */ 263 composite_continue_rpc(c, delgroup_req, continue_groupdel_deleted, c);264 } 265 266 267 static void continue_groupdel_deleted(struct rpc_request *req)268 { 269 struct composite_context *c; 270 struct groupdel_state *s; 271 272 c = t alloc_get_type(req->async.private_data, struct composite_context);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); 273 282 s = talloc_get_type(c->private_data, struct groupdel_state); 274 283 275 284 /* receive samr_DeleteGroup result */ 276 c->status = dcerpc_ndr_request_recv(req); 285 c->status = dcerpc_samr_DeleteDomainGroup_r_recv(subreq, s); 286 TALLOC_FREE(subreq); 277 287 if (!composite_is_ok(c)) return; 278 288 -
vendor/current/source4/libnet/libnet.c
r414 r740 43 43 ctx->lp_ctx = lp_ctx; 44 44 45 /* make sure dcerpc is initialized */ 46 dcerpc_init(lp_ctx); 47 45 48 /* name resolution methods */ 46 ctx->resolve_ctx = lp _resolve_context(lp_ctx);49 ctx->resolve_ctx = lpcfg_resolve_context(lp_ctx); 47 50 48 51 /* connected services' params */ … … 53 56 ctx->samr.buf_size = 128; 54 57 58 ctx->server_address = NULL; 59 55 60 return ctx; 56 61 } -
vendor/current/source4/libnet/libnet.h
r414 r740 31 31 struct { 32 32 struct dcerpc_pipe *pipe; 33 struct dcerpc_binding_handle *samr_handle; 33 34 const char *name; 34 35 struct dom_sid *sid; … … 42 43 struct { 43 44 struct dcerpc_pipe *pipe; 45 struct dcerpc_binding_handle *lsa_handle; 44 46 const char *name; 45 47 uint32_t access_mask; … … 53 55 54 56 struct loadparm_context *lp_ctx; 57 58 /* if non-null then override the server address */ 59 const char *server_address; 55 60 }; 56 61 57 62 58 #include "lib/ldb/include/ldb.h"63 #include <ldb.h> 59 64 #include "libnet/composite.h" 60 65 #include "libnet/userman.h" -
vendor/current/source4/libnet/libnet_become_dc.c
r414 r740 22 22 #include "libcli/composite/composite.h" 23 23 #include "libcli/cldap/cldap.h" 24 #include "lib/ldb/include/ldb.h"25 #include "lib/ldb/include/ldb_errors.h"26 #include "l ib/ldb_wrap.h"24 #include <ldb.h> 25 #include <ldb_errors.h> 26 #include "ldb_wrap.h" 27 27 #include "dsdb/samdb/samdb.h" 28 28 #include "../libds/common/flags.h" … … 35 35 #include "auth/gensec/gensec.h" 36 36 #include "param/param.h" 37 #include "lib/tsocket/tsocket.h" 37 38 38 39 /***************************************************************************** … … 337 338 * objectGUID: <object_guid> 338 339 * systemFlags: 1107296256 <0x42000000> 339 * objectCategory: CN=Site,C =Schema,CN=Configuration,<domain_partition>340 * objectCategory: CN=Site,CN=Schema,CN=Configuration,<domain_partition> 340 341 */ 341 342 … … 701 702 struct dcerpc_binding *binding; 702 703 struct dcerpc_pipe *pipe; 704 struct dcerpc_binding_handle *drsuapi_handle; 703 705 DATA_BLOB gensec_skey; 704 706 struct drsuapi_DsBind bind_r; … … 710 712 } drsuapi1, drsuapi2, drsuapi3; 711 713 714 void *ndr_struct_ptr; 715 712 716 struct libnet_BecomeDC_Domain domain; 713 717 struct libnet_BecomeDC_Forest forest; … … 730 734 struct libnet_BecomeDC_StoreChunk _sc; 731 735 struct libnet_BecomeDC_Callbacks callbacks; 736 737 bool rodc_join; 732 738 }; 739 740 static int32_t get_dc_function_level(struct loadparm_context *lp_ctx) 741 { 742 /* per default we are (Windows) 2008 R2 compatible */ 743 return lpcfg_parm_int(lp_ctx, NULL, "ads", "dc function level", 744 DS_DOMAIN_FUNCTION_2008_R2); 745 } 733 746 734 747 static void becomeDC_recv_cldap(struct tevent_req *req); … … 738 751 struct composite_context *c = s->creq; 739 752 struct tevent_req *req; 740 741 s->cldap.io.in.dest_address = s->source_dsa.address; 742 s->cldap.io.in.dest_port = lp_cldap_port(s->libnet->lp_ctx); 753 struct tsocket_address *dest_address; 754 int ret; 755 756 s->cldap.io.in.dest_address = NULL; 757 s->cldap.io.in.dest_port = 0; 743 758 s->cldap.io.in.realm = s->domain.dns_name; 744 759 s->cldap.io.in.host = s->dest_dsa.netbios_name; … … 750 765 s->cldap.io.in.map_response = true; 751 766 767 ret = tsocket_address_inet_from_strings(s, "ip", 768 s->source_dsa.address, 769 lpcfg_cldap_port(s->libnet->lp_ctx), 770 &dest_address); 771 if (ret != 0) { 772 c->status = map_nt_error_from_unix(errno); 773 if (!composite_is_ok(c)) return; 774 } 775 752 776 c->status = cldap_socket_init(s, s->libnet->event_ctx, 753 NULL, NULL, &s->cldap.sock);//TODO777 NULL, dest_address, &s->cldap.sock); 754 778 if (!composite_is_ok(c)) return; 755 779 … … 767 791 struct composite_context *c = s->creq; 768 792 769 c->status = cldap_netlogon_recv(req, 770 lp_iconv_convenience(s->libnet->lp_ctx), 771 s, &s->cldap.io); 793 c->status = cldap_netlogon_recv(req, s, &s->cldap.io); 772 794 talloc_free(req); 773 if (!composite_is_ok(c)) return; 774 795 if (!composite_is_ok(c)) { 796 DEBUG(0,("Failed to send, receive or parse CLDAP reply from server %s for our host %s: %s\n", 797 s->cldap.io.in.dest_address, 798 s->cldap.io.in.host, 799 nt_errstr(c->status))); 800 return; 801 } 775 802 s->cldap.netlogon = s->cldap.io.out.netlogon.data.nt5_ex; 776 803 777 804 s->domain.dns_name = s->cldap.netlogon.dns_domain; 778 s->domain.netbios_name = s->cldap.netlogon.domain ;805 s->domain.netbios_name = s->cldap.netlogon.domain_name; 779 806 s->domain.guid = s->cldap.netlogon.domain_uuid; 780 807 … … 787 814 s->dest_dsa.site_name = s->cldap.netlogon.client_site; 788 815 816 DEBUG(0,("CLDAP response: forest=%s dns=%s netbios=%s server_site=%s client_site=%s\n", 817 s->forest.dns_name, s->domain.dns_name, s->domain.netbios_name, 818 s->source_dsa.site_name, s->dest_dsa.site_name)); 819 if (!s->dest_dsa.site_name || strcmp(s->dest_dsa.site_name, "") == 0) { 820 DEBUG(0,("Got empty client site - using server site name %s\n", 821 s->source_dsa.site_name)); 822 s->dest_dsa.site_name = s->source_dsa.site_name; 823 } 824 789 825 becomeDC_connect_ldap1(s); 790 826 } … … 801 837 NULL, 802 838 s->libnet->cred, 803 0 , NULL);839 0); 804 840 talloc_free(url); 805 841 if (ldap->ldb == NULL) { … … 877 913 878 914 s->forest.crossref_behavior_version = ldb_msg_find_attr_as_uint(r->msgs[0], "msDs-Behavior-Version", 0); 915 if (s->forest.crossref_behavior_version > 916 get_dc_function_level(s->libnet->lp_ctx)) { 917 talloc_free(r); 918 DEBUG(0,("The servers function level %u is above 'ads:dc function level' of %u\n", 919 s->forest.crossref_behavior_version, 920 get_dc_function_level(s->libnet->lp_ctx))); 921 return NT_STATUS_NOT_SUPPORTED; 922 } 879 923 880 924 talloc_free(r); … … 906 950 907 951 s->domain.behavior_version = ldb_msg_find_attr_as_uint(r->msgs[0], "msDs-Behavior-Version", 0); 952 if (s->domain.behavior_version > 953 get_dc_function_level(s->libnet->lp_ctx)) { 954 talloc_free(r); 955 DEBUG(0,("The servers function level %u is above 'ads:dc function level' of %u\n", 956 s->forest.crossref_behavior_version, 957 get_dc_function_level(s->libnet->lp_ctx))); 958 return NT_STATUS_NOT_SUPPORTED; 959 } 908 960 909 961 talloc_free(r); … … 981 1033 struct ldb_dn *ntds_dn; 982 1034 struct ldb_dn *server_dn; 983 static const char *_1_1_attrs[] = {984 "1.1",985 NULL986 };987 static const char *fsmo_attrs[] = {988 "fSMORoleOwner",989 NULL990 };991 1035 static const char *dns_attrs[] = { 992 1036 "dnsHostName", … … 998 1042 }; 999 1043 1000 basedn = ldb_dn_new_fmt(s, s->ldap1.ldb, "<WKGUID=2fbac1870ade11d297c400c04fd8d5cd,%s>", 1001 s->domain.dn_str); 1002 NT_STATUS_HAVE_NO_MEMORY(basedn); 1003 1004 ret = ldb_search(s->ldap1.ldb, s, &r, basedn, LDB_SCOPE_BASE, 1005 _1_1_attrs, "(objectClass=*)"); 1006 talloc_free(basedn); 1044 ret = dsdb_wellknown_dn(s->ldap1.ldb, s, 1045 ldb_get_default_basedn(s->ldap1.ldb), 1046 DS_GUID_INFRASTRUCTURE_CONTAINER, 1047 &basedn); 1007 1048 if (ret != LDB_SUCCESS) { 1008 1049 return NT_STATUS_LDAP(ret); 1009 } else if (r->count != 1) { 1010 talloc_free(r); 1011 return NT_STATUS_INVALID_NETWORK_RESPONSE; 1012 } 1013 1014 basedn = talloc_steal(s, r->msgs[0]->dn); 1015 talloc_free(r); 1016 1017 ret = ldb_search(s->ldap1.ldb, s, &r, basedn, LDB_SCOPE_BASE, 1018 fsmo_attrs, "(objectClass=*)"); 1019 talloc_free(basedn); 1050 } 1051 1052 ret = samdb_reference_dn(s->ldap1.ldb, s, basedn, "fSMORoleOwner", &ntds_dn); 1020 1053 if (ret != LDB_SUCCESS) { 1054 talloc_free(basedn); 1021 1055 return NT_STATUS_LDAP(ret); 1022 } else if (r->count != 1) { 1023 talloc_free(r); 1024 return NT_STATUS_INVALID_NETWORK_RESPONSE; 1025 } 1026 1027 s->infrastructure_fsmo.ntds_dn_str = samdb_result_string(r->msgs[0], "fSMORoleOwner", NULL); 1028 if (!s->infrastructure_fsmo.ntds_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE; 1029 talloc_steal(s, s->infrastructure_fsmo.ntds_dn_str); 1030 1031 talloc_free(r); 1032 1033 ntds_dn = ldb_dn_new(s, s->ldap1.ldb, s->infrastructure_fsmo.ntds_dn_str); 1034 NT_STATUS_HAVE_NO_MEMORY(ntds_dn); 1056 } 1057 1058 s->infrastructure_fsmo.ntds_dn_str = ldb_dn_get_linearized(ntds_dn); 1059 NT_STATUS_HAVE_NO_MEMORY(s->infrastructure_fsmo.ntds_dn_str); 1035 1060 1036 1061 server_dn = ldb_dn_get_parent(s, ntds_dn); … … 1049 1074 } 1050 1075 1051 s->infrastructure_fsmo.dns_name = samdb_result_string(r->msgs[0], "dnsHostName", NULL);1076 s->infrastructure_fsmo.dns_name = ldb_msg_find_attr_as_string(r->msgs[0], "dnsHostName", NULL); 1052 1077 if (!s->infrastructure_fsmo.dns_name) return NT_STATUS_INVALID_NETWORK_RESPONSE; 1053 1078 talloc_steal(s, s->infrastructure_fsmo.dns_name); … … 1109 1134 } 1110 1135 1111 reference_dn_str = samdb_result_string(r->msgs[0], "rIDManagerReference", NULL);1136 reference_dn_str = ldb_msg_find_attr_as_string(r->msgs[0], "rIDManagerReference", NULL); 1112 1137 if (!reference_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE; 1113 1138 … … 1127 1152 } 1128 1153 1129 s->rid_manager_fsmo.ntds_dn_str = samdb_result_string(r->msgs[0], "fSMORoleOwner", NULL);1154 s->rid_manager_fsmo.ntds_dn_str = ldb_msg_find_attr_as_string(r->msgs[0], "fSMORoleOwner", NULL); 1130 1155 if (!s->rid_manager_fsmo.ntds_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE; 1131 1156 talloc_steal(s, s->rid_manager_fsmo.ntds_dn_str); … … 1151 1176 } 1152 1177 1153 s->rid_manager_fsmo.dns_name = samdb_result_string(r->msgs[0], "dnsHostName", NULL);1178 s->rid_manager_fsmo.dns_name = ldb_msg_find_attr_as_string(r->msgs[0], "dnsHostName", NULL); 1154 1179 if (!s->rid_manager_fsmo.dns_name) return NT_STATUS_INVALID_NETWORK_RESPONSE; 1155 1180 talloc_steal(s, s->rid_manager_fsmo.dns_name); … … 1236 1261 } 1237 1262 1238 s->dest_dsa.computer_dn_str = samdb_result_string(r->msgs[0], "distinguishedName", NULL);1263 s->dest_dsa.computer_dn_str = ldb_msg_find_attr_as_string(r->msgs[0], "distinguishedName", NULL); 1239 1264 if (!s->dest_dsa.computer_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE; 1240 1265 talloc_steal(s, s->dest_dsa.computer_dn_str); 1241 1266 1242 s->dest_dsa.user_account_control = samdb_result_uint(r->msgs[0], "userAccountControl", 0);1267 s->dest_dsa.user_account_control = ldb_msg_find_attr_as_uint(r->msgs[0], "userAccountControl", 0); 1243 1268 1244 1269 talloc_free(r); … … 1274 1299 } 1275 1300 1276 server_reference_dn_str = samdb_result_string(r->msgs[0], "serverReference", NULL);1301 server_reference_dn_str = ldb_msg_find_attr_as_string(r->msgs[0], "serverReference", NULL); 1277 1302 if (server_reference_dn_str) { 1278 1303 server_reference_dn = ldb_dn_new(r, s->ldap1.ldb, server_reference_dn_str); … … 1283 1308 1284 1309 /* 1285 * if the server object belongs to another DC in another domain in the forest,1286 * we should not touch this object!1310 * if the server object belongs to another DC in another domain 1311 * in the forest, we should not touch this object! 1287 1312 */ 1288 1313 if (ldb_dn_compare(computer_dn, server_reference_dn) != 0) { … … 1293 1318 1294 1319 /* if the server object is already for the dest_dsa, then we don't need to create it */ 1295 s->dest_dsa.server_dn_str = samdb_result_string(r->msgs[0], "distinguishedName", NULL);1320 s->dest_dsa.server_dn_str = ldb_msg_find_attr_as_string(r->msgs[0], "distinguishedName", NULL); 1296 1321 if (!s->dest_dsa.server_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE; 1297 1322 talloc_steal(s, s->dest_dsa.server_dn_str); … … 1328 1353 } 1329 1354 1330 server_reference_bl_dn_str = samdb_result_string(r->msgs[0], "serverReferenceBL", NULL);1355 server_reference_bl_dn_str = ldb_msg_find_attr_as_string(r->msgs[0], "serverReferenceBL", NULL); 1331 1356 if (!server_reference_bl_dn_str) { 1332 1357 /* if no back link is present, we're done for this function */ … … 1336 1361 1337 1362 /* if the server object is already for the dest_dsa, then we don't need to create it */ 1338 s->dest_dsa.server_dn_str = samdb_result_string(r->msgs[0], "serverReferenceBL", NULL);1363 s->dest_dsa.server_dn_str = ldb_msg_find_attr_as_string(r->msgs[0], "serverReferenceBL", NULL); 1339 1364 if (s->dest_dsa.server_dn_str) { 1340 1365 /* if a back link is present, we know that the server object is present */ … … 1399 1424 int ret; 1400 1425 struct ldb_message *msg; 1401 u int32_t i;1426 unsigned int i; 1402 1427 1403 1428 /* make a 'modify' msg, and only for serverReference */ … … 1520 1545 * passed as auth_type here. If NTLMSSP is used, Windows 1521 1546 * 2000 returns garbage in the DsGetNCChanges() response 1522 * if encrypted password attributes would be in the response. 1523 * That means the replication of the schema and configuration 1524 * partition works fine, but it fails for the domain partition. 1547 * if encrypted password attributes would be in the 1548 * response. That means the replication of the schema and 1549 * configuration partition works fine, but it fails for 1550 * the domain partition. 1525 1551 */ 1526 if (lp _parm_bool(s->libnet->lp_ctx, NULL, "become_dc",1552 if (lpcfg_parm_bool(s->libnet->lp_ctx, NULL, "become_dc", 1527 1553 "force krb5", true)) 1528 1554 { 1529 1555 krb5_str = "krb5,"; 1530 1556 } 1531 if (lp _parm_bool(s->libnet->lp_ctx, NULL, "become_dc",1557 if (lpcfg_parm_bool(s->libnet->lp_ctx, NULL, "become_dc", 1532 1558 "print", false)) 1533 1559 { … … 1551 1577 static void becomeDC_drsuapi_bind_send(struct libnet_BecomeDC_state *s, 1552 1578 struct becomeDC_drsuapi *drsuapi, 1553 void (*recv_fn)(struct rpc_request *req));1554 static void becomeDC_drsuapi1_bind_recv(struct rpc_request *req);1579 void (*recv_fn)(struct tevent_req *subreq)); 1580 static void becomeDC_drsuapi1_bind_recv(struct tevent_req *subreq); 1555 1581 1556 1582 static void becomeDC_drsuapi1_connect_recv(struct composite_context *req) … … 1563 1589 if (!composite_is_ok(c)) return; 1564 1590 1591 s->drsuapi1.drsuapi_handle = s->drsuapi1.pipe->binding_handle; 1592 1565 1593 c->status = gensec_session_key(s->drsuapi1.pipe->conn->security_state.generic_state, 1566 1594 &s->drsuapi1.gensec_skey); … … 1572 1600 static void becomeDC_drsuapi_bind_send(struct libnet_BecomeDC_state *s, 1573 1601 struct becomeDC_drsuapi *drsuapi, 1574 void (*recv_fn)(struct rpc_request *req))1602 void (*recv_fn)(struct tevent_req *subreq)) 1575 1603 { 1576 1604 struct composite_context *c = s->creq; 1577 struct rpc_request *req;1578 1605 struct drsuapi_DsBindInfo28 *bind_info28; 1606 struct tevent_req *subreq; 1579 1607 1580 1608 GUID_from_string(DRSUAPI_DS_BIND_GUID_W2K3, &drsuapi->bind_guid); … … 1590 1618 bind_info28->supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE; 1591 1619 bind_info28->supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2; 1592 if (s->domain.behavior_version == 2) {1620 if (s->domain.behavior_version >= DS_DOMAIN_FUNCTION_2003) { 1593 1621 /* TODO: find out how this is really triggered! */ 1594 1622 bind_info28->supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION; … … 1603 1631 bind_info28->supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY; 1604 1632 bind_info28->supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3; 1605 bind_info28->supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_ 00100000;1633 bind_info28->supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V5; 1606 1634 bind_info28->supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2; 1607 1635 bind_info28->supported_extensions |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6; … … 1627 1655 drsuapi->bind_r.out.bind_handle = &drsuapi->bind_handle; 1628 1656 1629 req = dcerpc_drsuapi_DsBind_send(drsuapi->pipe, s, &drsuapi->bind_r); 1630 composite_continue_rpc(c, req, recv_fn, s); 1657 subreq = dcerpc_drsuapi_DsBind_r_send(s, c->event_ctx, 1658 drsuapi->drsuapi_handle, 1659 &drsuapi->bind_r); 1660 if (composite_nomem(subreq, c)) return; 1661 tevent_req_set_callback(subreq, recv_fn, s); 1631 1662 } 1632 1663 … … 1670 1701 static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s); 1671 1702 1672 static void becomeDC_drsuapi1_bind_recv(struct rpc_request *req)1673 { 1674 struct libnet_BecomeDC_state *s = t alloc_get_type(req->async.private_data,1703 static void becomeDC_drsuapi1_bind_recv(struct tevent_req *subreq) 1704 { 1705 struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq, 1675 1706 struct libnet_BecomeDC_state); 1676 1707 struct composite_context *c = s->creq; 1677 1708 WERROR status; 1678 1709 1679 bool print = false; 1680 1681 if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) { 1682 print = true; 1683 } 1684 1685 c->status = dcerpc_ndr_request_recv(req); 1686 if (!composite_is_ok(c)) return; 1687 1688 if (print) { 1689 NDR_PRINT_OUT_DEBUG(drsuapi_DsBind, &s->drsuapi1.bind_r); 1690 } 1710 c->status = dcerpc_drsuapi_DsBind_r_recv(subreq, s); 1711 TALLOC_FREE(subreq); 1712 if (!composite_is_ok(c)) return; 1691 1713 1692 1714 status = becomeDC_drsuapi_bind_recv(s, &s->drsuapi1); … … 1699 1721 } 1700 1722 1701 static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req);1723 static void becomeDC_drsuapi1_add_entry_recv(struct tevent_req *subreq); 1702 1724 1703 1725 static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s) 1704 1726 { 1705 1727 struct composite_context *c = s->creq; 1706 struct rpc_request *req;1707 1728 struct drsuapi_DsAddEntry *r; 1708 1729 struct drsuapi_DsReplicaObjectIdentifier *identifier; 1709 1730 uint32_t num_attrs, i = 0; 1710 1731 struct drsuapi_DsReplicaAttribute *attrs; 1711 struct smb_iconv_convenience *iconv_convenience = lp_iconv_convenience(s->libnet->lp_ctx);1712 1732 enum ndr_err_code ndr_err; 1713 1733 bool w2k3; 1734 struct tevent_req *subreq; 1714 1735 1715 1736 /* choose a random invocationId */ … … 1717 1738 1718 1739 /* 1719 * if the schema version indicates w2k3, then 1720 * also send some w2k3 specific attributes1740 * if the schema version indicates w2k3, then also send some w2k3 1741 * specific attributes. 1721 1742 */ 1722 1743 if (s->forest.schema_object_version >= 30) { … … 1739 1760 1740 1761 /* allocate attribute array */ 1741 num_attrs = 1 1;1762 num_attrs = 12; 1742 1763 attrs = talloc_array(r, struct drsuapi_DsReplicaAttribute, num_attrs); 1743 1764 if (composite_nomem(attrs, c)) return; … … 1808 1829 if (composite_nomem(v, c)) return; 1809 1830 1810 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, v,(ndr_push_flags_fn_t)ndr_push_security_descriptor); 1831 ndr_err = ndr_push_struct_blob(&vd[0], vd, v, 1832 (ndr_push_flags_fn_t)ndr_push_security_descriptor); 1811 1833 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 1812 1834 c->status = ndr_map_error2ntstatus(ndr_err); … … 1816 1838 vs[0].blob = &vd[0]; 1817 1839 1818 attrs[i].attid = DRSUAPI_ATT RIBUTE_ntSecurityDescriptor;1840 attrs[i].attid = DRSUAPI_ATTID_ntSecurityDescriptor; 1819 1841 attrs[i].value_ctr.num_values = 1; 1820 1842 attrs[i].value_ctr.values = vs; … … 1842 1864 vs[0].blob = &vd[0]; 1843 1865 1844 attrs[i].attid = DRSUAPI_ATT RIBUTE_objectClass;1866 attrs[i].attid = DRSUAPI_ATTID_objectClass; 1845 1867 attrs[i].value_ctr.num_values = 1; 1846 1868 attrs[i].value_ctr.values = vs; … … 1849 1871 } 1850 1872 1851 /* objectCategory: CN=NTDS-DSA,CN=Schema,... */1873 /* objectCategory: CN=NTDS-DSA,CN=Schema,... or CN=NTDS-DSA-RO,CN=Schema,... */ 1852 1874 { 1853 1875 struct drsuapi_DsAttributeValue *vs; … … 1863 1885 v[0].guid = GUID_zero(); 1864 1886 v[0].sid = s->zero_sid; 1865 v[0].dn = talloc_asprintf(vd, "CN=NTDS-DSA,%s", 1887 1888 if (s->rodc_join) { 1889 v[0].dn = talloc_asprintf(vd, "CN=NTDS-DSA-RO,%s", 1866 1890 s->forest.schema_dn_str); 1891 } else { 1892 v[0].dn = talloc_asprintf(vd, "CN=NTDS-DSA,%s", 1893 s->forest.schema_dn_str); 1894 } 1867 1895 if (composite_nomem(v[0].dn, c)) return; 1868 1896 1869 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience,&v[0],1870 1897 ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0], 1898 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 1871 1899 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 1872 1900 c->status = ndr_map_error2ntstatus(ndr_err); … … 1876 1904 vs[0].blob = &vd[0]; 1877 1905 1878 attrs[i].attid = DRSUAPI_ATT RIBUTE_objectCategory;1906 attrs[i].attid = DRSUAPI_ATTID_objectCategory; 1879 1907 attrs[i].value_ctr.num_values = 1; 1880 1908 attrs[i].value_ctr.values = vs; … … 1897 1925 v = &s->dest_dsa.invocation_id; 1898 1926 1899 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, v, (ndr_push_flags_fn_t)ndr_push_GUID); 1900 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 1901 c->status = ndr_map_error2ntstatus(ndr_err); 1902 if (!composite_is_ok(c)) return; 1903 } 1927 c->status = GUID_to_ndr_blob(v, vd, &vd[0]); 1928 if (!composite_is_ok(c)) return; 1904 1929 1905 1930 vs[0].blob = &vd[0]; 1906 1931 1907 attrs[i].attid = DRSUAPI_ATT RIBUTE_invocationId;1932 attrs[i].attid = DRSUAPI_ATTID_invocationId; 1908 1933 attrs[i].value_ctr.num_values = 1; 1909 1934 attrs[i].value_ctr.values = vs; … … 1936 1961 v[2].dn = s->forest.schema_dn_str; 1937 1962 1938 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience,&v[0],1939 1963 ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0], 1964 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 1940 1965 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 1941 1966 c->status = ndr_map_error2ntstatus(ndr_err); … … 1943 1968 } 1944 1969 1945 ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience,&v[1],1946 1970 ndr_err = ndr_push_struct_blob(&vd[1], vd, &v[1], 1971 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 1947 1972 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 1948 1973 c->status = ndr_map_error2ntstatus(ndr_err); … … 1950 1975 } 1951 1976 1952 ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience,&v[2],1953 1977 ndr_err = ndr_push_struct_blob(&vd[2], vd, &v[2], 1978 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 1954 1979 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 1955 1980 c->status = ndr_map_error2ntstatus(ndr_err); … … 1961 1986 vs[2].blob = &vd[2]; 1962 1987 1963 attrs[i].attid = DRSUAPI_ATT RIBUTE_hasMasterNCs;1988 attrs[i].attid = DRSUAPI_ATTID_hasMasterNCs; 1964 1989 attrs[i].value_ctr.num_values = 3; 1965 1990 attrs[i].value_ctr.values = vs; … … 1992 2017 v[2].dn = s->forest.schema_dn_str; 1993 2018 1994 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience,&v[0],1995 2019 ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0], 2020 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 1996 2021 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 1997 2022 c->status = ndr_map_error2ntstatus(ndr_err); … … 1999 2024 } 2000 2025 2001 ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience,&v[1],2002 2026 ndr_err = ndr_push_struct_blob(&vd[1], vd, &v[1], 2027 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 2003 2028 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 2004 2029 c->status = ndr_map_error2ntstatus(ndr_err); … … 2006 2031 } 2007 2032 2008 ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience,&v[2],2009 2033 ndr_err = ndr_push_struct_blob(&vd[2], vd, &v[2], 2034 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 2010 2035 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 2011 2036 c->status = ndr_map_error2ntstatus(ndr_err); … … 2017 2042 vs[2].blob = &vd[2]; 2018 2043 2019 attrs[i].attid = DRSUAPI_ATT RIBUTE_msDS_hasMasterNCs;2044 attrs[i].attid = DRSUAPI_ATTID_msDS_hasMasterNCs; 2020 2045 attrs[i].value_ctr.num_values = 3; 2021 2046 attrs[i].value_ctr.values = vs; … … 2040 2065 v[0].dn = s->forest.schema_dn_str; 2041 2066 2042 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience,&v[0],2043 2067 ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0], 2068 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 2044 2069 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 2045 2070 c->status = ndr_map_error2ntstatus(ndr_err); … … 2049 2074 vs[0].blob = &vd[0]; 2050 2075 2051 attrs[i].attid = DRSUAPI_ATT RIBUTE_dMDLocation;2076 attrs[i].attid = DRSUAPI_ATTID_dMDLocation; 2052 2077 attrs[i].value_ctr.num_values = 1; 2053 2078 attrs[i].value_ctr.values = vs; … … 2072 2097 v[0].dn = s->domain.dn_str; 2073 2098 2074 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience,&v[0],2075 2099 ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0], 2100 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 2076 2101 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 2077 2102 c->status = ndr_map_error2ntstatus(ndr_err); … … 2081 2106 vs[0].blob = &vd[0]; 2082 2107 2083 attrs[i].attid = DRSUAPI_ATT RIBUTE_msDS_HasDomainNCs;2108 attrs[i].attid = DRSUAPI_ATTID_msDS_HasDomainNCs; 2084 2109 attrs[i].value_ctr.num_values = 1; 2085 2110 attrs[i].value_ctr.values = vs; … … 2102 2127 if (composite_nomem(vd[0].data, c)) return; 2103 2128 2104 SIVAL(vd[0].data, 0, 2105 lp_parm_int(s->libnet->lp_ctx, NULL, "ads", "functional level", DS_DC_FUNCTION_2008)); 2129 SIVAL(vd[0].data, 0, get_dc_function_level(s->libnet->lp_ctx)); 2106 2130 2107 2131 vs[0].blob = &vd[0]; 2108 2132 2109 attrs[i].attid = DRSUAPI_ATT RIBUTE_msDS_Behavior_Version;2133 attrs[i].attid = DRSUAPI_ATTID_msDS_Behavior_Version; 2110 2134 attrs[i].value_ctr.num_values = 1; 2111 2135 attrs[i].value_ctr.values = vs; … … 2128 2152 if (composite_nomem(vd[0].data, c)) return; 2129 2153 2130 SIVAL(vd[0].data, 0, SYSTEM_FLAG_DISALLOW_MOVE_ON_DELETE); 2154 if (s->rodc_join) { 2155 SIVAL(vd[0].data, 0, SYSTEM_FLAG_CONFIG_ALLOW_RENAME); 2156 } else { 2157 SIVAL(vd[0].data, 0, SYSTEM_FLAG_DISALLOW_MOVE_ON_DELETE); 2158 } 2131 2159 2132 2160 vs[0].blob = &vd[0]; 2133 2161 2134 attrs[i].attid = DRSUAPI_ATT RIBUTE_systemFlags;2162 attrs[i].attid = DRSUAPI_ATTID_systemFlags; 2135 2163 attrs[i].value_ctr.num_values = 1; 2136 2164 attrs[i].value_ctr.values = vs; … … 2155 2183 v[0].dn = s->dest_dsa.computer_dn_str; 2156 2184 2157 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience,&v[0],2158 2185 ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0], 2186 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); 2159 2187 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 2160 2188 c->status = ndr_map_error2ntstatus(ndr_err); … … 2164 2192 vs[0].blob = &vd[0]; 2165 2193 2166 attrs[i].attid = DRSUAPI_ATTRIBUTE_serverReference; 2194 attrs[i].attid = DRSUAPI_ATTID_serverReference; 2195 attrs[i].value_ctr.num_values = 1; 2196 attrs[i].value_ctr.values = vs; 2197 2198 i++; 2199 } 2200 2201 /* options:... */ 2202 if (s->rodc_join) { 2203 struct drsuapi_DsAttributeValue *vs; 2204 DATA_BLOB *vd; 2205 2206 vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1); 2207 if (composite_nomem(vs, c)) return; 2208 2209 vd = talloc_array(vs, DATA_BLOB, 1); 2210 if (composite_nomem(vd, c)) return; 2211 2212 vd[0] = data_blob_talloc(vd, NULL, 4); 2213 if (composite_nomem(vd[0].data, c)) return; 2214 2215 SIVAL(vd[0].data, 0, DS_NTDSDSA_OPT_DISABLE_OUTBOUND_REPL); 2216 2217 vs[0].blob = &vd[0]; 2218 2219 attrs[i].attid = DRSUAPI_ATTID_options; 2167 2220 attrs[i].value_ctr.num_values = 1; 2168 2221 attrs[i].value_ctr.values = vs; … … 2184 2237 r->in.req->req2.first_object.object.attribute_ctr.attributes = attrs; 2185 2238 2186 r->out.level_out = talloc(s, int32_t);2239 r->out.level_out = talloc(s, uint32_t); 2187 2240 r->out.ctr = talloc(s, union drsuapi_DsAddEntryCtr); 2188 2241 2189 req = dcerpc_drsuapi_DsAddEntry_send(s->drsuapi1.pipe, r, r); 2190 composite_continue_rpc(c, req, becomeDC_drsuapi1_add_entry_recv, s); 2242 s->ndr_struct_ptr = r; 2243 subreq = dcerpc_drsuapi_DsAddEntry_r_send(s, c->event_ctx, 2244 s->drsuapi1.drsuapi_handle, r); 2245 if (composite_nomem(subreq, c)) return; 2246 tevent_req_set_callback(subreq, becomeDC_drsuapi1_add_entry_recv, s); 2191 2247 } 2192 2248 … … 2194 2250 static NTSTATUS becomeDC_prepare_db(struct libnet_BecomeDC_state *s); 2195 2251 2196 static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req)2197 { 2198 struct libnet_BecomeDC_state *s = t alloc_get_type(req->async.private_data,2252 static void becomeDC_drsuapi1_add_entry_recv(struct tevent_req *subreq) 2253 { 2254 struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq, 2199 2255 struct libnet_BecomeDC_state); 2200 2256 struct composite_context *c = s->creq; 2201 struct drsuapi_DsAddEntry *r = talloc_get_type (req->ndr.struct_ptr,2257 struct drsuapi_DsAddEntry *r = talloc_get_type_abort(s->ndr_struct_ptr, 2202 2258 struct drsuapi_DsAddEntry); 2203 2259 char *binding_str; 2204 bool print = false; 2205 2206 if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) { 2207 print = true; 2208 } 2209 2210 c->status = dcerpc_ndr_request_recv(req); 2211 if (!composite_is_ok(c)) return; 2212 2213 if (print) { 2214 NDR_PRINT_OUT_DEBUG(drsuapi_DsAddEntry, r); 2215 } 2260 2261 s->ndr_struct_ptr = NULL; 2262 2263 c->status = dcerpc_drsuapi_DsAddEntry_r_recv(subreq, r); 2264 TALLOC_FREE(subreq); 2265 if (!composite_is_ok(c)) return; 2216 2266 2217 2267 if (!W_ERROR_IS_OK(r->out.result)) { … … 2221 2271 2222 2272 if (*r->out.level_out == 3) { 2223 if (r->out.ctr->ctr3.count != 1) { 2224 WERROR status; 2225 2226 if (r->out.ctr->ctr3.level != 1) { 2273 WERROR status; 2274 union drsuapi_DsAddEntry_ErrData *err_data = r->out.ctr->ctr3.err_data; 2275 2276 /* check for errors */ 2277 status = err_data ? err_data->v1.status : WERR_OK; 2278 if (!W_ERROR_IS_OK(status)) { 2279 struct drsuapi_DsAddEntryErrorInfo_Attr_V1 *attr_err; 2280 struct drsuapi_DsAddEntry_AttrErrListItem_V1 *attr_err_li; 2281 struct drsuapi_DsAddEntryErrorInfo_Name_V1 *name_err; 2282 struct drsuapi_DsAddEntryErrorInfo_Referr_V1 *ref_err; 2283 struct drsuapi_DsAddEntry_RefErrListItem_V1 *ref_li; 2284 2285 if (r->out.ctr->ctr3.err_ver != 1) { 2227 2286 composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE); 2228 2287 return; 2229 2288 } 2230 2289 2231 if (!r->out.ctr->ctr3.error) {2232 composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);2233 return;2234 }2235 2236 status = r->out.ctr->ctr3.error->info1.status; 2237 2238 if (!r->out.ctr->ctr3.error->info1.info) {2290 DEBUG(0,("DsAddEntry (R3) of '%s' failed: " 2291 "Errors: dir_err = %d, status = %s;\n", 2292 r->in.req->req3.first_object.object.identifier->dn, 2293 err_data->v1.dir_err, 2294 win_errstr(err_data->v1.status))); 2295 2296 if (!err_data->v1.info) { 2297 DEBUG(0, ("DsAddEntry (R3): no error info returned!\n")); 2239 2298 composite_error(c, werror_to_ntstatus(status)); 2240 2299 return; 2241 2300 } 2242 2301 2243 /* see if we can get a more detailed error */ 2244 switch (r->out.ctr->ctr3.error->info1.level) { 2245 case 1: 2246 status = r->out.ctr->ctr3.error->info1.info->error1.status; 2302 /* dump more detailed error */ 2303 switch (err_data->v1.dir_err) { 2304 case DRSUAPI_DIRERR_ATTRIBUTE: 2305 /* Dump attribute errors */ 2306 attr_err = &err_data->v1.info->attr_err; 2307 DEBUGADD(0,(" Attribute Error: object = %s, count = %d;\n", 2308 attr_err->id->dn, 2309 attr_err->count)); 2310 attr_err_li = &attr_err->first; 2311 for (; attr_err_li; attr_err_li = attr_err_li->next) { 2312 struct drsuapi_DsAddEntry_AttrErr_V1 *err = &attr_err_li->err_data; 2313 DEBUGADD(0,(" Error: err = %s, problem = 0x%08X, attid = 0x%08X;\n", 2314 win_errstr(err->extended_err), 2315 err->problem, 2316 err->attid)); 2317 /* TODO: should we print attribute value here? */ 2318 } 2247 2319 break; 2248 case 4: 2249 case 5: 2250 case 6: 2251 case 7: 2252 status = r->out.ctr->ctr3.error->info1.info->errorX.status; 2320 case DRSUAPI_DIRERR_NAME: 2321 /* Dump Name resolution error */ 2322 name_err = &err_data->v1.info->name_err; 2323 DEBUGADD(0,(" Name Error: err = %s, problem = 0x%08X, id_matched = %s;\n", 2324 win_errstr(name_err->extended_err), 2325 name_err->problem, 2326 name_err->id_matched->dn)); 2327 break; 2328 case DRSUAPI_DIRERR_REFERRAL: 2329 /* Dump Referral errors */ 2330 ref_err = &err_data->v1.info->referral_err; 2331 DEBUGADD(0,(" Referral Error: extended_err = %s\n", 2332 win_errstr(ref_err->extended_err))); 2333 ref_li = &ref_err->refer; 2334 for (; ref_li; ref_li = ref_li->next) { 2335 struct drsuapi_DsaAddressListItem_V1 *addr; 2336 DEBUGADD(0,(" Referral: id_target = %s, ref_type = 0x%04X,", 2337 ref_li->id_target->dn, 2338 ref_li->ref_type)); 2339 if (ref_li->is_choice_set) { 2340 DEBUGADD(0,(" choice = 0x%02X, ", 2341 ref_li->choice)); 2342 } 2343 DEBUGADD(0,(" add_list (")); 2344 for (addr = ref_li->addr_list; addr; addr = addr->next) { 2345 DEBUGADD(0,("%s", addr->address->string)); 2346 if (addr->next) { 2347 DEBUGADD(0,(", ")); 2348 } 2349 } 2350 DEBUGADD(0,(");\n")); 2351 } 2352 break; 2353 case DRSUAPI_DIRERR_SECURITY: 2354 /* Dump Security error. */ 2355 DEBUGADD(0,(" Security Error: extended_err = %s, problem = 0x%08X\n", 2356 win_errstr(err_data->v1.info->security_err.extended_err), 2357 err_data->v1.info->security_err.problem)); 2358 break; 2359 case DRSUAPI_DIRERR_SERVICE: 2360 /* Dump Service error. */ 2361 DEBUGADD(0,(" Service Error: extended_err = %s, problem = 0x%08X\n", 2362 win_errstr(err_data->v1.info->service_err.extended_err), 2363 err_data->v1.info->service_err.problem)); 2364 break; 2365 case DRSUAPI_DIRERR_UPDATE: 2366 /* Dump Update error. */ 2367 DEBUGADD(0,(" Update Error: extended_err = %s, problem = 0x%08X\n", 2368 win_errstr(err_data->v1.info->update_err.extended_err), 2369 err_data->v1.info->update_err.problem)); 2370 break; 2371 case DRSUAPI_DIRERR_SYSTEM: 2372 /* System error. */ 2373 DEBUGADD(0,(" System Error: extended_err = %s, problem = 0x%08X\n", 2374 win_errstr(err_data->v1.info->system_err.extended_err), 2375 err_data->v1.info->system_err.problem)); 2376 break; 2377 case DRSUAPI_DIRERR_OK: /* mute compiler warnings */ 2378 default: 2379 DEBUGADD(0,(" Unknown DIRERR error class returned!\n")); 2253 2380 break; 2254 2381 } … … 2258 2385 } 2259 2386 2387 if (1 != r->out.ctr->ctr3.count) { 2388 DEBUG(0,("DsAddEntry - Ctr3: something very wrong had happened - " 2389 "method succeeded but objects returned are %d (expected 1).\n", 2390 r->out.ctr->ctr3.count)); 2391 composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE); 2392 } 2393 2260 2394 s->dest_dsa.ntds_guid = r->out.ctr->ctr3.objects[0].guid; 2395 2261 2396 } else if (*r->out.level_out == 2) { 2262 if (r->out.ctr->ctr2.count != 1) { 2263 composite_error(c, werror_to_ntstatus(r->out.ctr->ctr2.error.status)); 2397 if (DRSUAPI_DIRERR_OK != r->out.ctr->ctr2.dir_err) { 2398 DEBUG(0,("DsAddEntry failed with: dir_err = %d, extended_err = %s\n", 2399 r->out.ctr->ctr2.dir_err, 2400 win_errstr(r->out.ctr->ctr2.extended_err))); 2401 composite_error(c, werror_to_ntstatus(r->out.ctr->ctr2.extended_err)); 2264 2402 return; 2403 } 2404 2405 if (1 != r->out.ctr->ctr2.count) { 2406 DEBUG(0,("DsAddEntry: something very wrong had happened - " 2407 "method succeeded but objects returned are %d (expected 1). " 2408 "Errors: dir_err = %d, extended_err = %s\n", 2409 r->out.ctr->ctr2.count, 2410 r->out.ctr->ctr2.dir_err, 2411 win_errstr(r->out.ctr->ctr2.extended_err))); 2412 composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE); 2265 2413 } 2266 2414 … … 2306 2454 } 2307 2455 2308 static void becomeDC_drsuapi2_bind_recv(struct rpc_request *req);2456 static void becomeDC_drsuapi2_bind_recv(struct tevent_req *subreq); 2309 2457 2310 2458 static void becomeDC_drsuapi2_connect_recv(struct composite_context *req) … … 2317 2465 if (!composite_is_ok(c)) return; 2318 2466 2467 s->drsuapi2.drsuapi_handle = s->drsuapi2.pipe->binding_handle; 2468 2319 2469 c->status = gensec_session_key(s->drsuapi2.pipe->conn->security_state.generic_state, 2320 2470 &s->drsuapi2.gensec_skey); … … 2326 2476 static void becomeDC_drsuapi3_connect_recv(struct composite_context *req); 2327 2477 2328 static void becomeDC_drsuapi2_bind_recv(struct rpc_request *req)2329 { 2330 struct libnet_BecomeDC_state *s = t alloc_get_type(req->async.private_data,2478 static void becomeDC_drsuapi2_bind_recv(struct tevent_req *subreq) 2479 { 2480 struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq, 2331 2481 struct libnet_BecomeDC_state); 2332 2482 struct composite_context *c = s->creq; … … 2334 2484 WERROR status; 2335 2485 2336 bool print = false; 2337 2338 if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) { 2339 print = true; 2340 } 2341 2342 c->status = dcerpc_ndr_request_recv(req); 2343 if (!composite_is_ok(c)) return; 2344 2345 if (print) { 2346 NDR_PRINT_OUT_DEBUG(drsuapi_DsBind, &s->drsuapi2.bind_r); 2347 } 2486 c->status = dcerpc_drsuapi_DsBind_r_recv(subreq, s); 2487 TALLOC_FREE(subreq); 2488 if (!composite_is_ok(c)) return; 2348 2489 2349 2490 status = becomeDC_drsuapi_bind_recv(s, &s->drsuapi2); … … 2380 2521 if (!composite_is_ok(c)) return; 2381 2522 2523 s->drsuapi3.drsuapi_handle = s->drsuapi3.pipe->binding_handle; 2524 2382 2525 c->status = gensec_session_key(s->drsuapi3.pipe->conn->security_state.generic_state, 2383 2526 &s->drsuapi3.gensec_skey); … … 2391 2534 struct becomeDC_drsuapi *drsuapi_p, 2392 2535 struct libnet_BecomeDC_Partition *partition, 2393 void (*recv_fn)(struct rpc_request *req))2536 void (*recv_fn)(struct tevent_req *subreq)) 2394 2537 { 2395 2538 struct composite_context *c = s->creq; 2396 struct rpc_request *req;2397 2539 struct drsuapi_DsGetNCChanges *r; 2540 struct tevent_req *subreq; 2398 2541 2399 2542 r = talloc(s, struct drsuapi_DsGetNCChanges); 2400 2543 if (composite_nomem(r, c)) return; 2401 2544 2402 r->out.level_out = talloc(r, int32_t);2545 r->out.level_out = talloc(r, uint32_t); 2403 2546 if (composite_nomem(r->out.level_out, c)) return; 2404 2547 r->in.req = talloc(r, union drsuapi_DsGetNCChangesRequest); … … 2444 2587 * connections. 2445 2588 */ 2446 req = dcerpc_drsuapi_DsGetNCChanges_send(drsuapi_p->pipe, r, r); 2447 composite_continue_rpc(c, req, recv_fn, s); 2589 s->ndr_struct_ptr = r; 2590 subreq = dcerpc_drsuapi_DsGetNCChanges_r_send(s, c->event_ctx, 2591 drsuapi_p->drsuapi_handle, 2592 r); 2593 if (composite_nomem(subreq, c)) return; 2594 tevent_req_set_callback(subreq, recv_fn, s); 2448 2595 } 2449 2596 … … 2547 2694 } 2548 2695 2549 static void becomeDC_drsuapi3_pull_schema_recv(struct rpc_request *req);2696 static void becomeDC_drsuapi3_pull_schema_recv(struct tevent_req *subreq); 2550 2697 2551 2698 static void becomeDC_drsuapi3_pull_schema_send(struct libnet_BecomeDC_state *s) … … 2557 2704 s->schema_part.destination_dsa_guid = s->drsuapi2.bind_guid; 2558 2705 2559 s->schema_part.replica_flags = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE 2560 | DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP 2561 | DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS 2562 | DRSUAPI_DS_REPLICA_NEIGHBOUR_FULL_IN_PROGRESS 2563 | DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED 2564 | DRSUAPI_DS_REPLICA_NEIGHBOUR_COMPRESS_CHANGES; 2706 s->schema_part.replica_flags = DRSUAPI_DRS_WRIT_REP 2707 | DRSUAPI_DRS_INIT_SYNC 2708 | DRSUAPI_DRS_PER_SYNC 2709 | DRSUAPI_DRS_FULL_SYNC_IN_PROGRESS 2710 | DRSUAPI_DRS_NEVER_SYNCED 2711 | DRSUAPI_DRS_USE_COMPRESSION; 2712 if (s->rodc_join) { 2713 s->schema_part.replica_flags &= ~DRSUAPI_DRS_WRIT_REP; 2714 } 2565 2715 2566 2716 s->schema_part.store_chunk = s->callbacks.schema_chunk; … … 2572 2722 static void becomeDC_drsuapi3_pull_config_send(struct libnet_BecomeDC_state *s); 2573 2723 2574 static void becomeDC_drsuapi3_pull_schema_recv(struct rpc_request *req)2575 { 2576 struct libnet_BecomeDC_state *s = t alloc_get_type(req->async.private_data,2724 static void becomeDC_drsuapi3_pull_schema_recv(struct tevent_req *subreq) 2725 { 2726 struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq, 2577 2727 struct libnet_BecomeDC_state); 2578 2728 struct composite_context *c = s->creq; 2579 struct drsuapi_DsGetNCChanges *r = talloc_get_type (req->ndr.struct_ptr,2729 struct drsuapi_DsGetNCChanges *r = talloc_get_type_abort(s->ndr_struct_ptr, 2580 2730 struct drsuapi_DsGetNCChanges); 2581 2731 WERROR status; 2582 2732 2583 bool print = false; 2584 2585 if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) { 2586 print = true; 2587 } 2588 2589 c->status = dcerpc_ndr_request_recv(req); 2590 if (!composite_is_ok(c)) return; 2591 2592 if (print) { 2593 NDR_PRINT_OUT_DEBUG(drsuapi_DsGetNCChanges, r); 2594 } 2733 s->ndr_struct_ptr = NULL; 2734 2735 c->status = dcerpc_drsuapi_DsGetNCChanges_r_recv(subreq, r); 2736 TALLOC_FREE(subreq); 2737 if (!composite_is_ok(c)) return; 2595 2738 2596 2739 status = becomeDC_drsuapi_pull_partition_recv(s, &s->drsuapi2, &s->drsuapi3, &s->schema_part, r); … … 2611 2754 } 2612 2755 2613 static void becomeDC_drsuapi3_pull_config_recv(struct rpc_request *req);2756 static void becomeDC_drsuapi3_pull_config_recv(struct tevent_req *subreq); 2614 2757 2615 2758 static void becomeDC_drsuapi3_pull_config_send(struct libnet_BecomeDC_state *s) … … 2621 2764 s->config_part.destination_dsa_guid = s->drsuapi2.bind_guid; 2622 2765 2623 s->config_part.replica_flags = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE 2624 | DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP 2625 | DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS 2626 | DRSUAPI_DS_REPLICA_NEIGHBOUR_FULL_IN_PROGRESS 2627 | DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED 2628 | DRSUAPI_DS_REPLICA_NEIGHBOUR_COMPRESS_CHANGES; 2766 s->config_part.replica_flags = DRSUAPI_DRS_WRIT_REP 2767 | DRSUAPI_DRS_INIT_SYNC 2768 | DRSUAPI_DRS_PER_SYNC 2769 | DRSUAPI_DRS_FULL_SYNC_IN_PROGRESS 2770 | DRSUAPI_DRS_NEVER_SYNCED 2771 | DRSUAPI_DRS_USE_COMPRESSION; 2772 if (s->rodc_join) { 2773 s->schema_part.replica_flags &= ~DRSUAPI_DRS_WRIT_REP; 2774 } 2629 2775 2630 2776 s->config_part.store_chunk = s->callbacks.config_chunk; … … 2634 2780 } 2635 2781 2636 static void becomeDC_drsuapi3_pull_config_recv(struct rpc_request *req)2637 { 2638 struct libnet_BecomeDC_state *s = t alloc_get_type(req->async.private_data,2782 static void becomeDC_drsuapi3_pull_config_recv(struct tevent_req *subreq) 2783 { 2784 struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq, 2639 2785 struct libnet_BecomeDC_state); 2640 2786 struct composite_context *c = s->creq; 2641 struct drsuapi_DsGetNCChanges *r = talloc_get_type (req->ndr.struct_ptr,2787 struct drsuapi_DsGetNCChanges *r = talloc_get_type_abort(s->ndr_struct_ptr, 2642 2788 struct drsuapi_DsGetNCChanges); 2643 2789 WERROR status; 2644 2790 2645 bool print = false; 2646 2647 if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) { 2648 print = true; 2649 } 2650 2651 c->status = dcerpc_ndr_request_recv(req); 2652 if (!composite_is_ok(c)) return; 2653 2654 if (print) { 2655 NDR_PRINT_OUT_DEBUG(drsuapi_DsGetNCChanges, r); 2656 } 2791 s->ndr_struct_ptr = NULL; 2792 2793 c->status = dcerpc_drsuapi_DsGetNCChanges_r_recv(subreq, r); 2794 TALLOC_FREE(subreq); 2795 if (!composite_is_ok(c)) return; 2657 2796 2658 2797 status = becomeDC_drsuapi_pull_partition_recv(s, &s->drsuapi2, &s->drsuapi3, &s->config_part, r); … … 2673 2812 } 2674 2813 2675 static void becomeDC_drsuapi3_pull_domain_recv(struct rpc_request *req);2814 static void becomeDC_drsuapi3_pull_domain_recv(struct tevent_req *subreq); 2676 2815 2677 2816 static void becomeDC_drsuapi3_pull_domain_send(struct libnet_BecomeDC_state *s) … … 2683 2822 s->domain_part.destination_dsa_guid = s->drsuapi2.bind_guid; 2684 2823 2685 s->domain_part.replica_flags = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE 2686 | DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP 2687 | DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS 2688 | DRSUAPI_DS_REPLICA_NEIGHBOUR_FULL_IN_PROGRESS 2689 | DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED 2690 | DRSUAPI_DS_REPLICA_NEIGHBOUR_COMPRESS_CHANGES; 2824 s->domain_part.replica_flags = DRSUAPI_DRS_WRIT_REP 2825 | DRSUAPI_DRS_INIT_SYNC 2826 | DRSUAPI_DRS_PER_SYNC 2827 | DRSUAPI_DRS_FULL_SYNC_IN_PROGRESS 2828 | DRSUAPI_DRS_NEVER_SYNCED 2829 | DRSUAPI_DRS_USE_COMPRESSION; 2830 if (s->rodc_join) { 2831 s->schema_part.replica_flags &= ~DRSUAPI_DRS_WRIT_REP; 2832 } 2691 2833 2692 2834 s->domain_part.store_chunk = s->callbacks.domain_chunk; … … 2699 2841 struct becomeDC_drsuapi *drsuapi, 2700 2842 struct libnet_BecomeDC_Partition *partition, 2701 void (*recv_fn)(struct rpc_request *req));2702 static void becomeDC_drsuapi2_update_refs_schema_recv(struct rpc_request *req);2703 2704 static void becomeDC_drsuapi3_pull_domain_recv(struct rpc_request *req)2705 { 2706 struct libnet_BecomeDC_state *s = t alloc_get_type(req->async.private_data,2843 void (*recv_fn)(struct tevent_req *subreq)); 2844 static void becomeDC_drsuapi2_update_refs_schema_recv(struct tevent_req *subreq); 2845 2846 static void becomeDC_drsuapi3_pull_domain_recv(struct tevent_req *subreq) 2847 { 2848 struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq, 2707 2849 struct libnet_BecomeDC_state); 2708 2850 struct composite_context *c = s->creq; 2709 struct drsuapi_DsGetNCChanges *r = talloc_get_type (req->ndr.struct_ptr,2851 struct drsuapi_DsGetNCChanges *r = talloc_get_type_abort(s->ndr_struct_ptr, 2710 2852 struct drsuapi_DsGetNCChanges); 2711 2853 WERROR status; 2712 bool print = false; 2713 2714 if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) { 2715 print = true; 2716 } 2717 2718 c->status = dcerpc_ndr_request_recv(req); 2719 if (!composite_is_ok(c)) return; 2720 2721 if (print) { 2722 NDR_PRINT_OUT_DEBUG(drsuapi_DsGetNCChanges, r); 2723 } 2854 2855 s->ndr_struct_ptr = NULL; 2856 2857 c->status = dcerpc_drsuapi_DsGetNCChanges_r_recv(subreq, r); 2858 TALLOC_FREE(subreq); 2859 if (!composite_is_ok(c)) return; 2724 2860 2725 2861 status = becomeDC_drsuapi_pull_partition_recv(s, &s->drsuapi2, &s->drsuapi3, &s->domain_part, r); … … 2744 2880 struct becomeDC_drsuapi *drsuapi, 2745 2881 struct libnet_BecomeDC_Partition *partition, 2746 void (*recv_fn)(struct rpc_request *req))2882 void (*recv_fn)(struct tevent_req *subreq)) 2747 2883 { 2748 2884 struct composite_context *c = s->creq; 2749 struct rpc_request *req;2750 2885 struct drsuapi_DsReplicaUpdateRefs *r; 2751 2886 const char *ntds_guid_str; 2752 2887 const char *ntds_dns_name; 2888 struct tevent_req *subreq; 2753 2889 2754 2890 r = talloc(s, struct drsuapi_DsReplicaUpdateRefs); … … 2768 2904 r->in.req.req1.dest_dsa_dns_name= ntds_dns_name; 2769 2905 r->in.req.req1.dest_dsa_guid = s->dest_dsa.ntds_guid; 2770 r->in.req.req1.options = DRSUAPI_DS_REPLICA_UPDATE_ADD_REFERENCE 2771 | DRSUAPI_DS_REPLICA_UPDATE_DELETE_REFERENCE; 2906 r->in.req.req1.options = DRSUAPI_DRS_ADD_REF | DRSUAPI_DRS_DEL_REF; 2772 2907 2773 2908 /* I think this is how we mark ourselves as a RODC */ 2774 if (!lp_parm_bool(s->libnet->lp_ctx, NULL, "repl", "RODC", false)) { 2775 r->in.req.req1.options |= DRSUAPI_DS_REPLICA_UPDATE_WRITEABLE; 2776 } 2777 2778 req = dcerpc_drsuapi_DsReplicaUpdateRefs_send(drsuapi->pipe, r, r); 2779 composite_continue_rpc(c, req, recv_fn, s); 2780 } 2781 2782 static void becomeDC_drsuapi2_update_refs_config_recv(struct rpc_request *req); 2783 2784 static void becomeDC_drsuapi2_update_refs_schema_recv(struct rpc_request *req) 2785 { 2786 struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data, 2909 if (!lpcfg_parm_bool(s->libnet->lp_ctx, NULL, "repl", "RODC", false)) { 2910 r->in.req.req1.options |= DRSUAPI_DRS_WRIT_REP; 2911 } 2912 2913 s->ndr_struct_ptr = r; 2914 subreq = dcerpc_drsuapi_DsReplicaUpdateRefs_r_send(s, c->event_ctx, 2915 drsuapi->drsuapi_handle, 2916 r); 2917 if (composite_nomem(subreq, c)) return; 2918 tevent_req_set_callback(subreq, recv_fn, s); 2919 } 2920 2921 static void becomeDC_drsuapi2_update_refs_config_recv(struct tevent_req *subreq); 2922 2923 static void becomeDC_drsuapi2_update_refs_schema_recv(struct tevent_req *subreq) 2924 { 2925 struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq, 2787 2926 struct libnet_BecomeDC_state); 2788 2927 struct composite_context *c = s->creq; 2789 struct drsuapi_DsReplicaUpdateRefs *r = talloc_get_type (req->ndr.struct_ptr,2928 struct drsuapi_DsReplicaUpdateRefs *r = talloc_get_type_abort(s->ndr_struct_ptr, 2790 2929 struct drsuapi_DsReplicaUpdateRefs); 2791 bool print = false; 2792 2793 if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) { 2794 print = true; 2795 } 2796 2797 c->status = dcerpc_ndr_request_recv(req); 2798 if (!composite_is_ok(c)) return; 2799 2800 if (print) { 2801 NDR_PRINT_OUT_DEBUG(drsuapi_DsReplicaUpdateRefs, r); 2802 } 2930 2931 s->ndr_struct_ptr = NULL; 2932 2933 c->status = dcerpc_drsuapi_DsReplicaUpdateRefs_r_recv(subreq, r); 2934 TALLOC_FREE(subreq); 2935 if (!composite_is_ok(c)) return; 2803 2936 2804 2937 if (!W_ERROR_IS_OK(r->out.result)) { … … 2813 2946 } 2814 2947 2815 static void becomeDC_drsuapi2_update_refs_domain_recv(struct rpc_request *req);2816 2817 static void becomeDC_drsuapi2_update_refs_config_recv(struct rpc_request *req)2818 { 2819 struct libnet_BecomeDC_state *s = t alloc_get_type(req->async.private_data,2948 static void becomeDC_drsuapi2_update_refs_domain_recv(struct tevent_req *subreq); 2949 2950 static void becomeDC_drsuapi2_update_refs_config_recv(struct tevent_req *subreq) 2951 { 2952 struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq, 2820 2953 struct libnet_BecomeDC_state); 2821 2954 struct composite_context *c = s->creq; 2822 struct drsuapi_DsReplicaUpdateRefs *r = talloc_get_type( req->ndr.struct_ptr,2955 struct drsuapi_DsReplicaUpdateRefs *r = talloc_get_type(s->ndr_struct_ptr, 2823 2956 struct drsuapi_DsReplicaUpdateRefs); 2824 2957 2825 c->status = dcerpc_ndr_request_recv(req); 2958 s->ndr_struct_ptr = NULL; 2959 2960 c->status = dcerpc_drsuapi_DsReplicaUpdateRefs_r_recv(subreq, r); 2961 TALLOC_FREE(subreq); 2826 2962 if (!composite_is_ok(c)) return; 2827 2963 … … 2837 2973 } 2838 2974 2839 static void becomeDC_drsuapi2_update_refs_domain_recv(struct rpc_request *req)2840 { 2841 struct libnet_BecomeDC_state *s = t alloc_get_type(req->async.private_data,2975 static void becomeDC_drsuapi2_update_refs_domain_recv(struct tevent_req *subreq) 2976 { 2977 struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq, 2842 2978 struct libnet_BecomeDC_state); 2843 2979 struct composite_context *c = s->creq; 2844 struct drsuapi_DsReplicaUpdateRefs *r = talloc_get_type( req->ndr.struct_ptr,2980 struct drsuapi_DsReplicaUpdateRefs *r = talloc_get_type(s->ndr_struct_ptr, 2845 2981 struct drsuapi_DsReplicaUpdateRefs); 2846 2982 2847 c->status = dcerpc_ndr_request_recv(req); 2983 s->ndr_struct_ptr = NULL; 2984 2985 c->status = dcerpc_drsuapi_DsReplicaUpdateRefs_r_recv(subreq, r); 2986 TALLOC_FREE(subreq); 2848 2987 if (!composite_is_ok(c)) return; 2849 2988 … … 2863 3002 int ret; 2864 3003 struct ldb_message *msg; 2865 u int32_t i;3004 unsigned int i; 2866 3005 uint32_t user_account_control = UF_SERVER_TRUST_ACCOUNT | 2867 3006 UF_TRUSTED_FOR_DELEGATION; … … 2878 3017 NT_STATUS_HAVE_NO_MEMORY(msg->dn); 2879 3018 2880 ret = ldb_msg_add_fmt(msg, "userAccountControl", "%u", user_account_control); 2881 if (ret != 0) { 3019 ret = samdb_msg_add_uint(s->ldap2.ldb, msg, msg, "userAccountControl", 3020 user_account_control); 3021 if (ret != LDB_SUCCESS) { 2882 3022 talloc_free(msg); 2883 3023 return NT_STATUS_NO_MEMORY; … … 2904 3044 { 2905 3045 int ret; 2906 struct ldb_result *r;2907 struct ldb_dn *basedn;2908 3046 struct ldb_dn *old_dn; 2909 3047 struct ldb_dn *new_dn; 2910 static const char *_1_1_attrs[] = { 2911 "1.1", 2912 NULL 2913 }; 2914 2915 basedn = ldb_dn_new_fmt(s, s->ldap2.ldb, "<WKGUID=a361b2ffffd211d1aa4b00c04fd7d83a,%s>", 2916 s->domain.dn_str); 2917 NT_STATUS_HAVE_NO_MEMORY(basedn); 2918 2919 ret = ldb_search(s->ldap2.ldb, s, &r, basedn, LDB_SCOPE_BASE, 2920 _1_1_attrs, "(objectClass=*)"); 2921 talloc_free(basedn); 3048 3049 ret = dsdb_wellknown_dn(s->ldap2.ldb, s, 3050 ldb_get_default_basedn(s->ldap2.ldb), 3051 DS_GUID_DOMAIN_CONTROLLERS_CONTAINER, 3052 &new_dn); 2922 3053 if (ret != LDB_SUCCESS) { 2923 3054 return NT_STATUS_LDAP(ret); 2924 } else if (r->count != 1) { 2925 talloc_free(r); 2926 return NT_STATUS_INVALID_NETWORK_RESPONSE; 2927 } 2928 2929 old_dn = ldb_dn_new(r, s->ldap2.ldb, s->dest_dsa.computer_dn_str); 3055 } 3056 3057 if (!ldb_dn_add_child_fmt(new_dn, "CN=%s", s->dest_dsa.netbios_name)) { 3058 talloc_free(new_dn); 3059 return NT_STATUS_NO_MEMORY; 3060 } 3061 3062 old_dn = ldb_dn_new(new_dn, s->ldap2.ldb, s->dest_dsa.computer_dn_str); 2930 3063 NT_STATUS_HAVE_NO_MEMORY(old_dn); 2931 2932 new_dn = r->msgs[0]->dn;2933 2934 if (!ldb_dn_add_child_fmt(new_dn, "CN=%s", s->dest_dsa.netbios_name)) {2935 talloc_free(r);2936 return NT_STATUS_NO_MEMORY;2937 }2938 3064 2939 3065 if (ldb_dn_compare(old_dn, new_dn) == 0) { 2940 3066 /* we don't need to rename if the old and new dn match */ 2941 talloc_free( r);3067 talloc_free(new_dn); 2942 3068 return NT_STATUS_OK; 2943 3069 } … … 2945 3071 ret = ldb_rename(s->ldap2.ldb, old_dn, new_dn); 2946 3072 if (ret != LDB_SUCCESS) { 2947 talloc_free( r);3073 talloc_free(new_dn); 2948 3074 return NT_STATUS_LDAP(ret); 2949 3075 } … … 2952 3078 NT_STATUS_HAVE_NO_MEMORY(s->dest_dsa.computer_dn_str); 2953 3079 2954 talloc_free( r);3080 talloc_free(new_dn); 2955 3081 2956 3082 return NT_STATUS_OK; … … 3014 3140 s->callbacks = r->in.callbacks; 3015 3141 3142 /* RODC join*/ 3143 s->rodc_join = r->in.rodc_join; 3144 3016 3145 becomeDC_send_cldap(s); 3017 3146 return c; -
vendor/current/source4/libnet/libnet_become_dc.h
r414 r740 137 137 138 138 struct libnet_BecomeDC_Callbacks callbacks; 139 } in; 139 140 bool rodc_join; 141 } in; 140 142 141 143 struct { -
vendor/current/source4/libnet/libnet_domain.c
r414 r740 48 48 49 49 50 static void continue_domain_open_close(struct rpc_request *req);51 static void continue_domain_open_connect(struct rpc_request *req);52 static void continue_domain_open_lookup(struct rpc_request *req);53 static void continue_domain_open_open(struct rpc_request *req);50 static void continue_domain_open_close(struct tevent_req *subreq); 51 static void continue_domain_open_connect(struct tevent_req *subreq); 52 static void continue_domain_open_lookup(struct tevent_req *subreq); 53 static void continue_domain_open_open(struct tevent_req *subreq); 54 54 55 55 … … 61 61 struct composite_context *c; 62 62 struct domain_open_samr_state *s; 63 struct rpc_request *conn_req;63 struct tevent_req *subreq; 64 64 65 65 c = talloc_get_type(ctx->async.private_data, struct composite_context); … … 77 77 78 78 /* send request */ 79 conn_req = dcerpc_samr_Connect_send(s->pipe, c, &s->connect); 80 if (composite_nomem(conn_req, c)) return; 79 subreq = dcerpc_samr_Connect_r_send(s, c->event_ctx, 80 s->pipe->binding_handle, 81 &s->connect); 82 if (composite_nomem(subreq, c)) return; 81 83 82 84 /* callback handler */ 83 composite_continue_rpc(c, conn_req, continue_domain_open_connect, c);85 tevent_req_set_callback(subreq, continue_domain_open_connect, c); 84 86 } 85 87 … … 89 91 * handle 90 92 */ 91 static void continue_domain_open_close(struct rpc_request *req)93 static void continue_domain_open_close(struct tevent_req *subreq) 92 94 { 93 95 struct composite_context *c; 94 96 struct domain_open_samr_state *s; 95 struct rpc_request *conn_req; 96 97 c = talloc_get_type(req->async.private_data, struct composite_context); 97 98 c = tevent_req_callback_data(subreq, struct composite_context); 98 99 s = talloc_get_type(c->private_data, struct domain_open_samr_state); 99 100 100 101 /* receive samr_Close reply */ 101 c->status = dcerpc_ndr_request_recv(req); 102 c->status = dcerpc_samr_Close_r_recv(subreq, s); 103 TALLOC_FREE(subreq); 102 104 if (!composite_is_ok(c)) return; 103 105 … … 122 124 123 125 /* send request */ 124 conn_req = dcerpc_samr_Connect_send(s->pipe, c, &s->connect); 125 if (composite_nomem(conn_req, c)) return; 126 subreq = dcerpc_samr_Connect_r_send(s, c->event_ctx, 127 s->pipe->binding_handle, 128 &s->connect); 129 if (composite_nomem(subreq, c)) return; 126 130 127 131 /* callback handler */ 128 composite_continue_rpc(c, conn_req, continue_domain_open_connect, c);132 tevent_req_set_callback(subreq, continue_domain_open_connect, c); 129 133 } 130 134 … … 133 137 * Stage 1: Connect to SAM server. 134 138 */ 135 static void continue_domain_open_connect(struct rpc_request *req)139 static void continue_domain_open_connect(struct tevent_req *subreq) 136 140 { 137 141 struct composite_context *c; 138 142 struct domain_open_samr_state *s; 139 struct rpc_request *lookup_req;140 143 struct samr_LookupDomain *r; 141 144 142 c = t alloc_get_type(req->async.private_data, struct composite_context);145 c = tevent_req_callback_data(subreq, struct composite_context); 143 146 s = talloc_get_type(c->private_data, struct domain_open_samr_state); 144 147 145 148 /* receive samr_Connect reply */ 146 c->status = dcerpc_ndr_request_recv(req); 149 c->status = dcerpc_samr_Connect_r_recv(subreq, s); 150 TALLOC_FREE(subreq); 147 151 if (!composite_is_ok(c)) return; 148 152 … … 164 168 if (composite_nomem(r->out.sid, c)) return; 165 169 166 lookup_req = dcerpc_samr_LookupDomain_send(s->pipe, c, r); 167 if (composite_nomem(lookup_req, c)) return; 168 169 composite_continue_rpc(c, lookup_req, continue_domain_open_lookup, c); 170 subreq = dcerpc_samr_LookupDomain_r_send(s, c->event_ctx, 171 s->pipe->binding_handle, 172 r); 173 if (composite_nomem(subreq, c)) return; 174 175 tevent_req_set_callback(subreq, continue_domain_open_lookup, c); 170 176 } 171 177 … … 174 180 * Stage 2: Lookup domain by name. 175 181 */ 176 static void continue_domain_open_lookup(struct rpc_request *req)182 static void continue_domain_open_lookup(struct tevent_req *subreq) 177 183 { 178 184 struct composite_context *c; 179 185 struct domain_open_samr_state *s; 180 struct rpc_request *opendom_req;181 186 struct samr_OpenDomain *r; 182 187 183 c = t alloc_get_type(req->async.private_data, struct composite_context);188 c = tevent_req_callback_data(subreq, struct composite_context); 184 189 s = talloc_get_type(c->private_data, struct domain_open_samr_state); 185 190 186 191 /* receive samr_LookupDomain reply */ 187 c->status = dcerpc_ndr_request_recv(req); 192 c->status = dcerpc_samr_LookupDomain_r_recv(subreq, s); 193 TALLOC_FREE(subreq); 188 194 189 195 if (s->monitor_fn) { … … 216 222 r->out.domain_handle = &s->domain_handle; 217 223 218 opendom_req = dcerpc_samr_OpenDomain_send(s->pipe, c, r); 219 if (composite_nomem(opendom_req, c)) return; 220 221 composite_continue_rpc(c, opendom_req, continue_domain_open_open, c); 224 subreq = dcerpc_samr_OpenDomain_r_send(s, c->event_ctx, 225 s->pipe->binding_handle, 226 r); 227 if (composite_nomem(subreq, c)) return; 228 229 tevent_req_set_callback(subreq, continue_domain_open_open, c); 222 230 } 223 231 … … 226 234 * Stage 3: Open domain. 227 235 */ 228 static void continue_domain_open_open(struct rpc_request *req)236 static void continue_domain_open_open(struct tevent_req *subreq) 229 237 { 230 238 struct composite_context *c; 231 239 struct domain_open_samr_state *s; 232 240 233 c = t alloc_get_type(req->async.private_data, struct composite_context);241 c = tevent_req_callback_data(subreq, struct composite_context); 234 242 s = talloc_get_type(c->private_data, struct domain_open_samr_state); 235 243 236 244 /* receive samr_OpenDomain reply */ 237 c->status = dcerpc_ndr_request_recv(req); 245 c->status = dcerpc_samr_OpenDomain_r_recv(subreq, s); 246 TALLOC_FREE(subreq); 238 247 if (!composite_is_ok(c)) return; 239 248 … … 266 275 struct domain_open_samr_state *s; 267 276 struct composite_context *rpcconn_req; 268 struct rpc_request *close_req, *conn_req;277 struct tevent_req *subreq; 269 278 270 279 c = composite_create(ctx, ctx->event_ctx); … … 314 323 315 324 /* send request to close domain handle */ 316 close_req = dcerpc_samr_Close_send(s->pipe, c, &s->close); 317 if (composite_nomem(close_req, c)) return c; 325 subreq = dcerpc_samr_Close_r_send(s, c->event_ctx, 326 s->pipe->binding_handle, 327 &s->close); 328 if (composite_nomem(subreq, c)) return c; 318 329 319 330 /* callback handler */ 320 composite_continue_rpc(c, close_req, continue_domain_open_close, c);331 tevent_req_set_callback(subreq, continue_domain_open_close, c); 321 332 return c; 322 333 } … … 329 340 330 341 /* send request */ 331 conn_req = dcerpc_samr_Connect_send(s->pipe, c, &s->connect); 332 if (composite_nomem(conn_req, c)) return c; 342 subreq = dcerpc_samr_Connect_r_send(s, c->event_ctx, 343 s->pipe->binding_handle, 344 &s->connect); 345 if (composite_nomem(subreq, c)) return c; 333 346 334 347 /* callback handler */ 335 composite_continue_rpc(c, conn_req, continue_domain_open_connect, c);348 tevent_req_set_callback(subreq, continue_domain_open_connect, c); 336 349 return c; 337 350 } … … 390 403 391 404 static void continue_rpc_connect_lsa(struct composite_context *ctx); 392 static void continue_lsa_policy_open(struct rpc_request *req);405 static void continue_lsa_policy_open(struct tevent_req *subreq); 393 406 394 407 … … 408 421 struct domain_open_lsa_state *s; 409 422 struct composite_context *rpcconn_req; 410 struct rpc_request *openpol_req;423 struct tevent_req *subreq; 411 424 struct lsa_QosInfo *qos; 412 425 … … 460 473 461 474 /* send rpc request */ 462 openpol_req = dcerpc_lsa_OpenPolicy2_send(s->pipe, c, &s->openpol); 463 if (composite_nomem(openpol_req, c)) return c; 464 465 composite_continue_rpc(c, openpol_req, continue_lsa_policy_open, c); 475 subreq = dcerpc_lsa_OpenPolicy2_r_send(s, c->event_ctx, 476 s->pipe->binding_handle, 477 &s->openpol); 478 if (composite_nomem(subreq, c)) return c; 479 480 tevent_req_set_callback(subreq, continue_lsa_policy_open, c); 466 481 return c; 467 482 } … … 476 491 struct domain_open_lsa_state *s; 477 492 struct lsa_QosInfo *qos; 478 struct rpc_request *openpol_req;493 struct tevent_req *subreq; 479 494 480 495 c = talloc_get_type(ctx->async.private_data, struct composite_context); … … 504 519 505 520 /* send rpc request */ 506 openpol_req = dcerpc_lsa_OpenPolicy2_send(s->pipe, c, &s->openpol); 507 if (composite_nomem(openpol_req, c)) return; 508 509 composite_continue_rpc(c, openpol_req, continue_lsa_policy_open, c); 521 subreq = dcerpc_lsa_OpenPolicy2_r_send(s, c->event_ctx, 522 s->pipe->binding_handle, 523 &s->openpol); 524 if (composite_nomem(subreq, c)) return; 525 526 tevent_req_set_callback(subreq, continue_lsa_policy_open, c); 510 527 } 511 528 … … 514 531 Stage 1: Lsa policy opened - we're done, if successfully 515 532 */ 516 static void continue_lsa_policy_open(struct rpc_request *req)533 static void continue_lsa_policy_open(struct tevent_req *subreq) 517 534 { 518 535 struct composite_context *c; 519 536 struct domain_open_lsa_state *s; 520 537 521 c = t alloc_get_type(req->async.private_data, struct composite_context);538 c = tevent_req_callback_data(subreq, struct composite_context); 522 539 s = talloc_get_type(c->private_data, struct domain_open_lsa_state); 523 540 524 c->status = dcerpc_ndr_request_recv(req); 541 c->status = dcerpc_lsa_OpenPolicy2_r_recv(subreq, s); 542 TALLOC_FREE(subreq); 525 543 if (!composite_is_ok(c)) return; 526 544 … … 667 685 668 686 669 static void continue_lsa_close(struct rpc_request *req);687 static void continue_lsa_close(struct tevent_req *subreq); 670 688 671 689 … … 676 694 struct composite_context *c; 677 695 struct domain_close_lsa_state *s; 678 struct rpc_request *close_req;696 struct tevent_req *subreq; 679 697 680 698 /* composite context and state structure allocation */ … … 703 721 704 722 /* send the request */ 705 close_req = dcerpc_lsa_Close_send(s->pipe, c, &s->close); 706 if (composite_nomem(close_req, c)) return c; 707 708 composite_continue_rpc(c, close_req, continue_lsa_close, c); 723 subreq = dcerpc_lsa_Close_r_send(s, c->event_ctx, 724 s->pipe->binding_handle, 725 &s->close); 726 if (composite_nomem(subreq, c)) return c; 727 728 tevent_req_set_callback(subreq, continue_lsa_close, c); 709 729 return c; 710 730 } … … 714 734 Stage 1: Receive result of lsa close call 715 735 */ 716 static void continue_lsa_close(struct rpc_request *req)736 static void continue_lsa_close(struct tevent_req *subreq) 717 737 { 718 738 struct composite_context *c; 719 739 struct domain_close_lsa_state *s; 720 740 721 c = t alloc_get_type(req->async.private_data, struct composite_context);741 c = tevent_req_callback_data(subreq, struct composite_context); 722 742 s = talloc_get_type(c->private_data, struct domain_close_lsa_state); 723 743 724 c->status = dcerpc_ndr_request_recv(req); 744 c->status = dcerpc_lsa_Close_r_recv(subreq, s); 745 TALLOC_FREE(subreq); 725 746 if (!composite_is_ok(c)) return; 726 747 … … 771 792 772 793 773 static void continue_samr_close(struct rpc_request *req);794 static void continue_samr_close(struct tevent_req *subreq); 774 795 775 796 … … 780 801 struct composite_context *c; 781 802 struct domain_close_samr_state *s; 782 struct rpc_request *close_req;803 struct tevent_req *subreq; 783 804 784 805 /* composite context and state structure allocation */ … … 805 826 806 827 /* send the request */ 807 close_req = dcerpc_samr_Close_send(ctx->samr.pipe, ctx, &s->close); 808 if (composite_nomem(close_req, c)) return c; 809 810 composite_continue_rpc(c, close_req, continue_samr_close, c); 828 subreq = dcerpc_samr_Close_r_send(s, c->event_ctx, 829 ctx->samr.pipe->binding_handle, 830 &s->close); 831 if (composite_nomem(subreq, c)) return c; 832 833 tevent_req_set_callback(subreq, continue_samr_close, c); 811 834 return c; 812 835 } … … 816 839 Stage 1: Receive result of samr close call 817 840 */ 818 static void continue_samr_close(struct rpc_request *req)841 static void continue_samr_close(struct tevent_req *subreq) 819 842 { 820 843 struct composite_context *c; 821 844 struct domain_close_samr_state *s; 822 845 823 c = t alloc_get_type(req->async.private_data, struct composite_context);846 c = tevent_req_callback_data(subreq, struct composite_context); 824 847 s = talloc_get_type(c->private_data, struct domain_close_samr_state); 825 848 826 c->status = dcerpc_ndr_request_recv(req); 849 c->status = dcerpc_samr_Close_r_recv(subreq, s); 850 TALLOC_FREE(subreq); 827 851 if (!composite_is_ok(c)) return; 828 852 … … 941 965 942 966 static void continue_rpc_connect(struct composite_context *c); 943 static void continue_samr_connect(struct rpc_request *c);944 static void continue_samr_enum_domains(struct rpc_request *req);945 static void continue_samr_close_handle(struct rpc_request *req);967 static void continue_samr_connect(struct tevent_req *subreq); 968 static void continue_samr_enum_domains(struct tevent_req *subreq); 969 static void continue_samr_close_handle(struct tevent_req *subreq); 946 970 947 971 static struct domainlist* get_domain_list(TALLOC_CTX *mem_ctx, struct domain_list_state *s); … … 956 980 struct composite_context *c; 957 981 struct domain_list_state *s; 958 struct rpc_request *samrconn_req;982 struct tevent_req *subreq; 959 983 960 984 c = talloc_get_type(ctx->async.private_data, struct composite_context); … … 968 992 s->samrconn.out.connect_handle = &s->connect_handle; 969 993 970 samrconn_req = dcerpc_samr_Connect_send(s->ctx->samr.pipe, c, &s->samrconn); 971 if (composite_nomem(samrconn_req, c)) return; 972 973 composite_continue_rpc(c, samrconn_req, continue_samr_connect, c); 994 subreq = dcerpc_samr_Connect_r_send(s, c->event_ctx, 995 s->ctx->samr.pipe->binding_handle, 996 &s->samrconn); 997 if (composite_nomem(subreq, c)) return; 998 999 tevent_req_set_callback(subreq, continue_samr_connect, c); 974 1000 } 975 1001 … … 979 1005 a request to enumerate domain databases available 980 1006 */ 981 static void continue_samr_connect(struct rpc_request *req)1007 static void continue_samr_connect(struct tevent_req *subreq) 982 1008 { 983 1009 struct composite_context *c; 984 1010 struct domain_list_state *s; 985 struct rpc_request *enumdom_req; 986 987 c = talloc_get_type(req->async.private_data, struct composite_context); 1011 1012 c = tevent_req_callback_data(subreq, struct composite_context); 988 1013 s = talloc_get_type(c->private_data, struct domain_list_state); 989 1014 990 c->status = dcerpc_ndr_request_recv(req); 1015 c->status = dcerpc_samr_Connect_r_recv(subreq, s); 1016 TALLOC_FREE(subreq); 991 1017 if (!composite_is_ok(c)) return; 992 1018 … … 1009 1035 if (composite_nomem(s->enumdom.out.sam, c)) return; 1010 1036 1011 enumdom_req = dcerpc_samr_EnumDomains_send(s->ctx->samr.pipe, c, &s->enumdom); 1012 if (composite_nomem(enumdom_req, c)) return; 1013 1014 composite_continue_rpc(c, enumdom_req, continue_samr_enum_domains, c); 1037 subreq = dcerpc_samr_EnumDomains_r_send(s, c->event_ctx, 1038 s->ctx->samr.pipe->binding_handle, 1039 &s->enumdom); 1040 if (composite_nomem(subreq, c)) return; 1041 1042 tevent_req_set_callback(subreq, continue_samr_enum_domains, c); 1015 1043 } 1016 1044 … … 1021 1049 upon completion. 1022 1050 */ 1023 static void continue_samr_enum_domains(struct rpc_request *req)1051 static void continue_samr_enum_domains(struct tevent_req *subreq) 1024 1052 { 1025 1053 struct composite_context *c; 1026 1054 struct domain_list_state *s; 1027 struct rpc_request *enumdom_req; 1028 struct rpc_request *samrclose_req; 1029 1030 c = talloc_get_type(req->async.private_data, struct composite_context); 1055 1056 c = tevent_req_callback_data(subreq, struct composite_context); 1031 1057 s = talloc_get_type(c->private_data, struct domain_list_state); 1032 1058 1033 c->status = dcerpc_ndr_request_recv(req); 1059 c->status = dcerpc_samr_EnumDomains_r_recv(subreq, s); 1060 TALLOC_FREE(subreq); 1034 1061 if (!composite_is_ok(c)) return; 1035 1062 … … 1058 1085 1059 1086 /* send the request */ 1060 enumdom_req = dcerpc_samr_EnumDomains_send(s->ctx->samr.pipe, c, &s->enumdom); 1061 if (composite_nomem(enumdom_req, c)) return; 1062 1063 composite_continue_rpc(c, enumdom_req, continue_samr_enum_domains, c); 1087 subreq = dcerpc_samr_EnumDomains_r_send(s, c->event_ctx, 1088 s->ctx->samr.pipe->binding_handle, 1089 &s->enumdom); 1090 if (composite_nomem(subreq, c)) return; 1091 1092 tevent_req_set_callback(subreq, continue_samr_enum_domains, c); 1064 1093 1065 1094 } else { … … 1073 1102 1074 1103 /* send the request */ 1075 samrclose_req = dcerpc_samr_Close_send(s->ctx->samr.pipe, c, &s->samrclose); 1076 if (composite_nomem(samrclose_req, c)) return; 1077 1078 composite_continue_rpc(c, samrclose_req, continue_samr_close_handle, c); 1104 subreq = dcerpc_samr_Close_r_send(s, c->event_ctx, 1105 s->ctx->samr.pipe->binding_handle, 1106 &s->samrclose); 1107 if (composite_nomem(subreq, c)) return; 1108 1109 tevent_req_set_callback(subreq, continue_samr_close_handle, c); 1079 1110 } 1080 1111 … … 1083 1114 Stage 4: Receive result of closing samr connection handle. 1084 1115 */ 1085 static void continue_samr_close_handle(struct rpc_request *req)1116 static void continue_samr_close_handle(struct tevent_req *subreq) 1086 1117 { 1087 1118 struct composite_context *c; 1088 1119 struct domain_list_state *s; 1089 1120 1090 c = t alloc_get_type(req->async.private_data, struct composite_context);1121 c = tevent_req_callback_data(subreq, struct composite_context); 1091 1122 s = talloc_get_type(c->private_data, struct domain_list_state); 1092 1123 1093 c->status = dcerpc_ndr_request_recv(req); 1124 c->status = dcerpc_samr_Close_r_recv(subreq, s); 1125 TALLOC_FREE(subreq); 1094 1126 if (!composite_is_ok(c)) return; 1095 1127 … … 1117 1149 static struct domainlist* get_domain_list(TALLOC_CTX *mem_ctx, struct domain_list_state *s) 1118 1150 { 1119 int i;1151 uint32_t i; 1120 1152 if (mem_ctx == NULL || s == NULL) return NULL; 1121 1153 … … 1164 1196 struct domain_list_state *s; 1165 1197 struct composite_context *rpcconn_req; 1166 struct rpc_request *samrconn_req;1198 struct tevent_req *subreq; 1167 1199 1168 1200 /* composite context and state structure allocation */ … … 1200 1232 s->samrconn.out.connect_handle = &s->connect_handle; 1201 1233 1202 samrconn_req = dcerpc_samr_Connect_send(s->ctx->samr.pipe, c, &s->samrconn); 1203 if (composite_nomem(samrconn_req, c)) return c; 1204 1205 composite_continue_rpc(c, samrconn_req, continue_samr_connect, c); 1234 subreq = dcerpc_samr_Connect_r_send(s, c->event_ctx, 1235 s->ctx->samr.pipe->binding_handle, 1236 &s->samrconn); 1237 if (composite_nomem(subreq, c)) return c; 1238 1239 tevent_req_set_callback(subreq, continue_samr_connect, c); 1206 1240 } 1207 1241 -
vendor/current/source4/libnet/libnet_export_keytab.c
r414 r740 3 3 #include "auth/kerberos/kerberos.h" 4 4 #include <hdb.h> 5 #include "kdc/ hdb-samba4.h"5 #include "kdc/samba_kdc.h" 6 6 #include "libnet/libnet.h" 7 8 extern struct hdb_method hdb_samba4; 7 9 8 10 NTSTATUS libnet_export_keytab(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_export_keytab *r) … … 14 16 /* Register hdb-samba4 hooks for use as a keytab */ 15 17 16 struct hdb_samba4_context *hdb_samba4_context = talloc(mem_ctx, struct hdb_samba4_context);17 if (! hdb_samba4_context) {18 struct samba_kdc_base_context *base_ctx = talloc_zero(mem_ctx, struct samba_kdc_base_context); 19 if (!base_ctx) { 18 20 return NT_STATUS_NO_MEMORY; 19 21 } 20 22 21 hdb_samba4_context->ev_ctx = ctx->event_ctx;22 hdb_samba4_context->lp_ctx = ctx->lp_ctx;23 base_ctx->ev_ctx = ctx->event_ctx; 24 base_ctx->lp_ctx = ctx->lp_ctx; 23 25 24 from_keytab = talloc_asprintf( hdb_samba4_context, "HDB:samba4&%p", hdb_samba4_context);26 from_keytab = talloc_asprintf(base_ctx, "HDB:samba4&%p", base_ctx); 25 27 if (!from_keytab) { 26 28 return NT_STATUS_NO_MEMORY; … … 44 46 } 45 47 48 unlink(r->in.keytab_name); 49 46 50 ret = kt_copy(smb_krb5_context->krb5_context, from_keytab, r->in.keytab_name); 47 51 if(ret) { -
vendor/current/source4/libnet/libnet_group.c
r414 r740 148 148 } 149 149 150 talloc_free(c); 150 151 return status; 151 152 } … … 409 410 410 411 talloc_free(c); 411 412 412 return status; 413 413 } … … 448 448 449 449 static void continue_lsa_domain_opened(struct composite_context *ctx); 450 static void continue_domain_queried(struct rpc_request *req);450 static void continue_domain_queried(struct tevent_req *subreq); 451 451 static void continue_samr_domain_opened(struct composite_context *ctx); 452 static void continue_domain_queried(struct rpc_request *req); 453 static void continue_groups_enumerated(struct rpc_request *req); 452 static void continue_groups_enumerated(struct tevent_req *subreq); 454 453 455 454 … … 470 469 struct composite_context *c; 471 470 struct grouplist_state *s; 472 struct rpc_request *query_req;471 struct tevent_req *subreq; 473 472 bool prereq_met = false; 474 473 … … 501 500 502 501 /* send the request */ 503 query_req = dcerpc_lsa_QueryInfoPolicy_send(ctx->lsa.pipe, c, &s->query_domain); 504 if (composite_nomem(query_req, c)) return c; 505 506 composite_continue_rpc(c, query_req, continue_domain_queried, c); 502 subreq = dcerpc_lsa_QueryInfoPolicy_r_send(s, c->event_ctx, 503 ctx->lsa.pipe->binding_handle, 504 &s->query_domain); 505 if (composite_nomem(subreq, c)) return c; 506 507 tevent_req_set_callback(subreq, continue_domain_queried, c); 507 508 return c; 508 509 } … … 517 518 struct composite_context *c; 518 519 struct grouplist_state *s; 519 struct rpc_request *query_req;520 struct tevent_req *subreq; 520 521 521 522 c = talloc_get_type(ctx->async.private_data, struct composite_context); … … 533 534 534 535 /* send the request */ 535 query_req = dcerpc_lsa_QueryInfoPolicy_send(s->ctx->lsa.pipe, c, &s->query_domain); 536 if (composite_nomem(query_req, c)) return; 537 538 composite_continue_rpc(c, query_req, continue_domain_queried, c); 536 subreq = dcerpc_lsa_QueryInfoPolicy_r_send(s, c->event_ctx, 537 s->ctx->lsa.pipe->binding_handle, 538 &s->query_domain); 539 if (composite_nomem(subreq, c)) return; 540 541 tevent_req_set_callback(subreq, continue_domain_queried, c); 539 542 } 540 543 … … 544 547 * provided a valid samr handle is opened 545 548 */ 546 static void continue_domain_queried(struct rpc_request *req)549 static void continue_domain_queried(struct tevent_req *subreq) 547 550 { 548 551 struct composite_context *c; 549 552 struct grouplist_state *s; 550 struct rpc_request *enum_req;551 553 bool prereq_met = false; 552 554 553 c = t alloc_get_type(req->async.private_data, struct composite_context);555 c = tevent_req_callback_data(subreq, struct composite_context); 554 556 s = talloc_get_type(c->private_data, struct grouplist_state); 555 557 556 558 /* receive result of rpc request */ 557 c->status = dcerpc_ndr_request_recv(req); 559 c->status = dcerpc_lsa_QueryInfoPolicy_r_recv(subreq, s); 560 TALLOC_FREE(subreq); 558 561 if (!composite_is_ok(c)) return; 559 562 … … 577 580 578 581 /* send the request */ 579 enum_req = dcerpc_samr_EnumDomainGroups_send(s->ctx->samr.pipe, c, &s->group_list); 580 if (composite_nomem(enum_req, c)) return; 581 582 composite_continue_rpc(c, enum_req, continue_groups_enumerated, c); 582 subreq = dcerpc_samr_EnumDomainGroups_r_send(s, c->event_ctx, 583 s->ctx->samr.pipe->binding_handle, 584 &s->group_list); 585 if (composite_nomem(subreq, c)) return; 586 587 tevent_req_set_callback(subreq, continue_groups_enumerated, c); 583 588 } 584 589 … … 592 597 struct composite_context *c; 593 598 struct grouplist_state *s; 594 struct rpc_request *enum_req;599 struct tevent_req *subreq; 595 600 596 601 c = talloc_get_type(ctx->async.private_data, struct composite_context); … … 612 617 613 618 /* send the request */ 614 enum_req = dcerpc_samr_EnumDomainGroups_send(s->ctx->samr.pipe, c, &s->group_list); 615 if (composite_nomem(enum_req, c)) return; 616 617 composite_continue_rpc(c, enum_req, continue_groups_enumerated, c); 619 subreq = dcerpc_samr_EnumDomainGroups_r_send(s, c->event_ctx, 620 s->ctx->samr.pipe->binding_handle, 621 &s->group_list); 622 if (composite_nomem(subreq, c)) return; 623 624 tevent_req_set_callback(subreq, continue_groups_enumerated, c); 618 625 } 619 626 … … 622 629 * Stage 2: receive enumerated groups and their rids 623 630 */ 624 static void continue_groups_enumerated(struct rpc_request *req)631 static void continue_groups_enumerated(struct tevent_req *subreq) 625 632 { 626 633 struct composite_context *c; 627 634 struct grouplist_state *s; 628 int i;629 630 c = t alloc_get_type(req->async.private_data, struct composite_context);635 uint32_t i; 636 637 c = tevent_req_callback_data(subreq, struct composite_context); 631 638 s = talloc_get_type(c->private_data, struct grouplist_state); 632 639 633 640 /* receive result of rpc request */ 634 c->status = dcerpc_ndr_request_recv(req); 641 c->status = dcerpc_samr_EnumDomainGroups_r_recv(subreq, s); 642 TALLOC_FREE(subreq); 635 643 if (!composite_is_ok(c)) return; 636 644 … … 664 672 665 673 /* groupname */ 666 s->groups[i].groupname = talloc_strdup( c, entry->name.string);674 s->groups[i].groupname = talloc_strdup(s->groups, entry->name.string); 667 675 if (composite_nomem(s->groups[i].groupname, c)) return; 668 676 669 677 /* sid string */ 670 s->groups[i].sid = dom_sid_string( c, group_sid);678 s->groups[i].sid = dom_sid_string(s->groups, group_sid); 671 679 if (composite_nomem(s->groups[i].sid, c)) return; 672 680 } … … 697 705 698 706 if (c == NULL || mem_ctx == NULL || io == NULL) { 707 talloc_free(c); 699 708 return NT_STATUS_INVALID_PARAMETER; 700 709 } … … 724 733 } 725 734 735 talloc_free(c); 726 736 return status; 727 737 } -
vendor/current/source4/libnet/libnet_join.c
r414 r740 23 23 #include "libnet/libnet.h" 24 24 #include "librpc/gen_ndr/ndr_drsuapi_c.h" 25 #include "lib/ldb/include/ldb.h" 26 #include "lib/ldb/include/ldb_errors.h" 27 #include "param/secrets.h" 25 #include <ldb.h> 26 #include <ldb_errors.h> 28 27 #include "dsdb/samdb/samdb.h" 29 28 #include "ldb_wrap.h" 30 #include "../lib/util/util_ldb.h"31 29 #include "libcli/security/security.h" 32 30 #include "auth/credentials/credentials.h" … … 35 33 #include "param/param.h" 36 34 #include "param/provision.h" 35 #include "system/kerberos.h" 36 #include "auth/kerberos/kerberos.h" 37 37 38 38 /* … … 95 95 } 96 96 97 drsuapi_binding = talloc (tmp_ctx, struct dcerpc_binding);97 drsuapi_binding = talloc_zero(tmp_ctx, struct dcerpc_binding); 98 98 if (!drsuapi_binding) { 99 99 r->out.error_string = NULL; … … 134 134 r_drsuapi_bind.out.bind_handle = &drsuapi_bind_handle; 135 135 136 status = dcerpc_drsuapi_DsBind(drsuapi_pipe, tmp_ctx, &r_drsuapi_bind); 137 if (!NT_STATUS_IS_OK(status)) { 138 if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { 139 r->out.error_string 140 = talloc_asprintf(r, 141 "dcerpc_drsuapi_DsBind failed - %s", 142 dcerpc_errstr(tmp_ctx, drsuapi_pipe->last_fault_code)); 143 talloc_free(tmp_ctx); 144 return status; 145 } else { 146 r->out.error_string 147 = talloc_asprintf(r, 148 "dcerpc_drsuapi_DsBind failed - %s", 149 nt_errstr(status)); 150 talloc_free(tmp_ctx); 151 return status; 152 } 136 status = dcerpc_drsuapi_DsBind_r(drsuapi_pipe->binding_handle, tmp_ctx, &r_drsuapi_bind); 137 if (!NT_STATUS_IS_OK(status)) { 138 r->out.error_string 139 = talloc_asprintf(r, 140 "dcerpc_drsuapi_DsBind failed - %s", 141 nt_errstr(status)); 142 talloc_free(tmp_ctx); 143 return status; 153 144 } else if (!W_ERROR_IS_OK(r_drsuapi_bind.out.result)) { 154 145 r->out.error_string … … 185 176 186 177 r_crack_names.out.ctr = talloc(r, union drsuapi_DsNameCtr); 187 r_crack_names.out.level_out = talloc(r, int32_t);178 r_crack_names.out.level_out = talloc(r, uint32_t); 188 179 if (!r_crack_names.out.ctr || !r_crack_names.out.level_out) { 189 180 r->out.error_string = NULL; … … 192 183 } 193 184 194 status = dcerpc_drsuapi_DsCrackNames(drsuapi_pipe, tmp_ctx, &r_crack_names); 195 if (!NT_STATUS_IS_OK(status)) { 196 if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { 197 r->out.error_string 198 = talloc_asprintf(r, 199 "dcerpc_drsuapi_DsCrackNames for [%s] failed - %s", 200 names[0].str, 201 dcerpc_errstr(tmp_ctx, drsuapi_pipe->last_fault_code)); 202 talloc_free(tmp_ctx); 203 return status; 204 } else { 205 r->out.error_string 206 = talloc_asprintf(r, 207 "dcerpc_drsuapi_DsCrackNames for [%s] failed - %s", 208 names[0].str, 209 nt_errstr(status)); 210 talloc_free(tmp_ctx); 211 return status; 212 } 185 status = dcerpc_drsuapi_DsCrackNames_r(drsuapi_pipe->binding_handle, tmp_ctx, &r_crack_names); 186 if (!NT_STATUS_IS_OK(status)) { 187 r->out.error_string 188 = talloc_asprintf(r, 189 "dcerpc_drsuapi_DsCrackNames for [%s] failed - %s", 190 names[0].str, 191 nt_errstr(status)); 192 talloc_free(tmp_ctx); 193 return status; 213 194 } else if (!W_ERROR_IS_OK(r_crack_names.out.result)) { 214 195 r->out.error_string … … 246 227 } 247 228 248 remote_ldb = ldb_wrap_connect(tmp_ctx, ctx->event_ctx, ctx->lp_ctx, 229 remote_ldb = ldb_wrap_connect(tmp_ctx, ctx->event_ctx, ctx->lp_ctx, 249 230 remote_ldb_url, 250 NULL, ctx->cred, 0 , NULL);231 NULL, ctx->cred, 0); 251 232 if (!remote_ldb) { 252 233 r->out.error_string = NULL; … … 256 237 257 238 account_dn = ldb_dn_new(tmp_ctx, remote_ldb, account_dn_str); 258 if ( ! ldb_dn_validate(account_dn)) {239 if (account_dn == NULL) { 259 240 r->out.error_string = talloc_asprintf(r, "Invalid account dn: %s", 260 241 account_dn_str); … … 290 271 291 272 { 292 int i;293 const char *service_principal_name[ 6];294 const char *dns_host_name = strlower_talloc( tmp_ctx,295 talloc_asprintf( tmp_ctx,273 unsigned int i; 274 const char *service_principal_name[2]; 275 const char *dns_host_name = strlower_talloc(msg, 276 talloc_asprintf(msg, 296 277 "%s.%s", 297 278 r->in.netbios_name, … … 304 285 } 305 286 306 service_principal_name[0] = talloc_asprintf(tmp_ctx, "host/%s", dns_host_name); 307 service_principal_name[1] = talloc_asprintf(tmp_ctx, "host/%s", strlower_talloc(tmp_ctx, r->in.netbios_name)); 308 service_principal_name[2] = talloc_asprintf(tmp_ctx, "host/%s/%s", dns_host_name, realm); 309 service_principal_name[3] = talloc_asprintf(tmp_ctx, "host/%s/%s", strlower_talloc(tmp_ctx, r->in.netbios_name), realm); 310 service_principal_name[4] = talloc_asprintf(tmp_ctx, "host/%s/%s", dns_host_name, r->out.domain_name); 311 service_principal_name[5] = talloc_asprintf(tmp_ctx, "host/%s/%s", strlower_talloc(tmp_ctx, r->in.netbios_name), r->out.domain_name); 287 service_principal_name[0] = talloc_asprintf(msg, "HOST/%s", 288 dns_host_name); 289 service_principal_name[1] = talloc_asprintf(msg, "HOST/%s", 290 r->in.netbios_name); 312 291 313 292 for (i=0; i < ARRAY_SIZE(service_principal_name); i++) { … … 317 296 return NT_STATUS_NO_MEMORY; 318 297 } 319 rtn = samdb_msg_add_string(remote_ldb, tmp_ctx, msg, "servicePrincipalName", service_principal_name[i]); 320 if (rtn == -1) { 298 rtn = ldb_msg_add_string(msg, "servicePrincipalName", 299 service_principal_name[i]); 300 if (rtn != LDB_SUCCESS) { 321 301 r->out.error_string = NULL; 322 302 talloc_free(tmp_ctx); … … 325 305 } 326 306 327 rtn = samdb_msg_add_string(remote_ldb, tmp_ctx,msg, "dNSHostName", dns_host_name);328 if (rtn == -1) {307 rtn = ldb_msg_add_string(msg, "dNSHostName", dns_host_name); 308 if (rtn != LDB_SUCCESS) { 329 309 r->out.error_string = NULL; 330 310 talloc_free(tmp_ctx); … … 332 312 } 333 313 334 rtn = samdb_replace(remote_ldb, tmp_ctx, msg);335 if (rtn != 0) {314 rtn = dsdb_replace(remote_ldb, msg, 0); 315 if (rtn != LDB_SUCCESS) { 336 316 r->out.error_string 337 317 = talloc_asprintf(r, … … 343 323 } 344 324 325 msg = ldb_msg_new(tmp_ctx); 326 if (!msg) { 327 r->out.error_string = NULL; 328 talloc_free(tmp_ctx); 329 return NT_STATUS_NO_MEMORY; 330 } 331 msg->dn = res->msgs[0]->dn; 332 333 rtn = samdb_msg_add_uint(remote_ldb, msg, msg, 334 "msDS-SupportedEncryptionTypes", ENC_ALL_TYPES); 335 if (rtn != LDB_SUCCESS) { 336 r->out.error_string = NULL; 337 talloc_free(tmp_ctx); 338 return NT_STATUS_NO_MEMORY; 339 } 340 341 rtn = dsdb_replace(remote_ldb, msg, 0); 342 /* The remote server may not support this attribute, if it 343 * isn't a modern schema */ 344 if (rtn != LDB_SUCCESS && rtn != LDB_ERR_NO_SUCH_ATTRIBUTE) { 345 r->out.error_string 346 = talloc_asprintf(r, 347 "Failed to replace msDS-SupportedEncryptionTypes on %s", 348 ldb_dn_get_linearized(msg->dn)); 349 talloc_free(tmp_ctx); 350 return NT_STATUS_INTERNAL_DB_CORRUPTION; 351 } 352 345 353 /* DsCrackNames to find out the DN of the domain. */ 346 354 r_crack_names.in.req->req1.format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT; … … 353 361 } 354 362 355 status = dcerpc_drsuapi_DsCrackNames(drsuapi_pipe, tmp_ctx, &r_crack_names); 356 if (!NT_STATUS_IS_OK(status)) { 357 if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { 358 r->out.error_string 359 = talloc_asprintf(r, 360 "dcerpc_drsuapi_DsCrackNames for [%s] failed - %s", 361 r->in.domain_name, 362 dcerpc_errstr(tmp_ctx, drsuapi_pipe->last_fault_code)); 363 talloc_free(tmp_ctx); 364 return status; 365 } else { 366 r->out.error_string 367 = talloc_asprintf(r, 368 "dcerpc_drsuapi_DsCrackNames for [%s] failed - %s", 369 r->in.domain_name, 370 nt_errstr(status)); 371 talloc_free(tmp_ctx); 372 return status; 373 } 363 status = dcerpc_drsuapi_DsCrackNames_r(drsuapi_pipe->binding_handle, tmp_ctx, &r_crack_names); 364 if (!NT_STATUS_IS_OK(status)) { 365 r->out.error_string 366 = talloc_asprintf(r, 367 "dcerpc_drsuapi_DsCrackNames for [%s] failed - %s", 368 r->in.domain_name, 369 nt_errstr(status)); 370 talloc_free(tmp_ctx); 371 return status; 374 372 } else if (!W_ERROR_IS_OK(r_crack_names.out.result)) { 375 373 r->out.error_string … … 540 538 541 539 /* 2. do a samr_Connect to get a policy handle */ 542 status = dcerpc_samr_Connect(samr_pipe, tmp_ctx, &sc); 540 status = dcerpc_samr_Connect_r(samr_pipe->binding_handle, tmp_ctx, &sc); 541 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(sc.out.result)) { 542 status = sc.out.result; 543 } 543 544 if (!NT_STATUS_IS_OK(status)) { 544 545 r->out.error_string = talloc_asprintf(mem_ctx, … … 554 555 connect_with_info->out.domain_name = talloc_strdup(tmp_ctx, r->in.domain_name); 555 556 } else { 556 /* Bugger, we just lost our way to automatic ly find the domain name */557 connect_with_info->out.domain_name = talloc_strdup(tmp_ctx, lp _workgroup(ctx->lp_ctx));558 connect_with_info->out.realm = talloc_strdup(tmp_ctx, lp _realm(ctx->lp_ctx));557 /* Bugger, we just lost our way to automatically find the domain name */ 558 connect_with_info->out.domain_name = talloc_strdup(tmp_ctx, lpcfg_workgroup(ctx->lp_ctx)); 559 connect_with_info->out.realm = talloc_strdup(tmp_ctx, lpcfg_realm(ctx->lp_ctx)); 559 560 } 560 561 } … … 570 571 l.out.sid = &sid; 571 572 572 status = dcerpc_samr_LookupDomain(samr_pipe, tmp_ctx, &l); 573 status = dcerpc_samr_LookupDomain_r(samr_pipe->binding_handle, tmp_ctx, &l); 574 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(l.out.result)) { 575 status = l.out.result; 576 } 573 577 if (!NT_STATUS_IS_OK(status)) { 574 578 r->out.error_string = talloc_asprintf(mem_ctx, … … 589 593 590 594 /* do a samr_OpenDomain to get a domain handle */ 591 status = dcerpc_samr_OpenDomain(samr_pipe, tmp_ctx, &od); 595 status = dcerpc_samr_OpenDomain_r(samr_pipe->binding_handle, tmp_ctx, &od); 596 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(od.out.result)) { 597 status = od.out.result; 598 } 592 599 if (!NT_STATUS_IS_OK(status)) { 593 600 r->out.error_string = talloc_asprintf(mem_ctx, … … 611 618 612 619 /* do a samr_CreateUser2 to get an account handle, or an error */ 613 cu_status = dcerpc_samr_CreateUser2(samr_pipe, tmp_ctx, &cu); 620 cu_status = dcerpc_samr_CreateUser2_r(samr_pipe->binding_handle, tmp_ctx, &cu); 621 if (NT_STATUS_IS_OK(cu_status) && !NT_STATUS_IS_OK(cu.out.result)) { 622 cu_status = cu.out.result; 623 } 614 624 status = cu_status; 615 625 if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) { … … 628 638 629 639 /* 5. do a samr_LookupNames to get the users rid */ 630 status = dcerpc_samr_LookupNames(samr_pipe, tmp_ctx, &ln); 640 status = dcerpc_samr_LookupNames_r(samr_pipe->binding_handle, tmp_ctx, &ln); 641 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(ln.out.result)) { 642 status = ln.out.result; 643 } 631 644 if (!NT_STATUS_IS_OK(status)) { 632 645 r->out.error_string = talloc_asprintf(mem_ctx, … … 656 669 657 670 /* 6. do a samr_OpenUser to get a user handle */ 658 status = dcerpc_samr_OpenUser(samr_pipe, tmp_ctx, &ou); 671 status = dcerpc_samr_OpenUser_r(samr_pipe->binding_handle, tmp_ctx, &ou); 672 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(ou.out.result)) { 673 status = ou.out.result; 674 } 659 675 if (!NT_STATUS_IS_OK(status)) { 660 676 r->out.error_string = talloc_asprintf(mem_ctx, … … 670 686 d.in.user_handle = u_handle; 671 687 d.out.user_handle = u_handle; 672 status = dcerpc_samr_DeleteUser(samr_pipe, mem_ctx, &d); 688 status = dcerpc_samr_DeleteUser_r(samr_pipe->binding_handle, mem_ctx, &d); 689 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(d.out.result)) { 690 status = d.out.result; 691 } 673 692 if (!NT_STATUS_IS_OK(status)) { 674 693 r->out.error_string = talloc_asprintf(mem_ctx, … … 683 702 684 703 /* &cu filled in above */ 685 status = dcerpc_samr_CreateUser2(samr_pipe, tmp_ctx, &cu); 704 status = dcerpc_samr_CreateUser2_r(samr_pipe->binding_handle, tmp_ctx, &cu); 705 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(cu.out.result)) { 706 status = cu.out.result; 707 } 686 708 if (!NT_STATUS_IS_OK(status)) { 687 709 r->out.error_string = talloc_asprintf(mem_ctx, … … 705 727 qui.out.info = &uinfo; 706 728 707 status = dcerpc_samr_QueryUserInfo(samr_pipe, tmp_ctx, &qui); 729 status = dcerpc_samr_QueryUserInfo_r(samr_pipe->binding_handle, tmp_ctx, &qui); 730 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(qui.out.result)) { 731 status = qui.out.result; 732 } 708 733 if (!NT_STATUS_IS_OK(status)) { 709 734 r->out.error_string = talloc_asprintf(mem_ctx, … … 790 815 pwp.out.info = &info; 791 816 792 status = dcerpc_samr_GetUserPwInfo(samr_pipe, tmp_ctx, &pwp); 817 status = dcerpc_samr_GetUserPwInfo_r(samr_pipe->binding_handle, tmp_ctx, &pwp); 818 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(pwp.out.result)) { 819 status = pwp.out.result; 820 } 793 821 if (NT_STATUS_IS_OK(status)) { 794 822 policy_min_pw_len = pwp.out.info->min_password_length; … … 797 825 /* Grab a password of that minimum length */ 798 826 799 password_str = generate_random_ str(tmp_ctx, MAX(8, policy_min_pw_len));827 password_str = generate_random_password(tmp_ctx, MAX(8, policy_min_pw_len), 255); 800 828 801 829 /* set full_name and reset flags */ … … 902 930 netbios_name = r->in.netbios_name; 903 931 } else { 904 netbios_name = talloc_strdup(tmp_mem, lp _netbios_name(ctx->lp_ctx));932 netbios_name = talloc_strdup(tmp_mem, lpcfg_netbios_name(ctx->lp_ctx)); 905 933 if (!netbios_name) { 906 934 r->out.error_string = NULL; … … 944 972 set_secrets->domain_name = r2->out.domain_name; 945 973 set_secrets->realm = r2->out.realm; 946 set_secrets->account_name = account_name;947 974 set_secrets->netbios_name = netbios_name; 948 975 set_secrets->secure_channel_type = r->in.join_type; -
vendor/current/source4/libnet/libnet_lookup.c
r414 r740 23 23 24 24 #include "includes.h" 25 #include "lib/events/events.h"26 25 #include "libnet/libnet.h" 27 26 #include "libcli/composite/composite.h" 28 27 #include "auth/credentials/credentials.h" 29 #include "lib/messaging/messaging.h"30 #include "lib/messaging/irpc.h"31 28 #include "libcli/resolve/resolve.h" 32 #include "libcli/finddc s.h"29 #include "libcli/finddc.h" 33 30 #include "libcli/security/security.h" 34 #include "librpc/gen_ndr/lsa.h"35 31 #include "librpc/gen_ndr/ndr_lsa_c.h" 36 37 32 #include "param/param.h" 38 33 … … 187 182 * Sends asynchronous LookupDCs request 188 183 */ 189 struct composite_context* libnet_LookupDCs_send(struct libnet_context *ctx, 190 TALLOC_CTX *mem_ctx, 191 struct libnet_LookupDCs *io) 192 { 193 struct composite_context *c; 194 struct messaging_context *msg_ctx = 195 messaging_client_init(mem_ctx, lp_messaging_path(mem_ctx, ctx->lp_ctx), 196 lp_iconv_convenience(ctx->lp_ctx), ctx->event_ctx); 197 198 c = finddcs_send(mem_ctx, lp_netbios_name(ctx->lp_ctx), lp_nbt_port(ctx->lp_ctx), 199 io->in.domain_name, io->in.name_type, 200 NULL, lp_iconv_convenience(ctx->lp_ctx), 201 ctx->resolve_ctx, ctx->event_ctx, msg_ctx); 202 return c; 184 struct tevent_req *libnet_LookupDCs_send(struct libnet_context *ctx, 185 TALLOC_CTX *mem_ctx, 186 struct libnet_LookupDCs *io) 187 { 188 struct tevent_req *req; 189 struct finddcs finddcs_io; 190 191 ZERO_STRUCT(finddcs_io); 192 193 if (strcasecmp_m(io->in.domain_name, lpcfg_workgroup(ctx->lp_ctx)) == 0) { 194 finddcs_io.in.domain_name = lpcfg_dnsdomain(ctx->lp_ctx); 195 } else { 196 finddcs_io.in.domain_name = io->in.domain_name; 197 } 198 finddcs_io.in.minimum_dc_flags = NBT_SERVER_LDAP | NBT_SERVER_DS | NBT_SERVER_WRITABLE; 199 finddcs_io.in.server_address = ctx->server_address; 200 201 req = finddcs_cldap_send(mem_ctx, &finddcs_io, ctx->resolve_ctx, ctx->event_ctx); 202 return req; 203 203 } 204 204 … … 212 212 */ 213 213 214 NTSTATUS libnet_LookupDCs_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,214 NTSTATUS libnet_LookupDCs_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, 215 215 struct libnet_LookupDCs *io) 216 216 { 217 217 NTSTATUS status; 218 status = finddcs_recv(c, mem_ctx, &io->out.num_dcs, &io->out.dcs); 219 if (!NT_STATUS_IS_OK(status)) { 220 return status; 221 } 218 struct finddcs finddcs_io; 219 status = finddcs_cldap_recv(req, mem_ctx, &finddcs_io); 220 talloc_free(req); 221 io->out.num_dcs = 1; 222 io->out.dcs = talloc(mem_ctx, struct nbt_dc_name); 223 NT_STATUS_HAVE_NO_MEMORY(io->out.dcs); 224 io->out.dcs[0].address = finddcs_io.out.address; 225 io->out.dcs[0].name = finddcs_io.out.netlogon.data.nt5_ex.pdc_dns_name; 222 226 return status; 223 227 } … … 230 234 struct libnet_LookupDCs *io) 231 235 { 232 struct composite_context *c= libnet_LookupDCs_send(ctx, mem_ctx, io);233 return libnet_LookupDCs_recv( c, mem_ctx, io);236 struct tevent_req *req = libnet_LookupDCs_send(ctx, mem_ctx, io); 237 return libnet_LookupDCs_recv(req, mem_ctx, io); 234 238 } 235 239 … … 253 257 struct lookup_name_state *s); 254 258 static void continue_lookup_name(struct composite_context *ctx); 255 static void continue_name_found(struct rpc_request *req);259 static void continue_name_found(struct tevent_req *subreq); 256 260 257 261 … … 263 267 struct composite_context *c; 264 268 struct lookup_name_state *s; 265 struct rpc_request *lookup_req;269 struct tevent_req *subreq; 266 270 bool prereq_met = false; 267 271 … … 284 288 if (!prepare_lookup_params(ctx, c, s)) return c; 285 289 286 lookup_req = dcerpc_lsa_LookupNames_send(ctx->lsa.pipe, c, &s->lookup); 287 if (composite_nomem(lookup_req, c)) return c; 288 289 composite_continue_rpc(c, lookup_req, continue_name_found, c); 290 subreq = dcerpc_lsa_LookupNames_r_send(s, c->event_ctx, 291 ctx->lsa.pipe->binding_handle, 292 &s->lookup); 293 if (composite_nomem(subreq, c)) return c; 294 295 tevent_req_set_callback(subreq, continue_name_found, c); 290 296 return c; 291 297 } … … 324 330 struct composite_context *c; 325 331 struct lookup_name_state *s; 326 struct rpc_request *lookup_req;332 struct tevent_req *subreq; 327 333 328 334 c = talloc_get_type(ctx->async.private_data, struct composite_context); … … 334 340 if (!prepare_lookup_params(s->ctx, c, s)) return; 335 341 336 lookup_req = dcerpc_lsa_LookupNames_send(s->ctx->lsa.pipe, c, &s->lookup); 337 if (composite_nomem(lookup_req, c)) return; 338 339 composite_continue_rpc(c, lookup_req, continue_name_found, c); 340 } 341 342 343 static void continue_name_found(struct rpc_request *req) 342 subreq = dcerpc_lsa_LookupNames_r_send(s, c->event_ctx, 343 s->ctx->lsa.pipe->binding_handle, 344 &s->lookup); 345 if (composite_nomem(subreq, c)) return; 346 347 tevent_req_set_callback(subreq, continue_name_found, c); 348 } 349 350 351 static void continue_name_found(struct tevent_req *subreq) 344 352 { 345 353 struct composite_context *c; 346 354 struct lookup_name_state *s; 347 355 348 c = t alloc_get_type(req->async.private_data, struct composite_context);356 c = tevent_req_callback_data(subreq, struct composite_context); 349 357 s = talloc_get_type(c->private_data, struct lookup_name_state); 350 358 351 c->status = dcerpc_ndr_request_recv(req); 359 c->status = dcerpc_lsa_LookupNames_r_recv(subreq, s); 360 TALLOC_FREE(subreq); 352 361 if (!composite_is_ok(c)) return; 353 362 -
vendor/current/source4/libnet/libnet_passwd.c
r414 r740 52 52 uint8_t old_lm_hash[16], new_lm_hash[16]; 53 53 struct samr_DomInfo1 *dominfo = NULL; 54 struct samr_ChangeReject*reject = NULL;54 struct userPwdChangeFailureInformation *reject = NULL; 55 55 56 56 ZERO_STRUCT(c); … … 102 102 103 103 /* 2. try samr_ChangePasswordUser3 */ 104 status = dcerpc_samr_ChangePasswordUser3(c.out.dcerpc_pipe, mem_ctx, &pw3); 105 if (!NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { 104 status = dcerpc_samr_ChangePasswordUser3_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &pw3); 105 if (!NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE)) { 106 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(pw3.out.result)) { 107 status = pw3.out.result; 108 } 106 109 if (!NT_STATUS_IS_OK(status)) { 107 110 r->samr.out.error_string = talloc_asprintf(mem_ctx, … … 110 113 r->samr.out.error_string = talloc_asprintf(mem_ctx, 111 114 "samr_ChangePasswordUser3 for '%s\\%s' failed: %s", 112 r->samr.in.domain_name, r->samr.in.account_name, 115 r->samr.in.domain_name, r->samr.in.account_name, 113 116 nt_errstr(status)); 114 117 } 115 118 goto disconnect; 116 } 119 } 117 120 118 121 /* prepare samr_ChangePasswordUser2 */ … … 134 137 135 138 /* 3. try samr_ChangePasswordUser2 */ 136 status = dcerpc_samr_ChangePasswordUser2(c.out.dcerpc_pipe, mem_ctx, &pw2); 137 if (!NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { 139 status = dcerpc_samr_ChangePasswordUser2_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &pw2); 140 if (!NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE)) { 141 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(pw2.out.result)) { 142 status = pw2.out.result; 143 } 138 144 if (!NT_STATUS_IS_OK(status)) { 139 145 r->samr.out.error_string = talloc_asprintf(mem_ctx, … … 160 166 161 167 /* 4. try samr_OemChangePasswordUser2 */ 162 status = dcerpc_samr_OemChangePasswordUser2(c.out.dcerpc_pipe, mem_ctx, &oe2); 163 if (!NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { 168 status = dcerpc_samr_OemChangePasswordUser2_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &oe2); 169 if (!NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE)) { 170 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(oe2.out.result)) { 171 status = oe2.out.result; 172 } 164 173 if (!NT_STATUS_IS_OK(oe2.out.result)) { 165 174 r->samr.out.error_string = talloc_asprintf(mem_ctx, … … 194 203 195 204 /* 5. try samr_ChangePasswordUser */ 196 status = dcerpc_samr_ChangePasswordUser (c.pdc.out.dcerpc_pipe, mem_ctx, &pw);205 status = dcerpc_samr_ChangePasswordUser_r(c.pdc.out.dcerpc_pipe->binding_handle, mem_ctx, &pw); 197 206 if (!NT_STATUS_IS_OK(status)) { 198 207 r->samr.out.error_string = talloc_asprintf(mem_ctx, … … 217 226 disconnect: 218 227 /* close connection */ 219 talloc_ free(c.out.dcerpc_pipe);228 talloc_unlink(ctx, c.out.dcerpc_pipe); 220 229 221 230 return status; … … 300 309 301 310 /* 7. try samr_SetUserInfo2 level 26 to set the password */ 302 status = dcerpc_samr_SetUserInfo2 (r->samr_handle.in.dcerpc_pipe, mem_ctx, &sui);311 status = dcerpc_samr_SetUserInfo2_r(r->samr_handle.in.dcerpc_pipe->binding_handle, mem_ctx, &sui); 303 312 /* check result of samr_SetUserInfo2 level 26 */ 313 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(sui.out.result)) { 314 status = sui.out.result; 315 } 304 316 if (!NT_STATUS_IS_OK(status)) { 305 317 r->samr_handle.out.error_string … … 354 366 355 367 /* 8. try samr_SetUserInfo2 level 25 to set the password */ 356 status = dcerpc_samr_SetUserInfo2(r->samr_handle.in.dcerpc_pipe, mem_ctx, &sui); 368 status = dcerpc_samr_SetUserInfo2_r(r->samr_handle.in.dcerpc_pipe->binding_handle, mem_ctx, &sui); 369 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(sui.out.result)) { 370 status = sui.out.result; 371 } 357 372 if (!NT_STATUS_IS_OK(status)) { 358 373 r->samr_handle.out.error_string … … 395 410 396 411 /* 9. try samr_SetUserInfo2 level 24 to set the password */ 397 status = dcerpc_samr_SetUserInfo2(r->samr_handle.in.dcerpc_pipe, mem_ctx, &sui); 412 status = dcerpc_samr_SetUserInfo2_r(r->samr_handle.in.dcerpc_pipe->binding_handle, mem_ctx, &sui); 413 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(sui.out.result)) { 414 status = sui.out.result; 415 } 398 416 if (!NT_STATUS_IS_OK(status)) { 399 417 r->samr_handle.out.error_string … … 438 456 439 457 /* 10. try samr_SetUserInfo2 level 23 to set the password */ 440 status = dcerpc_samr_SetUserInfo2(r->samr_handle.in.dcerpc_pipe, mem_ctx, &sui); 458 status = dcerpc_samr_SetUserInfo2_r(r->samr_handle.in.dcerpc_pipe->binding_handle, mem_ctx, &sui); 459 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(sui.out.result)) { 460 status = sui.out.result; 461 } 441 462 if (!NT_STATUS_IS_OK(status)) { 442 463 r->samr_handle.out.error_string … … 464 485 LIBNET_SET_PASSWORD_SAMR_HANDLE_23, 465 486 }; 466 int i;487 unsigned int i; 467 488 468 489 for (i=0; i < ARRAY_SIZE(levels); i++) { … … 471 492 if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS) 472 493 || NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER_MIX) 473 || NT_STATUS_EQUAL(status, NT_STATUS_ NET_WRITE_FAULT)) {494 || NT_STATUS_EQUAL(status, NT_STATUS_RPC_ENUM_VALUE_OUT_OF_RANGE)) { 474 495 /* Try another password set mechanism */ 475 496 continue; … … 530 551 531 552 /* 2. do a samr_Connect to get a policy handle */ 532 status = dcerpc_samr_Connect(c.out.dcerpc_pipe, mem_ctx, &sc); 553 status = dcerpc_samr_Connect_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &sc); 554 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(sc.out.result)) { 555 status = sc.out.result; 556 } 533 557 if (!NT_STATUS_IS_OK(status)) { 534 558 r->samr.out.error_string = talloc_asprintf(mem_ctx, … … 545 569 546 570 /* 3. do a samr_LookupDomain to get the domain sid */ 547 status = dcerpc_samr_LookupDomain(c.out.dcerpc_pipe, mem_ctx, &ld); 571 status = dcerpc_samr_LookupDomain_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &ld); 572 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(ld.out.result)) { 573 status = ld.out.result; 574 } 548 575 if (!NT_STATUS_IS_OK(status)) { 549 576 r->samr.out.error_string = talloc_asprintf(mem_ctx, … … 561 588 562 589 /* 4. do a samr_OpenDomain to get a domain handle */ 563 status = dcerpc_samr_OpenDomain(c.out.dcerpc_pipe, mem_ctx, &od); 590 status = dcerpc_samr_OpenDomain_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &od); 591 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(od.out.result)) { 592 status = od.out.result; 593 } 564 594 if (!NT_STATUS_IS_OK(status)) { 565 595 r->samr.out.error_string = talloc_asprintf(mem_ctx, … … 582 612 583 613 /* 5. do a samr_LookupNames to get the users rid */ 584 status = dcerpc_samr_LookupNames(c.out.dcerpc_pipe, mem_ctx, &ln); 614 status = dcerpc_samr_LookupNames_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &ln); 615 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(ln.out.result)) { 616 status = ln.out.result; 617 } 585 618 if (!NT_STATUS_IS_OK(status)) { 586 619 r->samr.out.error_string = talloc_asprintf(mem_ctx, … … 607 640 608 641 /* 6. do a samr_OpenUser to get a user handle */ 609 status = dcerpc_samr_OpenUser(c.out.dcerpc_pipe, mem_ctx, &ou); 642 status = dcerpc_samr_OpenUser_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &ou); 643 if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(ou.out.result)) { 644 status = ou.out.result; 645 } 610 646 if (!NT_STATUS_IS_OK(status)) { 611 647 r->samr.out.error_string = talloc_asprintf(mem_ctx, … … 628 664 disconnect: 629 665 /* close connection */ 630 talloc_ free(c.out.dcerpc_pipe);666 talloc_unlink(ctx, c.out.dcerpc_pipe); 631 667 632 668 return status; -
vendor/current/source4/libnet/libnet_rpc.c
r414 r740 23 23 #include "libcli/libcli.h" 24 24 #include "libcli/composite/composite.h" 25 #include "librpc/rpc/dcerpc.h"26 25 #include "librpc/rpc/dcerpc_proto.h" 27 26 #include "librpc/gen_ndr/ndr_lsa_c.h" … … 111 110 case LIBNET_RPC_CONNECT_SERVER_ADDRESS: 112 111 b->flags = r->in.dcerpc_flags; 112 } 113 114 if (DEBUGLEVEL >= 10) { 115 b->flags |= DCERPC_DEBUG_PRINT_BOTH; 113 116 } 114 117 … … 225 228 226 229 227 static void continue_lookup_dc(struct composite_context *ctx);230 static void continue_lookup_dc(struct tevent_req *req); 228 231 static void continue_rpc_connect(struct composite_context *ctx); 229 232 … … 245 248 struct composite_context *c; 246 249 struct rpc_connect_dc_state *s; 247 struct composite_context*lookup_dc_req;250 struct tevent_req *lookup_dc_req; 248 251 249 252 /* composite context allocation and setup */ … … 282 285 if (composite_nomem(lookup_dc_req, c)) return c; 283 286 284 composite_continue(c,lookup_dc_req, continue_lookup_dc, c);287 tevent_req_set_callback(lookup_dc_req, continue_lookup_dc, c); 285 288 return c; 286 289 } … … 291 294 initiate RpcConnect to it 292 295 */ 293 static void continue_lookup_dc(struct composite_context *ctx)296 static void continue_lookup_dc(struct tevent_req *req) 294 297 { 295 298 struct composite_context *c; … … 298 301 struct monitor_msg msg; 299 302 struct msg_net_lookup_dc data; 300 301 c = t alloc_get_type(ctx->async.private_data, struct composite_context);302 s = talloc_get_type (c->private_data, struct rpc_connect_dc_state);303 304 c = tevent_req_callback_data(req, struct composite_context); 305 s = talloc_get_type_abort(c->private_data, struct rpc_connect_dc_state); 303 306 304 307 /* receive result of domain controller lookup */ 305 c->status = libnet_LookupDCs_recv( ctx, c, &s->f);308 c->status = libnet_LookupDCs_recv(req, c, &s->f); 306 309 if (!composite_is_ok(c)) return; 307 310 … … 455 458 456 459 static void continue_dci_rpc_connect(struct composite_context *ctx); 457 static void continue_lsa_policy(struct rpc_request *req);458 static void continue_lsa_query_info(struct rpc_request *req);459 static void continue_lsa_query_info2(struct rpc_request *req);460 static void continue_lsa_policy(struct tevent_req *subreq); 461 static void continue_lsa_query_info(struct tevent_req *subreq); 462 static void continue_lsa_query_info2(struct tevent_req *subreq); 460 463 static void continue_epm_map_binding(struct composite_context *ctx); 461 464 static void continue_secondary_conn(struct composite_context *ctx); … … 529 532 struct composite_context *c; 530 533 struct rpc_connect_dci_state *s; 531 struct rpc_request *open_pol_req;534 struct tevent_req *subreq; 532 535 533 536 c = talloc_get_type(ctx->async.private_data, struct composite_context); … … 574 577 s->lsa_open_policy.out.handle = &s->lsa_handle; 575 578 576 open_pol_req = dcerpc_lsa_OpenPolicy2_send(s->lsa_pipe, c, &s->lsa_open_policy); 577 if (composite_nomem(open_pol_req, c)) return; 578 579 composite_continue_rpc(c, open_pol_req, continue_lsa_policy, c); 579 subreq = dcerpc_lsa_OpenPolicy2_r_send(s, c->event_ctx, 580 s->lsa_pipe->binding_handle, 581 &s->lsa_open_policy); 582 if (composite_nomem(subreq, c)) return; 583 584 tevent_req_set_callback(subreq, continue_lsa_policy, c); 580 585 } 581 586 … … 585 590 for kerberos realm (dns name) and guid. The query may fail. 586 591 */ 587 static void continue_lsa_policy(struct rpc_request *req)592 static void continue_lsa_policy(struct tevent_req *subreq) 588 593 { 589 594 struct composite_context *c; 590 595 struct rpc_connect_dci_state *s; 591 struct rpc_request *query_info_req; 592 593 c = talloc_get_type(req->async.private_data, struct composite_context); 596 597 c = tevent_req_callback_data(subreq, struct composite_context); 594 598 s = talloc_get_type(c->private_data, struct rpc_connect_dci_state); 595 599 596 c->status = dcerpc_ndr_request_recv(req); 600 c->status = dcerpc_lsa_OpenPolicy2_r_recv(subreq, s); 601 TALLOC_FREE(subreq); 597 602 if (!NT_STATUS_IS_OK(c->status)) { 598 603 composite_error(c, c->status); … … 631 636 if (composite_nomem(s->lsa_query_info2.out.info, c)) return; 632 637 633 query_info_req = dcerpc_lsa_QueryInfoPolicy2_send(s->lsa_pipe, c, &s->lsa_query_info2); 634 if (composite_nomem(query_info_req, c)) return; 635 636 composite_continue_rpc(c, query_info_req, continue_lsa_query_info2, c); 638 subreq = dcerpc_lsa_QueryInfoPolicy2_r_send(s, c->event_ctx, 639 s->lsa_pipe->binding_handle, 640 &s->lsa_query_info2); 641 if (composite_nomem(subreq, c)) return; 642 643 tevent_req_set_callback(subreq, continue_lsa_query_info2, c); 637 644 } 638 645 … … 642 649 may result in failure) and query lsa info for domain name and sid. 643 650 */ 644 static void continue_lsa_query_info2(struct rpc_request *req)651 static void continue_lsa_query_info2(struct tevent_req *subreq) 645 652 { 646 653 struct composite_context *c; 647 654 struct rpc_connect_dci_state *s; 648 struct rpc_request *query_info_req; 649 650 c = talloc_get_type(req->async.private_data, struct composite_context); 655 656 c = tevent_req_callback_data(subreq, struct composite_context); 651 657 s = talloc_get_type(c->private_data, struct rpc_connect_dci_state); 652 658 653 c->status = dcerpc_ndr_request_recv(req); 659 c->status = dcerpc_lsa_QueryInfoPolicy2_r_recv(subreq, s); 660 TALLOC_FREE(subreq); 654 661 655 662 /* In case of error just null the realm and guid and proceed … … 657 664 controller we talking to - NT-style PDC also counts */ 658 665 659 if (NT_STATUS_EQUAL(c->status, NT_STATUS_ NET_WRITE_FAULT)) {666 if (NT_STATUS_EQUAL(c->status, NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE)) { 660 667 s->r.out.realm = NULL; 661 668 s->r.out.guid = NULL; … … 706 713 if (composite_nomem(s->lsa_query_info.out.info, c)) return; 707 714 708 query_info_req = dcerpc_lsa_QueryInfoPolicy_send(s->lsa_pipe, c, &s->lsa_query_info); 709 if (composite_nomem(query_info_req, c)) return; 710 711 composite_continue_rpc(c, query_info_req, continue_lsa_query_info, c); 715 subreq = dcerpc_lsa_QueryInfoPolicy_r_send(s, c->event_ctx, 716 s->lsa_pipe->binding_handle, 717 &s->lsa_query_info); 718 if (composite_nomem(subreq, c)) return; 719 720 tevent_req_set_callback(subreq, continue_lsa_query_info, c); 712 721 } 713 722 … … 716 725 Step 5 of RpcConnectDCInfo: Get domain name and sid 717 726 */ 718 static void continue_lsa_query_info(struct rpc_request *req)727 static void continue_lsa_query_info(struct tevent_req *subreq) 719 728 { 720 729 struct composite_context *c; 721 730 struct rpc_connect_dci_state *s; 722 731 723 c = t alloc_get_type(req->async.private_data, struct composite_context);732 c = tevent_req_callback_data(subreq, struct composite_context); 724 733 s = talloc_get_type(c->private_data, struct rpc_connect_dci_state); 725 734 726 c->status = dcerpc_ndr_request_recv(req); 735 c->status = dcerpc_lsa_QueryInfoPolicy_r_recv(subreq, s); 736 TALLOC_FREE(subreq); 727 737 if (!NT_STATUS_IS_OK(c->status)) { 728 738 s->r.out.error_string = talloc_asprintf(c, … … 763 773 764 774 /* prepare to get endpoint mapping for the requested interface */ 765 s->final_binding = talloc (s, struct dcerpc_binding);775 s->final_binding = talloc_zero(s, struct dcerpc_binding); 766 776 if (composite_nomem(s->final_binding, c)) return; 767 777 … … 885 895 if (r->in.dcerpc_iface == &ndr_table_samr) { 886 896 ctx->samr.pipe = talloc_reference(ctx, r->out.dcerpc_pipe); 897 ctx->samr.samr_handle = ctx->samr.pipe->binding_handle; 887 898 888 899 } else if (r->in.dcerpc_iface == &ndr_table_lsarpc) { 889 900 ctx->lsa.pipe = talloc_reference(ctx, r->out.dcerpc_pipe); 901 ctx->lsa.lsa_handle = ctx->lsa.pipe->binding_handle; 890 902 } 891 903 -
vendor/current/source4/libnet/libnet_samdump.c
r414 r740 186 186 continue; 187 187 } 188 if (!convert_string_talloc_convenience(mem_ctx, lp _iconv_convenience(ctx->lp_ctx), CH_UTF16, CH_UNIX,188 if (!convert_string_talloc_convenience(mem_ctx, lpcfg_iconv_convenience(ctx->lp_ctx), CH_UTF16, CH_UNIX, 189 189 s->secret.data, s->secret.length, 190 190 (void **)&secret_string, NULL, false)) { -
vendor/current/source4/libnet/libnet_samsync.c
r414 r740 27 27 #include "auth/gensec/gensec.h" 28 28 #include "auth/credentials/credentials.h" 29 #include " auth/gensec/schannel_proto.h"29 #include "libcli/auth/schannel.h" 30 30 #include "librpc/gen_ndr/ndr_netlogon.h" 31 31 #include "librpc/gen_ndr/ndr_netlogon_c.h" … … 46 46 struct libnet_SamSync_state *state; 47 47 const enum netr_SamDatabaseID database_ids[] = {SAM_DATABASE_DOMAIN, SAM_DATABASE_BUILTIN, SAM_DATABASE_PRIVS}; 48 int i;48 unsigned int i; 49 49 50 50 samsync_ctx = talloc_named(mem_ctx, 0, "SamSync top context"); … … 210 210 211 211 do { 212 int d;212 uint32_t d; 213 213 loop_ctx = talloc_named(samsync_ctx, 0, "DatabaseSync loop context"); 214 214 netlogon_creds_client_authenticator(creds, &credential); … … 216 216 dbsync.in.credential = &credential; 217 217 218 dbsync_nt_status = dcerpc_netr_DatabaseSync(p, loop_ctx, &dbsync); 218 dbsync_nt_status = dcerpc_netr_DatabaseSync_r(p->binding_handle, loop_ctx, &dbsync); 219 if (NT_STATUS_IS_OK(dbsync_nt_status) && !NT_STATUS_IS_OK(dbsync.out.result)) { 220 dbsync_nt_status = dbsync.out.result; 221 } 219 222 if (!NT_STATUS_IS_OK(dbsync_nt_status) && 220 223 !NT_STATUS_EQUAL(dbsync_nt_status, STATUS_MORE_ENTRIES)) { -
vendor/current/source4/libnet/libnet_samsync_ldb.c
r414 r740 32 32 #include "ldb_wrap.h" 33 33 #include "libcli/security/security.h" 34 #include "librpc/rpc/dcerpc.h"35 34 #include "param/param.h" 36 35 … … 53 52 54 53 struct dom_sid *dom_sid[3]; 55 struct ldb_context *sam_ldb, *remote_ldb ;54 struct ldb_context *sam_ldb, *remote_ldb, *pdb; 56 55 struct ldb_dn *base_dn[3]; 57 56 struct samsync_ldb_secret *secrets; 58 57 struct samsync_ldb_trusted_domain *trusted_domains; 59 58 }; 59 60 /* This wrapper is needed for the "ADD_OR_DEL" macros */ 61 static int samdb_msg_add_string(struct ldb_context *sam_ldb, 62 TALLOC_CTX *mem_ctx, struct ldb_message *msg, 63 const char *attr_name, const char *str) 64 { 65 return ldb_msg_add_string(msg, attr_name, str); 66 } 60 67 61 68 static NTSTATUS samsync_ldb_add_foreignSecurityPrincipal(TALLOC_CTX *mem_ctx, … … 95 102 return NT_STATUS_UNSUCCESSFUL; 96 103 97 samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 98 "objectClass", 99 "foreignSecurityPrincipal"); 104 ldb_msg_add_string(msg, "objectClass", "foreignSecurityPrincipal"); 100 105 101 106 *fsp_dn = msg->dn; … … 103 108 /* create the alias */ 104 109 ret = ldb_add(state->sam_ldb, msg); 105 if (ret != 0) {110 if (ret != LDB_SUCCESS) { 106 111 *error_string = talloc_asprintf(mem_ctx, "Failed to create foreignSecurityPrincipal " 107 112 "record %s: %s", … … 167 172 168 173 if (state->samsync_state->domain_guid) { 169 enum ndr_err_code ndr_err;170 174 struct ldb_val v; 171 ndr_err = ndr_push_struct_blob(&v, msg, NULL, 172 state->samsync_state->domain_guid, 173 (ndr_push_flags_fn_t)ndr_push_GUID); 174 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 175 NTSTATUS status; 176 status = GUID_to_ndr_blob(state->samsync_state->domain_guid, msg, &v); 177 if (!NT_STATUS_IS_OK(status)) { 175 178 *error_string = talloc_asprintf(mem_ctx, "ndr_push of domain GUID failed!"); 176 return ndr_map_error2ntstatus(ndr_err);179 return status; 177 180 } 178 181 … … 198 201 } 199 202 200 samdb_msg_add_string(state->sam_ldb, mem_ctx,201 msg, "oEMInformation",domain->oem_information.string);203 ldb_msg_add_string(msg, "oEMInformation", 204 domain->oem_information.string); 202 205 203 206 samdb_msg_add_int64(state->sam_ldb, mem_ctx, … … 225 228 /* TODO: Account lockout, password properties */ 226 229 227 ret = samdb_replace(state->sam_ldb, mem_ctx, msg); 228 229 if (ret) { 230 return NT_STATUS_INTERNAL_ERROR; 230 ret = dsdb_replace(state->sam_ldb, msg, 0); 231 if (ret != LDB_SUCCESS) { 232 *error_string = talloc_asprintf(mem_ctx, 233 "Failed to modify domain record %s: %s", 234 ldb_dn_get_linearized(msg->dn), 235 ldb_errstring(state->sam_ldb)); 236 return NT_STATUS_INTERNAL_DB_CORRUPTION; 231 237 } 232 238 return NT_STATUS_OK; … … 248 254 struct ldb_message **msgs; 249 255 struct ldb_message **remote_msgs = NULL; 250 int ret, i; 256 unsigned int i; 257 int ret; 251 258 uint32_t acb; 252 259 bool add = false; … … 311 318 /* Try to put things in the same location as the remote server */ 312 319 } else if (add) { 313 msg->dn = remote_msgs[0]->dn; 314 talloc_steal(msg, remote_msgs[0]->dn); 320 msg->dn = talloc_steal(msg, remote_msgs[0]->dn); 315 321 } 316 322 } … … 363 369 } 364 370 365 if (!add) {366 /* Passwords. Ensure there is no plaintext stored against367 * this entry, as we only have hashes */368 samdb_msg_add_delete(state->sam_ldb, mem_ctx, msg,369 "userPassword");370 }371 371 if (user->lm_password_present) { 372 372 samdb_msg_add_hash(state->sam_ldb, mem_ctx, msg, … … 425 425 } 426 426 if (add) { 427 samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 428 "objectClass", obj_class); 427 ldb_msg_add_string(msg, "objectClass", obj_class); 429 428 if (!msg->dn) { 430 429 msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]); … … 436 435 437 436 ret = ldb_add(state->sam_ldb, msg); 438 if (ret != 0) {437 if (ret != LDB_SUCCESS) { 439 438 struct ldb_dn *first_try_dn = msg->dn; 440 439 /* Try again with the default DN */ … … 447 446 msg->dn = talloc_steal(msg, remote_msgs[0]->dn); 448 447 ret = ldb_add(state->sam_ldb, msg); 449 if (ret != 0) {448 if (ret != LDB_SUCCESS) { 450 449 *error_string = talloc_asprintf(mem_ctx, "Failed to create user record. Tried both %s and %s: %s", 451 450 ldb_dn_get_linearized(first_try_dn), … … 457 456 } 458 457 } else { 459 ret = samdb_replace(state->sam_ldb, mem_ctx, msg);460 if (ret != 0) {458 ret = dsdb_replace(state->sam_ldb, msg, 0); 459 if (ret != LDB_SUCCESS) { 461 460 *error_string = talloc_asprintf(mem_ctx, "Failed to modify user record %s: %s", 462 461 ldb_dn_get_linearized(msg->dn), … … 500 499 501 500 ret = ldb_delete(state->sam_ldb, msgs[0]->dn); 502 if (ret != 0) {501 if (ret != LDB_SUCCESS) { 503 502 *error_string = talloc_asprintf(mem_ctx, "Failed to delete user record %s: %s", 504 503 ldb_dn_get_linearized(msgs[0]->dn), … … 580 579 581 580 if (add) { 582 samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 583 "objectClass", obj_class); 581 ldb_msg_add_string(msg, "objectClass", obj_class); 584 582 msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]); 585 583 ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container); … … 589 587 590 588 ret = ldb_add(state->sam_ldb, msg); 591 if (ret != 0) {589 if (ret != LDB_SUCCESS) { 592 590 *error_string = talloc_asprintf(mem_ctx, "Failed to create group record %s: %s", 593 591 ldb_dn_get_linearized(msg->dn), … … 596 594 } 597 595 } else { 598 ret = samdb_replace(state->sam_ldb, mem_ctx, msg);599 if (ret != 0) {596 ret = dsdb_replace(state->sam_ldb, msg, 0); 597 if (ret != LDB_SUCCESS) { 600 598 *error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s", 601 599 ldb_dn_get_linearized(msg->dn), … … 639 637 640 638 ret = ldb_delete(state->sam_ldb, msgs[0]->dn); 641 if (ret != 0) {639 if (ret != LDB_SUCCESS) { 642 640 *error_string = talloc_asprintf(mem_ctx, "Failed to delete group record %s: %s", 643 641 ldb_dn_get_linearized(msgs[0]->dn), … … 661 659 int ret; 662 660 const char *attrs[] = { NULL }; 663 int i; 661 const char *str_dn; 662 uint32_t i; 664 663 665 664 msg = ldb_msg_new(mem_ctx); … … 705 704 return NT_STATUS_INTERNAL_DB_CORRUPTION; 706 705 } else { 707 samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, "member", ldb_dn_alloc_linearized(mem_ctx, msgs[0]->dn)); 706 str_dn = ldb_dn_alloc_linearized(msg, msgs[0]->dn); 707 NT_STATUS_HAVE_NO_MEMORY(str_dn); 708 ret = ldb_msg_add_string(msg, "member", str_dn); 709 if (ret != LDB_SUCCESS) return NT_STATUS_NO_MEMORY; 708 710 } 709 711 … … 711 713 } 712 714 713 ret = samdb_replace(state->sam_ldb, mem_ctx, msg);714 if (ret != 0) {715 ret = dsdb_replace(state->sam_ldb, msg, 0); 716 if (ret != LDB_SUCCESS) { 715 717 *error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s", 716 718 ldb_dn_get_linearized(msg->dn), … … 794 796 795 797 if (add) { 796 samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 797 "objectClass", obj_class); 798 ldb_msg_add_string(msg, "objectClass", obj_class); 798 799 msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]); 799 800 ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container); … … 803 804 804 805 ret = ldb_add(state->sam_ldb, msg); 805 if (ret != 0) {806 if (ret != LDB_SUCCESS) { 806 807 *error_string = talloc_asprintf(mem_ctx, "Failed to create alias record %s: %s", 807 808 ldb_dn_get_linearized(msg->dn), … … 810 811 } 811 812 } else { 812 ret = samdb_replace(state->sam_ldb, mem_ctx, msg);813 if (ret != 0) {813 ret = dsdb_replace(state->sam_ldb, msg, 0); 814 if (ret != LDB_SUCCESS) { 814 815 *error_string = talloc_asprintf(mem_ctx, "Failed to modify alias record %s: %s", 815 816 ldb_dn_get_linearized(msg->dn), … … 848 849 849 850 ret = ldb_delete(state->sam_ldb, msgs[0]->dn); 850 if (ret != 0) {851 if (ret != LDB_SUCCESS) { 851 852 *error_string = talloc_asprintf(mem_ctx, "Failed to delete alias record %s: %s", 852 853 ldb_dn_get_linearized(msgs[0]->dn), … … 870 871 int ret; 871 872 const char *attrs[] = { NULL }; 872 int i;873 uint32_t i; 873 874 874 875 msg = ldb_msg_new(mem_ctx); … … 902 903 for (i=0; i<alias_member->sids.num_sids; i++) { 903 904 struct ldb_dn *alias_member_dn; 905 const char *str_dn; 904 906 /* search for members, in the top basedn (normal users are builtin aliases) */ 905 907 ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[SAM_DATABASE_DOMAIN], &msgs, attrs, … … 924 926 alias_member_dn = msgs[0]->dn; 925 927 } 926 samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, "member", ldb_dn_alloc_linearized(mem_ctx, alias_member_dn)); 928 str_dn = ldb_dn_alloc_linearized(msg, alias_member_dn); 929 NT_STATUS_HAVE_NO_MEMORY(str_dn); 930 ret = ldb_msg_add_string(msg, "member", str_dn); 931 if (ret != LDB_SUCCESS) return NT_STATUS_NO_MEMORY; 927 932 928 933 talloc_free(msgs); 929 934 } 930 935 931 ret = samdb_replace(state->sam_ldb, mem_ctx, msg);932 if (ret != 0) {936 ret = dsdb_replace(state->sam_ldb, msg, 0); 937 if (ret != LDB_SUCCESS) { 933 938 *error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s", 934 939 ldb_dn_get_linearized(msg->dn), … … 950 955 951 956 struct ldb_message *msg; 952 struct ldb_message **msgs;953 struct ldb_dn *privilege_dn;954 957 int ret; 955 const char *attrs[] = { NULL };956 int i;958 uint32_t i; 959 char *dnstr, *sidstr; 957 960 958 961 msg = ldb_msg_new(mem_ctx); … … 961 964 } 962 965 963 /* search for the account, by sid, in the top basedn */ 964 ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[SAM_DATABASE_DOMAIN], &msgs, attrs, 965 "(objectSid=%s)", ldap_encode_ndr_dom_sid(mem_ctx, sid)); 966 967 if (ret == -1) { 968 *error_string = talloc_asprintf(mem_ctx, "gendb_search failed: %s", ldb_errstring(state->sam_ldb)); 969 return NT_STATUS_INTERNAL_DB_CORRUPTION; 970 } else if (ret == 0) { 971 NTSTATUS nt_status; 972 nt_status = samsync_ldb_add_foreignSecurityPrincipal(mem_ctx, state, 973 sid, 974 &privilege_dn, 975 error_string); 976 privilege_dn = talloc_steal(msg, privilege_dn); 977 if (!NT_STATUS_IS_OK(nt_status)) { 978 return nt_status; 979 } 980 } else if (ret > 1) { 981 *error_string = talloc_asprintf(mem_ctx, "More than one account with SID: %s", 982 dom_sid_string(mem_ctx, sid)); 983 return NT_STATUS_INTERNAL_DB_CORRUPTION; 984 } else { 985 privilege_dn = talloc_steal(msg, msgs[0]->dn); 986 } 987 988 msg->dn = privilege_dn; 966 sidstr = dom_sid_string(msg, sid); 967 NT_STATUS_HAVE_NO_MEMORY_AND_FREE(sidstr, msg); 968 969 dnstr = talloc_asprintf(msg, "sid=%s", sidstr); 970 NT_STATUS_HAVE_NO_MEMORY_AND_FREE(dnstr, msg); 971 972 msg->dn = ldb_dn_new(msg, state->pdb, dnstr); 973 NT_STATUS_HAVE_NO_MEMORY_AND_FREE(msg->dn, msg); 989 974 990 975 for (i=0; i< account->privilege_entries; i++) { 991 samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, "privilege", 992 account->privilege_name[i].string); 993 } 994 995 ret = samdb_replace(state->sam_ldb, mem_ctx, msg); 996 if (ret != 0) { 976 ldb_msg_add_string(msg, "privilege", account->privilege_name[i].string); 977 } 978 979 ret = dsdb_replace(state->pdb, msg, 0); 980 if (ret == LDB_ERR_NO_SUCH_OBJECT) { 981 if (samdb_msg_add_dom_sid(state->pdb, msg, msg, "objectSid", sid) != LDB_SUCCESS) { 982 talloc_free(msg); 983 return NT_STATUS_NO_MEMORY; 984 } 985 ldb_msg_add_string(msg, "comment", "added via samsync"); 986 ret = ldb_add(state->pdb, msg); 987 } 988 989 if (ret != LDB_SUCCESS) { 997 990 *error_string = talloc_asprintf(mem_ctx, "Failed to modify privilege record %s", 998 991 ldb_dn_get_linearized(msg->dn)); … … 1042 1035 "privilege"); 1043 1036 1044 ret = samdb_replace(state->sam_ldb, mem_ctx, msg);1045 if (ret != 0) {1037 ret = dsdb_replace(state->sam_ldb, msg, 0); 1038 if (ret != LDB_SUCCESS) { 1046 1039 *error_string = talloc_asprintf(mem_ctx, "Failed to modify privilege record %s", 1047 1040 ldb_dn_get_linearized(msg->dn)); … … 1199 1192 1200 1193 state->remote_ldb = ldb_wrap_connect(mem_ctx, 1201 state->samsync_state->machine_net_ctx->event_ctx,1202 state->samsync_state->machine_net_ctx->lp_ctx, 1194 NULL, 1195 state->samsync_state->machine_net_ctx->lp_ctx, 1203 1196 ldap_url, 1204 1197 NULL, state->samsync_state->machine_net_ctx->cred, 1205 0 , NULL);1198 0); 1206 1199 if (!state->remote_ldb) { 1207 1200 *error_string = talloc_asprintf(mem_ctx, "Failed to connect to remote LDAP server at %s (used to extract additional data in SamSync replication)", ldap_url); … … 1229 1222 state->sam_ldb = samdb_connect(mem_ctx, 1230 1223 ctx->event_ctx, 1231 ctx->lp_ctx, 1232 r->in.session_info); 1224 ctx->lp_ctx, 1225 r->in.session_info, 1226 0); 1227 if (!state->sam_ldb) { 1228 return NT_STATUS_INTERNAL_DB_ERROR; 1229 } 1230 1231 state->pdb = privilege_connect(mem_ctx, 1232 ctx->lp_ctx); 1233 if (!state->pdb) { 1234 return NT_STATUS_INTERNAL_DB_ERROR; 1235 } 1233 1236 1234 1237 r2.out.error_string = NULL; -
vendor/current/source4/libnet/libnet_share.c
r414 r740 90 90 s.out.totalentries = &totalentries; 91 91 92 status = dcerpc_srvsvc_NetShareEnumAll (c.out.dcerpc_pipe, mem_ctx, &s);92 status = dcerpc_srvsvc_NetShareEnumAll_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &s); 93 93 94 94 if (!NT_STATUS_IS_OK(status)) { … … 145 145 s.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", r->in.server_name); 146 146 147 status = dcerpc_srvsvc_NetShareAdd (c.out.dcerpc_pipe, mem_ctx, &s);147 status = dcerpc_srvsvc_NetShareAdd_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &s); 148 148 149 149 if (!NT_STATUS_IS_OK(status)) { … … 193 193 s.in.share_name = r->in.share_name; 194 194 195 status = dcerpc_srvsvc_NetShareDel (c.out.dcerpc_pipe, mem_ctx, &s);195 status = dcerpc_srvsvc_NetShareDel_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &s); 196 196 if (!NT_STATUS_IS_OK(status)) { 197 197 r->out.error_string = talloc_asprintf(mem_ctx, -
vendor/current/source4/libnet/libnet_site.c
r414 r740 21 21 #include "libnet/libnet.h" 22 22 #include "libcli/cldap/cldap.h" 23 #include "lib/ldb/include/ldb.h" 24 #include "lib/ldb/include/ldb_errors.h" 25 #include "librpc/rpc/dcerpc.h" 23 #include <ldb.h> 24 #include <ldb_errors.h> 26 25 #include "libcli/resolve/resolve.h" 27 26 #include "param/param.h" 27 #include "lib/tsocket/tsocket.h" 28 28 29 29 /** … … 42 42 struct cldap_socket *cldap = NULL; 43 43 struct cldap_netlogon search; 44 int ret; 45 struct tsocket_address *dest_address; 44 46 45 47 tmp_ctx = talloc_named(ctx, 0, "libnet_FindSite temp context"); … … 51 53 /* Resolve the site name. */ 52 54 ZERO_STRUCT(search); 53 search.in.dest_address = r->in.dest_address;54 search.in.dest_port = r->in.cldap_port;55 search.in.dest_address = NULL; 56 search.in.dest_port = 0; 55 57 search.in.acct_control = -1; 56 58 search.in.version = NETLOGON_NT_VERSION_5 | NETLOGON_NT_VERSION_5EX; 57 59 search.in.map_response = true; 58 60 61 ret = tsocket_address_inet_from_strings(tmp_ctx, "ip", 62 r->in.dest_address, 63 r->in.cldap_port, 64 &dest_address); 65 if (ret != 0) { 66 r->out.error_string = NULL; 67 status = map_nt_error_from_unix(errno); 68 return status; 69 } 70 59 71 /* we want to use non async calls, so we're not passing an event context */ 60 status = cldap_socket_init(tmp_ctx, NULL, NULL, NULL, &cldap);//TODO72 status = cldap_socket_init(tmp_ctx, NULL, NULL, dest_address, &cldap); 61 73 if (!NT_STATUS_IS_OK(status)) { 62 74 talloc_free(tmp_ctx); … … 64 76 return status; 65 77 } 66 status = cldap_netlogon(cldap, lp_iconv_convenience(lctx->lp_ctx),tmp_ctx, &search);78 status = cldap_netlogon(cldap, tmp_ctx, &search); 67 79 if (!NT_STATUS_IS_OK(status) 68 80 || !search.out.netlogon.data.nt5_ex.client_site) { … … 157 169 158 170 make_nbt_name_client(&name, libnet_r->out.samr_binding->host); 159 status = resolve_name(lp _resolve_context(ctx->lp_ctx), &name, r, &dest_addr, ctx->event_ctx);171 status = resolve_name(lpcfg_resolve_context(ctx->lp_ctx), &name, r, &dest_addr, ctx->event_ctx); 160 172 if (!NT_STATUS_IS_OK(status)) { 161 173 libnet_r->out.error_string = NULL; … … 168 180 r->in.netbios_name = libnet_r->in.netbios_name; 169 181 r->in.domain_dn_str = libnet_r->out.domain_dn_str; 170 r->in.cldap_port = lp _cldap_port(ctx->lp_ctx);182 r->in.cldap_port = lpcfg_cldap_port(ctx->lp_ctx); 171 183 172 184 status = libnet_FindSite(tmp_ctx, ctx, r); … … 192 204 193 205 rtn = ldb_msg_add_string(msg, "objectClass", "server"); 194 if (rtn != 0) {206 if (rtn != LDB_SUCCESS) { 195 207 libnet_r->out.error_string = NULL; 196 208 talloc_free(tmp_ctx); … … 198 210 } 199 211 rtn = ldb_msg_add_string(msg, "systemFlags", "50000000"); 200 if (rtn != 0) {212 if (rtn != LDB_SUCCESS) { 201 213 libnet_r->out.error_string = NULL; 202 214 talloc_free(tmp_ctx); … … 204 216 } 205 217 rtn = ldb_msg_add_string(msg, "serverReference", libnet_r->out.account_dn_str); 206 if (rtn != 0) {218 if (rtn != LDB_SUCCESS) { 207 219 libnet_r->out.error_string = NULL; 208 220 talloc_free(tmp_ctx); … … 223 235 rtn = ldb_add(remote_ldb, msg); 224 236 if (rtn == LDB_ERR_ENTRY_ALREADY_EXISTS) { 225 int i;237 unsigned int i; 226 238 227 239 /* make a 'modify' msg, and only for serverReference */ … … 235 247 236 248 rtn = ldb_msg_add_string(msg, "serverReference",libnet_r->out.account_dn_str); 237 if (rtn != 0) {249 if (rtn != LDB_SUCCESS) { 238 250 libnet_r->out.error_string = NULL; 239 251 talloc_free(tmp_ctx); … … 248 260 249 261 rtn = ldb_modify(remote_ldb, msg); 250 if (rtn != 0) {262 if (rtn != LDB_SUCCESS) { 251 263 libnet_r->out.error_string 252 264 = talloc_asprintf(libnet_r, … … 257 269 return NT_STATUS_INTERNAL_DB_CORRUPTION; 258 270 } 259 } else if (rtn != 0) {271 } else if (rtn != LDB_SUCCESS) { 260 272 libnet_r->out.error_string 261 273 = talloc_asprintf(libnet_r, -
vendor/current/source4/libnet/libnet_time.c
r414 r740 55 55 56 56 /* 2. try srvsvc_NetRemoteTOD */ 57 status = dcerpc_srvsvc_NetRemoteTOD (c.out.dcerpc_pipe, mem_ctx, &tod);57 status = dcerpc_srvsvc_NetRemoteTOD_r(c.out.dcerpc_pipe->binding_handle, mem_ctx, &tod); 58 58 if (!NT_STATUS_IS_OK(status)) { 59 59 r->srvsvc.out.error_string = talloc_asprintf(mem_ctx, -
vendor/current/source4/libnet/libnet_unbecome_dc.c
r414 r740 22 22 #include "libcli/composite/composite.h" 23 23 #include "libcli/cldap/cldap.h" 24 #include "lib/ldb/include/ldb.h"25 #include "lib/ldb/include/ldb_errors.h"26 #include "l ib/ldb_wrap.h"24 #include <ldb.h> 25 #include <ldb_errors.h> 26 #include "ldb_wrap.h" 27 27 #include "dsdb/samdb/samdb.h" 28 28 #include "../libds/common/flags.h" 29 29 #include "librpc/gen_ndr/ndr_drsuapi_c.h" 30 30 #include "param/param.h" 31 #include "lib/tsocket/tsocket.h" 31 32 32 33 /***************************************************************************** … … 204 205 struct dcerpc_binding *binding; 205 206 struct dcerpc_pipe *pipe; 207 struct dcerpc_binding_handle *drsuapi_handle; 206 208 struct drsuapi_DsBind bind_r; 207 209 struct GUID bind_guid; … … 257 259 struct composite_context *c = s->creq; 258 260 struct tevent_req *req; 259 260 s->cldap.io.in.dest_address = s->source_dsa.address; 261 s->cldap.io.in.dest_port = lp_cldap_port(s->libnet->lp_ctx); 261 struct tsocket_address *dest_address; 262 int ret; 263 264 s->cldap.io.in.dest_address = NULL; 265 s->cldap.io.in.dest_port = 0; 262 266 s->cldap.io.in.realm = s->domain.dns_name; 263 267 s->cldap.io.in.host = s->dest_dsa.netbios_name; … … 269 273 s->cldap.io.in.map_response = true; 270 274 275 ret = tsocket_address_inet_from_strings(s, "ip", 276 s->source_dsa.address, 277 lpcfg_cldap_port(s->libnet->lp_ctx), 278 &dest_address); 279 if (ret != 0) { 280 c->status = map_nt_error_from_unix(errno); 281 if (!composite_is_ok(c)) return; 282 } 283 271 284 c->status = cldap_socket_init(s, s->libnet->event_ctx, 272 NULL, NULL, &s->cldap.sock);//TODO285 NULL, dest_address, &s->cldap.sock); 273 286 if (!composite_is_ok(c)) return; 274 287 … … 286 299 struct composite_context *c = s->creq; 287 300 288 c->status = cldap_netlogon_recv(req, 289 lp_iconv_convenience(s->libnet->lp_ctx), 290 s, &s->cldap.io); 301 c->status = cldap_netlogon_recv(req, s, &s->cldap.io); 291 302 talloc_free(req); 292 303 if (!composite_is_ok(c)) return; … … 295 306 296 307 s->domain.dns_name = s->cldap.netlogon.dns_domain; 297 s->domain.netbios_name = s->cldap.netlogon.domain ;308 s->domain.netbios_name = s->cldap.netlogon.domain_name; 298 309 s->domain.guid = s->cldap.netlogon.domain_uuid; 299 310 … … 317 328 NULL, 318 329 s->libnet->cred, 319 0 , NULL);330 0); 320 331 talloc_free(url); 321 332 if (s->ldap.ldb == NULL) { … … 393 404 } 394 405 395 s->dest_dsa.computer_dn_str = samdb_result_string(r->msgs[0], "distinguishedName", NULL);406 s->dest_dsa.computer_dn_str = ldb_msg_find_attr_as_string(r->msgs[0], "distinguishedName", NULL); 396 407 if (!s->dest_dsa.computer_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE; 397 408 talloc_steal(s, s->dest_dsa.computer_dn_str); 398 409 399 s->dest_dsa.user_account_control = samdb_result_uint(r->msgs[0], "userAccountControl", 0);410 s->dest_dsa.user_account_control = ldb_msg_find_attr_as_uint(r->msgs[0], "userAccountControl", 0); 400 411 401 412 talloc_free(r); … … 408 419 struct ldb_message *msg; 409 420 uint32_t user_account_control = UF_WORKSTATION_TRUST_ACCOUNT; 410 u int32_t i;421 unsigned int i; 411 422 412 423 /* as the value is already as we want it to be, we're done */ … … 421 432 NT_STATUS_HAVE_NO_MEMORY(msg->dn); 422 433 423 ret = ldb_msg_add_fmt(msg, "userAccountControl", "%u", user_account_control); 424 if (ret != 0) { 434 ret = samdb_msg_add_uint(s->ldap.ldb, msg, msg, "userAccountControl", 435 user_account_control); 436 if (ret != LDB_SUCCESS) { 425 437 talloc_free(msg); 426 438 return NT_STATUS_NO_MEMORY; … … 556 568 if (!composite_is_ok(c)) return; 557 569 570 s->drsuapi.drsuapi_handle = s->drsuapi.pipe->binding_handle; 571 558 572 unbecomeDC_drsuapi_bind_send(s); 559 573 } 560 574 561 static void unbecomeDC_drsuapi_bind_recv(struct rpc_request *req);575 static void unbecomeDC_drsuapi_bind_recv(struct tevent_req *subreq); 562 576 563 577 static void unbecomeDC_drsuapi_bind_send(struct libnet_UnbecomeDC_state *s) 564 578 { 565 579 struct composite_context *c = s->creq; 566 struct rpc_request *req;567 580 struct drsuapi_DsBindInfo28 *bind_info28; 581 struct tevent_req *subreq; 568 582 569 583 GUID_from_string(DRSUAPI_DS_BIND_GUID, &s->drsuapi.bind_guid); … … 582 596 s->drsuapi.bind_r.out.bind_handle = &s->drsuapi.bind_handle; 583 597 584 req = dcerpc_drsuapi_DsBind_send(s->drsuapi.pipe, s, &s->drsuapi.bind_r); 585 composite_continue_rpc(c, req, unbecomeDC_drsuapi_bind_recv, s); 598 subreq = dcerpc_drsuapi_DsBind_r_send(s, c->event_ctx, 599 s->drsuapi.drsuapi_handle, 600 &s->drsuapi.bind_r); 601 if (composite_nomem(subreq, c)) return; 602 tevent_req_set_callback(subreq, unbecomeDC_drsuapi_bind_recv, s); 586 603 } 587 604 588 605 static void unbecomeDC_drsuapi_remove_ds_server_send(struct libnet_UnbecomeDC_state *s); 589 606 590 static void unbecomeDC_drsuapi_bind_recv(struct rpc_request *req)591 { 592 struct libnet_UnbecomeDC_state *s = t alloc_get_type(req->async.private_data,607 static void unbecomeDC_drsuapi_bind_recv(struct tevent_req *subreq) 608 { 609 struct libnet_UnbecomeDC_state *s = tevent_req_callback_data(subreq, 593 610 struct libnet_UnbecomeDC_state); 594 611 struct composite_context *c = s->creq; 595 612 596 c->status = dcerpc_ndr_request_recv(req); 613 c->status = dcerpc_drsuapi_DsBind_r_recv(subreq, s); 614 TALLOC_FREE(subreq); 597 615 if (!composite_is_ok(c)) return; 598 616 … … 632 650 } 633 651 634 static void unbecomeDC_drsuapi_remove_ds_server_recv(struct rpc_request *req);652 static void unbecomeDC_drsuapi_remove_ds_server_recv(struct tevent_req *subreq); 635 653 636 654 static void unbecomeDC_drsuapi_remove_ds_server_send(struct libnet_UnbecomeDC_state *s) 637 655 { 638 656 struct composite_context *c = s->creq; 639 struct rpc_request *req;640 657 struct drsuapi_DsRemoveDSServer *r = &s->drsuapi.rm_ds_srv_r; 658 struct tevent_req *subreq; 641 659 642 660 r->in.bind_handle = &s->drsuapi.bind_handle; … … 647 665 r->in.req->req1.commit = true; 648 666 649 r->out.level_out = talloc(s, int32_t);667 r->out.level_out = talloc(s, uint32_t); 650 668 r->out.res = talloc(s, union drsuapi_DsRemoveDSServerResult); 651 669 652 req = dcerpc_drsuapi_DsRemoveDSServer_send(s->drsuapi.pipe, s, r); 653 composite_continue_rpc(c, req, unbecomeDC_drsuapi_remove_ds_server_recv, s); 654 } 655 656 static void unbecomeDC_drsuapi_remove_ds_server_recv(struct rpc_request *req) 657 { 658 struct libnet_UnbecomeDC_state *s = talloc_get_type(req->async.private_data, 670 subreq = dcerpc_drsuapi_DsRemoveDSServer_r_send(s, c->event_ctx, 671 s->drsuapi.drsuapi_handle, 672 r); 673 if (composite_nomem(subreq, c)) return; 674 tevent_req_set_callback(subreq, unbecomeDC_drsuapi_remove_ds_server_recv, s); 675 } 676 677 static void unbecomeDC_drsuapi_remove_ds_server_recv(struct tevent_req *subreq) 678 { 679 struct libnet_UnbecomeDC_state *s = tevent_req_callback_data(subreq, 659 680 struct libnet_UnbecomeDC_state); 660 681 struct composite_context *c = s->creq; 661 682 struct drsuapi_DsRemoveDSServer *r = &s->drsuapi.rm_ds_srv_r; 662 683 663 c->status = dcerpc_ndr_request_recv(req); 684 c->status = dcerpc_drsuapi_DsRemoveDSServer_r_recv(subreq, s); 685 TALLOC_FREE(subreq); 664 686 if (!composite_is_ok(c)) return; 665 687 -
vendor/current/source4/libnet/libnet_user.c
r414 r740 179 179 } 180 180 181 talloc_free(c); 181 182 return status; 182 183 } … … 347 348 } 348 349 350 talloc_free(c); 349 351 return status; 350 352 } … … 573 575 { 574 576 NTSTATUS status = composite_wait(c); 577 578 talloc_free(c); 575 579 return status; 576 580 } … … 869 873 870 874 talloc_free(c); 871 872 875 return status; 873 876 } … … 910 913 911 914 static void continue_lsa_domain_opened(struct composite_context *ctx); 912 static void continue_domain_queried(struct rpc_request *req);915 static void continue_domain_queried(struct tevent_req *subreq); 913 916 static void continue_samr_domain_opened(struct composite_context *ctx); 914 static void continue_users_enumerated(struct rpc_request *req);917 static void continue_users_enumerated(struct tevent_req *subreq); 915 918 916 919 … … 931 934 struct composite_context *c; 932 935 struct userlist_state *s; 933 struct rpc_request *query_req;936 struct tevent_req *subreq; 934 937 bool prereq_met = false; 935 938 … … 962 965 963 966 /* send the request */ 964 query_req = dcerpc_lsa_QueryInfoPolicy_send(ctx->lsa.pipe, c, &s->query_domain); 965 if (composite_nomem(query_req, c)) return c; 966 967 composite_continue_rpc(c, query_req, continue_domain_queried, c); 967 subreq = dcerpc_lsa_QueryInfoPolicy_r_send(s, c->event_ctx, 968 ctx->lsa.pipe->binding_handle, 969 &s->query_domain); 970 if (composite_nomem(subreq, c)) return c; 971 972 tevent_req_set_callback(subreq, continue_domain_queried, c); 968 973 return c; 969 974 } … … 978 983 struct composite_context *c; 979 984 struct userlist_state *s; 980 struct rpc_request *query_req;985 struct tevent_req *subreq; 981 986 982 987 c = talloc_get_type(ctx->async.private_data, struct composite_context); … … 994 999 995 1000 /* send the request */ 996 query_req = dcerpc_lsa_QueryInfoPolicy_send(s->ctx->lsa.pipe, c, &s->query_domain); 997 if (composite_nomem(query_req, c)) return; 998 999 composite_continue_rpc(c, query_req, continue_domain_queried, c); 1001 subreq = dcerpc_lsa_QueryInfoPolicy_r_send(s, c->event_ctx, 1002 s->ctx->lsa.pipe->binding_handle, 1003 &s->query_domain); 1004 if (composite_nomem(subreq, c)) return; 1005 1006 tevent_req_set_callback(subreq, continue_domain_queried, c); 1000 1007 } 1001 1008 … … 1005 1012 * provided a valid samr handle is opened 1006 1013 */ 1007 static void continue_domain_queried(struct rpc_request *req)1014 static void continue_domain_queried(struct tevent_req *subreq) 1008 1015 { 1009 1016 struct composite_context *c; 1010 1017 struct userlist_state *s; 1011 struct rpc_request *enum_req;1012 1018 bool prereq_met = false; 1013 1019 1014 c = t alloc_get_type(req->async.private_data, struct composite_context);1020 c = tevent_req_callback_data(subreq, struct composite_context); 1015 1021 s = talloc_get_type(c->private_data, struct userlist_state); 1016 1022 1017 1023 /* receive result of rpc request */ 1018 c->status = dcerpc_ndr_request_recv(req); 1024 c->status = dcerpc_lsa_QueryInfoPolicy_r_recv(subreq, s); 1025 TALLOC_FREE(subreq); 1019 1026 if (!composite_is_ok(c)) return; 1020 1027 … … 1039 1046 1040 1047 /* send the request */ 1041 enum_req = dcerpc_samr_EnumDomainUsers_send(s->ctx->samr.pipe, c, &s->user_list); 1042 if (composite_nomem(enum_req, c)) return; 1043 1044 composite_continue_rpc(c, enum_req, continue_users_enumerated, c); 1048 subreq = dcerpc_samr_EnumDomainUsers_r_send(s, c->event_ctx, 1049 s->ctx->samr.pipe->binding_handle, 1050 &s->user_list); 1051 if (composite_nomem(subreq, c)) return; 1052 1053 tevent_req_set_callback(subreq, continue_users_enumerated, c); 1045 1054 } 1046 1055 … … 1054 1063 struct composite_context *c; 1055 1064 struct userlist_state *s; 1056 struct rpc_request *enum_req;1065 struct tevent_req *subreq; 1057 1066 1058 1067 c = talloc_get_type(ctx->async.private_data, struct composite_context); … … 1075 1084 1076 1085 /* send the request */ 1077 enum_req = dcerpc_samr_EnumDomainUsers_send(s->ctx->samr.pipe, c, &s->user_list); 1078 if (composite_nomem(enum_req, c)) return; 1079 1080 composite_continue_rpc(c, enum_req, continue_users_enumerated, c); 1086 subreq = dcerpc_samr_EnumDomainUsers_r_send(s, c->event_ctx, 1087 s->ctx->samr.pipe->binding_handle, 1088 &s->user_list); 1089 if (composite_nomem(subreq, c)) return; 1090 1091 tevent_req_set_callback(subreq, continue_users_enumerated, c); 1081 1092 } 1082 1093 … … 1085 1096 * Stage 2: receive enumerated users and their rids 1086 1097 */ 1087 static void continue_users_enumerated(struct rpc_request *req)1098 static void continue_users_enumerated(struct tevent_req *subreq) 1088 1099 { 1089 1100 struct composite_context *c; 1090 1101 struct userlist_state *s; 1091 int i;1092 1093 c = t alloc_get_type(req->async.private_data, struct composite_context);1102 uint32_t i; 1103 1104 c = tevent_req_callback_data(subreq, struct composite_context); 1094 1105 s = talloc_get_type(c->private_data, struct userlist_state); 1095 1106 1096 1107 /* receive result of rpc request */ 1097 c->status = dcerpc_ndr_request_recv(req); 1108 c->status = dcerpc_samr_EnumDomainUsers_r_recv(subreq, s); 1109 TALLOC_FREE(subreq); 1098 1110 if (!composite_is_ok(c)) return; 1099 1111 … … 1127 1139 1128 1140 /* username */ 1129 s->users[i].username = talloc_strdup( c, entry->name.string);1141 s->users[i].username = talloc_strdup(s->users, entry->name.string); 1130 1142 if (composite_nomem(s->users[i].username, c)) return; 1131 1143 1132 1144 /* sid string */ 1133 s->users[i].sid = dom_sid_string( c, user_sid);1145 s->users[i].sid = dom_sid_string(s->users, user_sid); 1134 1146 if (composite_nomem(s->users[i].sid, c)) return; 1135 1147 } … … 1160 1172 1161 1173 if (c == NULL || mem_ctx == NULL || r == NULL) { 1174 talloc_free(c); 1162 1175 return NT_STATUS_INVALID_PARAMETER; 1163 1176 } 1164 1177 1165 1178 status = composite_wait(c); 1166 1179 if (NT_STATUS_IS_OK(status) || … … 1187 1200 } 1188 1201 1202 talloc_free(c); 1189 1203 return status; 1190 1204 } -
vendor/current/source4/libnet/libnet_vampire.c
r414 r740 28 28 #include "dsdb/samdb/samdb.h" 29 29 #include "../lib/util/dlinklist.h" 30 #include "lib/ldb/include/ldb.h"31 #include "lib/ldb/include/ldb_errors.h"30 #include <ldb.h> 31 #include <ldb_errors.h> 32 32 #include "librpc/ndr/libndr.h" 33 33 #include "librpc/gen_ndr/ndr_drsuapi.h" … … 35 35 #include "librpc/gen_ndr/ndr_misc.h" 36 36 #include "system/time.h" 37 #include "l ib/ldb_wrap.h"37 #include "ldb_wrap.h" 38 38 #include "auth/auth.h" 39 #include "auth/credentials/credentials.h" 39 40 #include "param/param.h" 40 41 #include "param/provision.h" 41 #include "libcli/security/dom_sid.h" 42 #include "libcli/security/security.h" 43 #include "dsdb/common/util.h" 42 44 43 45 /* … … 54 56 55 57 */ 56 struct vampire_state {58 struct libnet_vampire_cb_state { 57 59 const char *netbios_name; 58 struct libnet_JoinDomain *join; 60 const char *domain_name; 61 const char *realm; 59 62 struct cli_credentials *machine_account; 63 64 /* Schema loaded from local LDIF files */ 65 struct dsdb_schema *provision_schema; 66 67 /* 1st pass, with some OIDs/attribute names/class names not 68 * converted, because we may not know them yet */ 60 69 struct dsdb_schema *self_made_schema; 70 71 /* prefixMap in LDB format, from the remote DRS server */ 72 DATA_BLOB prefixmap_blob; 61 73 const struct dsdb_schema *schema; 62 74 … … 75 87 unsigned total_objects; 76 88 char *last_partition; 89 const char *server_dn_str; 77 90 }; 78 91 79 static NTSTATUS vampire_prepare_db(void *private_data, 80 const struct libnet_BecomeDC_PrepareDB *p) 81 { 82 struct vampire_state *s = talloc_get_type(private_data, struct vampire_state); 92 /* initialise a state structure ready for replication of chunks */ 93 void *libnet_vampire_replicate_init(TALLOC_CTX *mem_ctx, 94 struct ldb_context *samdb, 95 struct loadparm_context *lp_ctx) 96 { 97 struct libnet_vampire_cb_state *s = talloc_zero(mem_ctx, struct libnet_vampire_cb_state); 98 if (!s) { 99 return NULL; 100 } 101 102 s->ldb = samdb; 103 s->lp_ctx = lp_ctx; 104 s->provision_schema = dsdb_get_schema(s->ldb, s); 105 s->schema = s->provision_schema; 106 s->netbios_name = lpcfg_netbios_name(lp_ctx); 107 s->domain_name = lpcfg_workgroup(lp_ctx); 108 s->realm = lpcfg_realm(lp_ctx); 109 110 return s; 111 } 112 113 /* Caller is expected to keep supplied pointers around for the lifetime of the structure */ 114 void *libnet_vampire_cb_state_init(TALLOC_CTX *mem_ctx, 115 struct loadparm_context *lp_ctx, struct tevent_context *event_ctx, 116 const char *netbios_name, const char *domain_name, const char *realm, 117 const char *targetdir) 118 { 119 struct libnet_vampire_cb_state *s = talloc_zero(mem_ctx, struct libnet_vampire_cb_state); 120 if (!s) { 121 return NULL; 122 } 123 124 s->lp_ctx = lp_ctx; 125 s->event_ctx = event_ctx; 126 s->netbios_name = netbios_name; 127 s->domain_name = domain_name; 128 s->realm = realm; 129 s->targetdir = targetdir; 130 return s; 131 } 132 133 struct ldb_context *libnet_vampire_cb_ldb(struct libnet_vampire_cb_state *state) 134 { 135 state = talloc_get_type_abort(state, struct libnet_vampire_cb_state); 136 return state->ldb; 137 } 138 139 struct loadparm_context *libnet_vampire_cb_lp_ctx(struct libnet_vampire_cb_state *state) 140 { 141 state = talloc_get_type_abort(state, struct libnet_vampire_cb_state); 142 return state->lp_ctx; 143 } 144 145 NTSTATUS libnet_vampire_cb_prepare_db(void *private_data, 146 const struct libnet_BecomeDC_PrepareDB *p) 147 { 148 struct libnet_vampire_cb_state *s = talloc_get_type(private_data, struct libnet_vampire_cb_state); 83 149 struct provision_settings settings; 84 150 struct provision_result result; … … 92 158 settings.schema_dn_str = p->forest->schema_dn_str; 93 159 settings.netbios_name = p->dest_dsa->netbios_name; 94 settings.realm = s-> join->out.realm;95 settings.domain = s-> join->out.domain_name;160 settings.realm = s->realm; 161 settings.domain = s->domain_name; 96 162 settings.server_dn_str = p->dest_dsa->server_dn_str; 97 settings.machine_password = generate_random_ str(s, 16);163 settings.machine_password = generate_random_password(s, 16, 255); 98 164 settings.targetdir = s->targetdir; 99 165 … … 104 170 } 105 171 106 s->ldb = result.samdb; 107 s->lp_ctx = result.lp_ctx; 172 s->ldb = talloc_steal(s, result.samdb); 173 s->lp_ctx = talloc_reparent(talloc_parent(result.lp_ctx), s, result.lp_ctx); 174 s->provision_schema = dsdb_get_schema(s->ldb, s); 175 s->server_dn_str = talloc_steal(s, p->dest_dsa->server_dn_str); 108 176 109 177 /* wrap the entire vapire operation in a transaction. This … … 125 193 } 126 194 127 static NTSTATUS vampire_check_options(void *private_data,128 129 { 130 struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);195 NTSTATUS libnet_vampire_cb_check_options(void *private_data, 196 const struct libnet_BecomeDC_CheckOptions *o) 197 { 198 struct libnet_vampire_cb_state *s = talloc_get_type(private_data, struct libnet_vampire_cb_state); 131 199 132 200 DEBUG(0,("Become DC [%s] of Domain[%s]/[%s]\n", … … 149 217 } 150 218 151 static NTSTATUS vampire_apply_schema(struct vampire_state *s, 152 const struct libnet_BecomeDC_StoreChunk *c) 153 { 219 static NTSTATUS libnet_vampire_cb_apply_schema(struct libnet_vampire_cb_state *s, 220 const struct libnet_BecomeDC_StoreChunk *c) 221 { 222 struct schema_list { 223 struct schema_list *next, *prev; 224 const struct drsuapi_DsReplicaObjectListItemEx *obj; 225 }; 226 154 227 WERROR status; 228 struct dsdb_schema_prefixmap *pfm_remote; 155 229 const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr; 156 uint32_t object_count; 230 struct schema_list *schema_list = NULL, *schema_list_item, *schema_list_next_item; 231 struct dsdb_schema *working_schema; 232 struct dsdb_schema *provision_schema; 233 uint32_t object_count = 0; 157 234 struct drsuapi_DsReplicaObjectListItemEx *first_object; 158 struct drsuapi_DsReplicaObjectListItemEx *cur;235 const struct drsuapi_DsReplicaObjectListItemEx *cur; 159 236 uint32_t linked_attributes_count; 160 237 struct drsuapi_DsReplicaLinkedAttribute *linked_attributes; 161 238 const struct drsuapi_DsReplicaCursor2CtrEx *uptodateness_vector; 162 struct dsdb_extended_replicated_objects * objs;239 struct dsdb_extended_replicated_objects *schema_objs; 163 240 struct repsFromTo1 *s_dsa; 164 241 char *tmp_dns_name; 242 struct ldb_context *schema_ldb; 165 243 struct ldb_message *msg; 166 struct ldb_val prefixMap_val;167 244 struct ldb_message_element *prefixMap_el; 168 struct ldb_val schemaInfo_val;169 245 uint32_t i; 170 int ret ;246 int ret, pass_no; 171 247 bool ok; 172 248 uint64_t seq_num; 249 uint32_t ignore_attids[] = { 250 DRSUAPI_ATTID_auxiliaryClass, 251 DRSUAPI_ATTID_mayContain, 252 DRSUAPI_ATTID_mustContain, 253 DRSUAPI_ATTID_possSuperiors, 254 DRSUAPI_ATTID_systemPossSuperiors, 255 DRSUAPI_ATTID_INVALID 256 }; 173 257 174 258 DEBUG(0,("Analyze and apply schema objects\n")); … … 206 290 } 207 291 208 s_dsa->replica_flags = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE 209 | DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP 210 | DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS; 292 status = dsdb_schema_pfm_from_drsuapi_pfm(mapping_ctr, true, 293 s, &pfm_remote, NULL); 294 if (!W_ERROR_IS_OK(status)) { 295 DEBUG(0,(__location__ ": Failed to decode remote prefixMap: %s", 296 win_errstr(status))); 297 return werror_to_ntstatus(status); 298 } 299 300 s_dsa->replica_flags = DRSUAPI_DRS_WRIT_REP 301 | DRSUAPI_DRS_INIT_SYNC 302 | DRSUAPI_DRS_PER_SYNC; 211 303 memset(s_dsa->schedule, 0x11, sizeof(s_dsa->schedule)); 212 304 … … 217 309 s_dsa->other_info->dns_name = tmp_dns_name; 218 310 311 schema_ldb = provision_get_schema(s, s->lp_ctx, &s->prefixmap_blob); 312 if (!schema_ldb) { 313 DEBUG(0,("Failed to re-load from local provision using remote prefixMap. " 314 "Will continue with local prefixMap\n")); 315 provision_schema = dsdb_get_schema(s->ldb, s); 316 } else { 317 provision_schema = dsdb_get_schema(schema_ldb, s); 318 ret = dsdb_reference_schema(s->ldb, provision_schema, false); 319 if (ret != LDB_SUCCESS) { 320 DEBUG(0,("Failed to attach schema from local provision using remote prefixMap.")); 321 return NT_STATUS_UNSUCCESSFUL; 322 } 323 talloc_free(schema_ldb); 324 } 325 326 /* create a list of objects yet to be converted */ 219 327 for (cur = first_object; cur; cur = cur->next_object) { 220 bool is_attr = false; 221 bool is_class = false; 222 223 for (i=0; i < cur->object.attribute_ctr.num_attributes; i++) { 224 struct drsuapi_DsReplicaAttribute *a; 225 uint32_t j; 226 const char *oid = NULL; 227 228 a = &cur->object.attribute_ctr.attributes[i]; 229 status = dsdb_map_int2oid(s->self_made_schema, a->attid, s, &oid); 328 schema_list_item = talloc(s, struct schema_list); 329 schema_list_item->obj = cur; 330 DLIST_ADD_END(schema_list, schema_list_item, struct schema_list); 331 } 332 333 /* resolve objects until all are resolved and in local schema */ 334 pass_no = 1; 335 working_schema = provision_schema; 336 337 while (schema_list) { 338 uint32_t converted_obj_count = 0; 339 uint32_t failed_obj_count = 0; 340 TALLOC_CTX *tmp_ctx = talloc_new(s); 341 NT_STATUS_HAVE_NO_MEMORY(tmp_ctx); 342 343 for (schema_list_item = schema_list; schema_list_item; schema_list_item=schema_list_next_item) { 344 struct dsdb_extended_replicated_object object; 345 346 cur = schema_list_item->obj; 347 348 /* Save the next item, now we have saved out 349 * the current one, so we can DLIST_REMOVE it 350 * safely */ 351 schema_list_next_item = schema_list_item->next; 352 353 /* 354 * Convert the objects into LDB messages using the 355 * schema we have so far. It's ok if we fail to convert 356 * an object. We should convert more objects on next pass. 357 */ 358 status = dsdb_convert_object_ex(s->ldb, working_schema, pfm_remote, 359 cur, c->gensec_skey, 360 ignore_attids, 361 tmp_ctx, &object); 230 362 if (!W_ERROR_IS_OK(status)) { 231 return werror_to_ntstatus(status); 363 DEBUG(1,("Warning: Failed to convert schema object %s into ldb msg\n", 364 cur->object.identifier->dn)); 365 366 failed_obj_count++; 367 } else { 368 /* 369 * Convert the schema from ldb_message format 370 * (OIDs as OID strings) into schema, using 371 * the remote prefixMap 372 */ 373 status = dsdb_schema_set_el_from_ldb_msg(s->ldb, 374 s->self_made_schema, 375 object.msg); 376 if (!W_ERROR_IS_OK(status)) { 377 DEBUG(1,("Warning: failed to convert object %s into a schema element: %s\n", 378 ldb_dn_get_linearized(object.msg->dn), 379 win_errstr(status))); 380 failed_obj_count++; 381 } else { 382 DLIST_REMOVE(schema_list, schema_list_item); 383 converted_obj_count++; 384 } 232 385 } 233 234 switch (a->attid) { 235 case DRSUAPI_ATTRIBUTE_objectClass: 236 for (j=0; j < a->value_ctr.num_values; j++) { 237 uint32_t val = 0xFFFFFFFF; 238 239 if (a->value_ctr.values[j].blob 240 && a->value_ctr.values[j].blob->length == 4) { 241 val = IVAL(a->value_ctr.values[j].blob->data,0); 242 } 243 244 if (val == DRSUAPI_OBJECTCLASS_attributeSchema) { 245 is_attr = true; 246 } 247 if (val == DRSUAPI_OBJECTCLASS_classSchema) { 248 is_class = true; 249 } 250 } 251 252 break; 253 default: 254 break; 386 } 387 talloc_free(tmp_ctx); 388 389 DEBUG(4,("Schema load pass %d: %d/%d of %d objects left to be converted.\n", 390 pass_no, failed_obj_count, converted_obj_count, object_count)); 391 pass_no++; 392 393 /* check if we converted any objects in this pass */ 394 if (converted_obj_count == 0) { 395 DEBUG(0,("Can't continue Schema load: didn't manage to convert any objects: all %d remaining of %d objects failed to convert\n", failed_obj_count, object_count)); 396 return NT_STATUS_INTERNAL_ERROR; 397 } 398 399 if (schema_list) { 400 /* prepare for another cycle */ 401 working_schema = s->self_made_schema; 402 403 ret = dsdb_setup_sorted_accessors(s->ldb, working_schema); 404 if (LDB_SUCCESS != ret) { 405 DEBUG(0,("Failed to create schema-cache indexes!\n")); 406 return NT_STATUS_INTERNAL_ERROR; 255 407 } 256 408 } 257 258 if (is_attr) { 259 struct dsdb_attribute *sa; 260 261 sa = talloc_zero(s->self_made_schema, struct dsdb_attribute); 262 NT_STATUS_HAVE_NO_MEMORY(sa); 263 264 status = dsdb_attribute_from_drsuapi(s->ldb, s->self_made_schema, &cur->object, s, sa); 265 if (!W_ERROR_IS_OK(status)) { 266 return werror_to_ntstatus(status); 267 } 268 269 DLIST_ADD_END(s->self_made_schema->attributes, sa, struct dsdb_attribute *); 270 } 271 272 if (is_class) { 273 struct dsdb_class *sc; 274 275 sc = talloc_zero(s->self_made_schema, struct dsdb_class); 276 NT_STATUS_HAVE_NO_MEMORY(sc); 277 278 status = dsdb_class_from_drsuapi(s->self_made_schema, &cur->object, s, sc); 279 if (!W_ERROR_IS_OK(status)) { 280 return werror_to_ntstatus(status); 281 } 282 283 DLIST_ADD_END(s->self_made_schema->classes, sc, struct dsdb_class *); 284 } 285 } 286 287 /* attach the schema to the ldb */ 409 }; 410 411 /* free temp objects for 1st conversion phase */ 412 talloc_unlink(s, provision_schema); 413 TALLOC_FREE(schema_list); 414 415 /* 416 * attach the schema we just brought over DRS to the ldb, 417 * so we can use it in dsdb_convert_object_ex below 418 */ 288 419 ret = dsdb_set_schema(s->ldb, s->self_made_schema); 289 420 if (ret != LDB_SUCCESS) { 421 DEBUG(0,("Failed to attach working schema from DRS.\n")); 290 422 return NT_STATUS_FOOBAR; 291 423 } 424 292 425 /* we don't want to access the self made schema anymore */ 426 s->schema = s->self_made_schema; 293 427 s->self_made_schema = NULL; 294 s->schema = dsdb_get_schema(s->ldb); 295 296 status = dsdb_extended_replicated_objects_commit(s->ldb, 297 c->partition->nc.dn, 298 mapping_ctr, 299 object_count, 300 first_object, 301 linked_attributes_count, 302 linked_attributes, 303 s_dsa, 304 uptodateness_vector, 305 c->gensec_skey, 306 s, &objs, &seq_num); 428 429 /* Now convert the schema elements again, using the schema we finalised, ready to actually import */ 430 status = dsdb_replicated_objects_convert(s->ldb, 431 s->schema, 432 c->partition->nc.dn, 433 mapping_ctr, 434 object_count, 435 first_object, 436 linked_attributes_count, 437 linked_attributes, 438 s_dsa, 439 uptodateness_vector, 440 c->gensec_skey, 441 s, &schema_objs); 442 if (!W_ERROR_IS_OK(status)) { 443 DEBUG(0,("Failed to convert objects when trying to import over DRS (2nd pass, to store remote schema): %s\n", win_errstr(status))); 444 return werror_to_ntstatus(status); 445 } 446 447 if (lpcfg_parm_bool(s->lp_ctx, NULL, "become dc", "dump objects", false)) { 448 for (i=0; i < schema_objs->num_objects; i++) { 449 struct ldb_ldif ldif; 450 fprintf(stdout, "#\n"); 451 ldif.changetype = LDB_CHANGETYPE_NONE; 452 ldif.msg = schema_objs->objects[i].msg; 453 ldb_ldif_write_file(s->ldb, stdout, &ldif); 454 NDR_PRINT_DEBUG(replPropertyMetaDataBlob, schema_objs->objects[i].meta_data); 455 } 456 } 457 458 status = dsdb_replicated_objects_commit(s->ldb, NULL, schema_objs, &seq_num); 307 459 if (!W_ERROR_IS_OK(status)) { 308 460 DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status))); … … 310 462 } 311 463 312 if (lp_parm_bool(s->lp_ctx, NULL, "become dc", "dump objects", false)) { 313 for (i=0; i < objs->num_objects; i++) { 314 struct ldb_ldif ldif; 315 fprintf(stdout, "#\n"); 316 ldif.changetype = LDB_CHANGETYPE_NONE; 317 ldif.msg = objs->objects[i].msg; 318 ldb_ldif_write_file(s->ldb, stdout, &ldif); 319 NDR_PRINT_DEBUG(replPropertyMetaDataBlob, objs->objects[i].meta_data); 320 } 321 } 322 323 msg = ldb_msg_new(objs); 464 msg = ldb_msg_new(schema_objs); 324 465 NT_STATUS_HAVE_NO_MEMORY(msg); 325 msg->dn = objs->partition_dn; 326 327 status = dsdb_get_oid_mappings_ldb(s->schema, msg, &prefixMap_val, &schemaInfo_val); 328 if (!W_ERROR_IS_OK(status)) { 329 DEBUG(0,("Failed dsdb_get_oid_mappings_ldb(%s)\n", win_errstr(status))); 330 return werror_to_ntstatus(status); 331 } 332 333 /* we only add prefixMap here, because schemaInfo is a replicated attribute and already applied */ 334 ret = ldb_msg_add_value(msg, "prefixMap", &prefixMap_val, &prefixMap_el); 466 msg->dn = schema_objs->partition_dn; 467 468 /* We must ensure a prefixMap has been written. Unlike other 469 * attributes (including schemaInfo), it is not replicated in 470 * the normal replication stream. We can use the one from 471 * s->prefixmap_blob because we operate with one, unchanging 472 * prefixMap for this entire operation. */ 473 ret = ldb_msg_add_value(msg, "prefixMap", &s->prefixmap_blob, &prefixMap_el); 335 474 if (ret != LDB_SUCCESS) { 336 475 return NT_STATUS_FOOBAR; 337 476 } 338 prefixMap_el->flags = LDB_FLAG_MOD_REPLACE; 477 /* We want to know if a prefixMap was written already, as it 478 * would mean that the above comment was not true, and we have 479 * somehow updated the prefixMap during this transaction */ 480 prefixMap_el->flags = LDB_FLAG_MOD_ADD; 339 481 340 482 ret = ldb_modify(s->ldb, msg); 341 483 if (ret != LDB_SUCCESS) { 342 DEBUG(0,("Failed to add prefixMap and schemaInfo %s\n", ldb_strerror(ret)));484 DEBUG(0,("Failed to add prefixMap: %s\n", ldb_errstring(s->ldb))); 343 485 return NT_STATUS_FOOBAR; 344 486 } 345 487 346 488 talloc_free(s_dsa); 347 talloc_free( objs);489 talloc_free(schema_objs); 348 490 349 491 /* We must set these up to ensure the replMetaData is written … … 360 502 } 361 503 362 s->schema = dsdb_get_schema(s->ldb );504 s->schema = dsdb_get_schema(s->ldb, s); 363 505 if (!s->schema) { 364 506 DEBUG(0,("Failed to get loaded dsdb_schema\n")); … … 369 511 } 370 512 371 static NTSTATUS vampire_schema_chunk(void *private_data,372 373 { 374 struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);513 NTSTATUS libnet_vampire_cb_schema_chunk(void *private_data, 514 const struct libnet_BecomeDC_StoreChunk *c) 515 { 516 struct libnet_vampire_cb_state *s = talloc_get_type(private_data, struct libnet_vampire_cb_state); 375 517 WERROR status; 376 518 const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr; … … 415 557 } 416 558 417 if (!s->schema) { 418 s->self_made_schema = dsdb_new_schema(s, lp_iconv_convenience(s->lp_ctx)); 419 559 if (!s->self_made_schema) { 560 WERROR werr; 561 struct drsuapi_DsReplicaOIDMapping_Ctr mapping_ctr_without_schema_info; 562 /* Put the DRS prefixmap aside for the schema we are 563 * about to load in the provision, and into the one we 564 * are making with the help of DRS */ 565 566 mapping_ctr_without_schema_info = *mapping_ctr; 567 568 /* This strips off the 0xFF schema info from the end, 569 * because we don't want it in the blob */ 570 if (mapping_ctr_without_schema_info.num_mappings > 0) { 571 mapping_ctr_without_schema_info.num_mappings--; 572 } 573 werr = dsdb_get_drsuapi_prefixmap_as_blob(&mapping_ctr_without_schema_info, s, &s->prefixmap_blob); 574 if (!W_ERROR_IS_OK(werr)) { 575 return werror_to_ntstatus(werr); 576 } 577 578 /* Set up two manually-constructed schema - the local 579 * schema from the provision will be used to build 580 * one, which will then in turn be used to build the 581 * other. */ 582 s->self_made_schema = dsdb_new_schema(s); 420 583 NT_STATUS_HAVE_NO_MEMORY(s->self_made_schema); 421 584 422 status = dsdb_load_ oid_mappings_drsuapi(s->self_made_schema, mapping_ctr);585 status = dsdb_load_prefixmap_from_drsuapi(s->self_made_schema, mapping_ctr); 423 586 if (!W_ERROR_IS_OK(status)) { 424 587 return werror_to_ntstatus(status); 425 588 } 426 427 s->schema = s->self_made_schema;428 589 } else { 429 status = dsdb_ verify_oid_mappings_drsuapi(s->schema, mapping_ctr);590 status = dsdb_schema_pfm_contains_drsuapi_pfm(s->self_made_schema->prefixmap, mapping_ctr); 430 591 if (!W_ERROR_IS_OK(status)) { 431 592 return werror_to_ntstatus(status); … … 445 606 446 607 if (!c->partition->more_data) { 447 return vampire_apply_schema(s, c);608 return libnet_vampire_cb_apply_schema(s, c); 448 609 } 449 610 … … 451 612 } 452 613 453 static NTSTATUS vampire_store_chunk(void *private_data,454 455 { 456 struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);614 NTSTATUS libnet_vampire_cb_store_chunk(void *private_data, 615 const struct libnet_BecomeDC_StoreChunk *c) 616 { 617 struct libnet_vampire_cb_state *s = talloc_get_type(private_data, struct libnet_vampire_cb_state); 457 618 WERROR status; 619 struct dsdb_schema *schema; 458 620 const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr; 459 621 uint32_t nc_object_count; … … 506 668 } 507 669 508 s_dsa->replica_flags = DRSUAPI_D S_REPLICA_NEIGHBOUR_WRITEABLE509 | DRSUAPI_D S_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP510 | DRSUAPI_D S_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS;670 s_dsa->replica_flags = DRSUAPI_DRS_WRIT_REP 671 | DRSUAPI_DRS_INIT_SYNC 672 | DRSUAPI_DRS_PER_SYNC; 511 673 memset(s_dsa->schedule, 0x11, sizeof(s_dsa->schedule)); 512 674 … … 535 697 536 698 537 status = dsdb_extended_replicated_objects_commit(s->ldb, 538 c->partition->nc.dn, 539 mapping_ctr, 540 object_count, 541 first_object, 542 linked_attributes_count, 543 linked_attributes, 544 s_dsa, 545 uptodateness_vector, 546 c->gensec_skey, 547 s, &objs, &seq_num); 699 schema = dsdb_get_schema(s->ldb, NULL); 700 if (!schema) { 701 DEBUG(0,(__location__ ": Schema is not loaded yet!\n")); 702 return NT_STATUS_INTERNAL_ERROR; 703 } 704 705 status = dsdb_replicated_objects_convert(s->ldb, 706 schema, 707 c->partition->nc.dn, 708 mapping_ctr, 709 object_count, 710 first_object, 711 linked_attributes_count, 712 linked_attributes, 713 s_dsa, 714 uptodateness_vector, 715 c->gensec_skey, 716 s, &objs); 548 717 if (!W_ERROR_IS_OK(status)) { 549 DEBUG(0,("Failed to co mmit objects: %s\n", win_errstr(status)));718 DEBUG(0,("Failed to convert objects: %s\n", win_errstr(status))); 550 719 return werror_to_ntstatus(status); 551 720 } 552 721 553 if (lp _parm_bool(s->lp_ctx, NULL, "become dc", "dump objects", false)) {722 if (lpcfg_parm_bool(s->lp_ctx, NULL, "become dc", "dump objects", false)) { 554 723 for (i=0; i < objs->num_objects; i++) { 555 724 struct ldb_ldif ldif; … … 561 730 } 562 731 } 732 status = dsdb_replicated_objects_commit(s->ldb, NULL, objs, &seq_num); 733 if (!W_ERROR_IS_OK(status)) { 734 DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status))); 735 return werror_to_ntstatus(status); 736 } 737 563 738 talloc_free(s_dsa); 564 739 talloc_free(objs); … … 581 756 } 582 757 583 if (lp _parm_bool(s->lp_ctx, NULL, "become dc", "dump objects", false)) {758 if (lpcfg_parm_bool(s->lp_ctx, NULL, "become dc", "dump objects", false)) { 584 759 DEBUG(0,("# %s\n", sa->lDAPDisplayName)); 585 760 NDR_PRINT_DEBUG(drsuapi_DsReplicaLinkedAttribute, &linked_attributes[i]); … … 593 768 } 594 769 770 static NTSTATUS update_dnshostname_for_server(TALLOC_CTX *mem_ctx, 771 struct ldb_context *ldb, 772 const char *server_dn_str, 773 const char *netbios_name, 774 const char *realm) 775 { 776 int ret; 777 struct ldb_message *msg; 778 struct ldb_message_element *el; 779 struct ldb_dn *server_dn; 780 const char *dNSHostName = strlower_talloc(mem_ctx, 781 talloc_asprintf(mem_ctx, 782 "%s.%s", 783 netbios_name, 784 realm)); 785 msg = ldb_msg_new(mem_ctx); 786 if (msg == NULL) { 787 return NT_STATUS_NO_MEMORY; 788 } 789 790 server_dn = ldb_dn_new(mem_ctx, ldb, server_dn_str); 791 if (!server_dn) { 792 return NT_STATUS_INTERNAL_ERROR; 793 } 794 795 msg->dn = server_dn; 796 ret = ldb_msg_add_empty(msg, "dNSHostName", LDB_FLAG_MOD_ADD, &el); 797 if (ret != LDB_SUCCESS) { 798 return NT_STATUS_INTERNAL_ERROR; 799 } 800 801 ret = ldb_msg_add_steal_string(msg, 802 "dNSHostName", 803 talloc_asprintf(el->values, "%s", dNSHostName)); 804 if (ret != LDB_SUCCESS) { 805 return NT_STATUS_INTERNAL_ERROR; 806 } 807 808 ret = dsdb_modify(ldb, msg, DSDB_MODIFY_PERMISSIVE); 809 if (ret != LDB_SUCCESS) { 810 DEBUG(0,(__location__ ": Failed to add dnsHostName to the Server object: %s\n", 811 ldb_errstring(ldb))); 812 return NT_STATUS_INTERNAL_ERROR; 813 } 814 815 return NT_STATUS_OK; 816 } 817 818 595 819 NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, 596 820 struct libnet_Vampire *r) 597 821 { 598 822 struct libnet_JoinDomain *join; 599 struct provision_store_self_join_settings *set_secrets; 600 struct libnet_BecomeDC b; 601 struct vampire_state *s; 602 struct ldb_message *msg; 603 const char *error_string; 604 int ldb_ret; 605 uint32_t i; 823 struct libnet_Replicate rep; 606 824 NTSTATUS status; 607 825 … … 611 829 r->out.error_string = NULL; 612 830 613 s = talloc_zero(mem_ctx, struct vampire_state); 614 if (!s) { 615 return NT_STATUS_NO_MEMORY; 616 } 617 618 s->lp_ctx = ctx->lp_ctx; 619 s->event_ctx = ctx->event_ctx; 620 621 join = talloc_zero(s, struct libnet_JoinDomain); 831 join = talloc_zero(mem_ctx, struct libnet_JoinDomain); 622 832 if (!join) { 623 833 return NT_STATUS_NO_MEMORY; … … 627 837 netbios_name = r->in.netbios_name; 628 838 } else { 629 netbios_name = talloc_reference(join, lp _netbios_name(ctx->lp_ctx));839 netbios_name = talloc_reference(join, lpcfg_netbios_name(ctx->lp_ctx)); 630 840 if (!netbios_name) { 841 talloc_free(join); 631 842 r->out.error_string = NULL; 632 talloc_free(s);633 843 return NT_STATUS_NO_MEMORY; 634 844 } … … 637 847 account_name = talloc_asprintf(join, "%s$", netbios_name); 638 848 if (!account_name) { 849 talloc_free(join); 639 850 r->out.error_string = NULL; 640 talloc_free(s);641 851 return NT_STATUS_NO_MEMORY; 642 852 } 643 853 854 /* Re-use the domain we are joining as the domain for the user 855 * to be authenticated with, unless they specified 856 * otherwise */ 857 cli_credentials_set_domain(ctx->cred, r->in.domain_name, CRED_GUESS_ENV); 858 644 859 join->in.domain_name = r->in.domain_name; 645 860 join->in.account_name = account_name; … … 651 866 if (!NT_STATUS_IS_OK(status)) { 652 867 r->out.error_string = talloc_steal(mem_ctx, join->out.error_string); 653 talloc_free( s);868 talloc_free(join); 654 869 return status; 655 870 } 871 872 rep.in.domain_name = join->out.domain_name; 873 rep.in.netbios_name = netbios_name; 874 rep.in.targetdir = r->in.targetdir; 875 rep.in.domain_sid = join->out.domain_sid; 876 rep.in.realm = join->out.realm; 877 rep.in.server = join->out.samr_binding->host; 878 rep.in.join_password = join->out.join_password; 879 rep.in.kvno = join->out.kvno; 880 881 status = libnet_Replicate(ctx, mem_ctx, &rep); 882 883 r->out.domain_sid = join->out.domain_sid; 884 r->out.domain_name = join->out.domain_name; 885 r->out.error_string = rep.out.error_string; 886 887 return status; 888 } 889 890 891 892 NTSTATUS libnet_Replicate(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, 893 struct libnet_Replicate *r) 894 { 895 struct provision_store_self_join_settings *set_secrets; 896 struct libnet_BecomeDC b; 897 struct libnet_vampire_cb_state *s; 898 struct ldb_message *msg; 899 const char *error_string; 900 int ldb_ret; 901 uint32_t i; 902 NTSTATUS status; 903 TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx); 904 const char *account_name; 905 const char *netbios_name; 906 907 r->out.error_string = NULL; 908 909 netbios_name = r->in.netbios_name; 910 account_name = talloc_asprintf(tmp_ctx, "%s$", netbios_name); 911 if (!account_name) { 912 talloc_free(tmp_ctx); 913 r->out.error_string = NULL; 914 return NT_STATUS_NO_MEMORY; 915 } 656 916 657 s->join = join; 658 659 s->targetdir = r->in.targetdir; 917 /* Re-use the domain we are joining as the domain for the user 918 * to be authenticated with, unless they specified 919 * otherwise */ 920 cli_credentials_set_domain(ctx->cred, r->in.domain_name, CRED_GUESS_ENV); 921 922 s = libnet_vampire_cb_state_init(mem_ctx, ctx->lp_ctx, ctx->event_ctx, 923 netbios_name, r->in.domain_name, r->in.realm, 924 r->in.targetdir); 925 if (!s) { 926 return NT_STATUS_NO_MEMORY; 927 } 928 talloc_steal(s, tmp_ctx); 660 929 661 930 ZERO_STRUCT(b); 662 b.in.domain_dns_name = join->out.realm; 663 b.in.domain_netbios_name = join->out.domain_name; 664 b.in.domain_sid = join->out.domain_sid; 665 b.in.source_dsa_address = join->out.samr_binding->host; 931 932 /* Be more robust: 933 * We now know the domain and realm for sure - if they didn't 934 * put one on the command line, use this for the rest of the 935 * join */ 936 cli_credentials_set_realm(ctx->cred, r->in.realm, CRED_GUESS_ENV); 937 cli_credentials_set_domain(ctx->cred, r->in.domain_name, CRED_GUESS_ENV); 938 939 /* Now set these values into the smb.conf - we probably had 940 * empty or useless defaults here from whatever smb.conf we 941 * started with */ 942 lpcfg_set_cmdline(s->lp_ctx, "realm", r->in.realm); 943 lpcfg_set_cmdline(s->lp_ctx, "workgroup", r->in.domain_name); 944 945 b.in.domain_dns_name = r->in.realm; 946 b.in.domain_netbios_name = r->in.domain_name; 947 b.in.domain_sid = r->in.domain_sid; 948 b.in.source_dsa_address = r->in.server; 666 949 b.in.dest_dsa_netbios_name = netbios_name; 667 950 668 951 b.in.callbacks.private_data = s; 669 b.in.callbacks.check_options = vampire_check_options; 670 b.in.callbacks.prepare_db = vampire_prepare_db; 671 b.in.callbacks.schema_chunk = vampire_schema_chunk; 672 b.in.callbacks.config_chunk = vampire_store_chunk; 673 b.in.callbacks.domain_chunk = vampire_store_chunk; 952 b.in.callbacks.check_options = libnet_vampire_cb_check_options; 953 b.in.callbacks.prepare_db = libnet_vampire_cb_prepare_db; 954 b.in.callbacks.schema_chunk = libnet_vampire_cb_schema_chunk; 955 b.in.callbacks.config_chunk = libnet_vampire_cb_store_chunk; 956 b.in.callbacks.domain_chunk = libnet_vampire_cb_store_chunk; 957 958 b.in.rodc_join = lpcfg_parm_bool(s->lp_ctx, NULL, "repl", "RODC", false); 674 959 675 960 status = libnet_BecomeDC(ctx, s, &b); … … 707 992 ldb_ret = ldb_modify(s->ldb, msg); 708 993 if (ldb_ret != LDB_SUCCESS) { 709 printf("ldb_modify() failed: %d \n", ldb_ret);994 printf("ldb_modify() failed: %d : %s\n", ldb_ret, ldb_errstring(s->ldb)); 710 995 talloc_free(s); 711 996 return NT_STATUS_INTERNAL_DB_ERROR; 712 997 } 713 998 /* during dcpromo the 2nd computer adds dNSHostName attribute to his Server object 999 * the attribute appears on the original DC after replication 1000 */ 1001 status = update_dnshostname_for_server(s, s->ldb, s->server_dn_str, s->netbios_name, s->realm); 1002 if (!NT_STATUS_IS_OK(status)) { 1003 printf("Failed to update dNSHostName on Server object - %s\n", nt_errstr(status)); 1004 talloc_free(s); 1005 return status; 1006 } 714 1007 /* prepare the transaction - this prepares to commit all the changes in 715 1008 the ldb from the whole vampire. Note that this … … 717 1010 */ 718 1011 if (ldb_transaction_prepare_commit(s->ldb) != LDB_SUCCESS) { 719 printf("Failed to prepare_commit vampire transaction \n");1012 printf("Failed to prepare_commit vampire transaction: %s\n", ldb_errstring(s->ldb)); 720 1013 return NT_STATUS_INTERNAL_DB_ERROR; 721 1014 } … … 729 1022 730 1023 ZERO_STRUCTP(set_secrets); 731 set_secrets->domain_name = join->out.domain_name; 732 set_secrets->realm = join->out.realm; 733 set_secrets->account_name = account_name; 1024 set_secrets->domain_name = r->in.domain_name; 1025 set_secrets->realm = r->in.realm; 734 1026 set_secrets->netbios_name = netbios_name; 735 1027 set_secrets->secure_channel_type = SEC_CHAN_BDC; 736 set_secrets->machine_password = join->out.join_password;737 set_secrets->key_version_number = join->out.kvno;738 set_secrets->domain_sid = join->out.domain_sid;1028 set_secrets->machine_password = r->in.join_password; 1029 set_secrets->key_version_number = r->in.kvno; 1030 set_secrets->domain_sid = r->in.domain_sid; 739 1031 740 status = provision_store_self_join(ctx, ctx->lp_ctx, ctx->event_ctx, set_secrets, &error_string);1032 status = provision_store_self_join(ctx, s->lp_ctx, ctx->event_ctx, set_secrets, &error_string); 741 1033 if (!NT_STATUS_IS_OK(status)) { 742 1034 r->out.error_string = talloc_steal(mem_ctx, error_string); … … 745 1037 } 746 1038 747 r->out.domain_name = talloc_steal(r, join->out.domain_name);748 r->out.domain_sid = dom_sid_dup(r, join->out.domain_sid);749 750 1039 /* commit the transaction now we know the secrets were written 751 1040 * out properly … … 759 1048 760 1049 return NT_STATUS_OK; 761 762 } 1050 } -
vendor/current/source4/libnet/libnet_vampire.h
r414 r740 37 37 }; 38 38 39 struct libnet_Replicate { 40 struct { 41 const char *domain_name; 42 const char *netbios_name; 43 const char *targetdir; /* optional, may be NULL */ 44 struct dom_sid *domain_sid; 45 const char *realm; 46 const char *server; 47 const char *join_password; 48 uint32_t kvno; 49 } in; 50 struct { 51 const char *error_string; 52 } out; 53 }; 54 55 /* Private context for the default callbacks */ 56 struct libnet_vampire_cb_state; 39 57 40 58 #endif /* __LIBNET_VAMPIRE_H__ */ -
vendor/current/source4/libnet/py_net.c
r414 r740 1 /* 1 /* 2 2 Unix SMB/CIFS implementation. 3 3 Samba utility functions 4 Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 5 4 Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008-2010 5 Copyright (C) Kamen Mazdrashki <kamen.mazdrashki@postpath.com> 2009 6 6 7 This program is free software; you can redistribute it and/or modify 7 8 it under the terms of the GNU General Public License as published by 8 9 the Free Software Foundation; either version 3 of the License, or 9 10 (at your option) any later version. 10 11 11 12 This program is distributed in the hope that it will be useful, 12 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 15 GNU General Public License for more details. 15 16 16 17 You should have received a copy of the GNU General Public License 17 18 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 19 */ 19 20 21 #include <Python.h> 20 22 #include "includes.h" 21 #include <Python.h> 23 #include <ldb.h> 24 #include <pyldb.h> 22 25 #include "libnet.h" 23 26 #include "auth/credentials/pycredentials.h" 24 27 #include "libcli/security/security.h" 25 28 #include "lib/events/events.h" 26 #include "param/param.h" 27 28 /* FIXME: This prototype should be in param/pyparam.h */ 29 struct loadparm_context *py_default_loadparm_context(TALLOC_CTX *mem_ctx); 30 31 static struct libnet_context *py_net_ctx(PyObject *obj, struct tevent_context *ev, struct cli_credentials *creds) 32 { 33 /* FIXME: Use obj */ 34 struct libnet_context *libnet; 35 libnet = libnet_context_init(ev, py_default_loadparm_context(NULL)); 36 if (!libnet) { 37 return NULL; 38 } 39 libnet->cred = creds; 40 return libnet; 41 } 42 43 static PyObject *py_net_join(PyObject *cls, PyObject *args, PyObject *kwargs) 29 #include "param/pyparam.h" 30 #include "auth/gensec/gensec.h" 31 #include "librpc/rpc/pyrpc_util.h" 32 #include "libcli/finddc.h" 33 #include "libcli/resolve/resolve.h" 34 35 void initnet(void); 36 37 typedef struct { 38 PyObject_HEAD 39 TALLOC_CTX *mem_ctx; 40 struct libnet_context *libnet_ctx; 41 struct tevent_context *ev; 42 } py_net_Object; 43 44 static PyObject *py_net_join(py_net_Object *self, PyObject *args, PyObject *kwargs) 44 45 { 45 46 struct libnet_Join r; … … 47 48 PyObject *result; 48 49 TALLOC_CTX *mem_ctx; 50 const char *kwnames[] = { "domain_name", "netbios_name", "join_type", "level", NULL }; 51 52 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ssii:Join", discard_const_p(char *, kwnames), 53 &r.in.domain_name, &r.in.netbios_name, 54 &r.in.join_type, &r.in.level)) 55 return NULL; 56 57 mem_ctx = talloc_new(self->mem_ctx); 58 if (mem_ctx == NULL) { 59 PyErr_NoMemory(); 60 return NULL; 61 } 62 63 status = libnet_Join(self->libnet_ctx, mem_ctx, &r); 64 if (NT_STATUS_IS_ERR(status)) { 65 PyErr_SetString(PyExc_RuntimeError, r.out.error_string?r.out.error_string:nt_errstr(status)); 66 talloc_free(mem_ctx); 67 return NULL; 68 } 69 70 result = Py_BuildValue("sss", r.out.join_password, 71 dom_sid_string(mem_ctx, r.out.domain_sid), 72 r.out.domain_name); 73 74 talloc_free(mem_ctx); 75 76 return result; 77 } 78 79 static const char py_net_join_doc[] = "join(domain_name, netbios_name, join_type, level) -> (join_password, domain_sid, domain_name)\n\n" \ 80 "Join the domain with the specified name."; 81 82 static PyObject *py_net_set_password(py_net_Object *self, PyObject *args, PyObject *kwargs) 83 { 84 union libnet_SetPassword r; 85 NTSTATUS status; 86 PyObject *py_creds; 87 TALLOC_CTX *mem_ctx; 49 88 struct tevent_context *ev; 50 struct libnet_context *libnet_ctx;51 struct cli_credentials *creds; 52 PyObject *py_creds;53 const char *kwnames[] = { "domain_name", "netbios_name", "join_type", "level", "credentials", NULL }; 54 55 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ssiiO:Join", discard_const_p(char *, kwnames),56 &r. in.domain_name, &r.in.netbios_name,57 &r.in.join_type, &r.in.level, &py_creds))58 return NULL;89 const char *kwnames[] = { "account_name", "domain_name", "newpassword", "credentials", NULL }; 90 91 r.generic.level = LIBNET_SET_PASSWORD_GENERIC; 92 93 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sssO:set_password", discard_const_p(char *, kwnames), 94 &r.generic.in.account_name, &r.generic.in.domain_name, 95 &r.generic.in.newpassword, &py_creds)) { 96 return NULL; 97 } 59 98 60 99 /* FIXME: we really need to get a context from the caller or we may end 61 100 * up with 2 event contexts */ 62 101 ev = s4_event_context_init(NULL); 102 63 103 mem_ctx = talloc_new(ev); 64 65 creds = cli_credentials_from_py_object(py_creds); 66 if (creds == NULL) { 104 if (mem_ctx == NULL) { 105 PyErr_NoMemory(); 106 return NULL; 107 } 108 109 status = libnet_SetPassword(self->libnet_ctx, mem_ctx, &r); 110 if (NT_STATUS_IS_ERR(status)) { 111 PyErr_SetString(PyExc_RuntimeError, 112 r.generic.out.error_string?r.generic.out.error_string:nt_errstr(status)); 113 talloc_free(mem_ctx); 114 return NULL; 115 } 116 117 talloc_free(mem_ctx); 118 119 Py_RETURN_NONE; 120 } 121 122 static const char py_net_set_password_doc[] = "set_password(account_name, domain_name, newpassword) -> True\n\n" \ 123 "Set password for a user. You must supply credential with enough rights to do this.\n\n" \ 124 "Sample usage is:\n" \ 125 "net.set_password(account_name=<account_name>,\n" \ 126 " domain_name=domain_name,\n" \ 127 " newpassword=new_pass)\n"; 128 129 130 static PyObject *py_net_export_keytab(py_net_Object *self, PyObject *args, PyObject *kwargs) 131 { 132 struct libnet_export_keytab r; 133 TALLOC_CTX *mem_ctx; 134 const char *kwnames[] = { "keytab", NULL }; 135 NTSTATUS status; 136 137 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s:export_keytab", discard_const_p(char *, kwnames), 138 &r.in.keytab_name)) { 139 return NULL; 140 } 141 142 mem_ctx = talloc_new(self->mem_ctx); 143 if (mem_ctx == NULL) { 144 PyErr_NoMemory(); 145 return NULL; 146 } 147 148 status = libnet_export_keytab(self->libnet_ctx, mem_ctx, &r); 149 if (NT_STATUS_IS_ERR(status)) { 150 PyErr_SetString(PyExc_RuntimeError, 151 r.out.error_string?r.out.error_string:nt_errstr(status)); 152 talloc_free(mem_ctx); 153 return NULL; 154 } 155 156 talloc_free(mem_ctx); 157 158 Py_RETURN_NONE; 159 } 160 161 static const char py_net_export_keytab_doc[] = "export_keytab(keytab, name)\n\n" 162 "Export the DC keytab to a keytab file."; 163 164 static PyObject *py_net_time(py_net_Object *self, PyObject *args, PyObject *kwargs) 165 { 166 const char *kwnames[] = { "server_name", NULL }; 167 union libnet_RemoteTOD r; 168 NTSTATUS status; 169 TALLOC_CTX *mem_ctx; 170 char timestr[64]; 171 PyObject *ret; 172 struct tm *tm; 173 174 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", 175 discard_const_p(char *, kwnames), &r.generic.in.server_name)) 176 return NULL; 177 178 r.generic.level = LIBNET_REMOTE_TOD_GENERIC; 179 180 mem_ctx = talloc_new(NULL); 181 if (mem_ctx == NULL) { 182 PyErr_NoMemory(); 183 return NULL; 184 } 185 186 status = libnet_RemoteTOD(self->libnet_ctx, mem_ctx, &r); 187 if (!NT_STATUS_IS_OK(status)) { 188 PyErr_SetString(PyExc_RuntimeError, 189 r.generic.out.error_string?r.generic.out.error_string:nt_errstr(status)); 190 talloc_free(mem_ctx); 191 return NULL; 192 } 193 194 ZERO_STRUCT(timestr); 195 tm = localtime(&r.generic.out.time); 196 strftime(timestr, sizeof(timestr)-1, "%c %Z",tm); 197 198 ret = PyString_FromString(timestr); 199 200 talloc_free(mem_ctx); 201 202 return ret; 203 } 204 205 static const char py_net_time_doc[] = "time(server_name) -> timestr\n" 206 "Retrieve the remote time on a server"; 207 208 static PyObject *py_net_user_create(py_net_Object *self, PyObject *args, PyObject *kwargs) 209 { 210 const char *kwnames[] = { "username", NULL }; 211 NTSTATUS status; 212 TALLOC_CTX *mem_ctx; 213 struct libnet_CreateUser r; 214 215 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", discard_const_p(char *, kwnames), 216 &r.in.user_name)) 217 return NULL; 218 219 r.in.domain_name = cli_credentials_get_domain(self->libnet_ctx->cred); 220 221 mem_ctx = talloc_new(NULL); 222 if (mem_ctx == NULL) { 223 PyErr_NoMemory(); 224 return NULL; 225 } 226 227 status = libnet_CreateUser(self->libnet_ctx, mem_ctx, &r); 228 if (!NT_STATUS_IS_OK(status)) { 229 PyErr_SetString(PyExc_RuntimeError, r.out.error_string?r.out.error_string:nt_errstr(status)); 230 talloc_free(mem_ctx); 231 return NULL; 232 } 233 234 talloc_free(mem_ctx); 235 236 Py_RETURN_NONE; 237 } 238 239 static const char py_net_create_user_doc[] = "create_user(username)\n" 240 "Create a new user."; 241 242 static PyObject *py_net_user_delete(py_net_Object *self, PyObject *args, PyObject *kwargs) 243 { 244 const char *kwnames[] = { "username", NULL }; 245 NTSTATUS status; 246 TALLOC_CTX *mem_ctx; 247 struct libnet_DeleteUser r; 248 249 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", discard_const_p(char *, kwnames), 250 &r.in.user_name)) 251 return NULL; 252 253 r.in.domain_name = cli_credentials_get_domain(self->libnet_ctx->cred); 254 255 mem_ctx = talloc_new(NULL); 256 if (mem_ctx == NULL) { 257 PyErr_NoMemory(); 258 return NULL; 259 } 260 261 status = libnet_DeleteUser(self->libnet_ctx, mem_ctx, &r); 262 if (!NT_STATUS_IS_OK(status)) { 263 PyErr_SetString(PyExc_RuntimeError, r.out.error_string?r.out.error_string:nt_errstr(status)); 264 talloc_free(mem_ctx); 265 return NULL; 266 } 267 268 talloc_free(mem_ctx); 269 270 Py_RETURN_NONE; 271 } 272 273 static const char py_net_delete_user_doc[] = "delete_user(username)\n" 274 "Delete a user."; 275 276 static PyObject *py_dom_sid_FromSid(struct dom_sid *sid) 277 { 278 PyObject *mod_security, *dom_sid_Type; 279 280 mod_security = PyImport_ImportModule("samba.dcerpc.security"); 281 if (mod_security == NULL) 282 return NULL; 283 284 dom_sid_Type = PyObject_GetAttrString(mod_security, "dom_sid"); 285 if (dom_sid_Type == NULL) 286 return NULL; 287 288 return py_talloc_reference((PyTypeObject *)dom_sid_Type, sid); 289 } 290 291 static PyObject *py_net_vampire(py_net_Object *self, PyObject *args, PyObject *kwargs) 292 { 293 const char *kwnames[] = { "domain", "target_dir", NULL }; 294 NTSTATUS status; 295 TALLOC_CTX *mem_ctx; 296 PyObject *ret; 297 struct libnet_Vampire r; 298 299 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|z", discard_const_p(char *, kwnames), 300 &r.in.domain_name, &r.in.targetdir)) { 301 return NULL; 302 } 303 304 r.in.netbios_name = lpcfg_netbios_name(self->libnet_ctx->lp_ctx); 305 r.out.error_string = NULL; 306 307 mem_ctx = talloc_new(NULL); 308 if (mem_ctx == NULL) { 309 PyErr_NoMemory(); 310 return NULL; 311 } 312 313 status = libnet_Vampire(self->libnet_ctx, mem_ctx, &r); 314 315 if (!NT_STATUS_IS_OK(status)) { 316 PyErr_SetString(PyExc_RuntimeError, 317 r.out.error_string ? r.out.error_string : nt_errstr(status)); 318 talloc_free(mem_ctx); 319 return NULL; 320 } 321 322 ret = Py_BuildValue("(sO)", r.out.domain_name, py_dom_sid_FromSid(r.out.domain_sid)); 323 324 talloc_free(mem_ctx); 325 326 return ret; 327 } 328 329 struct replicate_state { 330 void *vampire_state; 331 dcerpc_InterfaceObject *drs_pipe; 332 struct libnet_BecomeDC_StoreChunk chunk; 333 DATA_BLOB gensec_skey; 334 struct libnet_BecomeDC_Partition partition; 335 struct libnet_BecomeDC_Forest forest; 336 struct libnet_BecomeDC_DestDSA dest_dsa; 337 }; 338 339 /* 340 setup for replicate_chunk() calls 341 */ 342 static PyObject *py_net_replicate_init(py_net_Object *self, PyObject *args, PyObject *kwargs) 343 { 344 const char *kwnames[] = { "samdb", "lp", "drspipe", NULL }; 345 PyObject *py_ldb, *py_lp, *py_drspipe; 346 struct ldb_context *samdb; 347 struct loadparm_context *lp; 348 struct replicate_state *s; 349 NTSTATUS status; 350 351 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", 352 discard_const_p(char *, kwnames), 353 &py_ldb, &py_lp, &py_drspipe)) { 354 return NULL; 355 } 356 357 s = talloc_zero(NULL, struct replicate_state); 358 if (!s) return NULL; 359 360 lp = lpcfg_from_py_object(s, py_lp); 361 if (lp == NULL) { 362 PyErr_SetString(PyExc_TypeError, "Expected lp object"); 363 talloc_free(s); 364 return NULL; 365 } 366 367 samdb = PyLdb_AsLdbContext(py_ldb); 368 if (samdb == NULL) { 369 PyErr_SetString(PyExc_TypeError, "Expected ldb object"); 370 talloc_free(s); 371 return NULL; 372 } 373 374 s->drs_pipe = (dcerpc_InterfaceObject *)(py_drspipe); 375 376 s->vampire_state = libnet_vampire_replicate_init(s, samdb, lp); 377 if (s->vampire_state == NULL) { 378 PyErr_SetString(PyExc_TypeError, "Failed to initialise vampire_state"); 379 talloc_free(s); 380 return NULL; 381 } 382 383 status = gensec_session_key(s->drs_pipe->pipe->conn->security_state.generic_state, 384 &s->gensec_skey); 385 if (!NT_STATUS_IS_OK(status)) { 386 PyErr_Format(PyExc_RuntimeError, "Unable to get session key from drspipe: %s", 387 nt_errstr(status)); 388 talloc_free(s); 389 return NULL; 390 } 391 392 s->forest.dns_name = lpcfg_dnsdomain(lp); 393 394 s->chunk.gensec_skey = &s->gensec_skey; 395 s->chunk.partition = &s->partition; 396 s->chunk.forest = &s->forest; 397 s->chunk.dest_dsa = &s->dest_dsa; 398 399 return PyCObject_FromTallocPtr(s); 400 } 401 402 403 /* 404 process one replication chunk 405 */ 406 static PyObject *py_net_replicate_chunk(py_net_Object *self, PyObject *args, PyObject *kwargs) 407 { 408 const char *kwnames[] = { "state", "level", "ctr", "schema", NULL }; 409 PyObject *py_state, *py_ctr, *py_schema; 410 struct replicate_state *s; 411 unsigned level; 412 NTSTATUS (*chunk_handler)(void *private_data, const struct libnet_BecomeDC_StoreChunk *c); 413 NTSTATUS status; 414 415 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OIO|O", 416 discard_const_p(char *, kwnames), 417 &py_state, &level, &py_ctr, &py_schema)) { 418 return NULL; 419 } 420 421 s = talloc_get_type(PyCObject_AsVoidPtr(py_state), struct replicate_state); 422 if (!s) { 423 PyErr_SetString(PyExc_TypeError, "Expected replication_state"); 424 return NULL; 425 } 426 427 switch (level) { 428 case 1: 429 if (!py_check_dcerpc_type(py_ctr, "samba.dcerpc.drsuapi", "DsGetNCChangesCtr1")) { 430 return NULL; 431 } 432 s->chunk.ctr1 = py_talloc_get_ptr(py_ctr); 433 s->partition.nc = *s->chunk.ctr1->naming_context; 434 s->partition.more_data = s->chunk.ctr1->more_data; 435 s->partition.source_dsa_guid = s->chunk.ctr1->source_dsa_guid; 436 s->partition.source_dsa_invocation_id = s->chunk.ctr1->source_dsa_invocation_id; 437 s->partition.highwatermark = s->chunk.ctr1->new_highwatermark; 438 break; 439 case 6: 440 if (!py_check_dcerpc_type(py_ctr, "samba.dcerpc.drsuapi", "DsGetNCChangesCtr6")) { 441 return NULL; 442 } 443 s->chunk.ctr6 = py_talloc_get_ptr(py_ctr); 444 s->partition.nc = *s->chunk.ctr6->naming_context; 445 s->partition.more_data = s->chunk.ctr6->more_data; 446 s->partition.source_dsa_guid = s->chunk.ctr6->source_dsa_guid; 447 s->partition.source_dsa_invocation_id = s->chunk.ctr6->source_dsa_invocation_id; 448 s->partition.highwatermark = s->chunk.ctr6->new_highwatermark; 449 break; 450 default: 451 PyErr_Format(PyExc_TypeError, "Bad level %u in replicate_chunk", level); 452 return NULL; 453 } 454 455 chunk_handler = libnet_vampire_cb_store_chunk; 456 if (py_schema) { 457 if (!PyBool_Check(py_schema)) { 458 PyErr_SetString(PyExc_TypeError, "Expected boolean schema"); 459 return NULL; 460 } 461 if (py_schema == Py_True) { 462 chunk_handler = libnet_vampire_cb_schema_chunk; 463 } 464 } 465 466 s->chunk.ctr_level = level; 467 468 status = chunk_handler(s->vampire_state, &s->chunk); 469 if (!NT_STATUS_IS_OK(status)) { 470 PyErr_Format(PyExc_TypeError, "Failed to process chunk: %s", nt_errstr(status)); 471 return NULL; 472 } 473 474 Py_RETURN_NONE; 475 } 476 477 478 /* 479 find a DC given a domain name and server type 480 */ 481 static PyObject *py_net_finddc(py_net_Object *self, PyObject *args) 482 { 483 const char *domain_name; 484 unsigned server_type; 485 NTSTATUS status; 486 struct finddcs *io; 487 TALLOC_CTX *mem_ctx; 488 PyObject *ret; 489 490 if (!PyArg_ParseTuple(args, "sI", &domain_name, &server_type)) { 491 return NULL; 492 } 493 494 mem_ctx = talloc_new(self->mem_ctx); 495 496 io = talloc_zero(mem_ctx, struct finddcs); 497 io->in.domain_name = domain_name; 498 io->in.minimum_dc_flags = server_type; 499 500 status = finddcs_cldap(io, io, 501 lpcfg_resolve_context(self->libnet_ctx->lp_ctx), self->ev); 502 if (NT_STATUS_IS_ERR(status)) { 503 PyErr_SetString(PyExc_RuntimeError, nt_errstr(status)); 504 talloc_free(mem_ctx); 505 return NULL; 506 } 507 508 ret = py_return_ndr_struct("samba.dcerpc.nbt", "NETLOGON_SAM_LOGON_RESPONSE_EX", 509 io, &io->out.netlogon.data.nt5_ex); 510 talloc_free(mem_ctx); 511 512 return ret; 513 } 514 515 516 static const char py_net_vampire_doc[] = "vampire(domain, target_dir=None)\n" 517 "Vampire a domain."; 518 519 static const char py_net_replicate_init_doc[] = "replicate_init(samdb, lp, drspipe)\n" 520 "Setup for replicate_chunk calls."; 521 522 static const char py_net_replicate_chunk_doc[] = "replicate_chunk(state, level, ctr, schema)\n" 523 "Process replication for one chunk"; 524 525 static const char py_net_finddc_doc[] = "finddc(domain, server_type)\n" 526 "find a DC with the specified server_type bits. Return the DNS name"; 527 528 static PyMethodDef net_obj_methods[] = { 529 {"join", (PyCFunction)py_net_join, METH_VARARGS|METH_KEYWORDS, py_net_join_doc}, 530 {"set_password", (PyCFunction)py_net_set_password, METH_VARARGS|METH_KEYWORDS, py_net_set_password_doc}, 531 {"export_keytab", (PyCFunction)py_net_export_keytab, METH_VARARGS|METH_KEYWORDS, py_net_export_keytab_doc}, 532 {"time", (PyCFunction)py_net_time, METH_VARARGS|METH_KEYWORDS, py_net_time_doc}, 533 {"create_user", (PyCFunction)py_net_user_create, METH_VARARGS|METH_KEYWORDS, py_net_create_user_doc}, 534 {"delete_user", (PyCFunction)py_net_user_delete, METH_VARARGS|METH_KEYWORDS, py_net_delete_user_doc}, 535 {"vampire", (PyCFunction)py_net_vampire, METH_VARARGS|METH_KEYWORDS, py_net_vampire_doc}, 536 {"replicate_init", (PyCFunction)py_net_replicate_init, METH_VARARGS|METH_KEYWORDS, py_net_replicate_init_doc}, 537 {"replicate_chunk", (PyCFunction)py_net_replicate_chunk, METH_VARARGS|METH_KEYWORDS, py_net_replicate_chunk_doc}, 538 {"finddc", (PyCFunction)py_net_finddc, METH_VARARGS, py_net_finddc_doc}, 539 { NULL } 540 }; 541 542 static void py_net_dealloc(py_net_Object *self) 543 { 544 talloc_free(self->mem_ctx); 545 PyObject_Del(self); 546 } 547 548 static PyObject *net_obj_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) 549 { 550 PyObject *py_creds, *py_lp = Py_None; 551 const char *kwnames[] = { "creds", "lp", "server", NULL }; 552 py_net_Object *ret; 553 struct loadparm_context *lp; 554 const char *server_address = NULL; 555 556 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Oz", 557 discard_const_p(char *, kwnames), &py_creds, &py_lp, 558 &server_address)) 559 return NULL; 560 561 ret = PyObject_New(py_net_Object, type); 562 if (ret == NULL) { 563 return NULL; 564 } 565 566 /* FIXME: we really need to get a context from the caller or we may end 567 * up with 2 event contexts */ 568 ret->ev = s4_event_context_init(NULL); 569 ret->mem_ctx = talloc_new(ret->ev); 570 571 lp = lpcfg_from_py_object(ret->mem_ctx, py_lp); 572 if (lp == NULL) { 573 Py_DECREF(ret); 574 return NULL; 575 } 576 577 ret->libnet_ctx = libnet_context_init(ret->ev, lp); 578 if (ret->libnet_ctx == NULL) { 579 PyErr_SetString(PyExc_RuntimeError, "Unable to initialize net"); 580 Py_DECREF(ret); 581 return NULL; 582 } 583 584 ret->libnet_ctx->server_address = server_address; 585 586 ret->libnet_ctx->cred = cli_credentials_from_py_object(py_creds); 587 if (ret->libnet_ctx->cred == NULL) { 67 588 PyErr_SetString(PyExc_TypeError, "Expected credentials object"); 68 return NULL; 69 } 70 71 libnet_ctx = py_net_ctx(cls, ev, creds); 72 73 status = libnet_Join(libnet_ctx, mem_ctx, &r); 74 if (NT_STATUS_IS_ERR(status)) { 75 PyErr_SetString(PyExc_RuntimeError, r.out.error_string); 76 talloc_free(mem_ctx); 77 return NULL; 78 } 79 80 result = Py_BuildValue("sss", r.out.join_password, 81 dom_sid_string(mem_ctx, r.out.domain_sid), 82 r.out.domain_name); 83 84 talloc_free(mem_ctx); 85 86 if (result == NULL) 87 return NULL; 88 89 return result; 90 } 91 92 static char py_net_join_doc[] = "join(domain_name, netbios_name, join_type, level) -> (join_password, domain_sid, domain_name)\n\n" \ 93 "Join the domain with the specified name."; 94 95 static struct PyMethodDef net_methods[] = { 96 {"Join", (PyCFunction)py_net_join, METH_VARARGS|METH_KEYWORDS, py_net_join_doc}, 97 {NULL } 589 Py_DECREF(ret); 590 return NULL; 591 } 592 593 return (PyObject *)ret; 594 } 595 596 597 PyTypeObject py_net_Type = { 598 PyObject_HEAD_INIT(NULL) 0, 599 .tp_name = "net.Net", 600 .tp_basicsize = sizeof(py_net_Object), 601 .tp_dealloc = (destructor)py_net_dealloc, 602 .tp_methods = net_obj_methods, 603 .tp_new = net_obj_new, 98 604 }; 99 605 100 606 void initnet(void) 101 607 { 102 Py_InitModule("net", net_methods); 103 } 608 PyObject *m; 609 610 if (PyType_Ready(&py_net_Type) < 0) 611 return; 612 613 m = Py_InitModule3("net", NULL, NULL); 614 if (m == NULL) 615 return; 616 617 Py_INCREF(&py_net_Type); 618 PyModule_AddObject(m, "Net", (PyObject *)&py_net_Type); 619 PyModule_AddObject(m, "LIBNET_JOINDOMAIN_AUTOMATIC", PyInt_FromLong(LIBNET_JOINDOMAIN_AUTOMATIC)); 620 PyModule_AddObject(m, "LIBNET_JOINDOMAIN_SPECIFIED", PyInt_FromLong(LIBNET_JOINDOMAIN_SPECIFIED)); 621 PyModule_AddObject(m, "LIBNET_JOIN_AUTOMATIC", PyInt_FromLong(LIBNET_JOIN_AUTOMATIC)); 622 PyModule_AddObject(m, "LIBNET_JOIN_SPECIFIED", PyInt_FromLong(LIBNET_JOIN_SPECIFIED)); 623 } -
vendor/current/source4/libnet/userinfo.c
r414 r740 46 46 47 47 48 static void continue_userinfo_lookup(struct rpc_request *req);49 static void continue_userinfo_openuser(struct rpc_request *req);50 static void continue_userinfo_getuser(struct rpc_request *req);51 static void continue_userinfo_closeuser(struct rpc_request *req);48 static void continue_userinfo_lookup(struct tevent_req *subreq); 49 static void continue_userinfo_openuser(struct tevent_req *subreq); 50 static void continue_userinfo_getuser(struct tevent_req *subreq); 51 static void continue_userinfo_closeuser(struct tevent_req *subreq); 52 52 53 53 … … 55 55 * Stage 1 (optional): Look for a username in SAM server. 56 56 */ 57 static void continue_userinfo_lookup(struct rpc_request *req) 58 { 59 struct composite_context *c; 60 struct userinfo_state *s; 61 struct rpc_request *openuser_req; 57 static void continue_userinfo_lookup(struct tevent_req *subreq) 58 { 59 struct composite_context *c; 60 struct userinfo_state *s; 62 61 struct monitor_msg msg; 63 62 struct msg_rpc_lookup_name *msg_lookup; 64 63 65 c = t alloc_get_type(req->async.private_data, struct composite_context);64 c = tevent_req_callback_data(subreq, struct composite_context); 66 65 s = talloc_get_type(c->private_data, struct userinfo_state); 67 66 68 67 /* receive samr_Lookup reply */ 69 c->status = dcerpc_ndr_request_recv(req); 68 c->status = dcerpc_samr_LookupNames_r_recv(subreq, s); 69 TALLOC_FREE(subreq); 70 70 if (!composite_is_ok(c)) return; 71 71 … … 104 104 105 105 /* send request */ 106 openuser_req = dcerpc_samr_OpenUser_send(s->pipe, c, &s->openuser); 107 if (composite_nomem(openuser_req, c)) return; 108 109 composite_continue_rpc(c, openuser_req, continue_userinfo_openuser, c); 106 subreq = dcerpc_samr_OpenUser_r_send(s, c->event_ctx, 107 s->pipe->binding_handle, 108 &s->openuser); 109 if (composite_nomem(subreq, c)) return; 110 111 tevent_req_set_callback(subreq, continue_userinfo_openuser, c); 110 112 } 111 113 … … 114 116 * Stage 2: Open user policy handle. 115 117 */ 116 static void continue_userinfo_openuser(struct rpc_request *req) 117 { 118 struct composite_context *c; 119 struct userinfo_state *s; 120 struct rpc_request *queryuser_req; 118 static void continue_userinfo_openuser(struct tevent_req *subreq) 119 { 120 struct composite_context *c; 121 struct userinfo_state *s; 121 122 struct monitor_msg msg; 122 123 struct msg_rpc_open_user *msg_open; 123 124 124 c = t alloc_get_type(req->async.private_data, struct composite_context);125 c = tevent_req_callback_data(subreq, struct composite_context); 125 126 s = talloc_get_type(c->private_data, struct userinfo_state); 126 127 127 128 /* receive samr_OpenUser reply */ 128 c->status = dcerpc_ndr_request_recv(req); 129 c->status = dcerpc_samr_OpenUser_r_recv(subreq, s); 130 TALLOC_FREE(subreq); 129 131 if (!composite_is_ok(c)) return; 130 132 … … 153 155 154 156 /* queue rpc call, set event handling and new state */ 155 queryuser_req = dcerpc_samr_QueryUserInfo_send(s->pipe, c, &s->queryuserinfo); 156 if (composite_nomem(queryuser_req, c)) return; 157 158 composite_continue_rpc(c, queryuser_req, continue_userinfo_getuser, c); 157 subreq = dcerpc_samr_QueryUserInfo_r_send(s, c->event_ctx, 158 s->pipe->binding_handle, 159 &s->queryuserinfo); 160 if (composite_nomem(subreq, c)) return; 161 162 tevent_req_set_callback(subreq, continue_userinfo_getuser, c); 159 163 } 160 164 … … 163 167 * Stage 3: Get requested user information. 164 168 */ 165 static void continue_userinfo_getuser(struct rpc_request *req) 166 { 167 struct composite_context *c; 168 struct userinfo_state *s; 169 struct rpc_request *close_req; 169 static void continue_userinfo_getuser(struct tevent_req *subreq) 170 { 171 struct composite_context *c; 172 struct userinfo_state *s; 170 173 struct monitor_msg msg; 171 174 struct msg_rpc_query_user *msg_query; 172 175 173 c = t alloc_get_type(req->async.private_data, struct composite_context);176 c = tevent_req_callback_data(subreq, struct composite_context); 174 177 s = talloc_get_type(c->private_data, struct userinfo_state); 175 178 176 179 /* receive samr_QueryUserInfo reply */ 177 c->status = dcerpc_ndr_request_recv(req); 180 c->status = dcerpc_samr_QueryUserInfo_r_recv(subreq, s); 181 TALLOC_FREE(subreq); 178 182 if (!composite_is_ok(c)) return; 179 183 … … 202 206 203 207 /* queue rpc call, set event handling and new state */ 204 close_req = dcerpc_samr_Close_send(s->pipe, c, &s->samrclose); 205 if (composite_nomem(close_req, c)) return; 206 207 composite_continue_rpc(c, close_req, continue_userinfo_closeuser, c); 208 subreq = dcerpc_samr_Close_r_send(s, c->event_ctx, 209 s->pipe->binding_handle, 210 &s->samrclose); 211 if (composite_nomem(subreq, c)) return; 212 213 tevent_req_set_callback(subreq, continue_userinfo_closeuser, c); 208 214 } 209 215 … … 212 218 * Stage 4: Close policy handle associated with opened user. 213 219 */ 214 static void continue_userinfo_closeuser(struct rpc_request *req)220 static void continue_userinfo_closeuser(struct tevent_req *subreq) 215 221 { 216 222 struct composite_context *c; … … 219 225 struct msg_rpc_close_user *msg_close; 220 226 221 c = t alloc_get_type(req->async.private_data, struct composite_context);227 c = tevent_req_callback_data(subreq, struct composite_context); 222 228 s = talloc_get_type(c->private_data, struct userinfo_state); 223 229 224 230 /* receive samr_Close reply */ 225 c->status = dcerpc_ndr_request_recv(req); 231 c->status = dcerpc_samr_Close_r_recv(subreq, s); 232 TALLOC_FREE(subreq); 226 233 if (!composite_is_ok(c)) return; 227 234 … … 259 266 struct userinfo_state *s; 260 267 struct dom_sid *sid; 261 struct rpc_request *openuser_req, *lookup_req;268 struct tevent_req *subreq; 262 269 263 270 if (!p || !io) return NULL; … … 286 293 287 294 /* send request */ 288 openuser_req = dcerpc_samr_OpenUser_send(p, c, &s->openuser); 289 if (composite_nomem(openuser_req, c)) return c; 290 291 composite_continue_rpc(c, openuser_req, continue_userinfo_openuser, c); 295 subreq = dcerpc_samr_OpenUser_r_send(s, c->event_ctx, 296 p->binding_handle, 297 &s->openuser); 298 if (composite_nomem(subreq, c)) return c; 299 300 tevent_req_set_callback(subreq, continue_userinfo_openuser, c); 292 301 293 302 } else { … … 306 315 307 316 /* send request */ 308 lookup_req = dcerpc_samr_LookupNames_send(p, c, &s->lookup); 309 if (composite_nomem(lookup_req, c)) return c; 310 311 composite_continue_rpc(c, lookup_req, continue_userinfo_lookup, c); 317 subreq = dcerpc_samr_LookupNames_r_send(s, c->event_ctx, 318 p->binding_handle, 319 &s->lookup); 320 if (composite_nomem(subreq, c)) return c; 321 322 tevent_req_set_callback(subreq, continue_userinfo_lookup, c); 312 323 } 313 324 -
vendor/current/source4/libnet/userman.c
r414 r740 33 33 struct useradd_state { 34 34 struct dcerpc_pipe *pipe; 35 struct rpc_request *req;36 35 struct policy_handle domain_handle; 37 36 struct samr_CreateUser createuser; … … 44 43 45 44 46 static void continue_useradd_create(struct rpc_request *req);45 static void continue_useradd_create(struct tevent_req *subreq); 47 46 48 47 … … 50 49 * Stage 1 (and the only one for now): Create user account. 51 50 */ 52 static void continue_useradd_create(struct rpc_request *req)51 static void continue_useradd_create(struct tevent_req *subreq) 53 52 { 54 53 struct composite_context *c; 55 54 struct useradd_state *s; 56 55 57 c = t alloc_get_type(req->async.private_data, struct composite_context);56 c = tevent_req_callback_data(subreq, struct composite_context); 58 57 s = talloc_get_type(c->private_data, struct useradd_state); 59 58 60 59 /* check rpc layer status code */ 61 c->status = dcerpc_ndr_request_recv(s->req); 60 c->status = dcerpc_samr_CreateUser_r_recv(subreq, s); 61 TALLOC_FREE(subreq); 62 62 if (!composite_is_ok(c)) return; 63 63 … … 101 101 struct composite_context *c; 102 102 struct useradd_state *s; 103 struct tevent_req *subreq; 103 104 104 105 if (!p || !io) return NULL; … … 131 132 132 133 /* send the request */ 133 s->req = dcerpc_samr_CreateUser_send(p, c, &s->createuser); 134 if (composite_nomem(s->req, c)) return c; 135 136 composite_continue_rpc(c, s->req, continue_useradd_create, c); 134 subreq = dcerpc_samr_CreateUser_r_send(s, c->event_ctx, 135 p->binding_handle, 136 &s->createuser); 137 if (composite_nomem(subreq, c)) return c; 138 139 tevent_req_set_callback(subreq, continue_useradd_create, c); 137 140 return c; 138 141 } … … 204 207 205 208 206 static void continue_userdel_name_found(struct rpc_request *req);207 static void continue_userdel_user_opened(struct rpc_request*req);208 static void continue_userdel_deleted(struct rpc_request *req);209 static void continue_userdel_name_found(struct tevent_req *subreq); 210 static void continue_userdel_user_opened(struct tevent_req *subreq); 211 static void continue_userdel_deleted(struct tevent_req *subreq); 209 212 210 213 … … 212 215 * Stage 1: Lookup the user name and resolve it to rid 213 216 */ 214 static void continue_userdel_name_found(struct rpc_request *req)217 static void continue_userdel_name_found(struct tevent_req *subreq) 215 218 { 216 219 struct composite_context *c; 217 220 struct userdel_state *s; 218 struct rpc_request *openuser_req;219 221 struct monitor_msg msg; 220 222 221 c = t alloc_get_type(req->async.private_data, struct composite_context);223 c = tevent_req_callback_data(subreq, struct composite_context); 222 224 s = talloc_get_type(c->private_data, struct userdel_state); 223 225 224 226 /* receive samr_LookupNames result */ 225 c->status = dcerpc_ndr_request_recv(req); 227 c->status = dcerpc_samr_LookupNames_r_recv(subreq, s); 228 TALLOC_FREE(subreq); 226 229 if (!composite_is_ok(c)) return; 227 230 … … 265 268 266 269 /* send rpc request */ 267 openuser_req = dcerpc_samr_OpenUser_send(s->pipe, c, &s->openuser); 268 if (composite_nomem(openuser_req, c)) return; 269 270 composite_continue_rpc(c, openuser_req, continue_userdel_user_opened, c); 270 subreq = dcerpc_samr_OpenUser_r_send(s, c->event_ctx, 271 s->pipe->binding_handle, 272 &s->openuser); 273 if (composite_nomem(subreq, c)) return; 274 275 tevent_req_set_callback(subreq, continue_userdel_user_opened, c); 271 276 } 272 277 … … 275 280 * Stage 2: Open user account. 276 281 */ 277 static void continue_userdel_user_opened(struct rpc_request*req)282 static void continue_userdel_user_opened(struct tevent_req *subreq) 278 283 { 279 284 struct composite_context *c; 280 285 struct userdel_state *s; 281 struct rpc_request *deluser_req;282 286 struct monitor_msg msg; 283 287 284 c = t alloc_get_type(req->async.private_data, struct composite_context);288 c = tevent_req_callback_data(subreq, struct composite_context); 285 289 s = talloc_get_type(c->private_data, struct userdel_state); 286 290 287 291 /* receive samr_OpenUser result */ 288 c->status = dcerpc_ndr_request_recv(req); 292 c->status = dcerpc_samr_OpenUser_r_recv(subreq, s); 293 TALLOC_FREE(subreq); 289 294 if (!composite_is_ok(c)) return; 290 295 … … 313 318 314 319 /* send rpc request */ 315 deluser_req = dcerpc_samr_DeleteUser_send(s->pipe, c, &s->deleteuser); 316 if (composite_nomem(deluser_req, c)) return; 320 subreq = dcerpc_samr_DeleteUser_r_send(s, c->event_ctx, 321 s->pipe->binding_handle, 322 &s->deleteuser); 323 if (composite_nomem(subreq, c)) return; 317 324 318 325 /* callback handler setup */ 319 composite_continue_rpc(c, deluser_req, continue_userdel_deleted, c);326 tevent_req_set_callback(subreq, continue_userdel_deleted, c); 320 327 } 321 328 … … 324 331 * Stage 3: Delete user account 325 332 */ 326 static void continue_userdel_deleted(struct rpc_request *req)333 static void continue_userdel_deleted(struct tevent_req *subreq) 327 334 { 328 335 struct composite_context *c; … … 330 337 struct monitor_msg msg; 331 338 332 c = t alloc_get_type(req->async.private_data, struct composite_context);339 c = tevent_req_callback_data(subreq, struct composite_context); 333 340 s = talloc_get_type(c->private_data, struct userdel_state); 334 341 335 342 /* receive samr_DeleteUser result */ 336 c->status = dcerpc_ndr_request_recv(req); 343 c->status = dcerpc_samr_DeleteUser_r_recv(subreq, s); 344 TALLOC_FREE(subreq); 337 345 if (!composite_is_ok(c)) return; 338 346 … … 370 378 struct composite_context *c; 371 379 struct userdel_state *s; 372 struct rpc_request *lookup_req;380 struct tevent_req *subreq; 373 381 374 382 /* composite context allocation and setup */ … … 397 405 398 406 /* send the request */ 399 lookup_req = dcerpc_samr_LookupNames_send(p, c, &s->lookupname); 400 if (composite_nomem(lookup_req, c)) return c; 407 subreq = dcerpc_samr_LookupNames_r_send(s, c->event_ctx, 408 p->binding_handle, 409 &s->lookupname); 410 if (composite_nomem(subreq, c)) return c; 401 411 402 412 /* set the next stage */ 403 composite_continue_rpc(c, lookup_req, continue_userdel_name_found, c);413 tevent_req_set_callback(subreq, continue_userdel_name_found, c); 404 414 return c; 405 415 } … … 455 465 */ 456 466 457 static void continue_usermod_name_found(struct rpc_request *req);458 static void continue_usermod_user_opened(struct rpc_request *req);459 static void continue_usermod_user_queried(struct rpc_request *req);460 static void continue_usermod_user_changed(struct rpc_request *req);467 static void continue_usermod_name_found(struct tevent_req *subreq); 468 static void continue_usermod_user_opened(struct tevent_req *subreq); 469 static void continue_usermod_user_queried(struct tevent_req *subreq); 470 static void continue_usermod_user_changed(struct tevent_req *subreq); 461 471 462 472 … … 480 490 * Step 1: Lookup user name 481 491 */ 482 static void continue_usermod_name_found(struct rpc_request *req)492 static void continue_usermod_name_found(struct tevent_req *subreq) 483 493 { 484 494 struct composite_context *c; 485 495 struct usermod_state *s; 486 struct rpc_request *openuser_req;487 496 struct monitor_msg msg; 488 497 489 c = t alloc_get_type(req->async.private_data, struct composite_context);498 c = tevent_req_callback_data(subreq, struct composite_context); 490 499 s = talloc_get_type(c->private_data, struct usermod_state); 491 500 492 501 /* receive samr_LookupNames result */ 493 c->status = dcerpc_ndr_request_recv(req); 502 c->status = dcerpc_samr_LookupNames_r_recv(subreq, s); 503 TALLOC_FREE(subreq); 494 504 if (!composite_is_ok(c)) return; 495 505 … … 533 543 534 544 /* send the rpc request */ 535 openuser_req = dcerpc_samr_OpenUser_send(s->pipe, c, &s->openuser); 536 if (composite_nomem(openuser_req, c)) return; 537 538 composite_continue_rpc(c, openuser_req, continue_usermod_user_opened, c); 545 subreq = dcerpc_samr_OpenUser_r_send(s, c->event_ctx, 546 s->pipe->binding_handle, 547 &s->openuser); 548 if (composite_nomem(subreq, c)) return; 549 550 tevent_req_set_callback(subreq, continue_usermod_user_opened, c); 539 551 } 540 552 … … 656 668 struct usermod_state *s) 657 669 { 658 struct rpc_request *query_req, *setuser_req;659 670 bool do_set; 660 671 union samr_UserInfo *i = &s->info; 672 struct tevent_req *subreq; 661 673 662 674 /* set the level to invalid value, so that unless setfields routine … … 687 699 /* send query user info request to retrieve complete data of 688 700 a particular info level */ 689 query_req = dcerpc_samr_QueryUserInfo_send(s->pipe, c, &s->queryuser); 690 composite_continue_rpc(c, query_req, continue_usermod_user_queried, c); 701 subreq = dcerpc_samr_QueryUserInfo_r_send(s, c->event_ctx, 702 s->pipe->binding_handle, 703 &s->queryuser); 704 if (composite_nomem(subreq, c)) return NT_STATUS_NO_MEMORY; 705 tevent_req_set_callback(subreq, continue_usermod_user_queried, c); 691 706 692 707 } else { … … 696 711 697 712 /* send set user info request after making required change */ 698 setuser_req = dcerpc_samr_SetUserInfo_send(s->pipe, c, &s->setuser); 699 composite_continue_rpc(c, setuser_req, continue_usermod_user_changed, c); 713 subreq = dcerpc_samr_SetUserInfo_r_send(s, c->event_ctx, 714 s->pipe->binding_handle, 715 &s->setuser); 716 if (composite_nomem(subreq, c)) return NT_STATUS_NO_MEMORY; 717 tevent_req_set_callback(subreq, continue_usermod_user_changed, c); 700 718 } 701 719 … … 707 725 * Stage 2: Open user account 708 726 */ 709 static void continue_usermod_user_opened(struct rpc_request *req)727 static void continue_usermod_user_opened(struct tevent_req *subreq) 710 728 { 711 729 struct composite_context *c; 712 730 struct usermod_state *s; 713 731 714 c = t alloc_get_type(req->async.private_data, struct composite_context);732 c = tevent_req_callback_data(subreq, struct composite_context); 715 733 s = talloc_get_type(c->private_data, struct usermod_state); 716 734 717 c->status = dcerpc_ndr_request_recv(req); 735 c->status = dcerpc_samr_OpenUser_r_recv(subreq, s); 736 TALLOC_FREE(subreq); 718 737 if (!composite_is_ok(c)) return; 719 738 … … 731 750 * Stage 2a (optional): Query the user information 732 751 */ 733 static void continue_usermod_user_queried(struct rpc_request *req)752 static void continue_usermod_user_queried(struct tevent_req *subreq) 734 753 { 735 754 struct composite_context *c; … … 737 756 union samr_UserInfo *i; 738 757 uint16_t level; 739 struct rpc_request *setuser_req; 740 741 c = talloc_get_type(req->async.private_data, struct composite_context); 758 759 c = tevent_req_callback_data(subreq, struct composite_context); 742 760 s = talloc_get_type(c->private_data, struct usermod_state); 743 761 … … 745 763 746 764 /* receive samr_QueryUserInfo result */ 747 c->status = dcerpc_ndr_request_recv(req); 765 c->status = dcerpc_samr_QueryUserInfo_r_recv(subreq, s); 766 TALLOC_FREE(subreq); 748 767 if (!composite_is_ok(c)) return; 749 768 … … 766 785 767 786 /* send the rpc request */ 768 setuser_req = dcerpc_samr_SetUserInfo_send(s->pipe, c, &s->setuser); 769 composite_continue_rpc(c, setuser_req, continue_usermod_user_changed, c); 787 subreq = dcerpc_samr_SetUserInfo_r_send(s, c->event_ctx, 788 s->pipe->binding_handle, 789 &s->setuser); 790 if (composite_nomem(subreq, c)) return; 791 tevent_req_set_callback(subreq, continue_usermod_user_changed, c); 770 792 } 771 793 … … 774 796 * Stage 3: Set new user account data 775 797 */ 776 static void continue_usermod_user_changed(struct rpc_request *req)798 static void continue_usermod_user_changed(struct tevent_req *subreq) 777 799 { 778 800 struct composite_context *c; 779 801 struct usermod_state *s; 780 802 781 c = t alloc_get_type(req->async.private_data, struct composite_context);803 c = tevent_req_callback_data(subreq, struct composite_context); 782 804 s = talloc_get_type(c->private_data, struct usermod_state); 783 805 784 806 /* receive samr_SetUserInfo result */ 785 c->status = dcerpc_ndr_request_recv(req); 807 c->status = dcerpc_samr_SetUserInfo_r_recv(subreq, s); 808 TALLOC_FREE(subreq); 786 809 if (!composite_is_ok(c)) return; 787 810 … … 818 841 struct composite_context *c; 819 842 struct usermod_state *s; 820 struct rpc_request *lookup_req;843 struct tevent_req *subreq; 821 844 822 845 /* composite context allocation and setup */ … … 845 868 846 869 /* send the rpc request */ 847 lookup_req = dcerpc_samr_LookupNames_send(p, c, &s->lookupname); 848 if (composite_nomem(lookup_req, c)) return c; 870 subreq = dcerpc_samr_LookupNames_r_send(s, c->event_ctx, 871 p->binding_handle, 872 &s->lookupname); 873 if (composite_nomem(subreq, c)) return c; 849 874 850 875 /* callback handler setup */ 851 composite_continue_rpc(c, lookup_req, continue_usermod_name_found, c);876 tevent_req_set_callback(subreq, continue_usermod_name_found, c); 852 877 return c; 853 878 }
Note:
See TracChangeset
for help on using the changeset viewer.