summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Kos <okos@redhat.com>2013-07-24 09:09:04 +0200
committerOndrej Kos <okos@redhat.com>2013-07-24 09:09:04 +0200
commitcb8623fe46f360a6f664cf428d2fa5b8814bbab6 (patch)
tree65efe409e6b9beb90a726a511a6c13204f76a64c
parent1b3144586978c47506eaa39db505e6231e3b0c0a (diff)
downloadsssd-saveldapsid.tar.gz
sssd-saveldapsid.tar.xz
sssd-saveldapsid.zip
-rw-r--r--src/providers/ldap/ldap_init.c78
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",