summaryrefslogtreecommitdiffstats
path: root/src/tests
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2012-12-03 23:03:35 +0100
committerJakub Hrozek <jhrozek@redhat.com>2012-12-06 11:54:46 +0100
commit7810b6553c14636d872c3c8df71070f2d4092c10 (patch)
tree744b7934ac4b98010e279adad9c9c94a108aacdd /src/tests
parent72e94b34a63ec013c4f2f55a2194a305ecb72bbf (diff)
downloadsssd-7810b6553c14636d872c3c8df71070f2d4092c10.tar.gz
sssd-7810b6553c14636d872c3c8df71070f2d4092c10.tar.xz
sssd-7810b6553c14636d872c3c8df71070f2d4092c10.zip
MEMBEROF: Keep inherited ghost users around on modify operation1.9.2-34
https://fedorahosted.org/sssd/ticket/1652 It is possible to simply reset the list of ghost users to a different one during a modify operation. It is also actually how we update entries that are expired in the SSSD cache. In this case, we must be careful and retain the ghost users that are not native to the group we are processing but are rather inherited from child groups. The intention of the replace operation after all is to set the list of direct members of that group, not direct and indirect.
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/sysdb-tests.c248
1 files changed, 248 insertions, 0 deletions
diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c
index 27095e1a2..db45b7a61 100644
--- a/src/tests/sysdb-tests.c
+++ b/src/tests/sysdb-tests.c
@@ -1996,6 +1996,46 @@ START_TEST (test_sysdb_memberof_store_group_with_ghosts)
}
END_TEST
+START_TEST (test_sysdb_memberof_store_group_with_double_ghosts)
+{
+ struct sysdb_test_ctx *test_ctx;
+ struct test_data *data;
+ int ret;
+
+ /* Setup */
+ ret = setup_sysdb_tests(&test_ctx);
+ if (ret != EOK) {
+ fail("Could not set up the test");
+ return;
+ }
+
+ data = talloc_zero(test_ctx, struct test_data);
+ data->ctx = test_ctx;
+ data->ev = test_ctx->ev;
+ data->gid = _i;
+ data->groupname = talloc_asprintf(data, "testgroup%d", data->gid);
+
+ if (_i == 0) {
+ data->attrlist = NULL;
+ } else {
+ data->attrlist = talloc_array(data, const char *, 2);
+ fail_unless(data->attrlist != NULL, "talloc_array failed.");
+ data->attrlist[0] = talloc_asprintf(data, "testgroup%d", data->gid - 1);
+ data->attrlist[1] = NULL;
+ }
+
+ data->memberlist = talloc_array(data, char *, 3);
+ fail_unless(data->memberlist != NULL, "talloc_array failed.");
+ data->memberlist[0] = talloc_asprintf(data, "testusera%d", data->gid);
+ data->memberlist[1] = talloc_asprintf(data, "testuserb%d", data->gid);
+ data->memberlist[2] = NULL;
+
+ ret = test_memberof_store_group_with_ghosts(data);
+
+ fail_if(ret != EOK, "Could not store POSIX group #%d", data->gid);
+ talloc_free(test_ctx);
+}
+END_TEST
START_TEST (test_sysdb_memberof_mod_add)
{
@@ -2180,6 +2220,164 @@ START_TEST (test_sysdb_memberof_mod_replace)
}
END_TEST
+START_TEST (test_sysdb_memberof_mod_replace_keep)
+{
+ struct sysdb_test_ctx *test_ctx;
+ struct test_data *data;
+ char *ghostname_rep;
+ char *ghostname_del;
+ char *ghostname_check;
+ int ret;
+ struct ldb_message_element *el;
+ struct ldb_val gv, *test_gv;
+ gid_t itergid;
+ uid_t iteruid;
+
+ /* Setup */
+ ret = setup_sysdb_tests(&test_ctx);
+ if (ret != EOK) {
+ fail("Could not set up the test");
+ return;
+ }
+
+ data = talloc_zero(test_ctx, struct test_data);
+ data->ctx = test_ctx;
+ data->ev = test_ctx->ev;
+ data->gid = MBO_GROUP_BASE + 10 - _i;
+ data->groupname = talloc_asprintf(data, "testgroup%d", data->gid);
+
+ data->attrs = sysdb_new_attrs(data);
+ if (ret != EOK) {
+ fail("Could not create the changeset");
+ return;
+ }
+
+ /* The test replaces the attributes (testusera$gid, testuserb$gid) with
+ * just testusera$gid. The result should be not only testusera, but also
+ * all ghost users inherited from child groups
+ */
+ ghostname_rep = talloc_asprintf(data, "testusera%d", data->gid);
+ fail_unless(ghostname_rep != NULL, "Out of memory\n");
+ ret = sysdb_attrs_steal_string(data->attrs, SYSDB_GHOST, ghostname_rep);
+ fail_unless(ret == EOK, "Cannot add attr\n");
+
+ ghostname_del = talloc_asprintf(data, "testuserb%d", data->gid);
+ fail_unless(ghostname_del != NULL, "Out of memory\n");
+
+ data->attrlist = talloc_array(data, const char *, 2);
+ fail_unless(data->attrlist != NULL, "talloc_array failed.");
+ data->attrlist[0] = SYSDB_GHOST;
+ data->attrlist[1] = NULL;
+
+ /* Before the replace, all groups with gid >= _i have both testuser a
+ * and testuserb as a member
+ */
+ for (itergid = data->gid ; itergid < MBO_GROUP_BASE + NUM_GHOSTS; itergid++) {
+ ret = sysdb_search_group_by_gid(data, test_ctx->sysdb,
+ itergid,
+ data->attrlist, &data->msg);
+ fail_if(ret != EOK, "Cannot retrieve group %llu\n",
+ (unsigned long long) data->gid);
+
+ gv.data = (uint8_t *) ghostname_rep;
+ gv.length = strlen(ghostname_rep);
+
+ el = ldb_msg_find_element(data->msg, SYSDB_GHOST);
+ fail_if(el == NULL, "Cannot find ghost element\n");
+
+ test_gv = ldb_msg_find_val(el, &gv);
+ fail_if(test_gv == NULL, "Cannot find ghost user %s\n", ghostname_rep);
+
+ gv.data = (uint8_t *) ghostname_del;
+ gv.length = strlen(ghostname_rep);
+
+ test_gv = ldb_msg_find_val(el, &gv);
+ fail_if(test_gv == NULL, "Cannot find ghost user %s\n", ghostname_del);
+
+ /* inherited users must be there */
+ for (iteruid = MBO_GROUP_BASE ; iteruid < itergid ; iteruid++) {
+ ghostname_check = talloc_asprintf(data, "testusera%d", iteruid);
+ gv.data = (uint8_t *) ghostname_check;
+ gv.length = strlen(ghostname_check);
+
+ test_gv = ldb_msg_find_val(el, &gv);
+ fail_if(test_gv == NULL, "Cannot find inherited ghost user %s\n",
+ ghostname_check);
+
+ if (iteruid < data->gid) {
+ /* Also check the B user if it hasn't been deleted yet */
+ ghostname_check = talloc_asprintf(data, "testuserb%d", iteruid);
+ gv.data = (uint8_t *) ghostname_check;
+ gv.length = strlen(ghostname_check);
+
+ test_gv = ldb_msg_find_val(el, &gv);
+ fail_if(test_gv == NULL, "Cannot find inherited ghost user %s\n",
+ ghostname_check);
+ }
+ talloc_zfree(ghostname_check);
+ }
+ }
+
+ /* Perform the replace operation */
+ ret = sysdb_set_group_attr(test_ctx->sysdb, data->groupname,
+ data->attrs, SYSDB_MOD_REP);
+ fail_unless(ret == EOK, "Cannot set group attrs\n");
+
+ /* After the replace, testusera should still be there, but we also need
+ * to keep ghost users inherited from other groups
+ */
+ for (itergid = data->gid ; itergid < MBO_GROUP_BASE + NUM_GHOSTS; itergid++) {
+ ret = sysdb_search_group_by_gid(data, test_ctx->sysdb,
+ itergid,
+ data->attrlist, &data->msg);
+ fail_if(ret != EOK, "Cannot retrieve group %llu\n",
+ (unsigned long long) data->gid);
+
+ gv.data = (uint8_t *) ghostname_rep;
+ gv.length = strlen(ghostname_rep);
+
+ /* testusera must still be there */
+ el = ldb_msg_find_element(data->msg, SYSDB_GHOST);
+ fail_if(el == NULL, "Cannot find ghost element\n");
+
+ test_gv = ldb_msg_find_val(el, &gv);
+ fail_if(test_gv == NULL, "Cannot find ghost user %s\n", ghostname_rep);
+
+ /* testuserb must be gone */
+ gv.data = (uint8_t *) ghostname_del;
+ gv.length = strlen(ghostname_rep);
+
+ test_gv = ldb_msg_find_val(el, &gv);
+ fail_unless(test_gv == NULL, "Cannot find ghost user %s\n", ghostname_del);
+
+ /* inherited users must still be there */
+ for (iteruid = MBO_GROUP_BASE ; iteruid < itergid ; iteruid++) {
+ ghostname_check = talloc_asprintf(data, "testusera%d", iteruid);
+ gv.data = (uint8_t *) ghostname_check;
+ gv.length = strlen(ghostname_check);
+
+ test_gv = ldb_msg_find_val(el, &gv);
+ fail_if(test_gv == NULL, "Cannot find inherited ghost user %s\n",
+ ghostname_check);
+
+ if (iteruid < data->gid) {
+ /* Also check the B user if it hasn't been deleted yet */
+ ghostname_check = talloc_asprintf(data, "testuserb%d", iteruid);
+ gv.data = (uint8_t *) ghostname_check;
+ gv.length = strlen(ghostname_check);
+
+ test_gv = ldb_msg_find_val(el, &gv);
+ fail_if(test_gv == NULL, "Cannot find inherited ghost user %s\n",
+ ghostname_check);
+ }
+ talloc_zfree(ghostname_check);
+ }
+ }
+
+ talloc_free(test_ctx);
+}
+END_TEST
+
START_TEST (test_sysdb_memberof_close_loop)
{
struct sysdb_test_ctx *test_ctx;
@@ -2489,6 +2687,45 @@ START_TEST (test_sysdb_memberof_check_nested_ghosts)
}
END_TEST
+START_TEST (test_sysdb_memberof_check_nested_double_ghosts)
+{
+ struct sysdb_test_ctx *test_ctx;
+ struct test_data *data;
+ int ret;
+
+ /* Setup */
+ ret = setup_sysdb_tests(&test_ctx);
+ if (ret != EOK) {
+ fail("Could not set up the test");
+ return;
+ }
+
+ data = talloc_zero(test_ctx, struct test_data);
+ data->ctx = test_ctx;
+ data->ev = test_ctx->ev;
+ data->gid = _i;
+
+ data->attrlist = talloc_array(data, const char *, 2);
+ fail_unless(data->attrlist != NULL, "talloc_array failed.");
+ data->attrlist[0] = SYSDB_GHOST;
+ data->attrlist[1] = NULL;
+
+ ret = sysdb_search_group_by_gid(data, test_ctx->sysdb,
+ data->gid,
+ data->attrlist, &data->msg);
+ fail_if(ret != EOK, "Cannot retrieve group %llu\n", (unsigned long long) data->gid);
+
+ fail_unless(strcmp(data->msg->elements[0].name, SYSDB_GHOST) == 0,
+ "Wrong attribute name");
+ fail_unless(data->msg->elements[0].num_values == (_i - MBO_GROUP_BASE + 1)*2,
+ "Wrong number of attribute values, expected [%d] got [%d]",
+ (_i - MBO_GROUP_BASE + 1)*2,
+ data->msg->elements[0].num_values);
+
+ talloc_free(test_ctx);
+}
+END_TEST
+
START_TEST (test_sysdb_memberof_remove_child_group_and_check_ghost)
{
struct sysdb_test_ctx *test_ctx;
@@ -4942,6 +5179,17 @@ Suite *create_sysdb_suite(void)
tcase_add_loop_test(tc_memberof, test_sysdb_remove_local_group_by_gid,
MBO_GROUP_BASE , MBO_GROUP_BASE + 10);
+ /* ghost users - replace but retain inherited */
+ tcase_add_loop_test(tc_memberof, test_sysdb_memberof_store_group_with_double_ghosts,
+ MBO_GROUP_BASE , MBO_GROUP_BASE + 10);
+ tcase_add_loop_test(tc_memberof, test_sysdb_memberof_check_nested_double_ghosts,
+ MBO_GROUP_BASE , MBO_GROUP_BASE + 10);
+ /* This loop counts backwards so the indexing is a little odd */
+ tcase_add_loop_test(tc_memberof, test_sysdb_memberof_mod_replace_keep,
+ 1 , 11);
+ tcase_add_loop_test(tc_memberof, test_sysdb_remove_local_group_by_gid,
+ MBO_GROUP_BASE , MBO_GROUP_BASE + 10);
+
suite_add_tcase(s, tc_memberof);
TCase *tc_subdomain = tcase_create("SYSDB sub-domain Tests");