From e1efa2ea6209c349abbc22f490bf3de251253dc6 Mon Sep 17 00:00:00 2001 From: Sumit Bose Date: Tue, 1 Jun 2010 10:29:18 +0200 Subject: [PATCH] Remove service groups Because the memberOf attribute is now set for the service objects we do not need to fetch the service groups separately anymore. --- src/providers/ipa/ipa_access.c | 271 +--------------------------------------- src/providers/ipa/ipa_access.h | 2 - 2 files changed, 6 insertions(+), 267 deletions(-) diff --git a/src/providers/ipa/ipa_access.c b/src/providers/ipa/ipa_access.c index c90d63a..2fc2fcc 100644 --- a/src/providers/ipa/ipa_access.c +++ b/src/providers/ipa/ipa_access.c @@ -50,19 +50,16 @@ #define IPA_CN "cn" #define IPA_MEMBER_SERVICE "memberService" #define IPA_SERVICE_CATEGORY "serviceCategory" -#define IPA_SERVICEGROUP_MEMBER "member" #define IPA_HOST_BASE_TMPL "cn=computers,cn=accounts,%s" #define IPA_HBAC_BASE_TMPL "cn=hbac,%s" #define IPA_SERVICES_BASE_TMPL "cn=hbacservices,cn=accounts,%s" -#define IPA_SERVICEGROUPS_BASE_TMPL "cn=hbacservicegroups,cn=accounts,%s" #define SYSDB_HBAC_BASE_TMPL "cn=hbac,"SYSDB_TMPL_CUSTOM_BASE #define HBAC_RULES_SUBDIR "hbac_rules" #define HBAC_HOSTS_SUBDIR "hbac_hosts" #define HBAC_SERVICES_SUBDIR "hbac_services" -#define HBAC_SERVICEGROUPS_SUBDIR "hbac_servicegroups" static errno_t msgs2attrs_array(TALLOC_CTX *mem_ctx, size_t count, struct ldb_message **msgs, @@ -120,25 +117,15 @@ struct hbac_get_service_data_state { struct sysdb_attrs **services_reply_list; size_t services_reply_count; - char *servicegroups_filter; - char *servicegroups_search_base; - const char **servicegroups_attrs; - struct sysdb_attrs **servicegroups_reply_list; - size_t servicegroups_reply_count; - size_t current_item; }; static void hbac_get_services_connect_done(struct tevent_req *subreq); static void hbac_services_get_done(struct tevent_req *subreq); -static void hbac_servicegroups_get_done(struct tevent_req *subreq); static void hbac_service_data_sysdb_transaction_started(struct tevent_req *subreq); static void hbac_services_delete_done(struct tevent_req *subreq); -static void hbac_servicegroups_delete_done(struct tevent_req *subreq); static void hbac_service_store_prepare(struct tevent_req *req); static void hbac_service_store_done(struct tevent_req *subreq); -static void hbac_servicegroup_store_prepare(struct tevent_req *req); -static void hbac_servicegroup_store_done(struct tevent_req *subreq); struct tevent_req *hbac_get_service_data_send(TALLOC_CTX *memctx, struct tevent_context *ev, @@ -168,12 +155,6 @@ struct tevent_req *hbac_get_service_data_send(TALLOC_CTX *memctx, state->services_reply_list = NULL; state->services_reply_count = 0; - state->servicegroups_filter = NULL; - state->servicegroups_search_base = NULL; - state->servicegroups_attrs = NULL; - state->servicegroups_reply_list = NULL; - state->servicegroups_reply_count = 0; - state->current_item = 0; state->services_search_base = talloc_asprintf(state, IPA_SERVICES_BASE_TMPL, @@ -334,114 +315,7 @@ static void hbac_services_get_done(struct tevent_req *subreq) } } - state->servicegroups_search_base = talloc_asprintf(state, - IPA_SERVICEGROUPS_BASE_TMPL, - state->basedn); - if (state->servicegroups_search_base == NULL) { - DEBUG(1, ("Failed to create service groups search base.\n")); - ret = ENOMEM; - goto fail; - } - - state->servicegroups_attrs = talloc_array(state, const char *, 8); - if (state->servicegroups_attrs == NULL) { - DEBUG(1, ("Failed to allocate servicegroup attribute list.\n")); - ret = ENOMEM; - goto fail; - } - state->servicegroups_attrs[0] = IPA_CN; - state->servicegroups_attrs[1] = IPA_SERVICEGROUP_MEMBER; - state->servicegroups_attrs[2] = SYSDB_ORIG_DN; - state->servicegroups_attrs[3] = IPA_UNIQUE_ID; - state->servicegroups_attrs[4] = IPA_MEMBEROF; - state->servicegroups_attrs[5] = SYSDB_ORIG_MEMBEROF; - state->servicegroups_attrs[6] = OBJECTCLASS; - state->servicegroups_attrs[7] = NULL; - - state->servicegroups_filter = talloc_asprintf(state, - "(objectclass=ipaHBACServiceGroup)"); - if (state->servicegroups_filter == NULL) { - ret = ENOMEM; - goto fail; - } - - DEBUG(9, ("Services filter: [%s].\n", state->servicegroups_filter)); - - if (state->offline) { - subreq = sysdb_search_custom_send(state, state->ev, state->sysdb, NULL, - state->sdap_ctx->be->domain, - state->servicegroups_filter, - HBAC_SERVICEGROUPS_SUBDIR, - state->servicegroups_attrs); - if (subreq == NULL) { - DEBUG(1, ("sysdb_search_custom_send failed.\n")); - ret = ENOMEM; - goto fail; - } - - tevent_req_set_callback(subreq, hbac_servicegroups_get_done, req); - - return; - } - - subreq = sdap_get_generic_send(state, state->ev, - state->sdap_ctx->opts, - state->sdap_ctx->gsh, - state->servicegroups_search_base, - LDAP_SCOPE_SUB, - state->servicegroups_filter, - state->servicegroups_attrs, - NULL, 0); - - if (subreq == NULL) { - DEBUG(1, ("sdap_get_generic_send failed.\n")); - ret = ENOMEM; - goto fail; - } - - tevent_req_set_callback(subreq, hbac_servicegroups_get_done, req); - return; - -fail: - tevent_req_error(req, ret); - return; -} - -static void hbac_servicegroups_get_done(struct tevent_req *subreq) -{ - struct tevent_req *req = tevent_req_callback_data(subreq, - struct tevent_req); - struct hbac_get_service_data_state *state = tevent_req_data(req, - struct hbac_get_service_data_state); - int ret; - struct ldb_message **msgs; - - if (state->offline) { - ret = sysdb_search_custom_recv(subreq, state, - &state->servicegroups_reply_count, &msgs); - } else { - ret = sdap_get_generic_recv(subreq, state, - &state->servicegroups_reply_count, - &state->servicegroups_reply_list); - } - talloc_zfree(subreq); - if (ret != EOK) { - tevent_req_error(req, ret); - return; - } - - if (state->offline) { - ret = msgs2attrs_array(state, state->servicegroups_reply_count, msgs, - &state->servicegroups_reply_list); - talloc_zfree(msgs); - if (ret != EOK) { - DEBUG(1, ("msgs2attrs_array failed.\n")); - goto fail; - } - } - - if ((state->services_reply_count == 0 && - state->servicegroups_reply_count == 0)|| state->offline) { + if (state->services_reply_count == 0 || state->offline) { tevent_req_done(req); return; } @@ -507,46 +381,6 @@ static void hbac_services_delete_done(struct tevent_req *subreq) struct hbac_get_service_data_state *state = tevent_req_data(req, struct hbac_get_service_data_state); int ret; - struct ldb_dn *servicegroups_base_dn; - - ret = sysdb_delete_recursive_recv(subreq); - talloc_zfree(subreq); - if (ret != EOK) { - tevent_req_error(req, ret); - return; - } - - servicegroups_base_dn = sysdb_custom_subtree_dn(state->sysdb, state, - state->sdap_ctx->be->domain->name, - HBAC_SERVICEGROUPS_SUBDIR); - if (servicegroups_base_dn == NULL) { - ret = ENOMEM; - goto fail; - } - - DEBUG(9, ("Trying to delete [%s].\n", ldb_dn_get_linearized(servicegroups_base_dn))); - subreq = sysdb_delete_recursive_send(state, state->ev, state->handle, - servicegroups_base_dn, true); - if (subreq == NULL) { - DEBUG(1, ("sysdb_delete_recursive_send failed.\n")); - ret = ENOMEM; - goto fail; - } - tevent_req_set_callback(subreq, hbac_servicegroups_delete_done, req); - return; - -fail: - tevent_req_error(req, ret); - return; -} - -static void hbac_servicegroups_delete_done(struct tevent_req *subreq) -{ - struct tevent_req *req = tevent_req_callback_data(subreq, - struct tevent_req); - struct hbac_get_service_data_state *state = tevent_req_data(req, - struct hbac_get_service_data_state); - int ret; ret = sysdb_delete_recursive_recv(subreq); talloc_zfree(subreq); @@ -614,90 +448,6 @@ static void hbac_service_store_prepare(struct tevent_req *req) return; } - state->current_item = 0; - hbac_servicegroup_store_prepare(req); - - return; - -fail: - tevent_req_error(req, ret); - return; -} - -static void hbac_service_store_done(struct tevent_req *subreq) -{ - struct tevent_req *req = tevent_req_callback_data(subreq, - struct tevent_req); - struct hbac_get_service_data_state *state = tevent_req_data(req, - struct hbac_get_service_data_state); - int ret; - - ret = sysdb_store_custom_recv(subreq); - talloc_zfree(subreq); - if (ret != EOK) { - tevent_req_error(req, ret); - return; - } - - state->current_item++; - hbac_service_store_prepare(req); -} - -static void hbac_servicegroup_store_prepare(struct tevent_req *req) -{ - struct hbac_get_service_data_state *state = tevent_req_data(req, - struct hbac_get_service_data_state); - int ret; - struct ldb_message_element *el; - struct tevent_req *subreq; - char *object_name; - - if (state->current_item < state->servicegroups_reply_count) { - -/* TODO: I would prefer IPA_UNIQUE_ID but currently it is not available */ - ret = sysdb_attrs_get_el(state->servicegroups_reply_list[state->current_item], - IPA_CN, &el); - if (ret != EOK) { - DEBUG(1, ("sysdb_attrs_get_el failed.\n")); - goto fail; - } - if (el->num_values == 0) { - ret = EINVAL; - goto fail; - } - object_name = talloc_strndup(state, (const char *)el->values[0].data, - el->values[0].length); - if (object_name == NULL) { - ret = ENOMEM; - goto fail; - } - DEBUG(9, ("Object name: [%s].\n", object_name)); - - ret = sysdb_attrs_replace_name( - state->servicegroups_reply_list[state->current_item], - IPA_MEMBEROF, SYSDB_ORIG_MEMBEROF); - if (ret != EOK) { - DEBUG(1, ("sysdb_attrs_replace_name failed.\n")); - goto fail; - } - - subreq = sysdb_store_custom_send(state, state->ev, - state->handle, - state->sdap_ctx->be->domain, - object_name, - HBAC_SERVICEGROUPS_SUBDIR, - state->servicegroups_reply_list[state->current_item]); - - if (subreq == NULL) { - DEBUG(1, ("sysdb_store_custom_send failed.\n")); - ret = ENOMEM; - goto fail; - } - - tevent_req_set_callback(subreq, hbac_servicegroup_store_done, req); - return; - } - subreq = sysdb_transaction_commit_send(state, state->ev, state->handle); if (subreq == NULL) { DEBUG(1, ("sysdb_transaction_commit_send failed.\n")); @@ -706,6 +456,7 @@ static void hbac_servicegroup_store_prepare(struct tevent_req *req) } tevent_req_set_callback(subreq, sysdb_transaction_complete, req); + return; fail: @@ -713,7 +464,7 @@ fail: return; } -static void hbac_servicegroup_store_done(struct tevent_req *subreq) +static void hbac_service_store_done(struct tevent_req *subreq) { struct tevent_req *req = tevent_req_callback_data(subreq, struct tevent_req); @@ -729,15 +480,13 @@ static void hbac_servicegroup_store_done(struct tevent_req *subreq) } state->current_item++; - hbac_servicegroup_store_prepare(req); + hbac_service_store_prepare(req); } static int hbac_get_service_data_recv(struct tevent_req *req, TALLOC_CTX *memctx, size_t *hbac_services_count, - struct sysdb_attrs ***hbac_services_list, - size_t *hbac_servicegroups_count, - struct sysdb_attrs ***hbac_servicegroups_list) + struct sysdb_attrs ***hbac_services_list) { struct hbac_get_service_data_state *state = tevent_req_data(req, struct hbac_get_service_data_state); @@ -751,12 +500,6 @@ static int hbac_get_service_data_recv(struct tevent_req *req, talloc_steal(memctx, state->services_reply_list[i]); } - *hbac_servicegroups_count = state->servicegroups_reply_count; - *hbac_servicegroups_list = talloc_steal(memctx, - state->servicegroups_reply_list); - for (i = 0; i < state->servicegroups_reply_count; i++) { - talloc_steal(memctx, state->servicegroups_reply_list[i]); - } return EOK; } @@ -2558,9 +2301,7 @@ static void hbac_get_service_data_done(struct tevent_req *req) ret = hbac_get_service_data_recv(req, hbac_ctx, &hbac_ctx->hbac_services_count, - &hbac_ctx->hbac_services_list, - &hbac_ctx->hbac_servicegroups_count, - &hbac_ctx->hbac_servicegroups_list); + &hbac_ctx->hbac_services_list); talloc_zfree(req); if (ret != EOK) { goto fail; diff --git a/src/providers/ipa/ipa_access.h b/src/providers/ipa/ipa_access.h index e3e0c4f..514afc0 100644 --- a/src/providers/ipa/ipa_access.h +++ b/src/providers/ipa/ipa_access.h @@ -62,8 +62,6 @@ struct hbac_ctx { char *ldap_basedn; struct sysdb_attrs **hbac_services_list; size_t hbac_services_count; - struct sysdb_attrs **hbac_servicegroups_list; - size_t hbac_servicegroups_count; }; void ipa_access_handler(struct be_req *be_req); -- 1.7.0.1