static isc_result_t dlz_bind9_writeable_zone_hook(dns_view_t *view, const char *zone_name) { struct torture_context *tctx = talloc_get_type((void *)view, struct torture_context); struct ldb_context *samdb = samdb_connect_url(tctx, NULL, tctx->lp_ctx, system_session(tctx->lp_ctx), 0, lpcfg_private_path(tctx, tctx->lp_ctx, "dns/sam.ldb")); struct ldb_message *msg; int ret; const char *attrs[] = { NULL }; if (!samdb) { torture_fail(tctx, "Failed to connect to samdb"); return ISC_R_FAILURE; } ret = dsdb_search_one(samdb, tctx, &msg, NULL, LDB_SCOPE_SUBTREE, attrs, DSDB_SEARCH_SEARCH_ALL_PARTITIONS, "(&(objectClass=dnsZone)(name=%s))", zone_name); if (ret != LDB_SUCCESS) { torture_fail(tctx, talloc_asprintf(tctx, "Failed to search for %s: %s", zone_name, ldb_errstring(samdb))); return ISC_R_FAILURE; } talloc_free(msg); return ISC_R_SUCCESS; }
/** \details Initialize the EMSABP context and open connections to Samba databases. \param lp_ctx pointer to the loadparm context \param tdb_ctx pointer to the EMSABP TDB context \return Allocated emsabp_context on success, otherwise NULL */ _PUBLIC_ struct emsabp_context *emsabp_init(struct loadparm_context *lp_ctx, TDB_CONTEXT *tdb_ctx) { TALLOC_CTX *mem_ctx; struct emsabp_context *emsabp_ctx; struct tevent_context *ev; const char *samdb_url; /* Sanity checks */ if (!lp_ctx) return NULL; mem_ctx = talloc_named(NULL, 0, "emsabp_init"); emsabp_ctx = talloc_zero(mem_ctx, struct emsabp_context); if (!emsabp_ctx) { talloc_free(mem_ctx); return NULL; } emsabp_ctx->mem_ctx = mem_ctx; ev = tevent_context_init(mem_ctx); if (!ev) { talloc_free(mem_ctx); return NULL; } tevent_loop_allow_nesting(ev); /* Save a pointer to the loadparm context */ emsabp_ctx->lp_ctx = lp_ctx; /* Retrieve samdb url (local or external) */ samdb_url = lpcfg_parm_string(lp_ctx, NULL, "dcerpc_mapiproxy", "samdb_url"); /* return an opaque context pointer on samDB database */ if (!samdb_url) { emsabp_ctx->samdb_ctx = samdb_connect(mem_ctx, ev, lp_ctx, system_session(lp_ctx), 0); } else { emsabp_ctx->samdb_ctx = samdb_connect_url(mem_ctx, ev, lp_ctx, system_session(lp_ctx), 0, samdb_url); } if (!emsabp_ctx->samdb_ctx) { talloc_free(mem_ctx); DEBUG(0, ("[%s:%d]: Connection to \"sam.ldb\" failed\n", __FUNCTION__, __LINE__)); return NULL; } /* Reference the global TDB context to the current emsabp context */ emsabp_ctx->tdb_ctx = tdb_ctx; /* Initialize a temporary (on-memory) TDB database to store * temporary MId used within EMSABP */ emsabp_ctx->ttdb_ctx = emsabp_tdb_init_tmp(emsabp_ctx->mem_ctx); if (!emsabp_ctx->ttdb_ctx) { smb_panic("unable to create on-memory TDB database"); } return emsabp_ctx; }
/** \details Initialize ldb_context to samdb, creates one for all emsmdbp contexts \param lp_ctx pointer to the loadparm context */ static struct ldb_context *samdb_init(struct loadparm_context *lp_ctx) { TALLOC_CTX *mem_ctx; struct tevent_context *ev; const char *samdb_url; if (samdb_ctx) return samdb_ctx; mem_ctx = talloc_autofree_context(); ev = tevent_context_init(mem_ctx); if (!ev) { OC_PANIC(false, ("Fail to initialize tevent_context\n")); return NULL; } tevent_loop_allow_nesting(ev); /* Retrieve samdb url (local or external) */ samdb_url = lpcfg_parm_string(lp_ctx, NULL, "dcerpc_mapiproxy", "samdb_url"); if (!samdb_url) { samdb_ctx = samdb_connect(mem_ctx, ev, lp_ctx, system_session(lp_ctx), 0); } else { samdb_ctx = samdb_connect_url(mem_ctx, ev, lp_ctx, system_session(lp_ctx), LDB_FLG_RECONNECT, samdb_url); } return samdb_ctx; }
/* called to initialise the driver */ _PUBLIC_ isc_result_t dlz_create(const char *dlzname, unsigned int argc, char *argv[], void **dbdata, ...) { struct dlz_bind9_data *state; const char *helper_name; va_list ap; isc_result_t result; struct ldb_dn *dn; NTSTATUS nt_status; state = talloc_zero(NULL, struct dlz_bind9_data); if (state == NULL) { return ISC_R_NOMEMORY; } talloc_set_destructor(state, dlz_state_debug_unregister); /* fill in the helper functions */ va_start(ap, dbdata); while ((helper_name = va_arg(ap, const char *)) != NULL) { b9_add_helper(state, helper_name, va_arg(ap, void*)); } va_end(ap); /* Do not install samba signal handlers */ fault_setup_disable(); /* Start logging (to the bind9 logs) */ debug_set_callback(state, b9_debug); state->ev_ctx = s4_event_context_init(state); if (state->ev_ctx == NULL) { result = ISC_R_NOMEMORY; goto failed; } result = parse_options(state, argc, argv, &state->options); if (result != ISC_R_SUCCESS) { goto failed; } state->lp = loadparm_init_global(true); if (state->lp == NULL) { result = ISC_R_NOMEMORY; goto failed; } if (state->options.debug) { lpcfg_do_global_parameter(state->lp, "log level", state->options.debug); } else { lpcfg_do_global_parameter(state->lp, "log level", "0"); } if (smb_krb5_init_context(state, state->ev_ctx, state->lp, &state->smb_krb5_ctx) != 0) { result = ISC_R_NOMEMORY; goto failed; } nt_status = gensec_init(); if (!NT_STATUS_IS_OK(nt_status)) { result = ISC_R_NOMEMORY; goto failed; } state->auth_context = talloc_zero(state, struct auth4_context); if (state->auth_context == NULL) { result = ISC_R_NOMEMORY; goto failed; } if (state->options.url == NULL) { state->options.url = lpcfg_private_path(state, state->lp, "dns/sam.ldb"); if (state->options.url == NULL) { result = ISC_R_NOMEMORY; goto failed; } } state->samdb = samdb_connect_url(state, state->ev_ctx, state->lp, system_session(state->lp), 0, state->options.url); if (state->samdb == NULL) { state->log(ISC_LOG_ERROR, "samba_dlz: Failed to connect to %s", state->options.url); result = ISC_R_FAILURE; goto failed; } dn = ldb_get_default_basedn(state->samdb); if (dn == NULL) { state->log(ISC_LOG_ERROR, "samba_dlz: Unable to get basedn for %s - %s", state->options.url, ldb_errstring(state->samdb)); result = ISC_R_FAILURE; goto failed; } state->log(ISC_LOG_INFO, "samba_dlz: started for DN %s", ldb_dn_get_linearized(dn)); state->auth_context->event_ctx = state->ev_ctx; state->auth_context->lp_ctx = state->lp; state->auth_context->sam_ctx = state->samdb; state->auth_context->generate_session_info_pac = b9_generate_session_info_pac; *dbdata = state; return ISC_R_SUCCESS; failed: talloc_free(state); return result; }
/** \details Initialize the EMSMDBP context and open connections to Samba databases. \param lp_ctx pointer to the loadparm_context \param username account name for current session \param ldb_ctx pointer to the openchange dispatcher ldb database \return Allocated emsmdbp_context pointer on success, otherwise NULL */ _PUBLIC_ struct emsmdbp_context *emsmdbp_init(struct loadparm_context *lp_ctx, const char *username, void *oc_ctx) { TALLOC_CTX *mem_ctx; struct emsmdbp_context *emsmdbp_ctx; struct tevent_context *ev; enum mapistore_error ret; const char *samdb_url; /* Sanity Checks */ if (!lp_ctx) return NULL; mem_ctx = talloc_named(NULL, 0, "emsmdbp_init"); emsmdbp_ctx = talloc_zero(mem_ctx, struct emsmdbp_context); if (!emsmdbp_ctx) { talloc_free(mem_ctx); return NULL; } emsmdbp_ctx->mem_ctx = mem_ctx; ev = tevent_context_init(mem_ctx); if (!ev) { talloc_free(mem_ctx); return NULL; } tevent_loop_allow_nesting(ev); /* Save a pointer to the loadparm context */ emsmdbp_ctx->lp_ctx = lp_ctx; /* Retrieve samdb url (local or external) */ samdb_url = lpcfg_parm_string(lp_ctx, NULL, "dcerpc_mapiproxy", "samdb_url"); /* return an opaque context pointer on samDB database */ if (!samdb_url) { emsmdbp_ctx->samdb_ctx = samdb_connect(mem_ctx, ev, lp_ctx, system_session(lp_ctx), 0); } else { emsmdbp_ctx->samdb_ctx = samdb_connect_url(mem_ctx, ev, lp_ctx, system_session(lp_ctx), 0, samdb_url); } if (!emsmdbp_ctx->samdb_ctx) { talloc_free(mem_ctx); DEBUG(0, ("[%s:%d]: Connection to \"sam.ldb\" failed\n", __FUNCTION__, __LINE__)); return NULL; } /* Reference global OpenChange dispatcher database pointer within current context */ emsmdbp_ctx->oc_ctx = oc_ctx; /* Initialize the mapistore context */ emsmdbp_ctx->mstore_ctx = mapistore_init(mem_ctx, lp_ctx, NULL); if (!emsmdbp_ctx->mstore_ctx) { DEBUG(0, ("[%s:%d]: MAPISTORE initialization failed\n", __FUNCTION__, __LINE__)); talloc_free(mem_ctx); return NULL; } ret = mapistore_set_connection_info(emsmdbp_ctx->mstore_ctx, emsmdbp_ctx->samdb_ctx, emsmdbp_ctx->oc_ctx, username); if (ret != MAPISTORE_SUCCESS) { DEBUG(0, ("[%s:%d]: MAPISTORE connection info initialization failed\n", __FUNCTION__, __LINE__)); talloc_free(mem_ctx); return NULL; } talloc_set_destructor((void *)emsmdbp_ctx->mstore_ctx, (int (*)(void *))emsmdbp_mapi_store_destructor); /* Initialize MAPI handles context */ emsmdbp_ctx->handles_ctx = mapi_handles_init(mem_ctx); if (!emsmdbp_ctx->handles_ctx) { DEBUG(0, ("[%s:%d]: MAPI handles context initialization failed\n", __FUNCTION__, __LINE__)); talloc_free(mem_ctx); return NULL; } talloc_set_destructor((void *)emsmdbp_ctx->handles_ctx, (int (*)(void *))emsmdbp_mapi_handles_destructor); return emsmdbp_ctx; }