Ignore:
Timestamp:
Nov 14, 2012, 12:59:34 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to 3.6.0

Location:
vendor/current/source4/libnet
Files:
1 added
2 deleted
26 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source4/libnet/groupinfo.c

    r414 r740  
    4747
    4848
    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);
     49static void continue_groupinfo_lookup(struct tevent_req *subreq);
     50static void continue_groupinfo_opengroup(struct tevent_req *subreq);
     51static void continue_groupinfo_getgroup(struct tevent_req *subreq);
     52static void continue_groupinfo_closegroup(struct tevent_req *subreq);
    5353
    5454
     
    5656 * Stage 1 (optional): Look for a group name in SAM server.
    5757 */
    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;
     58static void continue_groupinfo_lookup(struct tevent_req *subreq)
     59{
     60        struct composite_context *c;
     61        struct groupinfo_state *s;
    6362        struct monitor_msg msg;
    6463        struct msg_rpc_lookup_name *msg_lookup;
    6564
    66         c = talloc_get_type(req->async.private_data, struct composite_context);
     65        c = tevent_req_callback_data(subreq, struct composite_context);
    6766        s = talloc_get_type(c->private_data, struct groupinfo_state);
    6867
    6968        /* 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);
    7171        if (!composite_is_ok(c)) return;
    7272       
     
    105105
    106106        /* 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);
    111113}
    112114
     
    115117 * Stage 2: Open group policy handle.
    116118 */
    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;
     119static void continue_groupinfo_opengroup(struct tevent_req *subreq)
     120{
     121        struct composite_context *c;
     122        struct groupinfo_state *s;
    122123        struct monitor_msg msg;
    123124        struct msg_rpc_open_group *msg_open;
    124125
    125         c = talloc_get_type(req->async.private_data, struct composite_context);
     126        c = tevent_req_callback_data(subreq, struct composite_context);
    126127        s = talloc_get_type(c->private_data, struct groupinfo_state);
    127128
    128129        /* 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);
    130132        if (!composite_is_ok(c)) return;
    131133
     
    154156       
    155157        /* 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);
    160165}
    161166
     
    164169 * Stage 3: Get requested group information.
    165170 */
    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;
     171static void continue_groupinfo_getgroup(struct tevent_req *subreq)
     172{
     173        struct composite_context *c;
     174        struct groupinfo_state *s;
    171175        struct monitor_msg msg;
    172176        struct msg_rpc_query_group *msg_query;
    173177
    174         c = talloc_get_type(req->async.private_data, struct composite_context);
     178        c = tevent_req_callback_data(subreq, struct composite_context);
    175179        s = talloc_get_type(c->private_data, struct groupinfo_state);
    176180
    177181        /* 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);
    179184        if (!composite_is_ok(c)) return;
    180185
     
    203208       
    204209        /* 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);
    209216}
    210217
     
    213220 * Stage 4: Close policy handle associated with opened group.
    214221 */
    215 static void continue_groupinfo_closegroup(struct rpc_request *req)
     222static void continue_groupinfo_closegroup(struct tevent_req *subreq)
    216223{
    217224        struct composite_context *c;
     
    220227        struct msg_rpc_close_group *msg_close;
    221228
    222         c = talloc_get_type(req->async.private_data, struct composite_context);
     229        c = tevent_req_callback_data(subreq, struct composite_context);
    223230        s = talloc_get_type(c->private_data, struct groupinfo_state);
    224231
    225232        /* 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);
    227235        if (!composite_is_ok(c)) return;
    228236
     
    260268        struct groupinfo_state *s;
    261269        struct dom_sid *sid;
    262         struct rpc_request *opengroup_req, *lookup_req;
     270        struct tevent_req *subreq;
    263271
    264272        if (!p || !io) return NULL;
     
    287295               
    288296                /* 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);
    293303
    294304        } else {
     
    307317
    308318                /* 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);
    313325        }
    314326
  • vendor/current/source4/libnet/groupman.c

    r414 r740  
    3939
    4040
    41 static void continue_groupadd_created(struct rpc_request *req);
     41static void continue_groupadd_created(struct tevent_req *subreq);
    4242
    4343
     
    4848        struct composite_context *c;
    4949        struct groupadd_state *s;
    50         struct rpc_request *create_req;
     50        struct tevent_req *subreq;
    5151
    5252        if (!p || !io) return NULL;
     
    7777        s->creategroup.out.rid           = &s->group_rid;
    7878       
    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);
    8385        return c;
    8486}
     
    100102
    101103
    102 static void continue_groupadd_created(struct rpc_request *req)
     104static void continue_groupadd_created(struct tevent_req *subreq)
    103105{
    104106        struct composite_context *c;
    105107        struct groupadd_state *s;
    106108
    107         c = talloc_get_type(req->async.private_data, struct composite_context);
     109        c = tevent_req_callback_data(subreq, struct composite_context);
    108110        s = talloc_get_type(c->private_data, struct groupadd_state);
    109111
    110         c->status = dcerpc_ndr_request_recv(req);
     112        c->status = dcerpc_samr_CreateDomainGroup_r_recv(subreq, s);
     113        TALLOC_FREE(subreq);
    111114        if (!composite_is_ok(c)) return;
    112115
     
    141144
    142145
    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);
     146static void continue_groupdel_name_found(struct tevent_req *subreq);
     147static void continue_groupdel_group_opened(struct tevent_req *subreq);
     148static void continue_groupdel_deleted(struct tevent_req *subreq);
    146149
    147150
     
    152155        struct composite_context *c;
    153156        struct groupdel_state *s;
    154         struct rpc_request *lookup_req;
     157        struct tevent_req *subreq;
    155158
    156159        /* composite context allocation and setup */
     
    179182
    180183        /* 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);
    185190        return c;
    186191}
    187192
    188193
    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);
     194static 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);
    196200        s = talloc_get_type(c->private_data, struct groupdel_state);
    197201
    198202        /* 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);
    200205        if (!composite_is_ok(c)) return;
    201206
     
    226231
    227232        /* 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
     242static 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);
    242248        s = talloc_get_type(c->private_data, struct groupdel_state);
    243249
    244250        /* 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);
    246253        if (!composite_is_ok(c)) return;
    247254
     
    257264       
    258265        /* 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;
    261270
    262271        /* 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 = talloc_get_type(req->async.private_data, struct composite_context);
     272        tevent_req_set_callback(subreq, continue_groupdel_deleted, c);
     273}
     274
     275
     276static 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);
    273282        s = talloc_get_type(c->private_data, struct groupdel_state);
    274283
    275284        /* 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);
    277287        if (!composite_is_ok(c)) return;
    278288
  • vendor/current/source4/libnet/libnet.c

    r414 r740  
    4343        ctx->lp_ctx = lp_ctx;
    4444
     45        /* make sure dcerpc is initialized */
     46        dcerpc_init(lp_ctx);
     47
    4548        /* name resolution methods */
    46         ctx->resolve_ctx = lp_resolve_context(lp_ctx);
     49        ctx->resolve_ctx = lpcfg_resolve_context(lp_ctx);
    4750
    4851        /* connected services' params */
     
    5356        ctx->samr.buf_size = 128;
    5457
     58        ctx->server_address = NULL;
     59
    5560        return ctx;
    5661}
  • vendor/current/source4/libnet/libnet.h

    r414 r740  
    3131        struct {
    3232                struct dcerpc_pipe *pipe;
     33                struct dcerpc_binding_handle *samr_handle;
    3334                const char *name;
    3435                struct dom_sid *sid;
     
    4243        struct {
    4344                struct dcerpc_pipe *pipe;
     45                struct dcerpc_binding_handle *lsa_handle;
    4446                const char *name;
    4547                uint32_t access_mask;
     
    5355
    5456        struct loadparm_context *lp_ctx;
     57
     58        /* if non-null then override the server address */
     59        const char *server_address;
    5560};
    5661
    5762
    58 #include "lib/ldb/include/ldb.h"
     63#include <ldb.h>
    5964#include "libnet/composite.h"
    6065#include "libnet/userman.h"
  • vendor/current/source4/libnet/libnet_become_dc.c

    r414 r740  
    2222#include "libcli/composite/composite.h"
    2323#include "libcli/cldap/cldap.h"
    24 #include "lib/ldb/include/ldb.h"
    25 #include "lib/ldb/include/ldb_errors.h"
    26 #include "lib/ldb_wrap.h"
     24#include <ldb.h>
     25#include <ldb_errors.h>
     26#include "ldb_wrap.h"
    2727#include "dsdb/samdb/samdb.h"
    2828#include "../libds/common/flags.h"
     
    3535#include "auth/gensec/gensec.h"
    3636#include "param/param.h"
     37#include "lib/tsocket/tsocket.h"
    3738
    3839/*****************************************************************************
     
    337338 *              objectGUID:     <object_guid>
    338339 *              systemFlags:    1107296256 <0x42000000>
    339  *              objectCategory: CN=Site,C=Schema,CN=Configuration,<domain_partition>
     340 *              objectCategory: CN=Site,CN=Schema,CN=Configuration,<domain_partition>
    340341 */
    341342
     
    701702                struct dcerpc_binding *binding;
    702703                struct dcerpc_pipe *pipe;
     704                struct dcerpc_binding_handle *drsuapi_handle;
    703705                DATA_BLOB gensec_skey;
    704706                struct drsuapi_DsBind bind_r;
     
    710712        } drsuapi1, drsuapi2, drsuapi3;
    711713
     714        void *ndr_struct_ptr;
     715
    712716        struct libnet_BecomeDC_Domain domain;
    713717        struct libnet_BecomeDC_Forest forest;
     
    730734        struct libnet_BecomeDC_StoreChunk _sc;
    731735        struct libnet_BecomeDC_Callbacks callbacks;
     736
     737        bool rodc_join;
    732738};
     739
     740static 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}
    733746
    734747static void becomeDC_recv_cldap(struct tevent_req *req);
     
    738751        struct composite_context *c = s->creq;
    739752        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;
    743758        s->cldap.io.in.realm            = s->domain.dns_name;
    744759        s->cldap.io.in.host             = s->dest_dsa.netbios_name;
     
    750765        s->cldap.io.in.map_response     = true;
    751766
     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
    752776        c->status = cldap_socket_init(s, s->libnet->event_ctx,
    753                                       NULL, NULL, &s->cldap.sock);//TODO
     777                                      NULL, dest_address, &s->cldap.sock);
    754778        if (!composite_is_ok(c)) return;
    755779
     
    767791        struct composite_context *c = s->creq;
    768792
    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);
    772794        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        }
    775802        s->cldap.netlogon = s->cldap.io.out.netlogon.data.nt5_ex;
    776803
    777804        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;
    779806        s->domain.guid                  = s->cldap.netlogon.domain_uuid;
    780807
     
    787814        s->dest_dsa.site_name           = s->cldap.netlogon.client_site;
    788815
     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
    789825        becomeDC_connect_ldap1(s);
    790826}
     
    801837                                     NULL,
    802838                                     s->libnet->cred,
    803                                      0, NULL);
     839                                     0);
    804840        talloc_free(url);
    805841        if (ldap->ldb == NULL) {
     
    877913
    878914        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        }
    879923
    880924        talloc_free(r);
     
    906950
    907951        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        }
    908960
    909961        talloc_free(r);
     
    9811033        struct ldb_dn *ntds_dn;
    9821034        struct ldb_dn *server_dn;
    983         static const char *_1_1_attrs[] = {
    984                 "1.1",
    985                 NULL
    986         };
    987         static const char *fsmo_attrs[] = {
    988                 "fSMORoleOwner",
    989                 NULL
    990         };
    9911035        static const char *dns_attrs[] = {
    9921036                "dnsHostName",
     
    9981042        };
    9991043
    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);
    10071048        if (ret != LDB_SUCCESS) {
    10081049                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);
    10201053        if (ret != LDB_SUCCESS) {
     1054                talloc_free(basedn);
    10211055                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);
    10351060
    10361061        server_dn = ldb_dn_get_parent(s, ntds_dn);
     
    10491074        }
    10501075
    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);
    10521077        if (!s->infrastructure_fsmo.dns_name) return NT_STATUS_INVALID_NETWORK_RESPONSE;
    10531078        talloc_steal(s, s->infrastructure_fsmo.dns_name);
     
    11091134        }
    11101135
    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);
    11121137        if (!reference_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;
    11131138
     
    11271152        }
    11281153
    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);
    11301155        if (!s->rid_manager_fsmo.ntds_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;
    11311156        talloc_steal(s, s->rid_manager_fsmo.ntds_dn_str);
     
    11511176        }
    11521177
    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);
    11541179        if (!s->rid_manager_fsmo.dns_name) return NT_STATUS_INVALID_NETWORK_RESPONSE;
    11551180        talloc_steal(s, s->rid_manager_fsmo.dns_name);
     
    12361261        }
    12371262
    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);
    12391264        if (!s->dest_dsa.computer_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;
    12401265        talloc_steal(s, s->dest_dsa.computer_dn_str);
    12411266
    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);
    12431268
    12441269        talloc_free(r);
     
    12741299        }
    12751300
    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);
    12771302        if (server_reference_dn_str) {
    12781303                server_reference_dn     = ldb_dn_new(r, s->ldap1.ldb, server_reference_dn_str);
     
    12831308
    12841309                /*
    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!
    12871312                 */
    12881313                if (ldb_dn_compare(computer_dn, server_reference_dn) != 0) {
     
    12931318
    12941319        /* 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);
    12961321        if (!s->dest_dsa.server_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;
    12971322        talloc_steal(s, s->dest_dsa.server_dn_str);
     
    13281353        }
    13291354
    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);
    13311356        if (!server_reference_bl_dn_str) {
    13321357                /* if no back link is present, we're done for this function */
     
    13361361
    13371362        /* 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);
    13391364        if (s->dest_dsa.server_dn_str) {
    13401365                /* if a back link is present, we know that the server object is present */
     
    13991424        int ret;
    14001425        struct ldb_message *msg;
    1401         uint32_t i;
     1426        unsigned int i;
    14021427
    14031428        /* make a 'modify' msg, and only for serverReference */
     
    15201545                 *       passed as auth_type here. If NTLMSSP is used, Windows
    15211546                 *       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.
    15251551                 */
    1526                 if (lp_parm_bool(s->libnet->lp_ctx, NULL, "become_dc",
     1552                if (lpcfg_parm_bool(s->libnet->lp_ctx, NULL, "become_dc",
    15271553                                 "force krb5", true))
    15281554                {
    15291555                        krb5_str = "krb5,";
    15301556                }
    1531                 if (lp_parm_bool(s->libnet->lp_ctx, NULL, "become_dc",
     1557                if (lpcfg_parm_bool(s->libnet->lp_ctx, NULL, "become_dc",
    15321558                                 "print", false))
    15331559                {
     
    15511577static void becomeDC_drsuapi_bind_send(struct libnet_BecomeDC_state *s,
    15521578                                       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));
     1580static void becomeDC_drsuapi1_bind_recv(struct tevent_req *subreq);
    15551581
    15561582static void becomeDC_drsuapi1_connect_recv(struct composite_context *req)
     
    15631589        if (!composite_is_ok(c)) return;
    15641590
     1591        s->drsuapi1.drsuapi_handle = s->drsuapi1.pipe->binding_handle;
     1592
    15651593        c->status = gensec_session_key(s->drsuapi1.pipe->conn->security_state.generic_state,
    15661594                                       &s->drsuapi1.gensec_skey);
     
    15721600static void becomeDC_drsuapi_bind_send(struct libnet_BecomeDC_state *s,
    15731601                                       struct becomeDC_drsuapi *drsuapi,
    1574                                        void (*recv_fn)(struct rpc_request *req))
     1602                                       void (*recv_fn)(struct tevent_req *subreq))
    15751603{
    15761604        struct composite_context *c = s->creq;
    1577         struct rpc_request *req;
    15781605        struct drsuapi_DsBindInfo28 *bind_info28;
     1606        struct tevent_req *subreq;
    15791607
    15801608        GUID_from_string(DRSUAPI_DS_BIND_GUID_W2K3, &drsuapi->bind_guid);
     
    15901618        bind_info28->supported_extensions       |= DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE;
    15911619        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) {
    15931621                /* TODO: find out how this is really triggered! */
    15941622                bind_info28->supported_extensions       |= DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION;
     
    16031631        bind_info28->supported_extensions       |= DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY;
    16041632        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;
    16061634        bind_info28->supported_extensions       |= DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2;
    16071635        bind_info28->supported_extensions       |= DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6;
     
    16271655        drsuapi->bind_r.out.bind_handle = &drsuapi->bind_handle;
    16281656
    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);
    16311662}
    16321663
     
    16701701static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s);
    16711702
    1672 static void becomeDC_drsuapi1_bind_recv(struct rpc_request *req)
    1673 {
    1674         struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data,
     1703static void becomeDC_drsuapi1_bind_recv(struct tevent_req *subreq)
     1704{
     1705        struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq,
    16751706                                          struct libnet_BecomeDC_state);
    16761707        struct composite_context *c = s->creq;
    16771708        WERROR status;
    16781709
    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;
    16911713
    16921714        status = becomeDC_drsuapi_bind_recv(s, &s->drsuapi1);
     
    16991721}
    17001722
    1701 static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req);
     1723static void becomeDC_drsuapi1_add_entry_recv(struct tevent_req *subreq);
    17021724
    17031725static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
    17041726{
    17051727        struct composite_context *c = s->creq;
    1706         struct rpc_request *req;
    17071728        struct drsuapi_DsAddEntry *r;
    17081729        struct drsuapi_DsReplicaObjectIdentifier *identifier;
    17091730        uint32_t num_attrs, i = 0;
    17101731        struct drsuapi_DsReplicaAttribute *attrs;
    1711         struct smb_iconv_convenience *iconv_convenience = lp_iconv_convenience(s->libnet->lp_ctx);
    17121732        enum ndr_err_code ndr_err;
    17131733        bool w2k3;
     1734        struct tevent_req *subreq;
    17141735
    17151736        /* choose a random invocationId */
     
    17171738
    17181739        /*
    1719          * if the schema version indicates w2k3, then
    1720          * also send some w2k3 specific attributes
     1740         * if the schema version indicates w2k3, then also send some w2k3
     1741         * specific attributes.
    17211742         */
    17221743        if (s->forest.schema_object_version >= 30) {
     
    17391760
    17401761        /* allocate attribute array */
    1741         num_attrs       = 11;
     1762        num_attrs       = 12;
    17421763        attrs           = talloc_array(r, struct drsuapi_DsReplicaAttribute, num_attrs);
    17431764        if (composite_nomem(attrs, c)) return;
     
    18081829                if (composite_nomem(v, c)) return;
    18091830
    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);
    18111833                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    18121834                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    18161838                vs[0].blob              = &vd[0];
    18171839
    1818                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_ntSecurityDescriptor;
     1840                attrs[i].attid                  = DRSUAPI_ATTID_ntSecurityDescriptor;
    18191841                attrs[i].value_ctr.num_values   = 1;
    18201842                attrs[i].value_ctr.values       = vs;
     
    18421864                vs[0].blob              = &vd[0];
    18431865
    1844                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_objectClass;
     1866                attrs[i].attid                  = DRSUAPI_ATTID_objectClass;
    18451867                attrs[i].value_ctr.num_values   = 1;
    18461868                attrs[i].value_ctr.values       = vs;
     
    18491871        }
    18501872
    1851         /* objectCategory: CN=NTDS-DSA,CN=Schema,... */
     1873        /* objectCategory: CN=NTDS-DSA,CN=Schema,... or CN=NTDS-DSA-RO,CN=Schema,... */
    18521874        {
    18531875                struct drsuapi_DsAttributeValue *vs;
     
    18631885                v[0].guid               = GUID_zero();
    18641886                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",
    18661890                                                          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                }
    18671895                if (composite_nomem(v[0].dn, c)) return;
    18681896
    1869                 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],
    1870                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     1897                ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0],
     1898                        (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    18711899                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    18721900                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    18761904                vs[0].blob              = &vd[0];
    18771905
    1878                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_objectCategory;
     1906                attrs[i].attid                  = DRSUAPI_ATTID_objectCategory;
    18791907                attrs[i].value_ctr.num_values   = 1;
    18801908                attrs[i].value_ctr.values       = vs;
     
    18971925                v = &s->dest_dsa.invocation_id;
    18981926
    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;
    19041929
    19051930                vs[0].blob              = &vd[0];
    19061931
    1907                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_invocationId;
     1932                attrs[i].attid                  = DRSUAPI_ATTID_invocationId;
    19081933                attrs[i].value_ctr.num_values   = 1;
    19091934                attrs[i].value_ctr.values       = vs;
     
    19361961                v[2].dn                 = s->forest.schema_dn_str;
    19371962
    1938                 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],
    1939                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     1963                ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0],
     1964                        (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    19401965                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    19411966                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    19431968                }
    19441969
    1945                 ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience, &v[1],
    1946                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     1970                ndr_err = ndr_push_struct_blob(&vd[1], vd, &v[1],
     1971                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    19471972                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    19481973                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    19501975                }
    19511976
    1952                 ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience, &v[2],
    1953                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     1977                ndr_err = ndr_push_struct_blob(&vd[2], vd, &v[2],
     1978                   (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    19541979                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    19551980                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    19611986                vs[2].blob              = &vd[2];
    19621987
    1963                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_hasMasterNCs;
     1988                attrs[i].attid                  = DRSUAPI_ATTID_hasMasterNCs;
    19641989                attrs[i].value_ctr.num_values   = 3;
    19651990                attrs[i].value_ctr.values       = vs;
     
    19922017                v[2].dn                 = s->forest.schema_dn_str;
    19932018
    1994                 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],
    1995                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     2019                ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0],
     2020                        (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    19962021                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    19972022                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    19992024                }
    20002025
    2001                 ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience, &v[1],
    2002                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     2026                ndr_err = ndr_push_struct_blob(&vd[1], vd, &v[1],
     2027                        (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    20032028                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    20042029                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    20062031                }
    20072032
    2008                 ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience, &v[2],
    2009                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     2033                ndr_err = ndr_push_struct_blob(&vd[2], vd, &v[2],
     2034                        (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    20102035                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    20112036                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    20172042                vs[2].blob              = &vd[2];
    20182043
    2019                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs;
     2044                attrs[i].attid                  = DRSUAPI_ATTID_msDS_hasMasterNCs;
    20202045                attrs[i].value_ctr.num_values   = 3;
    20212046                attrs[i].value_ctr.values       = vs;
     
    20402065                v[0].dn                 = s->forest.schema_dn_str;
    20412066
    2042                 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],
    2043                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     2067                ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0],
     2068                        (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    20442069                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    20452070                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    20492074                vs[0].blob              = &vd[0];
    20502075
    2051                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_dMDLocation;
     2076                attrs[i].attid                  = DRSUAPI_ATTID_dMDLocation;
    20522077                attrs[i].value_ctr.num_values   = 1;
    20532078                attrs[i].value_ctr.values       = vs;
     
    20722097                v[0].dn                 = s->domain.dn_str;
    20732098
    2074                 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],
    2075                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     2099                ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0],
     2100                        (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    20762101                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    20772102                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    20812106                vs[0].blob              = &vd[0];
    20822107
    2083                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_msDS_HasDomainNCs;
     2108                attrs[i].attid                  = DRSUAPI_ATTID_msDS_HasDomainNCs;
    20842109                attrs[i].value_ctr.num_values   = 1;
    20852110                attrs[i].value_ctr.values       = vs;
     
    21022127                if (composite_nomem(vd[0].data, c)) return;
    21032128
    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));
    21062130
    21072131                vs[0].blob              = &vd[0];
    21082132
    2109                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_msDS_Behavior_Version;
     2133                attrs[i].attid                  = DRSUAPI_ATTID_msDS_Behavior_Version;
    21102134                attrs[i].value_ctr.num_values   = 1;
    21112135                attrs[i].value_ctr.values       = vs;
     
    21282152                if (composite_nomem(vd[0].data, c)) return;
    21292153
    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                }
    21312159
    21322160                vs[0].blob              = &vd[0];
    21332161
    2134                 attrs[i].attid                  = DRSUAPI_ATTRIBUTE_systemFlags;
     2162                attrs[i].attid                  = DRSUAPI_ATTID_systemFlags;
    21352163                attrs[i].value_ctr.num_values   = 1;
    21362164                attrs[i].value_ctr.values       = vs;
     
    21552183                v[0].dn                 = s->dest_dsa.computer_dn_str;
    21562184
    2157                 ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],
    2158                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
     2185                ndr_err = ndr_push_struct_blob(&vd[0], vd, &v[0],
     2186                        (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
    21592187                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    21602188                        c->status = ndr_map_error2ntstatus(ndr_err);
     
    21642192                vs[0].blob              = &vd[0];
    21652193
    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;
    21672220                attrs[i].value_ctr.num_values   = 1;
    21682221                attrs[i].value_ctr.values       = vs;
     
    21842237        r->in.req->req2.first_object.object.attribute_ctr.attributes    = attrs;
    21852238
    2186         r->out.level_out        = talloc(s, int32_t);
     2239        r->out.level_out        = talloc(s, uint32_t);
    21872240        r->out.ctr              = talloc(s, union drsuapi_DsAddEntryCtr);
    21882241
    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);
    21912247}
    21922248
     
    21942250static NTSTATUS becomeDC_prepare_db(struct libnet_BecomeDC_state *s);
    21952251
    2196 static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req)
    2197 {
    2198         struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data,
     2252static void becomeDC_drsuapi1_add_entry_recv(struct tevent_req *subreq)
     2253{
     2254        struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq,
    21992255                                          struct libnet_BecomeDC_state);
    22002256        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,
    22022258                                       struct drsuapi_DsAddEntry);
    22032259        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;
    22162266
    22172267        if (!W_ERROR_IS_OK(r->out.result)) {
     
    22212271
    22222272        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) {
    22272286                                composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);
    22282287                                return;
    22292288                        }
    22302289
    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"));
    22392298                                composite_error(c, werror_to_ntstatus(status));
    22402299                                return;
    22412300                        }
    22422301
    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                                }
    22472319                                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"));
    22532380                                break;
    22542381                        }
     
    22582385                }
    22592386
     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
    22602394                s->dest_dsa.ntds_guid   = r->out.ctr->ctr3.objects[0].guid;
     2395
    22612396        } 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));
    22642402                        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);
    22652413                }
    22662414
     
    23062454}
    23072455
    2308 static void becomeDC_drsuapi2_bind_recv(struct rpc_request *req);
     2456static void becomeDC_drsuapi2_bind_recv(struct tevent_req *subreq);
    23092457
    23102458static void becomeDC_drsuapi2_connect_recv(struct composite_context *req)
     
    23172465        if (!composite_is_ok(c)) return;
    23182466
     2467        s->drsuapi2.drsuapi_handle = s->drsuapi2.pipe->binding_handle;
     2468
    23192469        c->status = gensec_session_key(s->drsuapi2.pipe->conn->security_state.generic_state,
    23202470                                       &s->drsuapi2.gensec_skey);
     
    23262476static void becomeDC_drsuapi3_connect_recv(struct composite_context *req);
    23272477
    2328 static void becomeDC_drsuapi2_bind_recv(struct rpc_request *req)
    2329 {
    2330         struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data,
     2478static void becomeDC_drsuapi2_bind_recv(struct tevent_req *subreq)
     2479{
     2480        struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq,
    23312481                                          struct libnet_BecomeDC_state);
    23322482        struct composite_context *c = s->creq;
     
    23342484        WERROR status;
    23352485
    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;
    23482489
    23492490        status = becomeDC_drsuapi_bind_recv(s, &s->drsuapi2);
     
    23802521        if (!composite_is_ok(c)) return;
    23812522
     2523        s->drsuapi3.drsuapi_handle = s->drsuapi3.pipe->binding_handle;
     2524
    23822525        c->status = gensec_session_key(s->drsuapi3.pipe->conn->security_state.generic_state,
    23832526                                       &s->drsuapi3.gensec_skey);
     
    23912534                                                 struct becomeDC_drsuapi *drsuapi_p,
    23922535                                                 struct libnet_BecomeDC_Partition *partition,
    2393                                                  void (*recv_fn)(struct rpc_request *req))
     2536                                                 void (*recv_fn)(struct tevent_req *subreq))
    23942537{
    23952538        struct composite_context *c = s->creq;
    2396         struct rpc_request *req;
    23972539        struct drsuapi_DsGetNCChanges *r;
     2540        struct tevent_req *subreq;
    23982541
    23992542        r = talloc(s, struct drsuapi_DsGetNCChanges);
    24002543        if (composite_nomem(r, c)) return;
    24012544
    2402         r->out.level_out = talloc(r, int32_t);
     2545        r->out.level_out = talloc(r, uint32_t);
    24032546        if (composite_nomem(r->out.level_out, c)) return;
    24042547        r->in.req = talloc(r, union drsuapi_DsGetNCChangesRequest);
     
    24442587         * connections.
    24452588         */
    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);
    24482595}
    24492596
     
    25472694}
    25482695
    2549 static void becomeDC_drsuapi3_pull_schema_recv(struct rpc_request *req);
     2696static void becomeDC_drsuapi3_pull_schema_recv(struct tevent_req *subreq);
    25502697
    25512698static void becomeDC_drsuapi3_pull_schema_send(struct libnet_BecomeDC_state *s)
     
    25572704        s->schema_part.destination_dsa_guid     = s->drsuapi2.bind_guid;
    25582705
    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        }
    25652715
    25662716        s->schema_part.store_chunk      = s->callbacks.schema_chunk;
     
    25722722static void becomeDC_drsuapi3_pull_config_send(struct libnet_BecomeDC_state *s);
    25732723
    2574 static void becomeDC_drsuapi3_pull_schema_recv(struct rpc_request *req)
    2575 {
    2576         struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data,
     2724static void becomeDC_drsuapi3_pull_schema_recv(struct tevent_req *subreq)
     2725{
     2726        struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq,
    25772727                                          struct libnet_BecomeDC_state);
    25782728        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,
    25802730                                           struct drsuapi_DsGetNCChanges);
    25812731        WERROR status;
    25822732
    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;
    25952738
    25962739        status = becomeDC_drsuapi_pull_partition_recv(s, &s->drsuapi2, &s->drsuapi3, &s->schema_part, r);
     
    26112754}
    26122755
    2613 static void becomeDC_drsuapi3_pull_config_recv(struct rpc_request *req);
     2756static void becomeDC_drsuapi3_pull_config_recv(struct tevent_req *subreq);
    26142757
    26152758static void becomeDC_drsuapi3_pull_config_send(struct libnet_BecomeDC_state *s)
     
    26212764        s->config_part.destination_dsa_guid     = s->drsuapi2.bind_guid;
    26222765
    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        }
    26292775
    26302776        s->config_part.store_chunk      = s->callbacks.config_chunk;
     
    26342780}
    26352781
    2636 static void becomeDC_drsuapi3_pull_config_recv(struct rpc_request *req)
    2637 {
    2638         struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data,
     2782static void becomeDC_drsuapi3_pull_config_recv(struct tevent_req *subreq)
     2783{
     2784        struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq,
    26392785                                          struct libnet_BecomeDC_state);
    26402786        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,
    26422788                                           struct drsuapi_DsGetNCChanges);
    26432789        WERROR status;
    26442790
    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;
    26572796
    26582797        status = becomeDC_drsuapi_pull_partition_recv(s, &s->drsuapi2, &s->drsuapi3, &s->config_part, r);
     
    26732812}
    26742813
    2675 static void becomeDC_drsuapi3_pull_domain_recv(struct rpc_request *req);
     2814static void becomeDC_drsuapi3_pull_domain_recv(struct tevent_req *subreq);
    26762815
    26772816static void becomeDC_drsuapi3_pull_domain_send(struct libnet_BecomeDC_state *s)
     
    26832822        s->domain_part.destination_dsa_guid     = s->drsuapi2.bind_guid;
    26842823
    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        }
    26912833
    26922834        s->domain_part.store_chunk      = s->callbacks.domain_chunk;
     
    26992841                                              struct becomeDC_drsuapi *drsuapi,
    27002842                                              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 = talloc_get_type(req->async.private_data,
     2843                                              void (*recv_fn)(struct tevent_req *subreq));
     2844static void becomeDC_drsuapi2_update_refs_schema_recv(struct tevent_req *subreq);
     2845
     2846static void becomeDC_drsuapi3_pull_domain_recv(struct tevent_req *subreq)
     2847{
     2848        struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq,
    27072849                                          struct libnet_BecomeDC_state);
    27082850        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,
    27102852                                           struct drsuapi_DsGetNCChanges);
    27112853        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;
    27242860
    27252861        status = becomeDC_drsuapi_pull_partition_recv(s, &s->drsuapi2, &s->drsuapi3, &s->domain_part, r);
     
    27442880                                              struct becomeDC_drsuapi *drsuapi,
    27452881                                              struct libnet_BecomeDC_Partition *partition,
    2746                                               void (*recv_fn)(struct rpc_request *req))
     2882                                              void (*recv_fn)(struct tevent_req *subreq))
    27472883{
    27482884        struct composite_context *c = s->creq;
    2749         struct rpc_request *req;
    27502885        struct drsuapi_DsReplicaUpdateRefs *r;
    27512886        const char *ntds_guid_str;
    27522887        const char *ntds_dns_name;
     2888        struct tevent_req *subreq;
    27532889
    27542890        r = talloc(s, struct drsuapi_DsReplicaUpdateRefs);
     
    27682904        r->in.req.req1.dest_dsa_dns_name= ntds_dns_name;
    27692905        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;
    27722907
    27732908        /* 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
     2921static void becomeDC_drsuapi2_update_refs_config_recv(struct tevent_req *subreq);
     2922
     2923static void becomeDC_drsuapi2_update_refs_schema_recv(struct tevent_req *subreq)
     2924{
     2925        struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq,
    27872926                                          struct libnet_BecomeDC_state);
    27882927        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,
    27902929                                           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;
    28032936
    28042937        if (!W_ERROR_IS_OK(r->out.result)) {
     
    28132946}
    28142947
    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 = talloc_get_type(req->async.private_data,
     2948static void becomeDC_drsuapi2_update_refs_domain_recv(struct tevent_req *subreq);
     2949
     2950static void becomeDC_drsuapi2_update_refs_config_recv(struct tevent_req *subreq)
     2951{
     2952        struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq,
    28202953                                          struct libnet_BecomeDC_state);
    28212954        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,
    28232956                                           struct drsuapi_DsReplicaUpdateRefs);
    28242957
    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);
    28262962        if (!composite_is_ok(c)) return;
    28272963
     
    28372973}
    28382974
    2839 static void becomeDC_drsuapi2_update_refs_domain_recv(struct rpc_request *req)
    2840 {
    2841         struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data,
     2975static void becomeDC_drsuapi2_update_refs_domain_recv(struct tevent_req *subreq)
     2976{
     2977        struct libnet_BecomeDC_state *s = tevent_req_callback_data(subreq,
    28422978                                          struct libnet_BecomeDC_state);
    28432979        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,
    28452981                                           struct drsuapi_DsReplicaUpdateRefs);
    28462982
    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);
    28482987        if (!composite_is_ok(c)) return;
    28492988
     
    28633002        int ret;
    28643003        struct ldb_message *msg;
    2865         uint32_t i;
     3004        unsigned int i;
    28663005        uint32_t user_account_control = UF_SERVER_TRUST_ACCOUNT |
    28673006                                        UF_TRUSTED_FOR_DELEGATION;
     
    28783017        NT_STATUS_HAVE_NO_MEMORY(msg->dn);
    28793018
    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) {
    28823022                talloc_free(msg);
    28833023                return NT_STATUS_NO_MEMORY;
     
    29043044{
    29053045        int ret;
    2906         struct ldb_result *r;
    2907         struct ldb_dn *basedn;
    29083046        struct ldb_dn *old_dn;
    29093047        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);
    29223053        if (ret != LDB_SUCCESS) {
    29233054                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);
    29303063        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         }
    29383064
    29393065        if (ldb_dn_compare(old_dn, new_dn) == 0) {
    29403066                /* we don't need to rename if the old and new dn match */
    2941                 talloc_free(r);
     3067                talloc_free(new_dn);
    29423068                return NT_STATUS_OK;
    29433069        }
     
    29453071        ret = ldb_rename(s->ldap2.ldb, old_dn, new_dn);
    29463072        if (ret != LDB_SUCCESS) {
    2947                 talloc_free(r);
     3073                talloc_free(new_dn);
    29483074                return NT_STATUS_LDAP(ret);
    29493075        }
     
    29523078        NT_STATUS_HAVE_NO_MEMORY(s->dest_dsa.computer_dn_str);
    29533079
    2954         talloc_free(r);
     3080        talloc_free(new_dn);
    29553081
    29563082        return NT_STATUS_OK;
     
    30143140        s->callbacks = r->in.callbacks;
    30153141
     3142        /* RODC join*/
     3143        s->rodc_join = r->in.rodc_join;
     3144
    30163145        becomeDC_send_cldap(s);
    30173146        return c;
  • vendor/current/source4/libnet/libnet_become_dc.h

    r414 r740  
    137137
    138138                struct libnet_BecomeDC_Callbacks callbacks;
    139         } in;
     139
     140                bool rodc_join;
     141        } in;
    140142
    141143        struct {
  • vendor/current/source4/libnet/libnet_domain.c

    r414 r740  
    4848
    4949
    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);
     50static void continue_domain_open_close(struct tevent_req *subreq);
     51static void continue_domain_open_connect(struct tevent_req *subreq);
     52static void continue_domain_open_lookup(struct tevent_req *subreq);
     53static void continue_domain_open_open(struct tevent_req *subreq);
    5454
    5555
     
    6161        struct composite_context *c;
    6262        struct domain_open_samr_state *s;
    63         struct rpc_request *conn_req;
     63        struct tevent_req *subreq;
    6464
    6565        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    7777
    7878        /* 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;
    8183
    8284        /* 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);
    8486}
    8587
     
    8991 * handle
    9092 */
    91 static void continue_domain_open_close(struct rpc_request *req)
     93static void continue_domain_open_close(struct tevent_req *subreq)
    9294{
    9395        struct composite_context *c;
    9496        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);
    9899        s = talloc_get_type(c->private_data, struct domain_open_samr_state);
    99100
    100101        /* 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);
    102104        if (!composite_is_ok(c)) return;
    103105
     
    122124       
    123125        /* 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;
    126130
    127131        /* 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);
    129133}
    130134
     
    133137 * Stage 1: Connect to SAM server.
    134138 */
    135 static void continue_domain_open_connect(struct rpc_request *req)
     139static void continue_domain_open_connect(struct tevent_req *subreq)
    136140{
    137141        struct composite_context *c;
    138142        struct domain_open_samr_state *s;
    139         struct rpc_request *lookup_req;
    140143        struct samr_LookupDomain *r;
    141144       
    142         c = talloc_get_type(req->async.private_data, struct composite_context);
     145        c = tevent_req_callback_data(subreq, struct composite_context);
    143146        s = talloc_get_type(c->private_data, struct domain_open_samr_state);
    144147
    145148        /* 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);
    147151        if (!composite_is_ok(c)) return;
    148152
     
    164168        if (composite_nomem(r->out.sid, c)) return;
    165169
    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);
    170176}
    171177
     
    174180 * Stage 2: Lookup domain by name.
    175181 */
    176 static void continue_domain_open_lookup(struct rpc_request *req)
     182static void continue_domain_open_lookup(struct tevent_req *subreq)
    177183{
    178184        struct composite_context *c;
    179185        struct domain_open_samr_state *s;
    180         struct rpc_request *opendom_req;
    181186        struct samr_OpenDomain *r;
    182187
    183         c = talloc_get_type(req->async.private_data, struct composite_context);
     188        c = tevent_req_callback_data(subreq, struct composite_context);
    184189        s = talloc_get_type(c->private_data, struct domain_open_samr_state);
    185190       
    186191        /* 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);
    188194
    189195        if (s->monitor_fn) {
     
    216222        r->out.domain_handle = &s->domain_handle;
    217223
    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);
    222230}
    223231
     
    226234 * Stage 3: Open domain.
    227235 */
    228 static void continue_domain_open_open(struct rpc_request *req)
     236static void continue_domain_open_open(struct tevent_req *subreq)
    229237{
    230238        struct composite_context *c;
    231239        struct domain_open_samr_state *s;
    232240
    233         c = talloc_get_type(req->async.private_data, struct composite_context);
     241        c = tevent_req_callback_data(subreq, struct composite_context);
    234242        s = talloc_get_type(c->private_data, struct domain_open_samr_state);
    235243
    236244        /* 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);
    238247        if (!composite_is_ok(c)) return;
    239248
     
    266275        struct domain_open_samr_state *s;
    267276        struct composite_context *rpcconn_req;
    268         struct rpc_request *close_req, *conn_req;
     277        struct tevent_req *subreq;
    269278
    270279        c = composite_create(ctx, ctx->event_ctx);
     
    314323
    315324                        /* 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;
    318329
    319330                        /* 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);
    321332                        return c;
    322333                }
     
    329340       
    330341        /* 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;
    333346
    334347        /* 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);
    336349        return c;
    337350}
     
    390403
    391404static void continue_rpc_connect_lsa(struct composite_context *ctx);
    392 static void continue_lsa_policy_open(struct rpc_request *req);
     405static void continue_lsa_policy_open(struct tevent_req *subreq);
    393406
    394407
     
    408421        struct domain_open_lsa_state *s;
    409422        struct composite_context *rpcconn_req;
    410         struct rpc_request *openpol_req;
     423        struct tevent_req *subreq;
    411424        struct lsa_QosInfo *qos;
    412425
     
    460473       
    461474        /* 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);
    466481        return c;
    467482}
     
    476491        struct domain_open_lsa_state *s;
    477492        struct lsa_QosInfo *qos;
    478         struct rpc_request *openpol_req;
     493        struct tevent_req *subreq;
    479494
    480495        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    504519
    505520        /* 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);
    510527}
    511528
     
    514531  Stage 1: Lsa policy opened - we're done, if successfully
    515532 */
    516 static void continue_lsa_policy_open(struct rpc_request *req)
     533static void continue_lsa_policy_open(struct tevent_req *subreq)
    517534{
    518535        struct composite_context *c;
    519536        struct domain_open_lsa_state *s;
    520537
    521         c = talloc_get_type(req->async.private_data, struct composite_context);
     538        c = tevent_req_callback_data(subreq, struct composite_context);
    522539        s = talloc_get_type(c->private_data, struct domain_open_lsa_state);
    523540
    524         c->status = dcerpc_ndr_request_recv(req);
     541        c->status = dcerpc_lsa_OpenPolicy2_r_recv(subreq, s);
     542        TALLOC_FREE(subreq);
    525543        if (!composite_is_ok(c)) return;
    526544
     
    667685
    668686
    669 static void continue_lsa_close(struct rpc_request *req);
     687static void continue_lsa_close(struct tevent_req *subreq);
    670688
    671689
     
    676694        struct composite_context *c;
    677695        struct domain_close_lsa_state *s;
    678         struct rpc_request *close_req;
     696        struct tevent_req *subreq;
    679697
    680698        /* composite context and state structure allocation */
     
    703721
    704722        /* 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);
    709729        return c;
    710730}
     
    714734  Stage 1: Receive result of lsa close call
    715735*/
    716 static void continue_lsa_close(struct rpc_request *req)
     736static void continue_lsa_close(struct tevent_req *subreq)
    717737{
    718738        struct composite_context *c;
    719739        struct domain_close_lsa_state *s;
    720740       
    721         c = talloc_get_type(req->async.private_data, struct composite_context);
     741        c = tevent_req_callback_data(subreq, struct composite_context);
    722742        s = talloc_get_type(c->private_data, struct domain_close_lsa_state);
    723743
    724         c->status = dcerpc_ndr_request_recv(req);
     744        c->status = dcerpc_lsa_Close_r_recv(subreq, s);
     745        TALLOC_FREE(subreq);
    725746        if (!composite_is_ok(c)) return;
    726747
     
    771792
    772793
    773 static void continue_samr_close(struct rpc_request *req);
     794static void continue_samr_close(struct tevent_req *subreq);
    774795
    775796
     
    780801        struct composite_context *c;
    781802        struct domain_close_samr_state *s;
    782         struct rpc_request *close_req;
     803        struct tevent_req *subreq;
    783804
    784805        /* composite context and state structure allocation */
     
    805826
    806827        /* 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);
    811834        return c;
    812835}
     
    816839  Stage 1: Receive result of samr close call
    817840*/
    818 static void continue_samr_close(struct rpc_request *req)
     841static void continue_samr_close(struct tevent_req *subreq)
    819842{
    820843        struct composite_context *c;
    821844        struct domain_close_samr_state *s;
    822845
    823         c = talloc_get_type(req->async.private_data, struct composite_context);
     846        c = tevent_req_callback_data(subreq, struct composite_context);
    824847        s = talloc_get_type(c->private_data, struct domain_close_samr_state);
    825848       
    826         c->status = dcerpc_ndr_request_recv(req);
     849        c->status = dcerpc_samr_Close_r_recv(subreq, s);
     850        TALLOC_FREE(subreq);
    827851        if (!composite_is_ok(c)) return;
    828852
     
    941965
    942966static 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);
     967static void continue_samr_connect(struct tevent_req *subreq);
     968static void continue_samr_enum_domains(struct tevent_req *subreq);
     969static void continue_samr_close_handle(struct tevent_req *subreq);
    946970
    947971static struct domainlist* get_domain_list(TALLOC_CTX *mem_ctx, struct domain_list_state *s);
     
    956980        struct composite_context *c;
    957981        struct domain_list_state *s;
    958         struct rpc_request *samrconn_req;
     982        struct tevent_req *subreq;
    959983
    960984        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    968992        s->samrconn.out.connect_handle = &s->connect_handle;
    969993
    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);
    9741000}
    9751001
     
    9791005  a request to enumerate domain databases available
    9801006*/
    981 static void continue_samr_connect(struct rpc_request *req)
     1007static void continue_samr_connect(struct tevent_req *subreq)
    9821008{
    9831009        struct composite_context *c;
    9841010        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);
    9881013        s = talloc_get_type(c->private_data, struct domain_list_state);
    9891014       
    990         c->status = dcerpc_ndr_request_recv(req);
     1015        c->status = dcerpc_samr_Connect_r_recv(subreq, s);
     1016        TALLOC_FREE(subreq);
    9911017        if (!composite_is_ok(c)) return;
    9921018
     
    10091035        if (composite_nomem(s->enumdom.out.sam, c)) return;
    10101036
    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);
    10151043}
    10161044
     
    10211049  upon completion.
    10221050*/
    1023 static void continue_samr_enum_domains(struct rpc_request *req)
     1051static void continue_samr_enum_domains(struct tevent_req *subreq)
    10241052{
    10251053        struct composite_context *c;
    10261054        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);
    10311057        s = talloc_get_type(c->private_data, struct domain_list_state);
    10321058       
    1033         c->status = dcerpc_ndr_request_recv(req);
     1059        c->status = dcerpc_samr_EnumDomains_r_recv(subreq, s);
     1060        TALLOC_FREE(subreq);
    10341061        if (!composite_is_ok(c)) return;
    10351062
     
    10581085
    10591086                /* 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);
    10641093
    10651094        } else {
     
    10731102       
    10741103        /* 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);
    10791110}
    10801111
     
    10831114  Stage 4: Receive result of closing samr connection handle.
    10841115*/
    1085 static void continue_samr_close_handle(struct rpc_request *req)
     1116static void continue_samr_close_handle(struct tevent_req *subreq)
    10861117{
    10871118        struct composite_context *c;
    10881119        struct domain_list_state *s;
    10891120
    1090         c = talloc_get_type(req->async.private_data, struct composite_context);
     1121        c = tevent_req_callback_data(subreq, struct composite_context);
    10911122        s = talloc_get_type(c->private_data, struct domain_list_state);
    10921123
    1093         c->status = dcerpc_ndr_request_recv(req);
     1124        c->status = dcerpc_samr_Close_r_recv(subreq, s);
     1125        TALLOC_FREE(subreq);
    10941126        if (!composite_is_ok(c)) return;
    10951127
     
    11171149static struct domainlist* get_domain_list(TALLOC_CTX *mem_ctx, struct domain_list_state *s)
    11181150{
    1119         int i;
     1151        uint32_t i;
    11201152        if (mem_ctx == NULL || s == NULL) return NULL;
    11211153
     
    11641196        struct domain_list_state *s;
    11651197        struct composite_context *rpcconn_req;
    1166         struct rpc_request *samrconn_req;
     1198        struct tevent_req *subreq;
    11671199
    11681200        /* composite context and state structure allocation */
     
    12001232                s->samrconn.out.connect_handle = &s->connect_handle;
    12011233               
    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);
    12061240        }
    12071241
  • vendor/current/source4/libnet/libnet_export_keytab.c

    r414 r740  
    33#include "auth/kerberos/kerberos.h"
    44#include <hdb.h>
    5 #include "kdc/hdb-samba4.h"
     5#include "kdc/samba_kdc.h"
    66#include "libnet/libnet.h"
     7
     8extern struct hdb_method hdb_samba4;
    79
    810NTSTATUS libnet_export_keytab(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_export_keytab *r)
     
    1416        /* Register hdb-samba4 hooks for use as a keytab */
    1517
    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) {
    1820                return NT_STATUS_NO_MEMORY;
    1921        }
    2022
    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;
    2325
    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);
    2527        if (!from_keytab) {
    2628                return NT_STATUS_NO_MEMORY;
     
    4446        }
    4547
     48        unlink(r->in.keytab_name);
     49
    4650        ret = kt_copy(smb_krb5_context->krb5_context, from_keytab, r->in.keytab_name);
    4751        if(ret) {
  • vendor/current/source4/libnet/libnet_group.c

    r414 r740  
    148148        }
    149149
     150        talloc_free(c);
    150151        return status;
    151152}
     
    409410
    410411        talloc_free(c);
    411 
    412412        return status;
    413413}
     
    448448
    449449static void continue_lsa_domain_opened(struct composite_context *ctx);
    450 static void continue_domain_queried(struct rpc_request *req);
     450static void continue_domain_queried(struct tevent_req *subreq);
    451451static 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);
     452static void continue_groups_enumerated(struct tevent_req *subreq);
    454453
    455454
     
    470469        struct composite_context *c;
    471470        struct grouplist_state *s;
    472         struct rpc_request *query_req;
     471        struct tevent_req *subreq;
    473472        bool prereq_met = false;
    474473
     
    501500
    502501        /* 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);
    507508        return c;
    508509}
     
    517518        struct composite_context *c;
    518519        struct grouplist_state *s;
    519         struct rpc_request *query_req;
     520        struct tevent_req *subreq;
    520521       
    521522        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    533534
    534535        /* 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);
    539542}
    540543
     
    544547 * provided a valid samr handle is opened
    545548 */
    546 static void continue_domain_queried(struct rpc_request *req)
     549static void continue_domain_queried(struct tevent_req *subreq)
    547550{
    548551        struct composite_context *c;
    549552        struct grouplist_state *s;
    550         struct rpc_request *enum_req;
    551553        bool prereq_met = false;
    552554       
    553         c = talloc_get_type(req->async.private_data, struct composite_context);
     555        c = tevent_req_callback_data(subreq, struct composite_context);
    554556        s = talloc_get_type(c->private_data, struct grouplist_state);
    555557
    556558        /* 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);
    558561        if (!composite_is_ok(c)) return;
    559562
     
    577580
    578581        /* 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);
    583588}
    584589
     
    592597        struct composite_context *c;
    593598        struct grouplist_state *s;
    594         struct rpc_request *enum_req;
     599        struct tevent_req *subreq;
    595600
    596601        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    612617
    613618        /* 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);
    618625}
    619626
     
    622629 * Stage 2: receive enumerated groups and their rids
    623630 */
    624 static void continue_groups_enumerated(struct rpc_request *req)
     631static void continue_groups_enumerated(struct tevent_req *subreq)
    625632{
    626633        struct composite_context *c;
    627634        struct grouplist_state *s;
    628         int i;
    629 
    630         c = talloc_get_type(req->async.private_data, struct composite_context);
     635        uint32_t i;
     636
     637        c = tevent_req_callback_data(subreq, struct composite_context);
    631638        s = talloc_get_type(c->private_data, struct grouplist_state);
    632639
    633640        /* 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);
    635643        if (!composite_is_ok(c)) return;
    636644
     
    664672
    665673                        /* groupname */
    666                         s->groups[i].groupname = talloc_strdup(c, entry->name.string);
     674                        s->groups[i].groupname = talloc_strdup(s->groups, entry->name.string);
    667675                        if (composite_nomem(s->groups[i].groupname, c)) return;
    668676
    669677                        /* 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);
    671679                        if (composite_nomem(s->groups[i].sid, c)) return;
    672680                }
     
    697705
    698706        if (c == NULL || mem_ctx == NULL || io == NULL) {
     707                talloc_free(c);
    699708                return NT_STATUS_INVALID_PARAMETER;
    700709        }
     
    724733        }
    725734
     735        talloc_free(c);
    726736        return status;
    727737}
  • vendor/current/source4/libnet/libnet_join.c

    r414 r740  
    2323#include "libnet/libnet.h"
    2424#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>
    2827#include "dsdb/samdb/samdb.h"
    2928#include "ldb_wrap.h"
    30 #include "../lib/util/util_ldb.h"
    3129#include "libcli/security/security.h"
    3230#include "auth/credentials/credentials.h"
     
    3533#include "param/param.h"
    3634#include "param/provision.h"
     35#include "system/kerberos.h"
     36#include "auth/kerberos/kerberos.h"
    3737
    3838/*
     
    9595        }
    9696                                                   
    97         drsuapi_binding = talloc(tmp_ctx, struct dcerpc_binding);
     97        drsuapi_binding = talloc_zero(tmp_ctx, struct dcerpc_binding);
    9898        if (!drsuapi_binding) {
    9999                r->out.error_string = NULL;
     
    134134        r_drsuapi_bind.out.bind_handle = &drsuapi_bind_handle;
    135135
    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;
    153144        } else if (!W_ERROR_IS_OK(r_drsuapi_bind.out.result)) {
    154145                r->out.error_string
     
    185176
    186177        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);
    188179        if (!r_crack_names.out.ctr || !r_crack_names.out.level_out) {
    189180                r->out.error_string = NULL;
     
    192183        }
    193184
    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;
    213194        } else if (!W_ERROR_IS_OK(r_crack_names.out.result)) {
    214195                r->out.error_string
     
    246227        }
    247228
    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,
    249230                                      remote_ldb_url,
    250                                       NULL, ctx->cred, 0, NULL);
     231                                      NULL, ctx->cred, 0);
    251232        if (!remote_ldb) {
    252233                r->out.error_string = NULL;
     
    256237
    257238        account_dn = ldb_dn_new(tmp_ctx, remote_ldb, account_dn_str);
    258         if (! ldb_dn_validate(account_dn)) {
     239        if (account_dn == NULL) {
    259240                r->out.error_string = talloc_asprintf(r, "Invalid account dn: %s",
    260241                                                      account_dn_str);
     
    290271
    291272        {
    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,
    296277                                                                            "%s.%s",
    297278                                                                            r->in.netbios_name,
     
    304285                }
    305286
    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);
    312291               
    313292                for (i=0; i < ARRAY_SIZE(service_principal_name); i++) {
     
    317296                                return NT_STATUS_NO_MEMORY;
    318297                        }
    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) {
    321301                                r->out.error_string = NULL;
    322302                                talloc_free(tmp_ctx);
     
    325305                }
    326306
    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) {
    329309                        r->out.error_string = NULL;
    330310                        talloc_free(tmp_ctx);
     
    332312                }
    333313
    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) {
    336316                        r->out.error_string
    337317                                = talloc_asprintf(r,
     
    343323        }
    344324                               
     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
    345353        /* DsCrackNames to find out the DN of the domain. */
    346354        r_crack_names.in.req->req1.format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT;
     
    353361        }
    354362
    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;
    374372        } else if (!W_ERROR_IS_OK(r_crack_names.out.result)) {
    375373                r->out.error_string
     
    540538
    541539        /* 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        }
    543544        if (!NT_STATUS_IS_OK(status)) {
    544545                r->out.error_string = talloc_asprintf(mem_ctx,
     
    554555                        connect_with_info->out.domain_name = talloc_strdup(tmp_ctx, r->in.domain_name);
    555556                } else {
    556                         /* Bugger, we just lost our way to automaticly 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));
    559560                }
    560561        }
     
    570571                l.out.sid = &sid;
    571572               
    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                }
    573577                if (!NT_STATUS_IS_OK(status)) {
    574578                        r->out.error_string = talloc_asprintf(mem_ctx,
     
    589593
    590594        /* 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        }
    592599        if (!NT_STATUS_IS_OK(status)) {
    593600                r->out.error_string = talloc_asprintf(mem_ctx,
     
    611618
    612619        /* 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        }
    614624        status = cu_status;
    615625        if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) {
     
    628638               
    629639                /* 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                }
    631644                if (!NT_STATUS_IS_OK(status)) {
    632645                        r->out.error_string = talloc_asprintf(mem_ctx,
     
    656669               
    657670                /* 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                }
    659675                if (!NT_STATUS_IS_OK(status)) {
    660676                        r->out.error_string = talloc_asprintf(mem_ctx,
     
    670686                        d.in.user_handle = u_handle;
    671687                        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                        }
    673692                        if (!NT_STATUS_IS_OK(status)) {
    674693                                r->out.error_string = talloc_asprintf(mem_ctx,
     
    683702                       
    684703                        /* &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                        }
    686708                        if (!NT_STATUS_IS_OK(status)) {
    687709                                r->out.error_string = talloc_asprintf(mem_ctx,
     
    705727        qui.out.info = &uinfo;
    706728       
    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        }
    708733        if (!NT_STATUS_IS_OK(status)) {
    709734                r->out.error_string = talloc_asprintf(mem_ctx,
     
    790815        pwp.out.info = &info;
    791816
    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        }
    793821        if (NT_STATUS_IS_OK(status)) {
    794822                policy_min_pw_len = pwp.out.info->min_password_length;
     
    797825        /* Grab a password of that minimum length */
    798826       
    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);
    800828
    801829        /* set full_name and reset flags */
     
    902930                netbios_name = r->in.netbios_name;
    903931        } 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));
    905933                if (!netbios_name) {
    906934                        r->out.error_string = NULL;
     
    944972        set_secrets->domain_name = r2->out.domain_name;
    945973        set_secrets->realm = r2->out.realm;
    946         set_secrets->account_name = account_name;
    947974        set_secrets->netbios_name = netbios_name;
    948975        set_secrets->secure_channel_type = r->in.join_type;
  • vendor/current/source4/libnet/libnet_lookup.c

    r414 r740  
    2323
    2424#include "includes.h"
    25 #include "lib/events/events.h"
    2625#include "libnet/libnet.h"
    2726#include "libcli/composite/composite.h"
    2827#include "auth/credentials/credentials.h"
    29 #include "lib/messaging/messaging.h"
    30 #include "lib/messaging/irpc.h"
    3128#include "libcli/resolve/resolve.h"
    32 #include "libcli/finddcs.h"
     29#include "libcli/finddc.h"
    3330#include "libcli/security/security.h"
    34 #include "librpc/gen_ndr/lsa.h"
    3531#include "librpc/gen_ndr/ndr_lsa_c.h"
    36 
    3732#include "param/param.h"
    3833
     
    187182 * Sends asynchronous LookupDCs request
    188183 */
    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;
     184struct 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;
    203203}
    204204
     
    212212 */
    213213
    214 NTSTATUS libnet_LookupDCs_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,
     214NTSTATUS libnet_LookupDCs_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
    215215                               struct libnet_LookupDCs *io)
    216216{
    217217        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;
    222226        return status;
    223227}
     
    230234                          struct libnet_LookupDCs *io)
    231235{
    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);
    234238}
    235239
     
    253257                                  struct lookup_name_state *s);
    254258static void continue_lookup_name(struct composite_context *ctx);
    255 static void continue_name_found(struct rpc_request *req);
     259static void continue_name_found(struct tevent_req *subreq);
    256260
    257261
     
    263267        struct composite_context *c;
    264268        struct lookup_name_state *s;
    265         struct rpc_request *lookup_req;
     269        struct tevent_req *subreq;
    266270        bool prereq_met = false;
    267271
     
    284288        if (!prepare_lookup_params(ctx, c, s)) return c;
    285289
    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);
    290296        return c;
    291297}
     
    324330        struct composite_context *c;
    325331        struct lookup_name_state *s;
    326         struct rpc_request *lookup_req;
     332        struct tevent_req *subreq;
    327333
    328334        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    334340        if (!prepare_lookup_params(s->ctx, c, s)) return;
    335341
    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
     351static void continue_name_found(struct tevent_req *subreq)
    344352{
    345353        struct composite_context *c;
    346354        struct lookup_name_state *s;
    347355
    348         c = talloc_get_type(req->async.private_data, struct composite_context);
     356        c = tevent_req_callback_data(subreq, struct composite_context);
    349357        s = talloc_get_type(c->private_data, struct lookup_name_state);
    350358
    351         c->status = dcerpc_ndr_request_recv(req);
     359        c->status = dcerpc_lsa_LookupNames_r_recv(subreq, s);
     360        TALLOC_FREE(subreq);
    352361        if (!composite_is_ok(c)) return;
    353362
  • vendor/current/source4/libnet/libnet_passwd.c

    r414 r740  
    5252        uint8_t old_lm_hash[16], new_lm_hash[16];
    5353        struct samr_DomInfo1 *dominfo = NULL;
    54         struct samr_ChangeReject *reject = NULL;
     54        struct userPwdChangeFailureInformation *reject = NULL;
    5555
    5656        ZERO_STRUCT(c);
     
    102102
    103103        /* 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                }
    106109                if (!NT_STATUS_IS_OK(status)) {
    107110                        r->samr.out.error_string = talloc_asprintf(mem_ctx,
     
    110113                        r->samr.out.error_string = talloc_asprintf(mem_ctx,
    111114                                                                   "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,
    113116                                                                   nt_errstr(status));
    114117                }
    115118                goto disconnect;
    116         } 
     119        }
    117120
    118121        /* prepare samr_ChangePasswordUser2 */
     
    134137
    135138        /* 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                }
    138144                if (!NT_STATUS_IS_OK(status)) {
    139145                        r->samr.out.error_string = talloc_asprintf(mem_ctx,
     
    160166
    161167        /* 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                }
    164173                if (!NT_STATUS_IS_OK(oe2.out.result)) {
    165174                        r->samr.out.error_string = talloc_asprintf(mem_ctx,
     
    194203
    195204        /* 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);
    197206        if (!NT_STATUS_IS_OK(status)) {
    198207                r->samr.out.error_string = talloc_asprintf(mem_ctx,
     
    217226disconnect:
    218227        /* close connection */
    219         talloc_free(c.out.dcerpc_pipe);
     228        talloc_unlink(ctx, c.out.dcerpc_pipe);
    220229
    221230        return status;
     
    300309       
    301310        /* 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);
    303312        /* 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        }
    304316        if (!NT_STATUS_IS_OK(status)) {
    305317                r->samr_handle.out.error_string
     
    354366
    355367        /* 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        }
    357372        if (!NT_STATUS_IS_OK(status)) {
    358373                r->samr_handle.out.error_string
     
    395410
    396411        /* 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        }
    398416        if (!NT_STATUS_IS_OK(status)) {
    399417                r->samr_handle.out.error_string
     
    438456
    439457        /* 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        }
    441462        if (!NT_STATUS_IS_OK(status)) {
    442463                r->samr_handle.out.error_string
     
    464485                LIBNET_SET_PASSWORD_SAMR_HANDLE_23,
    465486        };
    466         int i;
     487        unsigned int i;
    467488
    468489        for (i=0; i < ARRAY_SIZE(levels); i++) {
     
    471492                if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS)
    472493                    || 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)) {
    474495                        /* Try another password set mechanism */
    475496                        continue;
     
    530551
    531552        /* 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        }
    533557        if (!NT_STATUS_IS_OK(status)) {
    534558                r->samr.out.error_string = talloc_asprintf(mem_ctx,
     
    545569
    546570        /* 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        }
    548575        if (!NT_STATUS_IS_OK(status)) {
    549576                r->samr.out.error_string = talloc_asprintf(mem_ctx,
     
    561588
    562589        /* 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        }
    564594        if (!NT_STATUS_IS_OK(status)) {
    565595                r->samr.out.error_string = talloc_asprintf(mem_ctx,
     
    582612
    583613        /* 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        }
    585618        if (!NT_STATUS_IS_OK(status)) {
    586619                r->samr.out.error_string = talloc_asprintf(mem_ctx,
     
    607640
    608641        /* 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        }
    610646        if (!NT_STATUS_IS_OK(status)) {
    611647                r->samr.out.error_string = talloc_asprintf(mem_ctx,
     
    628664disconnect:
    629665        /* close connection */
    630         talloc_free(c.out.dcerpc_pipe);
     666        talloc_unlink(ctx, c.out.dcerpc_pipe);
    631667
    632668        return status;
  • vendor/current/source4/libnet/libnet_rpc.c

    r414 r740  
    2323#include "libcli/libcli.h"
    2424#include "libcli/composite/composite.h"
    25 #include "librpc/rpc/dcerpc.h"
    2625#include "librpc/rpc/dcerpc_proto.h"
    2726#include "librpc/gen_ndr/ndr_lsa_c.h"
     
    111110        case LIBNET_RPC_CONNECT_SERVER_ADDRESS:
    112111                b->flags = r->in.dcerpc_flags;
     112        }
     113
     114        if (DEBUGLEVEL >= 10) {
     115                b->flags |= DCERPC_DEBUG_PRINT_BOTH;
    113116        }
    114117
     
    225228
    226229
    227 static void continue_lookup_dc(struct composite_context *ctx);
     230static void continue_lookup_dc(struct tevent_req *req);
    228231static void continue_rpc_connect(struct composite_context *ctx);
    229232
     
    245248        struct composite_context *c;
    246249        struct rpc_connect_dc_state *s;
    247         struct composite_context *lookup_dc_req;
     250        struct tevent_req *lookup_dc_req;
    248251
    249252        /* composite context allocation and setup */
     
    282285        if (composite_nomem(lookup_dc_req, c)) return c;
    283286
    284         composite_continue(c, lookup_dc_req, continue_lookup_dc, c);
     287        tevent_req_set_callback(lookup_dc_req, continue_lookup_dc, c);
    285288        return c;
    286289}
     
    291294  initiate RpcConnect to it
    292295*/
    293 static void continue_lookup_dc(struct composite_context *ctx)
     296static void continue_lookup_dc(struct tevent_req *req)
    294297{
    295298        struct composite_context *c;
     
    298301        struct monitor_msg msg;
    299302        struct msg_net_lookup_dc data;
    300        
    301         c = talloc_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);
    303306       
    304307        /* 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);
    306309        if (!composite_is_ok(c)) return;
    307310
     
    455458
    456459static 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);
     460static void continue_lsa_policy(struct tevent_req *subreq);
     461static void continue_lsa_query_info(struct tevent_req *subreq);
     462static void continue_lsa_query_info2(struct tevent_req *subreq);
    460463static void continue_epm_map_binding(struct composite_context *ctx);
    461464static void continue_secondary_conn(struct composite_context *ctx);
     
    529532        struct composite_context *c;
    530533        struct rpc_connect_dci_state *s;
    531         struct rpc_request *open_pol_req;
     534        struct tevent_req *subreq;
    532535
    533536        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    574577        s->lsa_open_policy.out.handle     = &s->lsa_handle;
    575578
    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);
    580585}
    581586
     
    585590  for kerberos realm (dns name) and guid. The query may fail.
    586591*/
    587 static void continue_lsa_policy(struct rpc_request *req)
     592static void continue_lsa_policy(struct tevent_req *subreq)
    588593{
    589594        struct composite_context *c;
    590595        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);
    594598        s = talloc_get_type(c->private_data, struct rpc_connect_dci_state);
    595599
    596         c->status = dcerpc_ndr_request_recv(req);
     600        c->status = dcerpc_lsa_OpenPolicy2_r_recv(subreq, s);
     601        TALLOC_FREE(subreq);
    597602        if (!NT_STATUS_IS_OK(c->status)) {
    598603                composite_error(c, c->status);
     
    631636        if (composite_nomem(s->lsa_query_info2.out.info, c)) return;
    632637
    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);
    637644}
    638645
     
    642649  may result in failure) and query lsa info for domain name and sid.
    643650*/
    644 static void continue_lsa_query_info2(struct rpc_request *req)
     651static void continue_lsa_query_info2(struct tevent_req *subreq)
    645652{       
    646653        struct composite_context *c;
    647654        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);
    651657        s = talloc_get_type(c->private_data, struct rpc_connect_dci_state);
    652658
    653         c->status = dcerpc_ndr_request_recv(req);
     659        c->status = dcerpc_lsa_QueryInfoPolicy2_r_recv(subreq, s);
     660        TALLOC_FREE(subreq);
    654661       
    655662        /* In case of error just null the realm and guid and proceed
     
    657664           controller we talking to - NT-style PDC also counts */
    658665
    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)) {
    660667                s->r.out.realm = NULL;
    661668                s->r.out.guid  = NULL;
     
    706713        if (composite_nomem(s->lsa_query_info.out.info, c)) return;
    707714
    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);
    712721}
    713722
     
    716725  Step 5 of RpcConnectDCInfo: Get domain name and sid
    717726*/
    718 static void continue_lsa_query_info(struct rpc_request *req)
     727static void continue_lsa_query_info(struct tevent_req *subreq)
    719728{
    720729        struct composite_context *c;
    721730        struct rpc_connect_dci_state *s;
    722731
    723         c = talloc_get_type(req->async.private_data, struct composite_context);
     732        c = tevent_req_callback_data(subreq, struct composite_context);
    724733        s = talloc_get_type(c->private_data, struct rpc_connect_dci_state);
    725734
    726         c->status = dcerpc_ndr_request_recv(req);
     735        c->status = dcerpc_lsa_QueryInfoPolicy_r_recv(subreq, s);
     736        TALLOC_FREE(subreq);
    727737        if (!NT_STATUS_IS_OK(c->status)) {
    728738                s->r.out.error_string = talloc_asprintf(c,
     
    763773
    764774        /* 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);
    766776        if (composite_nomem(s->final_binding, c)) return;
    767777       
     
    885895                if (r->in.dcerpc_iface == &ndr_table_samr) {
    886896                        ctx->samr.pipe = talloc_reference(ctx, r->out.dcerpc_pipe);
     897                        ctx->samr.samr_handle = ctx->samr.pipe->binding_handle;
    887898
    888899                } else if (r->in.dcerpc_iface == &ndr_table_lsarpc) {
    889900                        ctx->lsa.pipe = talloc_reference(ctx, r->out.dcerpc_pipe);
     901                        ctx->lsa.lsa_handle = ctx->lsa.pipe->binding_handle;
    890902                }
    891903
  • vendor/current/source4/libnet/libnet_samdump.c

    r414 r740  
    186186                                continue;
    187187                        }
    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,
    189189                                                  s->secret.data, s->secret.length,
    190190                                                  (void **)&secret_string, NULL, false)) {
  • vendor/current/source4/libnet/libnet_samsync.c

    r414 r740  
    2727#include "auth/gensec/gensec.h"
    2828#include "auth/credentials/credentials.h"
    29 #include "auth/gensec/schannel_proto.h"
     29#include "libcli/auth/schannel.h"
    3030#include "librpc/gen_ndr/ndr_netlogon.h"
    3131#include "librpc/gen_ndr/ndr_netlogon_c.h"
     
    4646        struct libnet_SamSync_state *state;
    4747        const enum netr_SamDatabaseID database_ids[] = {SAM_DATABASE_DOMAIN, SAM_DATABASE_BUILTIN, SAM_DATABASE_PRIVS};
    48         int i;
     48        unsigned int i;
    4949
    5050        samsync_ctx = talloc_named(mem_ctx, 0, "SamSync top context");
     
    210210               
    211211                do {
    212                         int d;
     212                        uint32_t d;
    213213                        loop_ctx = talloc_named(samsync_ctx, 0, "DatabaseSync loop context");
    214214                        netlogon_creds_client_authenticator(creds, &credential);
     
    216216                        dbsync.in.credential = &credential;
    217217                       
    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                        }
    219222                        if (!NT_STATUS_IS_OK(dbsync_nt_status) &&
    220223                            !NT_STATUS_EQUAL(dbsync_nt_status, STATUS_MORE_ENTRIES)) {
  • vendor/current/source4/libnet/libnet_samsync_ldb.c

    r414 r740  
    3232#include "ldb_wrap.h"
    3333#include "libcli/security/security.h"
    34 #include "librpc/rpc/dcerpc.h"
    3534#include "param/param.h"
    3635
     
    5352
    5453        struct dom_sid *dom_sid[3];
    55         struct ldb_context *sam_ldb, *remote_ldb;
     54        struct ldb_context *sam_ldb, *remote_ldb, *pdb;
    5655        struct ldb_dn *base_dn[3];
    5756        struct samsync_ldb_secret *secrets;
    5857        struct samsync_ldb_trusted_domain *trusted_domains;
    5958};
     59
     60/* This wrapper is needed for the "ADD_OR_DEL" macros */
     61static 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}
    6067
    6168static NTSTATUS samsync_ldb_add_foreignSecurityPrincipal(TALLOC_CTX *mem_ctx,
     
    95102                return NT_STATUS_UNSUCCESSFUL;
    96103       
    97         samdb_msg_add_string(state->sam_ldb, mem_ctx, msg,
    98                              "objectClass",
    99                              "foreignSecurityPrincipal");
     104        ldb_msg_add_string(msg, "objectClass", "foreignSecurityPrincipal");
    100105
    101106        *fsp_dn = msg->dn;
     
    103108        /* create the alias */
    104109        ret = ldb_add(state->sam_ldb, msg);
    105         if (ret != 0) {
     110        if (ret != LDB_SUCCESS) {
    106111                *error_string = talloc_asprintf(mem_ctx, "Failed to create foreignSecurityPrincipal "
    107112                                                "record %s: %s",
     
    167172
    168173                if (state->samsync_state->domain_guid) {
    169                         enum ndr_err_code ndr_err;
    170174                        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)) {
    175178                                *error_string = talloc_asprintf(mem_ctx, "ndr_push of domain GUID failed!");
    176                                 return ndr_map_error2ntstatus(ndr_err);
     179                                return status;
    177180                        }
    178181                       
     
    198201        }
    199202
    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);
    202205
    203206        samdb_msg_add_int64(state->sam_ldb, mem_ctx,
     
    225228        /* TODO: Account lockout, password properties */
    226229       
    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;
    231237        }
    232238        return NT_STATUS_OK;
     
    248254        struct ldb_message **msgs;
    249255        struct ldb_message **remote_msgs = NULL;
    250         int ret, i;
     256        unsigned int i;
     257        int ret;
    251258        uint32_t acb;
    252259        bool add = false;
     
    311318                        /* Try to put things in the same location as the remote server */
    312319                } 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);
    315321                }
    316322        }
     
    363369        }
    364370       
    365         if (!add) {
    366                 /* Passwords.  Ensure there is no plaintext stored against
    367                  * this entry, as we only have hashes */
    368                 samdb_msg_add_delete(state->sam_ldb, mem_ctx, msg, 
    369                                      "userPassword");
    370         }
    371371        if (user->lm_password_present) {
    372372                samdb_msg_add_hash(state->sam_ldb, mem_ctx, msg, 
     
    425425        }
    426426        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);
    429428                if (!msg->dn) {
    430429                        msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]);
     
    436435
    437436                ret = ldb_add(state->sam_ldb, msg);
    438                 if (ret != 0) {
     437                if (ret != LDB_SUCCESS) {
    439438                        struct ldb_dn *first_try_dn = msg->dn;
    440439                        /* Try again with the default DN */
     
    447446                                msg->dn = talloc_steal(msg, remote_msgs[0]->dn);
    448447                                ret = ldb_add(state->sam_ldb, msg);
    449                                 if (ret != 0) {
     448                                if (ret != LDB_SUCCESS) {
    450449                                        *error_string = talloc_asprintf(mem_ctx, "Failed to create user record.  Tried both %s and %s: %s",
    451450                                                                        ldb_dn_get_linearized(first_try_dn),
     
    457456                }
    458457        } 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) {
    461460                        *error_string = talloc_asprintf(mem_ctx, "Failed to modify user record %s: %s",
    462461                                                        ldb_dn_get_linearized(msg->dn),
     
    500499
    501500        ret = ldb_delete(state->sam_ldb, msgs[0]->dn);
    502         if (ret != 0) {
     501        if (ret != LDB_SUCCESS) {
    503502                *error_string = talloc_asprintf(mem_ctx, "Failed to delete user record %s: %s",
    504503                                                ldb_dn_get_linearized(msgs[0]->dn),
     
    580579
    581580        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);
    584582                msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]);
    585583                ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container);
     
    589587
    590588                ret = ldb_add(state->sam_ldb, msg);
    591                 if (ret != 0) {
     589                if (ret != LDB_SUCCESS) {
    592590                        *error_string = talloc_asprintf(mem_ctx, "Failed to create group record %s: %s",
    593591                                                        ldb_dn_get_linearized(msg->dn),
     
    596594                }
    597595        } 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) {
    600598                        *error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s",
    601599                                                        ldb_dn_get_linearized(msg->dn),
     
    639637       
    640638        ret = ldb_delete(state->sam_ldb, msgs[0]->dn);
    641         if (ret != 0) {
     639        if (ret != LDB_SUCCESS) {
    642640                *error_string = talloc_asprintf(mem_ctx, "Failed to delete group record %s: %s",
    643641                                                ldb_dn_get_linearized(msgs[0]->dn),
     
    661659        int ret;
    662660        const char *attrs[] = { NULL };
    663         int i;
     661        const char *str_dn;
     662        uint32_t i;
    664663
    665664        msg = ldb_msg_new(mem_ctx);
     
    705704                        return NT_STATUS_INTERNAL_DB_CORRUPTION;
    706705                } 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;
    708710                }
    709711               
     
    711713        }
    712714       
    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) {
    715717                *error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s",
    716718                                                ldb_dn_get_linearized(msg->dn),
     
    794796
    795797        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);
    798799                msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]);
    799800                ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container);
     
    803804
    804805                ret = ldb_add(state->sam_ldb, msg);
    805                 if (ret != 0) {
     806                if (ret != LDB_SUCCESS) {
    806807                        *error_string = talloc_asprintf(mem_ctx, "Failed to create alias record %s: %s",
    807808                                                        ldb_dn_get_linearized(msg->dn),
     
    810811                }
    811812        } 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) {
    814815                        *error_string = talloc_asprintf(mem_ctx, "Failed to modify alias record %s: %s",
    815816                                                        ldb_dn_get_linearized(msg->dn),
     
    848849
    849850        ret = ldb_delete(state->sam_ldb, msgs[0]->dn);
    850         if (ret != 0) {
     851        if (ret != LDB_SUCCESS) {
    851852                *error_string = talloc_asprintf(mem_ctx, "Failed to delete alias record %s: %s",
    852853                                                ldb_dn_get_linearized(msgs[0]->dn),
     
    870871        int ret;
    871872        const char *attrs[] = { NULL };
    872         int i;
     873        uint32_t i;
    873874
    874875        msg = ldb_msg_new(mem_ctx);
     
    902903        for (i=0; i<alias_member->sids.num_sids; i++) {
    903904                struct ldb_dn *alias_member_dn;
     905                const char *str_dn;
    904906                /* search for members, in the top basedn (normal users are builtin aliases) */
    905907                ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[SAM_DATABASE_DOMAIN], &msgs, attrs,
     
    924926                        alias_member_dn = msgs[0]->dn;
    925927                }
    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;
    927932       
    928933                talloc_free(msgs);
    929934        }
    930935
    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) {
    933938                *error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s",
    934939                                                ldb_dn_get_linearized(msg->dn),
     
    950955
    951956        struct ldb_message *msg;
    952         struct ldb_message **msgs;
    953         struct ldb_dn *privilege_dn;
    954957        int ret;
    955         const char *attrs[] = { NULL };
    956         int i;
     958        uint32_t i;
     959        char *dnstr, *sidstr;
    957960
    958961        msg = ldb_msg_new(mem_ctx);
     
    961964        }
    962965
    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);
    989974
    990975        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) {
    997990                *error_string = talloc_asprintf(mem_ctx, "Failed to modify privilege record %s",
    998991                                                ldb_dn_get_linearized(msg->dn));
     
    10421035                             "privilege");
    10431036
    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) {
    10461039                *error_string = talloc_asprintf(mem_ctx, "Failed to modify privilege record %s",
    10471040                                                ldb_dn_get_linearized(msg->dn));
     
    11991192               
    12001193                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,
    12031196                                                     ldap_url,
    12041197                                                     NULL, state->samsync_state->machine_net_ctx->cred,
    1205                                                      0, NULL);
     1198                                                     0);
    12061199                if (!state->remote_ldb) {
    12071200                        *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);
     
    12291222        state->sam_ldb         = samdb_connect(mem_ctx,
    12301223                                               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        }
    12331236
    12341237        r2.out.error_string    = NULL;
  • vendor/current/source4/libnet/libnet_share.c

    r414 r740  
    9090        s.out.totalentries = &totalentries;
    9191
    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);
    9393       
    9494        if (!NT_STATUS_IS_OK(status)) {
     
    145145        s.in.server_unc         = talloc_asprintf(mem_ctx, "\\\\%s", r->in.server_name);
    146146 
    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);
    148148
    149149        if (!NT_STATUS_IS_OK(status)) {
     
    193193        s.in.share_name = r->in.share_name;
    194194
    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);
    196196        if (!NT_STATUS_IS_OK(status)) {
    197197                r->out.error_string = talloc_asprintf(mem_ctx,
  • vendor/current/source4/libnet/libnet_site.c

    r414 r740  
    2121#include "libnet/libnet.h"
    2222#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>
    2625#include "libcli/resolve/resolve.h"
    2726#include "param/param.h"
     27#include "lib/tsocket/tsocket.h"
    2828
    2929/**
     
    4242        struct cldap_socket *cldap = NULL;
    4343        struct cldap_netlogon search;
     44        int ret;
     45        struct tsocket_address *dest_address;
    4446
    4547        tmp_ctx = talloc_named(ctx, 0, "libnet_FindSite temp context");
     
    5153        /* Resolve the site name. */
    5254        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;
    5557        search.in.acct_control = -1;
    5658        search.in.version = NETLOGON_NT_VERSION_5 | NETLOGON_NT_VERSION_5EX;
    5759        search.in.map_response = true;
    5860
     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
    5971        /* 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);//TODO
     72        status = cldap_socket_init(tmp_ctx, NULL, NULL, dest_address, &cldap);
    6173        if (!NT_STATUS_IS_OK(status)) {
    6274                talloc_free(tmp_ctx);
     
    6476                return status;
    6577        }
    66         status = cldap_netlogon(cldap, lp_iconv_convenience(lctx->lp_ctx), tmp_ctx, &search);
     78        status = cldap_netlogon(cldap, tmp_ctx, &search);
    6779        if (!NT_STATUS_IS_OK(status)
    6880            || !search.out.netlogon.data.nt5_ex.client_site) {
     
    157169
    158170        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);
    160172        if (!NT_STATUS_IS_OK(status)) {
    161173                libnet_r->out.error_string = NULL;
     
    168180        r->in.netbios_name = libnet_r->in.netbios_name;
    169181        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);
    171183
    172184        status = libnet_FindSite(tmp_ctx, ctx, r);
     
    192204
    193205        rtn = ldb_msg_add_string(msg, "objectClass", "server");
    194         if (rtn != 0) {
     206        if (rtn != LDB_SUCCESS) {
    195207                libnet_r->out.error_string = NULL;
    196208                talloc_free(tmp_ctx);
     
    198210        }
    199211        rtn = ldb_msg_add_string(msg, "systemFlags", "50000000");
    200         if (rtn != 0) {
     212        if (rtn != LDB_SUCCESS) {
    201213                libnet_r->out.error_string = NULL;
    202214                talloc_free(tmp_ctx);
     
    204216        }
    205217        rtn = ldb_msg_add_string(msg, "serverReference", libnet_r->out.account_dn_str);
    206         if (rtn != 0) {
     218        if (rtn != LDB_SUCCESS) {
    207219                libnet_r->out.error_string = NULL;
    208220                talloc_free(tmp_ctx);
     
    223235        rtn = ldb_add(remote_ldb, msg);
    224236        if (rtn == LDB_ERR_ENTRY_ALREADY_EXISTS) {
    225                 int i;
     237                unsigned int i;
    226238
    227239                /* make a 'modify' msg, and only for serverReference */
     
    235247
    236248                rtn = ldb_msg_add_string(msg, "serverReference",libnet_r->out.account_dn_str);
    237                 if (rtn != 0) {
     249                if (rtn != LDB_SUCCESS) {
    238250                        libnet_r->out.error_string = NULL;
    239251                        talloc_free(tmp_ctx);
     
    248260
    249261                rtn = ldb_modify(remote_ldb, msg);
    250                 if (rtn != 0) {
     262                if (rtn != LDB_SUCCESS) {
    251263                        libnet_r->out.error_string
    252264                                = talloc_asprintf(libnet_r,
     
    257269                        return NT_STATUS_INTERNAL_DB_CORRUPTION;
    258270                }
    259         } else if (rtn != 0) {
     271        } else if (rtn != LDB_SUCCESS) {
    260272                libnet_r->out.error_string
    261273                        = talloc_asprintf(libnet_r,
  • vendor/current/source4/libnet/libnet_time.c

    r414 r740  
    5555
    5656        /* 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);
    5858        if (!NT_STATUS_IS_OK(status)) {
    5959                r->srvsvc.out.error_string = talloc_asprintf(mem_ctx,
  • vendor/current/source4/libnet/libnet_unbecome_dc.c

    r414 r740  
    2222#include "libcli/composite/composite.h"
    2323#include "libcli/cldap/cldap.h"
    24 #include "lib/ldb/include/ldb.h"
    25 #include "lib/ldb/include/ldb_errors.h"
    26 #include "lib/ldb_wrap.h"
     24#include <ldb.h>
     25#include <ldb_errors.h>
     26#include "ldb_wrap.h"
    2727#include "dsdb/samdb/samdb.h"
    2828#include "../libds/common/flags.h"
    2929#include "librpc/gen_ndr/ndr_drsuapi_c.h"
    3030#include "param/param.h"
     31#include "lib/tsocket/tsocket.h"
    3132
    3233/*****************************************************************************
     
    204205                struct dcerpc_binding *binding;
    205206                struct dcerpc_pipe *pipe;
     207                struct dcerpc_binding_handle *drsuapi_handle;
    206208                struct drsuapi_DsBind bind_r;
    207209                struct GUID bind_guid;
     
    257259        struct composite_context *c = s->creq;
    258260        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;
    262266        s->cldap.io.in.realm            = s->domain.dns_name;
    263267        s->cldap.io.in.host             = s->dest_dsa.netbios_name;
     
    269273        s->cldap.io.in.map_response     = true;
    270274
     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
    271284        c->status = cldap_socket_init(s, s->libnet->event_ctx,
    272                                       NULL, NULL, &s->cldap.sock);//TODO
     285                                      NULL, dest_address, &s->cldap.sock);
    273286        if (!composite_is_ok(c)) return;
    274287
     
    286299        struct composite_context *c = s->creq;
    287300
    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);
    291302        talloc_free(req);
    292303        if (!composite_is_ok(c)) return;
     
    295306
    296307        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;
    298309        s->domain.guid                  = s->cldap.netlogon.domain_uuid;
    299310
     
    317328                                       NULL,
    318329                                       s->libnet->cred,
    319                                        0, NULL);
     330                                       0);
    320331        talloc_free(url);
    321332        if (s->ldap.ldb == NULL) {
     
    393404        }
    394405
    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);
    396407        if (!s->dest_dsa.computer_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;
    397408        talloc_steal(s, s->dest_dsa.computer_dn_str);
    398409
    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);
    400411
    401412        talloc_free(r);
     
    408419        struct ldb_message *msg;
    409420        uint32_t user_account_control = UF_WORKSTATION_TRUST_ACCOUNT;
    410         uint32_t i;
     421        unsigned int i;
    411422
    412423        /* as the value is already as we want it to be, we're done */
     
    421432        NT_STATUS_HAVE_NO_MEMORY(msg->dn);
    422433
    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) {
    425437                talloc_free(msg);
    426438                return NT_STATUS_NO_MEMORY;
     
    556568        if (!composite_is_ok(c)) return;
    557569
     570        s->drsuapi.drsuapi_handle = s->drsuapi.pipe->binding_handle;
     571
    558572        unbecomeDC_drsuapi_bind_send(s);
    559573}
    560574
    561 static void unbecomeDC_drsuapi_bind_recv(struct rpc_request *req);
     575static void unbecomeDC_drsuapi_bind_recv(struct tevent_req *subreq);
    562576
    563577static void unbecomeDC_drsuapi_bind_send(struct libnet_UnbecomeDC_state *s)
    564578{
    565579        struct composite_context *c = s->creq;
    566         struct rpc_request *req;
    567580        struct drsuapi_DsBindInfo28 *bind_info28;
     581        struct tevent_req *subreq;
    568582
    569583        GUID_from_string(DRSUAPI_DS_BIND_GUID, &s->drsuapi.bind_guid);
     
    582596        s->drsuapi.bind_r.out.bind_handle = &s->drsuapi.bind_handle;
    583597
    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);
    586603}
    587604
    588605static void unbecomeDC_drsuapi_remove_ds_server_send(struct libnet_UnbecomeDC_state *s);
    589606
    590 static void unbecomeDC_drsuapi_bind_recv(struct rpc_request *req)
    591 {
    592         struct libnet_UnbecomeDC_state *s = talloc_get_type(req->async.private_data,
     607static void unbecomeDC_drsuapi_bind_recv(struct tevent_req *subreq)
     608{
     609        struct libnet_UnbecomeDC_state *s = tevent_req_callback_data(subreq,
    593610                                            struct libnet_UnbecomeDC_state);
    594611        struct composite_context *c = s->creq;
    595612
    596         c->status = dcerpc_ndr_request_recv(req);
     613        c->status = dcerpc_drsuapi_DsBind_r_recv(subreq, s);
     614        TALLOC_FREE(subreq);
    597615        if (!composite_is_ok(c)) return;
    598616
     
    632650}
    633651
    634 static void unbecomeDC_drsuapi_remove_ds_server_recv(struct rpc_request *req);
     652static void unbecomeDC_drsuapi_remove_ds_server_recv(struct tevent_req *subreq);
    635653
    636654static void unbecomeDC_drsuapi_remove_ds_server_send(struct libnet_UnbecomeDC_state *s)
    637655{
    638656        struct composite_context *c = s->creq;
    639         struct rpc_request *req;
    640657        struct drsuapi_DsRemoveDSServer *r = &s->drsuapi.rm_ds_srv_r;
     658        struct tevent_req *subreq;
    641659
    642660        r->in.bind_handle       = &s->drsuapi.bind_handle;
     
    647665        r->in.req->req1.commit  = true;
    648666
    649         r->out.level_out        = talloc(s, int32_t);
     667        r->out.level_out        = talloc(s, uint32_t);
    650668        r->out.res              = talloc(s, union drsuapi_DsRemoveDSServerResult);
    651669
    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
     677static void unbecomeDC_drsuapi_remove_ds_server_recv(struct tevent_req *subreq)
     678{
     679        struct libnet_UnbecomeDC_state *s = tevent_req_callback_data(subreq,
    659680                                            struct libnet_UnbecomeDC_state);
    660681        struct composite_context *c = s->creq;
    661682        struct drsuapi_DsRemoveDSServer *r = &s->drsuapi.rm_ds_srv_r;
    662683
    663         c->status = dcerpc_ndr_request_recv(req);
     684        c->status = dcerpc_drsuapi_DsRemoveDSServer_r_recv(subreq, s);
     685        TALLOC_FREE(subreq);
    664686        if (!composite_is_ok(c)) return;
    665687
  • vendor/current/source4/libnet/libnet_user.c

    r414 r740  
    179179        }
    180180
     181        talloc_free(c);
    181182        return status;
    182183}
     
    347348        }
    348349       
     350        talloc_free(c);
    349351        return status;
    350352}
     
    573575{
    574576        NTSTATUS status = composite_wait(c);
     577
     578        talloc_free(c);
    575579        return status;
    576580}
     
    869873
    870874        talloc_free(c);
    871        
    872875        return status;
    873876}
     
    910913
    911914static void continue_lsa_domain_opened(struct composite_context *ctx);
    912 static void continue_domain_queried(struct rpc_request *req);
     915static void continue_domain_queried(struct tevent_req *subreq);
    913916static void continue_samr_domain_opened(struct composite_context *ctx);
    914 static void continue_users_enumerated(struct rpc_request *req);
     917static void continue_users_enumerated(struct tevent_req *subreq);
    915918
    916919
     
    931934        struct composite_context *c;
    932935        struct userlist_state *s;
    933         struct rpc_request *query_req;
     936        struct tevent_req *subreq;
    934937        bool prereq_met = false;
    935938
     
    962965
    963966        /* 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);
    968973        return c;
    969974}
     
    978983        struct composite_context *c;
    979984        struct userlist_state *s;
    980         struct rpc_request *query_req;
     985        struct tevent_req *subreq;
    981986       
    982987        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    994999
    9951000        /* 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);
    10001007}
    10011008
     
    10051012 * provided a valid samr handle is opened
    10061013 */
    1007 static void continue_domain_queried(struct rpc_request *req)
     1014static void continue_domain_queried(struct tevent_req *subreq)
    10081015{
    10091016        struct composite_context *c;
    10101017        struct userlist_state *s;
    1011         struct rpc_request *enum_req;
    10121018        bool prereq_met = false;
    10131019       
    1014         c = talloc_get_type(req->async.private_data, struct composite_context);
     1020        c = tevent_req_callback_data(subreq, struct composite_context);
    10151021        s = talloc_get_type(c->private_data, struct userlist_state);
    10161022
    10171023        /* 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);
    10191026        if (!composite_is_ok(c)) return;
    10201027
     
    10391046
    10401047        /* 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);
    10451054}
    10461055
     
    10541063        struct composite_context *c;
    10551064        struct userlist_state *s;
    1056         struct rpc_request *enum_req;
     1065        struct tevent_req *subreq;
    10571066
    10581067        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    10751084       
    10761085        /* 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);
    10811092}
    10821093
     
    10851096 * Stage 2: receive enumerated users and their rids
    10861097 */
    1087 static void continue_users_enumerated(struct rpc_request *req)
     1098static void continue_users_enumerated(struct tevent_req *subreq)
    10881099{
    10891100        struct composite_context *c;
    10901101        struct userlist_state *s;
    1091         int i;
    1092 
    1093         c = talloc_get_type(req->async.private_data, struct composite_context);
     1102        uint32_t i;
     1103
     1104        c = tevent_req_callback_data(subreq, struct composite_context);
    10941105        s = talloc_get_type(c->private_data, struct userlist_state);
    10951106
    10961107        /* 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);
    10981110        if (!composite_is_ok(c)) return;
    10991111
     
    11271139                       
    11281140                        /* username */
    1129                         s->users[i].username = talloc_strdup(c, entry->name.string);
     1141                        s->users[i].username = talloc_strdup(s->users, entry->name.string);
    11301142                        if (composite_nomem(s->users[i].username, c)) return;
    11311143
    11321144                        /* 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);
    11341146                        if (composite_nomem(s->users[i].sid, c)) return;
    11351147                }
     
    11601172
    11611173        if (c == NULL || mem_ctx == NULL || r == NULL) {
     1174                talloc_free(c);
    11621175                return NT_STATUS_INVALID_PARAMETER;
    11631176        }
    1164        
     1177
    11651178        status = composite_wait(c);
    11661179        if (NT_STATUS_IS_OK(status) ||
     
    11871200        }
    11881201
     1202        talloc_free(c);
    11891203        return status;
    11901204}
  • vendor/current/source4/libnet/libnet_vampire.c

    r414 r740  
    2828#include "dsdb/samdb/samdb.h"
    2929#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>
    3232#include "librpc/ndr/libndr.h"
    3333#include "librpc/gen_ndr/ndr_drsuapi.h"
     
    3535#include "librpc/gen_ndr/ndr_misc.h"
    3636#include "system/time.h"
    37 #include "lib/ldb_wrap.h"
     37#include "ldb_wrap.h"
    3838#include "auth/auth.h"
     39#include "auth/credentials/credentials.h"
    3940#include "param/param.h"
    4041#include "param/provision.h"
    41 #include "libcli/security/dom_sid.h"
     42#include "libcli/security/security.h"
     43#include "dsdb/common/util.h"
    4244
    4345/*
     
    5456
    5557*/
    56 struct vampire_state {
     58struct libnet_vampire_cb_state {
    5759        const char *netbios_name;
    58         struct libnet_JoinDomain *join;
     60        const char *domain_name;
     61        const char *realm;
    5962        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 */
    6069        struct dsdb_schema *self_made_schema;
     70
     71        /* prefixMap in LDB format, from the remote DRS server */
     72        DATA_BLOB prefixmap_blob;
    6173        const struct dsdb_schema *schema;
    6274
     
    7587        unsigned total_objects;
    7688        char *last_partition;
     89        const char *server_dn_str;
    7790};
    7891
    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 */
     93void *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 */
     114void *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
     133struct 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
     139struct 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
     145NTSTATUS 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);
    83149        struct provision_settings settings;
    84150        struct provision_result result;
     
    92158        settings.schema_dn_str = p->forest->schema_dn_str;
    93159        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;
    96162        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);
    98164        settings.targetdir = s->targetdir;
    99165
     
    104170        }
    105171
    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);
    108176
    109177        /* wrap the entire vapire operation in a transaction.  This
     
    125193}
    126194
    127 static NTSTATUS vampire_check_options(void *private_data,
    128                                              const struct libnet_BecomeDC_CheckOptions *o)
    129 {
    130         struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);
     195NTSTATUS 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);
    131199
    132200        DEBUG(0,("Become DC [%s] of Domain[%s]/[%s]\n",
     
    149217}
    150218
    151 static NTSTATUS vampire_apply_schema(struct vampire_state *s,
    152                                   const struct libnet_BecomeDC_StoreChunk *c)
    153 {
     219static 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
    154227        WERROR status;
     228        struct dsdb_schema_prefixmap *pfm_remote;
    155229        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;
    157234        struct drsuapi_DsReplicaObjectListItemEx *first_object;
    158         struct drsuapi_DsReplicaObjectListItemEx *cur;
     235        const struct drsuapi_DsReplicaObjectListItemEx *cur;
    159236        uint32_t linked_attributes_count;
    160237        struct drsuapi_DsReplicaLinkedAttribute *linked_attributes;
    161238        const struct drsuapi_DsReplicaCursor2CtrEx *uptodateness_vector;
    162         struct dsdb_extended_replicated_objects *objs;
     239        struct dsdb_extended_replicated_objects *schema_objs;
    163240        struct repsFromTo1 *s_dsa;
    164241        char *tmp_dns_name;
     242        struct ldb_context *schema_ldb;
    165243        struct ldb_message *msg;
    166         struct ldb_val prefixMap_val;
    167244        struct ldb_message_element *prefixMap_el;
    168         struct ldb_val schemaInfo_val;
    169245        uint32_t i;
    170         int ret;
     246        int ret, pass_no;
    171247        bool ok;
    172248        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        };
    173257
    174258        DEBUG(0,("Analyze and apply schema objects\n"));
     
    206290        }
    207291
    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;
    211303        memset(s_dsa->schedule, 0x11, sizeof(s_dsa->schedule));
    212304
     
    217309        s_dsa->other_info->dns_name = tmp_dns_name;
    218310
     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 */
    219327        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);
    230362                        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                                }
    232385                        }
    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;
    255407                        }
    256408                }
    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         */
    288419        ret = dsdb_set_schema(s->ldb, s->self_made_schema);
    289420        if (ret != LDB_SUCCESS) {
     421                DEBUG(0,("Failed to attach working schema from DRS.\n"));
    290422                return NT_STATUS_FOOBAR;
    291423        }
     424
    292425        /* we don't want to access the self made schema anymore */
     426        s->schema = s->self_made_schema;
    293427        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);
    307459        if (!W_ERROR_IS_OK(status)) {
    308460                DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status)));
     
    310462        }
    311463
    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);
    324465        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);
    335474        if (ret != LDB_SUCCESS) {
    336475                return NT_STATUS_FOOBAR;
    337476        }
    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;
    339481
    340482        ret = ldb_modify(s->ldb, msg);
    341483        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)));
    343485                return NT_STATUS_FOOBAR;
    344486        }
    345487
    346488        talloc_free(s_dsa);
    347         talloc_free(objs);
     489        talloc_free(schema_objs);
    348490
    349491        /* We must set these up to ensure the replMetaData is written
     
    360502        }
    361503
    362         s->schema = dsdb_get_schema(s->ldb);
     504        s->schema = dsdb_get_schema(s->ldb, s);
    363505        if (!s->schema) {
    364506                DEBUG(0,("Failed to get loaded dsdb_schema\n"));
     
    369511}
    370512
    371 static NTSTATUS vampire_schema_chunk(void *private_data,
    372                                             const struct libnet_BecomeDC_StoreChunk *c)
    373 {
    374         struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);
     513NTSTATUS 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);
    375517        WERROR status;
    376518        const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;
     
    415557        }
    416558
    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);
    420583                NT_STATUS_HAVE_NO_MEMORY(s->self_made_schema);
    421584
    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);
    423586                if (!W_ERROR_IS_OK(status)) {
    424587                        return werror_to_ntstatus(status);
    425588                }
    426 
    427                 s->schema = s->self_made_schema;
    428589        } 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);
    430591                if (!W_ERROR_IS_OK(status)) {
    431592                        return werror_to_ntstatus(status);
     
    445606
    446607        if (!c->partition->more_data) {
    447                 return vampire_apply_schema(s, c);
     608                return libnet_vampire_cb_apply_schema(s, c);
    448609        }
    449610
     
    451612}
    452613
    453 static NTSTATUS vampire_store_chunk(void *private_data,
    454                                            const struct libnet_BecomeDC_StoreChunk *c)
    455 {
    456         struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);
     614NTSTATUS 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);
    457618        WERROR status;
     619        struct dsdb_schema *schema;
    458620        const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;
    459621        uint32_t nc_object_count;
     
    506668        }
    507669
    508         s_dsa->replica_flags            = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE
    509                                         | DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP
    510                                         | DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS;
     670        s_dsa->replica_flags            = DRSUAPI_DRS_WRIT_REP
     671                                        | DRSUAPI_DRS_INIT_SYNC
     672                                        | DRSUAPI_DRS_PER_SYNC;
    511673        memset(s_dsa->schedule, 0x11, sizeof(s_dsa->schedule));
    512674
     
    535697
    536698
    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);
    548717        if (!W_ERROR_IS_OK(status)) {
    549                 DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status)));
     718                DEBUG(0,("Failed to convert objects: %s\n", win_errstr(status)));
    550719                return werror_to_ntstatus(status);
    551720        }
    552721
    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)) {
    554723                for (i=0; i < objs->num_objects; i++) {
    555724                        struct ldb_ldif ldif;
     
    561730                }
    562731        }
     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
    563738        talloc_free(s_dsa);
    564739        talloc_free(objs);
     
    581756                }
    582757
    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)) {
    584759                        DEBUG(0,("# %s\n", sa->lDAPDisplayName));
    585760                        NDR_PRINT_DEBUG(drsuapi_DsReplicaLinkedAttribute, &linked_attributes[i]);
     
    593768}
    594769
     770static 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
    595819NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
    596820                        struct libnet_Vampire *r)
    597821{
    598822        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;
    606824        NTSTATUS status;
    607825
     
    611829        r->out.error_string = NULL;
    612830
    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);
    622832        if (!join) {
    623833                return NT_STATUS_NO_MEMORY;
     
    627837                netbios_name = r->in.netbios_name;
    628838        } 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));
    630840                if (!netbios_name) {
     841                        talloc_free(join);
    631842                        r->out.error_string = NULL;
    632                         talloc_free(s);
    633843                        return NT_STATUS_NO_MEMORY;
    634844                }
     
    637847        account_name = talloc_asprintf(join, "%s$", netbios_name);
    638848        if (!account_name) {
     849                talloc_free(join);
    639850                r->out.error_string = NULL;
    640                 talloc_free(s);
    641851                return NT_STATUS_NO_MEMORY;
    642852        }
    643853       
     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
    644859        join->in.domain_name    = r->in.domain_name;
    645860        join->in.account_name   = account_name;
     
    651866        if (!NT_STATUS_IS_OK(status)) {
    652867                r->out.error_string = talloc_steal(mem_ctx, join->out.error_string);
    653                 talloc_free(s);
     868                talloc_free(join);
    654869                return status;
    655870        }
     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
     892NTSTATUS 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        }
    656916       
    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);
    660929
    661930        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;
    666949        b.in.dest_dsa_netbios_name      = netbios_name;
    667950
    668951        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);
    674959
    675960        status = libnet_BecomeDC(ctx, s, &b);
     
    707992        ldb_ret = ldb_modify(s->ldb, msg);
    708993        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));
    710995                talloc_free(s);
    711996                return NT_STATUS_INTERNAL_DB_ERROR;
    712997        }
    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        }
    7141007        /* prepare the transaction - this prepares to commit all the changes in
    7151008           the ldb from the whole vampire.  Note that this
     
    7171010        */
    7181011        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));
    7201013                return NT_STATUS_INTERNAL_DB_ERROR;
    7211014        }
     
    7291022       
    7301023        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;
    7341026        set_secrets->netbios_name = netbios_name;
    7351027        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;
    7391031       
    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);
    7411033        if (!NT_STATUS_IS_OK(status)) {
    7421034                r->out.error_string = talloc_steal(mem_ctx, error_string);
     
    7451037        }
    7461038
    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        
    7501039        /* commit the transaction now we know the secrets were written
    7511040         * out properly
     
    7591048
    7601049        return NT_STATUS_OK;
    761 
    762 }
     1050}
  • vendor/current/source4/libnet/libnet_vampire.h

    r414 r740  
    3737};
    3838
     39struct 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 */
     56struct libnet_vampire_cb_state;
    3957
    4058#endif /* __LIBNET_VAMPIRE_H__ */
  • vendor/current/source4/libnet/py_net.c

    r414 r740  
    1 /* 
     1/*
    22   Unix SMB/CIFS implementation.
    33   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
    67   This program is free software; you can redistribute it and/or modify
    78   it under the terms of the GNU General Public License as published by
    89   the Free Software Foundation; either version 3 of the License, or
    910   (at your option) any later version.
    10    
     11
    1112   This program is distributed in the hope that it will be useful,
    1213   but WITHOUT ANY WARRANTY; without even the implied warranty of
    1314   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1415   GNU General Public License for more details.
    15    
     16
    1617   You should have received a copy of the GNU General Public License
    1718   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    1819*/
    1920
     21#include <Python.h>
    2022#include "includes.h"
    21 #include <Python.h>
     23#include <ldb.h>
     24#include <pyldb.h>
    2225#include "libnet.h"
    2326#include "auth/credentials/pycredentials.h"
    2427#include "libcli/security/security.h"
    2528#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
     35void initnet(void);
     36
     37typedef 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
     44static PyObject *py_net_join(py_net_Object *self, PyObject *args, PyObject *kwargs)
    4445{
    4546        struct libnet_Join r;
     
    4748        PyObject *result;
    4849        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
     79static 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
     82static 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;
    4988        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        }
    5998
    6099        /* FIXME: we really need to get a context from the caller or we may end
    61100         * up with 2 event contexts */
    62101        ev = s4_event_context_init(NULL);
     102
    63103        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
     122static 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
     130static 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
     161static const char py_net_export_keytab_doc[] = "export_keytab(keytab, name)\n\n"
     162"Export the DC keytab to a keytab file.";
     163
     164static 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
     205static const char py_net_time_doc[] = "time(server_name) -> timestr\n"
     206"Retrieve the remote time on a server";
     207
     208static 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
     239static const char py_net_create_user_doc[] = "create_user(username)\n"
     240"Create a new user.";
     241
     242static 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
     273static const char py_net_delete_user_doc[] = "delete_user(username)\n"
     274"Delete a user.";
     275
     276static 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
     291static 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
     329struct 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 */
     342static 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 */
     406static 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 */
     481static 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
     516static const char py_net_vampire_doc[] = "vampire(domain, target_dir=None)\n"
     517                                         "Vampire a domain.";
     518
     519static const char py_net_replicate_init_doc[] = "replicate_init(samdb, lp, drspipe)\n"
     520                                         "Setup for replicate_chunk calls.";
     521
     522static const char py_net_replicate_chunk_doc[] = "replicate_chunk(state, level, ctr, schema)\n"
     523                                         "Process replication for one chunk";
     524
     525static 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
     528static 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
     542static void py_net_dealloc(py_net_Object *self)
     543{
     544        talloc_free(self->mem_ctx);
     545        PyObject_Del(self);
     546}
     547
     548static 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) {
    67588                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
     597PyTypeObject 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,
    98604};
    99605
    100606void initnet(void)
    101607{
    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  
    4646
    4747
    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);
     48static void continue_userinfo_lookup(struct tevent_req *subreq);
     49static void continue_userinfo_openuser(struct tevent_req *subreq);
     50static void continue_userinfo_getuser(struct tevent_req *subreq);
     51static void continue_userinfo_closeuser(struct tevent_req *subreq);
    5252
    5353
     
    5555 * Stage 1 (optional): Look for a username in SAM server.
    5656 */
    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;
     57static void continue_userinfo_lookup(struct tevent_req *subreq)
     58{
     59        struct composite_context *c;
     60        struct userinfo_state *s;
    6261        struct monitor_msg msg;
    6362        struct msg_rpc_lookup_name *msg_lookup;
    6463
    65         c = talloc_get_type(req->async.private_data, struct composite_context);
     64        c = tevent_req_callback_data(subreq, struct composite_context);
    6665        s = talloc_get_type(c->private_data, struct userinfo_state);
    6766
    6867        /* 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);
    7070        if (!composite_is_ok(c)) return;
    7171       
     
    104104
    105105        /* 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);
    110112}
    111113
     
    114116 * Stage 2: Open user policy handle.
    115117 */
    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;
     118static void continue_userinfo_openuser(struct tevent_req *subreq)
     119{
     120        struct composite_context *c;
     121        struct userinfo_state *s;
    121122        struct monitor_msg msg;
    122123        struct msg_rpc_open_user *msg_open;
    123124
    124         c = talloc_get_type(req->async.private_data, struct composite_context);
     125        c = tevent_req_callback_data(subreq, struct composite_context);
    125126        s = talloc_get_type(c->private_data, struct userinfo_state);
    126127
    127128        /* 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);
    129131        if (!composite_is_ok(c)) return;
    130132
     
    153155       
    154156        /* 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);
    159163}
    160164
     
    163167 * Stage 3: Get requested user information.
    164168 */
    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;
     169static void continue_userinfo_getuser(struct tevent_req *subreq)
     170{
     171        struct composite_context *c;
     172        struct userinfo_state *s;
    170173        struct monitor_msg msg;
    171174        struct msg_rpc_query_user *msg_query;
    172175
    173         c = talloc_get_type(req->async.private_data, struct composite_context);
     176        c = tevent_req_callback_data(subreq, struct composite_context);
    174177        s = talloc_get_type(c->private_data, struct userinfo_state);
    175178
    176179        /* 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);
    178182        if (!composite_is_ok(c)) return;
    179183
     
    202206       
    203207        /* 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);
    208214}
    209215
     
    212218 * Stage 4: Close policy handle associated with opened user.
    213219 */
    214 static void continue_userinfo_closeuser(struct rpc_request *req)
     220static void continue_userinfo_closeuser(struct tevent_req *subreq)
    215221{
    216222        struct composite_context *c;
     
    219225        struct msg_rpc_close_user *msg_close;
    220226
    221         c = talloc_get_type(req->async.private_data, struct composite_context);
     227        c = tevent_req_callback_data(subreq, struct composite_context);
    222228        s = talloc_get_type(c->private_data, struct userinfo_state);
    223229
    224230        /* 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);
    226233        if (!composite_is_ok(c)) return;
    227234
     
    259266        struct userinfo_state *s;
    260267        struct dom_sid *sid;
    261         struct rpc_request *openuser_req, *lookup_req;
     268        struct tevent_req *subreq;
    262269
    263270        if (!p || !io) return NULL;
     
    286293               
    287294                /* 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);
    292301
    293302        } else {
     
    306315               
    307316                /* 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);
    312323        }
    313324
  • vendor/current/source4/libnet/userman.c

    r414 r740  
    3333struct useradd_state {
    3434        struct dcerpc_pipe       *pipe;
    35         struct rpc_request       *req;
    3635        struct policy_handle     domain_handle;
    3736        struct samr_CreateUser   createuser;
     
    4443
    4544
    46 static void continue_useradd_create(struct rpc_request *req);
     45static void continue_useradd_create(struct tevent_req *subreq);
    4746
    4847
     
    5049 * Stage 1 (and the only one for now): Create user account.
    5150 */
    52 static void continue_useradd_create(struct rpc_request *req)
     51static void continue_useradd_create(struct tevent_req *subreq)
    5352{
    5453        struct composite_context *c;
    5554        struct useradd_state *s;
    5655
    57         c = talloc_get_type(req->async.private_data, struct composite_context);
     56        c = tevent_req_callback_data(subreq, struct composite_context);
    5857        s = talloc_get_type(c->private_data, struct useradd_state);
    5958
    6059        /* 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);
    6262        if (!composite_is_ok(c)) return;
    6363
     
    101101        struct composite_context *c;
    102102        struct useradd_state *s;
     103        struct tevent_req *subreq;
    103104
    104105        if (!p || !io) return NULL;
     
    131132
    132133        /* 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);
    137140        return c;
    138141}
     
    204207
    205208
    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);
     209static void continue_userdel_name_found(struct tevent_req *subreq);
     210static void continue_userdel_user_opened(struct tevent_req *subreq);
     211static void continue_userdel_deleted(struct tevent_req *subreq);
    209212
    210213
     
    212215 * Stage 1: Lookup the user name and resolve it to rid
    213216 */
    214 static void continue_userdel_name_found(struct rpc_request *req)
     217static void continue_userdel_name_found(struct tevent_req *subreq)
    215218{
    216219        struct composite_context *c;
    217220        struct userdel_state *s;
    218         struct rpc_request *openuser_req;
    219221        struct monitor_msg msg;
    220222
    221         c = talloc_get_type(req->async.private_data, struct composite_context);
     223        c = tevent_req_callback_data(subreq, struct composite_context);
    222224        s = talloc_get_type(c->private_data, struct userdel_state);
    223225
    224226        /* 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);
    226229        if (!composite_is_ok(c)) return;
    227230
     
    265268
    266269        /* 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);
    271276}
    272277
     
    275280 * Stage 2: Open user account.
    276281 */
    277 static void continue_userdel_user_opened(struct rpc_request* req)
     282static void continue_userdel_user_opened(struct tevent_req *subreq)
    278283{
    279284        struct composite_context *c;
    280285        struct userdel_state *s;
    281         struct rpc_request *deluser_req;
    282286        struct monitor_msg msg;
    283287
    284         c = talloc_get_type(req->async.private_data, struct composite_context);
     288        c = tevent_req_callback_data(subreq, struct composite_context);
    285289        s = talloc_get_type(c->private_data, struct userdel_state);
    286290
    287291        /* 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);
    289294        if (!composite_is_ok(c)) return;
    290295
     
    313318       
    314319        /* 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;
    317324
    318325        /* callback handler setup */
    319         composite_continue_rpc(c, deluser_req, continue_userdel_deleted, c);
     326        tevent_req_set_callback(subreq, continue_userdel_deleted, c);
    320327}
    321328
     
    324331 * Stage 3: Delete user account
    325332 */
    326 static void continue_userdel_deleted(struct rpc_request *req)
     333static void continue_userdel_deleted(struct tevent_req *subreq)
    327334{
    328335        struct composite_context *c;
     
    330337        struct monitor_msg msg;
    331338
    332         c = talloc_get_type(req->async.private_data, struct composite_context);
     339        c = tevent_req_callback_data(subreq, struct composite_context);
    333340        s = talloc_get_type(c->private_data, struct userdel_state);
    334341
    335342        /* 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);
    337345        if (!composite_is_ok(c)) return;
    338346
     
    370378        struct composite_context *c;
    371379        struct userdel_state *s;
    372         struct rpc_request *lookup_req;
     380        struct tevent_req *subreq;
    373381
    374382        /* composite context allocation and setup */
     
    397405
    398406        /* 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;
    401411
    402412        /* 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);
    404414        return c;
    405415}
     
    455465 */
    456466
    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);
     467static void continue_usermod_name_found(struct tevent_req *subreq);
     468static void continue_usermod_user_opened(struct tevent_req *subreq);
     469static void continue_usermod_user_queried(struct tevent_req *subreq);
     470static void continue_usermod_user_changed(struct tevent_req *subreq);
    461471
    462472
     
    480490 * Step 1: Lookup user name
    481491 */
    482 static void continue_usermod_name_found(struct rpc_request *req)
     492static void continue_usermod_name_found(struct tevent_req *subreq)
    483493{
    484494        struct composite_context *c;
    485495        struct usermod_state *s;
    486         struct rpc_request *openuser_req;
    487496        struct monitor_msg msg;
    488497
    489         c = talloc_get_type(req->async.private_data, struct composite_context);
     498        c = tevent_req_callback_data(subreq, struct composite_context);
    490499        s = talloc_get_type(c->private_data, struct usermod_state);
    491500
    492501        /* 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);
    494504        if (!composite_is_ok(c)) return;
    495505
     
    533543
    534544        /* 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);
    539551}
    540552
     
    656668                               struct usermod_state *s)
    657669{
    658         struct rpc_request *query_req, *setuser_req;
    659670        bool do_set;
    660671        union samr_UserInfo *i = &s->info;
     672        struct tevent_req *subreq;
    661673
    662674        /* set the level to invalid value, so that unless setfields routine
     
    687699                /* send query user info request to retrieve complete data of
    688700                   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);
    691706
    692707        } else {
     
    696711
    697712                /* 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);
    700718        }
    701719       
     
    707725 * Stage 2: Open user account
    708726 */
    709 static void continue_usermod_user_opened(struct rpc_request *req)
     727static void continue_usermod_user_opened(struct tevent_req *subreq)
    710728{
    711729        struct composite_context *c;
    712730        struct usermod_state *s;
    713731
    714         c = talloc_get_type(req->async.private_data, struct composite_context);
     732        c = tevent_req_callback_data(subreq, struct composite_context);
    715733        s = talloc_get_type(c->private_data, struct usermod_state);
    716734
    717         c->status = dcerpc_ndr_request_recv(req);
     735        c->status = dcerpc_samr_OpenUser_r_recv(subreq, s);
     736        TALLOC_FREE(subreq);
    718737        if (!composite_is_ok(c)) return;
    719738
     
    731750 * Stage 2a (optional): Query the user information
    732751 */
    733 static void continue_usermod_user_queried(struct rpc_request *req)
     752static void continue_usermod_user_queried(struct tevent_req *subreq)
    734753{
    735754        struct composite_context *c;
     
    737756        union samr_UserInfo *i;
    738757        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);
    742760        s = talloc_get_type(c->private_data, struct usermod_state);
    743761
     
    745763
    746764        /* 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);
    748767        if (!composite_is_ok(c)) return;
    749768
     
    766785
    767786        /* 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);
    770792}
    771793
     
    774796 * Stage 3: Set new user account data
    775797 */
    776 static void continue_usermod_user_changed(struct rpc_request *req)
     798static void continue_usermod_user_changed(struct tevent_req *subreq)
    777799{
    778800        struct composite_context *c;
    779801        struct usermod_state *s;
    780802       
    781         c = talloc_get_type(req->async.private_data, struct composite_context);
     803        c = tevent_req_callback_data(subreq, struct composite_context);
    782804        s = talloc_get_type(c->private_data, struct usermod_state);
    783805
    784806        /* 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);
    786809        if (!composite_is_ok(c)) return;
    787810
     
    818841        struct composite_context *c;
    819842        struct usermod_state *s;
    820         struct rpc_request *lookup_req;
     843        struct tevent_req *subreq;
    821844
    822845        /* composite context allocation and setup */
     
    845868
    846869        /* 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;
    849874       
    850875        /* 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);
    852877        return c;
    853878}
Note: See TracChangeset for help on using the changeset viewer.