diff options
author | Ondrej Kos <okos@redhat.com> | 2013-07-24 09:09:04 +0200 |
---|---|---|
committer | Ondrej Kos <okos@redhat.com> | 2013-07-24 09:09:04 +0200 |
commit | cb8623fe46f360a6f664cf428d2fa5b8814bbab6 (patch) | |
tree | 65efe409e6b9beb90a726a511a6c13204f76a64c | |
parent | 1b3144586978c47506eaa39db505e6231e3b0c0a (diff) | |
download | sssd-saveldapsid.tar.gz sssd-saveldapsid.tar.xz sssd-saveldapsid.zip |
wipsaveldapsid
-rw-r--r-- | src/providers/ldap/ldap_init.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/providers/ldap/ldap_init.c b/src/providers/ldap/ldap_init.c index 38d4fa71..8d48ca79 100644 --- a/src/providers/ldap/ldap_init.c +++ b/src/providers/ldap/ldap_init.c @@ -84,6 +84,75 @@ errno_t check_order_list_for_duplicates(char **list, return EOK; } +#ifndef AD_AT_OBJECT_SID +#define AD_AT_OBJECT_SID "objectSID" +#endif +#ifndef MASTER_DOMAIN_SID_FILTER +#define MASTER_DOMAIN_SID_FILTER "objectclass=domain" +#endif + +static void sdap_get_master_sid_done(struct tevent_req *req) +{ + int ret; + struct sdap_id_ctx *ctx; + size_t reply_count; + struct sysdb_attrs **reply = NULL; + + ctx = tevent_req_callback_data(req, struct sdap_id_ctx); + + ret = sdap_get_generic_recv(req, ctx, &reply_count, &reply); + talloc_zfree(req); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send request failed.\n")); + goto done; + } + return; + +done: +// be_req_terminate(ctx->be->ev, DP_ERR_FATAL, ret, NULL); + DEBUG(SSSDBG_FATAL_FAILURE, ("some usage\n")); + return; +} + +errno_t sdap_get_master_sid(struct sdap_id_ctx *ctx) +{ + struct tevent_req *req; + struct sdap_search_base *base; + const char *master_sid_attrs[] = {AD_AT_OBJECT_SID, NULL}; + struct sdap_id_op *sdap_op; + const char *basedn; + + basedn = dp_opt_get_string(ctx->opts->basic, SDAP_SEARCH_BASE); + if (basedn == NULL) { + DEBUG(SSSDBG_FATAL_FAILURE,("\n\n\nFAILED\n\n\n")); + } + + DEBUG(SSSDBG_TRACE_FUNC, ("\n\nSDAP_SEARCH_BASE: %s\n\n", basedn)); + + sdap_op = sdap_id_op_create(ctx, ctx->conn->conn_cache); + if (sdap_op == NULL) { + DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_create failed.\n")); + return ENOMEM; + } + + req = sdap_get_generic_send(ctx, ctx->be->ev, ctx->opts, + sdap_id_op_handle(sdap_op), + /*basedn*/"dc=adsssd,dc=brq", LDAP_SCOPE_BASE, + "objectclass=domain", master_sid_attrs, + NULL, 0, + dp_opt_get_int(ctx->opts->basic, SDAP_SEARCH_TIMEOUT), + false); + + if (req == NULL) { + DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send failed.\n")); + return ENOMEM; + } + + tevent_req_set_callback(req, sdap_get_master_sid_done, ctx); + + return EAGAIN; +} + int sssm_ldap_id_init(struct be_ctx *bectx, struct bet_ops **ops, void **pvt_data) @@ -165,6 +234,15 @@ int sssm_ldap_id_init(struct be_ctx *bectx, goto done; } + if (ctx->opts->schema_type == SDAP_SCHEMA_AD) { + DEBUG(SSSDBG_CRIT_FAILURE, ("\n\n\n\n\n\nLDAP provider, AD schema\n\n\n\n\n")); + + DEBUG(SSSDBG_TRACE_FUNC, ("AD schema set, trying to retrieve " + "domain master SID\n")); + sleep(15); + ret = sdap_get_master_sid(ctx); + } + ret = sdap_setup_child(); if (ret != EOK) { DEBUG(1, ("setup_child failed [%d][%s].\n", |