sss_groupshow.c revision e2ac9be4f293b96f3c8992f1171e44bc1da5cfca
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer/*
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer SSSD
6b26240dca29e026900a83d51c75ca230a072a16Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer sss_groupshow
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer Copyright (C) Jakub Hrozek <jhrozek@redhat.com> 2010
2eeec5240b424984e3ee26296da1eeab6c6d739eChristian Maeder
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer This program is free software; you can redistribute it and/or modify
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer it under the terms of the GNU General Public License as published by
7520452bb30b5abbd471f82352fc4c1c937e02c5Till Mossakowski the Free Software Foundation; either version 3 of the License, or
7520452bb30b5abbd471f82352fc4c1c937e02c5Till Mossakowski (at your option) any later version.
7520452bb30b5abbd471f82352fc4c1c937e02c5Till Mossakowski
7520452bb30b5abbd471f82352fc4c1c937e02c5Till Mossakowski This program is distributed in the hope that it will be useful,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer but WITHOUT ANY WARRANTY; without even the implied warranty of
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer GNU General Public License for more details.
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer You should have received a copy of the GNU General Public License
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer along with this program. If not, see <http://www.gnu.org/licenses/>.
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer*/
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#include <stdio.h>
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#include <stdlib.h>
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#include <talloc.h>
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#include <popt.h>
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#include "db/sysdb.h"
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#include "util/util.h"
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#include "tools/tools_util.h"
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#include "tools/sss_sync_ops.h"
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#define PADDING_SPACES 4
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#define GROUP_SHOW_ATTRS { SYSDB_MEMBEROF, SYSDB_GIDNUM, \
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer SYSDB_MEMBER, SYSDB_GHOST, SYSDB_NAME, \
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer NULL }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer#define GROUP_SHOW_MPG_ATTRS { SYSDB_MEMBEROF, SYSDB_UIDNUM, \
38122cbf09ad3dcc31a826cc4093f630515a5cfcChristian Maeder SYSDB_NAME, NULL }
521045d36343cd17dd217a81d4b9422ad6ab6a07Christian Maeder
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyerstruct group_info {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char *name;
0193c86704431f83731015a77cb613d67ae4e3c2Thiemo Wiedemeyer gid_t gid;
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer bool mpg;
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer const char **user_members;
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer const char **memberofs;
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer struct group_info **group_members;
7ae38566aaf40710cd83ffa3ba25655c4ad22741Thiemo Wiedemeyer};
1a389234e68da7c3d087b038307ed8c66fc6dc32Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer/*==================Helper routines to process results================= */
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyerconst char *rdn_as_string(TALLOC_CTX *mem_ctx,
38122cbf09ad3dcc31a826cc4093f630515a5cfcChristian Maeder struct ldb_dn *dn)
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer{
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const struct ldb_val *val;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer val = ldb_dn_get_rdn_val(dn);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (val == NULL) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer return NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer return ldb_dn_escape_value(mem_ctx, *val);;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer}
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
1842453990fed8a1bd7a5ac792d7982c1d2bfcd5Christian Maederstatic int parse_memberofs(struct ldb_context *ldb,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct ldb_message_element *el,
b6a59f004903ac7bc96323ee3ef09c01fd221157Christian Maeder struct group_info *gi)
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer{
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer int i;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct ldb_dn *dn = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer gi->memberofs = talloc_array(gi, const char *, el->num_values+1);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (gi->memberofs == NULL) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer return ENOMEM;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
521045d36343cd17dd217a81d4b9422ad6ab6a07Christian Maeder
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer for (i = 0; i< el->num_values; ++i) {
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer dn = ldb_dn_from_ldb_val(gi, ldb, &(el->values[i]));
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer gi->memberofs[i] = talloc_strdup(gi, rdn_as_string(gi, dn));
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer talloc_zfree(dn);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (gi->memberofs[i] == NULL) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer return ENOMEM;
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer DEBUG(6, ("memberof value: %s\n", gi->memberofs[i]));
7ae38566aaf40710cd83ffa3ba25655c4ad22741Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer gi->memberofs[el->num_values] = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer return EOK;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer}
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
d5f9a0b274192a496eb8d2fb8ce81c33ac2f1717Thiemo Wiedemeyerstatic int parse_members(TALLOC_CTX *mem_ctx,
93eeaffa1087fc6eae3f19b8ca5affb7802799fdThiemo Wiedemeyer struct ldb_context *ldb,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct sss_domain_info *domain,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct ldb_message_element *el,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const char *parent_name,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const char ***user_members,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const char ***group_members,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer int *num_group_members)
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian Maeder{
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct ldb_dn *user_basedn = NULL, *group_basedn = NULL;
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer struct ldb_dn *parent_dn = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct ldb_dn *dn = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const char **um = NULL, **gm = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer unsigned int um_index = 0, gm_index = 0;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer TALLOC_CTX *tmp_ctx = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer int ret;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer int i;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer tmp_ctx = talloc_new(mem_ctx);
93eeaffa1087fc6eae3f19b8ca5affb7802799fdThiemo Wiedemeyer if (!tmp_ctx) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ret = ENOMEM;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer goto fail;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer user_basedn = ldb_dn_new_fmt(tmp_ctx, ldb,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer SYSDB_TMPL_USER_BASE,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer domain->name);
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer group_basedn = ldb_dn_new_fmt(tmp_ctx, ldb,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer SYSDB_TMPL_GROUP_BASE,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer domain->name);
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer if (!user_basedn || !group_basedn) {
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer ret = ENOMEM;
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer goto fail;
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer }
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer um = talloc_array(mem_ctx, const char *, el->num_values+1);
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer gm = talloc_array(mem_ctx, const char *, el->num_values+1);
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer if (!um || !gm) {
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer ret = ENOMEM;
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer goto fail;
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer for (i = 0; i< el->num_values; ++i) {
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer dn = ldb_dn_from_ldb_val(tmp_ctx, ldb, &(el->values[i]));
331603b37dec12e37e2e1df9634ef0f2c5c73ddfThiemo Wiedemeyer
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder /* user member or group member? */
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder parent_dn = ldb_dn_get_parent(tmp_ctx, dn);
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder if (ldb_dn_compare_base(parent_dn, user_basedn) == 0) {
a96ea65117eaf61ed34248bdf76e4e2144288c9dThiemo Wiedemeyer um[um_index] = rdn_as_string(mem_ctx, dn);
a96ea65117eaf61ed34248bdf76e4e2144288c9dThiemo Wiedemeyer if (um[um_index] == NULL) {
a96ea65117eaf61ed34248bdf76e4e2144288c9dThiemo Wiedemeyer ret = ENOMEM;
a96ea65117eaf61ed34248bdf76e4e2144288c9dThiemo Wiedemeyer goto fail;
a96ea65117eaf61ed34248bdf76e4e2144288c9dThiemo Wiedemeyer }
a96ea65117eaf61ed34248bdf76e4e2144288c9dThiemo Wiedemeyer DEBUG(6, ("User member %s\n", um[um_index]));
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer um_index++;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer } else if (ldb_dn_compare_base(parent_dn, group_basedn) == 0) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer gm[gm_index] = rdn_as_string(mem_ctx, dn);
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer if (gm[gm_index] == NULL) {
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer ret = ENOMEM;
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer goto fail;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer }
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer if (parent_name && strcmp(gm[gm_index], parent_name) == 0) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer DEBUG(6, ("Skipping circular nesting for group %s\n",
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer gm[gm_index]));
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer continue;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer }
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder DEBUG(6, ("Group member %s\n", gm[gm_index]));
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder gm_index++;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer } else {
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer DEBUG(2, ("Group member not a user nor group: %s\n",
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer ldb_dn_get_linearized(dn)));
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer ret = EIO;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer goto fail;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer }
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer talloc_zfree(dn);
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer talloc_zfree(parent_dn);
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer }
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer um[um_index] = NULL;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer gm[gm_index] = NULL;
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer
a96ea65117eaf61ed34248bdf76e4e2144288c9dThiemo Wiedemeyer if (um_index > 0) {
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer um = talloc_realloc(mem_ctx, um, const char *, um_index+1);
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer if (!um) {
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder ret = ENOMEM;
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder goto fail;
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder }
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder } else {
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder talloc_zfree(um);
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder }
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder if (gm_index > 0) {
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder gm = talloc_realloc(mem_ctx, gm, const char *, gm_index+1);
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder if (!gm) {
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder ret = ENOMEM;
bbd9ff47b93f02c2cb2f101b074da02a2f683fe3Christian Maeder goto fail;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer } else {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer talloc_zfree(gm);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer *user_members = um;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (group_members) *group_members = gm;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (num_group_members) *num_group_members = gm_index;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer talloc_zfree(tmp_ctx);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer return EOK;
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyerfail:
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer talloc_zfree(um);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer talloc_zfree(gm);
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer talloc_zfree(tmp_ctx);
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer return ret;
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer}
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyerstatic int process_group(TALLOC_CTX *mem_ctx,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct ldb_context *ldb,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct ldb_message *msg,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct sss_domain_info *domain,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const char *parent_name,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct group_info **info,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const char ***group_members,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer int *num_group_members)
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer{
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer struct ldb_message_element *el;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer int ret, i, j;
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer int count = 0;
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer struct group_info *gi = NULL;
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer const char **user_members;
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer DEBUG(6, ("Found entry %s\n", ldb_dn_get_linearized(msg->dn)));
1842453990fed8a1bd7a5ac792d7982c1d2bfcd5Christian Maeder
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer gi = talloc_zero(mem_ctx, struct group_info);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (!gi) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = ENOMEM;
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer goto done;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer /* mandatory data - name and gid */
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer gi->name = talloc_strdup(gi,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ldb_msg_find_attr_as_string(msg,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer SYSDB_NAME,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer NULL));
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer gi->gid = ldb_msg_find_attr_as_uint64(msg,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer SYSDB_GIDNUM, 0);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (gi->gid == 0 || gi->name == NULL) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer DEBUG(3, ("No name or no GID?\n"));
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ret = EIO;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer goto done;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer /* list members */
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer el = ldb_msg_find_element(msg, SYSDB_MEMBER);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (el) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ret = parse_members(gi, ldb, domain, el,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer parent_name,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer &gi->user_members,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer group_members, num_group_members);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (ret != EOK) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer goto done;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (gi->user_members == NULL) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer count = 0;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer } else {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer for (count = 0; gi->user_members[count]; count++) ;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer el = ldb_msg_find_element(msg, SYSDB_GHOST);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (el) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ret = parse_members(gi, ldb, domain, el,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer parent_name,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer &user_members,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer NULL, NULL);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (ret != EOK) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer goto done;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (user_members != NULL) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer i = count;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer for (count = 0; user_members[count]; count++) ;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer gi->user_members = talloc_realloc(gi, gi->user_members,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const char *,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer i + count + 1);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (gi->user_members == NULL) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ret = ENOMEM;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer goto done;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer for (j = 0; j < count; j++, i++) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer gi->user_members[i] = talloc_steal(gi->user_members,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer user_members[j]);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer gi->user_members[i] = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer talloc_zfree(user_members);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer /* list memberofs */
6c59ae2c44a1fe22ef1712a57afe129e9dbd3368Thiemo Wiedemeyer el = ldb_msg_find_element(msg, SYSDB_MEMBEROF);
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer if (el) {
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer ret = parse_memberofs(ldb, el, gi);
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer if (ret != EOK) {
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer goto done;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer }
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer *info = gi;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer return EOK;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyerdone:
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer talloc_zfree(gi);
aa07f9c4585a94514dcff2979d853d6e04c12fb9Thiemo Wiedemeyer return ret;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer}
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
aa07f9c4585a94514dcff2979d853d6e04c12fb9Thiemo Wiedemeyer/*========Find info about a group and recursively about subgroups====== */
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyerint group_show_recurse(TALLOC_CTX *mem_ctx,
aa07f9c4585a94514dcff2979d853d6e04c12fb9Thiemo Wiedemeyer struct sysdb_ctx *sysdb,
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer struct sss_domain_info *domain,
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer struct group_info *root,
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer struct group_info *parent,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char **group_members,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const int nmembers,
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer struct group_info ***up_members);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyerstatic int group_show_trim_memberof(TALLOC_CTX *mem_ctx,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct sysdb_ctx *sysdb,
aa07f9c4585a94514dcff2979d853d6e04c12fb9Thiemo Wiedemeyer struct sss_domain_info *domain,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char *name,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char **memberofs,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char ***_direct);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyerint group_show(TALLOC_CTX *mem_ctx,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct sysdb_ctx *sysdb,
76ecd8e01387d1edc9197f3464073264fa2c789aThiemo Wiedemeyer struct sss_domain_info *domain,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer bool recursive,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char *name,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct group_info **res)
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer{
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer struct group_info *root;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer static const char *attrs[] = GROUP_SHOW_ATTRS;
545d0cd78159cade346b579d06052638b19b0f72Thiemo Wiedemeyer struct ldb_message *msg = NULL;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char **group_members = NULL;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer int nmembers = 0;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer int ret;
545d0cd78159cade346b579d06052638b19b0f72Thiemo Wiedemeyer int i;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer /* First, search for the root group */
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = sysdb_search_group_by_name(mem_ctx, domain, name, attrs, &msg);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (ret) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer DEBUG(2, ("Search failed: %s (%d)\n", strerror(ret), ret));
293b25835a956ece11d20b3dc022df4e1226b16cThiemo Wiedemeyer goto done;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = process_group(mem_ctx, sysdb_ctx_get_ldb(sysdb),
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer msg, domain, NULL, &root,
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer &group_members, &nmembers);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (ret != EOK) {
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer DEBUG(2, ("Group processing failed: %s (%d)\n",
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer strerror(ret), ret));
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer goto done;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer if (!recursive) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (group_members) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer root->group_members = talloc_array(root,
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer struct group_info *,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer nmembers+1);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (!root->group_members) {
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer ret = ENOMEM;
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer goto done;
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer }
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer for (i = 0; i < nmembers; i++) {
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer root->group_members[i] = talloc_zero(root, struct group_info);
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer if (!root->group_members[i]) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = ENOMEM;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer goto done;
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer root->group_members[i]->name = talloc_strdup(root,
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer group_members[i]);
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer if (!root->group_members[i]->name) {
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer ret = ENOMEM;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer goto done;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer root->group_members[nmembers] = NULL;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (root->memberofs == NULL) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = EOK;
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer goto done;
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer }
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer /* if not recursive, only show the direct parent */
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = group_show_trim_memberof(mem_ctx, sysdb, domain, root->name,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer root->memberofs, &root->memberofs);
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer goto done;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (group_members == NULL) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = EOK;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer goto done;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = group_show_recurse(root, sysdb, domain, root, root,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer group_members, nmembers,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer &root->group_members);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (ret) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer DEBUG(2, ("Recursive search failed: %s (%d)\n", strerror(ret), ret));
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer goto done;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer ret = EOK;
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyerdone:
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer if (ret == EOK) {
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer *res = root;
84ba39232a012abf2085c8a421ebce6abc52d56eThiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer return ret;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer}
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
545d0cd78159cade346b579d06052638b19b0f72Thiemo Wiedemeyer/*=========Nonrecursive search should only show direct parent========== */
1a389234e68da7c3d087b038307ed8c66fc6dc32Thiemo Wiedemeyer
1a389234e68da7c3d087b038307ed8c66fc6dc32Thiemo Wiedemeyerstatic int group_show_trim_memberof(TALLOC_CTX *mem_ctx,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct sysdb_ctx *sysdb,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct sss_domain_info *domain,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char *name,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char **memberofs,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char ***_direct)
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer{
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct ldb_dn *dn;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer char *filter;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct ldb_message **msgs;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer size_t count;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char **direct = NULL;
1a389234e68da7c3d087b038307ed8c66fc6dc32Thiemo Wiedemeyer int ndirect = 0;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer int ret;
1a389234e68da7c3d087b038307ed8c66fc6dc32Thiemo Wiedemeyer int i;
1a389234e68da7c3d087b038307ed8c66fc6dc32Thiemo Wiedemeyer
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer dn = sysdb_group_dn(mem_ctx, domain, name);
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer if (!dn) {
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer return ENOMEM;
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer }
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer for (i = 0; memberofs[i]; i++) {
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer filter = talloc_asprintf(mem_ctx, "(&(%s=%s)(%s=%s))",
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer SYSDB_NAME, memberofs[i],
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer SYSDB_MEMBER, ldb_dn_get_linearized(dn));
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer if (!filter) {
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer return ENOMEM;
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer }
37e30366abd83c00a5d5447b45694627fd783de8Cui Jian
da955132262baab309a50fdffe228c9efe68251dCui Jian ret = sysdb_search_groups(mem_ctx, domain,
37e30366abd83c00a5d5447b45694627fd783de8Cui Jian filter, NULL, &count, &msgs);
37e30366abd83c00a5d5447b45694627fd783de8Cui Jian /* ENOENT is OK, the group is just not a direct parent */
37e30366abd83c00a5d5447b45694627fd783de8Cui Jian if (ret != EOK && ret != ENOENT) {
37e30366abd83c00a5d5447b45694627fd783de8Cui Jian return ret;
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer if (count > 0) {
1842453990fed8a1bd7a5ac792d7982c1d2bfcd5Christian Maeder name = ldb_msg_find_attr_as_string(msgs[0],
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer SYSDB_NAME, NULL);
1842453990fed8a1bd7a5ac792d7982c1d2bfcd5Christian Maeder if (!name) {
40c18e3f63c23085e5bb36ea35efe141a87df8e4Klaus Luettich DEBUG(2, ("Entry %s has no Name Attribute ?!?\n",
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ldb_dn_get_linearized(msgs[0]->dn)));
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer return EFAULT;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
8836fa284a241af325aa6f41234b5130b26ec4f9Thiemo Wiedemeyer
40c18e3f63c23085e5bb36ea35efe141a87df8e4Klaus Luettich direct = talloc_realloc(mem_ctx, direct,
fe1f344573c570949fa4f255c68bb9026c609832Thiemo Wiedemeyer const char *, ndirect + 2);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (!direct) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer return ENOMEM;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
1842453990fed8a1bd7a5ac792d7982c1d2bfcd5Christian Maeder
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer direct[ndirect] = talloc_strdup(direct, name);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (!direct[ndirect]) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer return ENOMEM;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer direct[ndirect + 1] = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ndirect++;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
109b67ffce2bad83667e2f4a319d2d7f380f91afThiemo Wiedemeyer *_direct = direct;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer return EOK;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer}
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer/*==================Recursive search for nested groups================= */
4d3b50fc78a0c99ff2914fb23f3c7fba6e38d790Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyerint group_show_recurse(TALLOC_CTX *mem_ctx,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct sysdb_ctx *sysdb,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct sss_domain_info *domain,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct group_info *root,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct group_info *parent,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const char **group_members,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const int nmembers,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct group_info ***up_members)
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer{
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct group_info **groups;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer static const char *attrs[] = GROUP_SHOW_ATTRS;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct ldb_message *msg;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer const char **new_group_members = NULL;
5107ba7da675778f2fded68493512b60eff8a455Christian Maeder int new_nmembers = 0;
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer int ret;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer int i;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
5107ba7da675778f2fded68493512b60eff8a455Christian Maeder groups = talloc_zero_array(root,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct group_info *,
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer nmembers+1); /* trailing NULL */
4d3b50fc78a0c99ff2914fb23f3c7fba6e38d790Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (!group_members || !group_members[0]) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer return ENOENT;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer for (i = 0; i < nmembers; i++) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer /* Skip circular groups */
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (strcmp(group_members[i], parent->name) == 0) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer continue;
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer }
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer ret = sysdb_search_group_by_name(mem_ctx, domain, group_members[i],
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer attrs, &msg);
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer if (ret) {
ddc662fdf0207eae2034d7b68ae5e2225c575207Thiemo Wiedemeyer DEBUG(2, ("Search failed: %s (%d)\n", strerror(ret), ret));
aa07f9c4585a94514dcff2979d853d6e04c12fb9Thiemo Wiedemeyer return EIO;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer ret = process_group(root, sysdb_ctx_get_ldb(sysdb),
be688cc3aa83344b0141321d2d20bf6a8d5c5686Christian Maeder msg, domain, parent->name,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer &groups[i], &new_group_members, &new_nmembers);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (ret != EOK) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer DEBUG(2, ("Group processing failed: %s (%d)\n",
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer strerror(ret), ret));
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer return ret;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer }
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer /* descend to another level */
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer if (new_nmembers > 0) {
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer ret = group_show_recurse(mem_ctx, sysdb, domain,
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer root, groups[i],
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer new_group_members, new_nmembers,
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer &parent->group_members);
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer if (ret != EOK) {
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer DEBUG(2, ("Recursive search failed: %s (%d)\n",
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer strerror(ret), ret));
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer return ret;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer }
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer talloc_zfree(new_group_members);
b6a59f004903ac7bc96323ee3ef09c01fd221157Christian Maeder }
b6a59f004903ac7bc96323ee3ef09c01fd221157Christian Maeder }
b6a59f004903ac7bc96323ee3ef09c01fd221157Christian Maeder
308f8e668578eadb8b2eb2af4abd0d63c656505aChristian Maeder *up_members = groups;
308f8e668578eadb8b2eb2af4abd0d63c656505aChristian Maeder return EOK;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer}
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
a44f1558006c43dda309b3d1e5a1214443f07048Thiemo Wiedemeyer/*==================Get info about MPG================================= */
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyerstatic int group_show_mpg(TALLOC_CTX *mem_ctx,
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer struct sysdb_ctx *sysdb,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer struct sss_domain_info *domain,
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer const char *name,
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer struct group_info **res)
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer{
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer const char *attrs[] = GROUP_SHOW_MPG_ATTRS;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer struct ldb_message *msg;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer struct group_info *info;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer int ret;
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer
c40b7badd217089d8a256dabdf8f7d4e219ca215Thiemo Wiedemeyer info = talloc_zero(mem_ctx, struct group_info);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (!info) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = ENOMEM;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer goto fail;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = sysdb_search_user_by_name(info, domain, name, attrs, &msg);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (ret) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer DEBUG(2, ("Search failed: %s (%d)\n", strerror(ret), ret));
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer goto fail;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer info->name = talloc_strdup(info,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ldb_msg_find_attr_as_string(msg,
38122cbf09ad3dcc31a826cc4093f630515a5cfcChristian Maeder SYSDB_NAME, NULL));
38122cbf09ad3dcc31a826cc4093f630515a5cfcChristian Maeder info->gid = ldb_msg_find_attr_as_uint64(msg, SYSDB_UIDNUM, 0);
38122cbf09ad3dcc31a826cc4093f630515a5cfcChristian Maeder if (info->gid == 0 || info->name == NULL) {
38122cbf09ad3dcc31a826cc4093f630515a5cfcChristian Maeder DEBUG(3, ("No name or no GID?\n"));
38122cbf09ad3dcc31a826cc4093f630515a5cfcChristian Maeder ret = EIO;
521045d36343cd17dd217a81d4b9422ad6ab6a07Christian Maeder goto fail;
521045d36343cd17dd217a81d4b9422ad6ab6a07Christian Maeder }
521045d36343cd17dd217a81d4b9422ad6ab6a07Christian Maeder info->mpg = true;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer *res = info;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer return EOK;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyerfail:
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer talloc_zfree(info);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer return ret;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer}
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer/*==================The main program=================================== */
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyerstatic void print_group_info(struct group_info *g, int level)
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer{
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer int i;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer char padding[512];
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer char fmt[8];
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer snprintf(fmt, 8, "%%%ds", level*PADDING_SPACES);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer snprintf(padding, 512, fmt, "");
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer printf(_("%1$s%2$sGroup: %3$s\n"), padding,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer g->mpg ? _("Magic Private ") : "",
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer g->name);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer printf(_("%1$sGID number: %2$d\n"), padding, g->gid);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer printf(_("%1$sMember users: "), padding);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (g->user_members) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer for (i=0; g->user_members[i]; ++i) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer printf("%s%s", i>0 ? "," : "",
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer g->user_members[i]);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer printf(_("\n%1$sIs a member of: "), padding);
76d96735a2a826b3028a0bedbcc97fb5137170fdChristian Maeder if (g->memberofs) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer for (i=0; g->memberofs[i]; ++i) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer printf("%s%s", i>0 ? "," : "",
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer g->memberofs[i]);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer printf(_("\n%1$sMember groups: "), padding);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer}
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyerstatic void print_recursive(struct group_info **group_members, int level)
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer{
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer int i;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (group_members == NULL) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer return;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer level++;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer for (i=0; group_members[i]; ++i) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer printf("\n");
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer print_group_info(group_members[i], level);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer printf("\n");
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer print_recursive(group_members[i]->group_members, level);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer}
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyerint main(int argc, const char **argv)
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer{
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer int ret = EXIT_SUCCESS;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer int pc_debug = SSSDBG_DEFAULT;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer bool pc_recursive = false;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer const char *pc_groupname = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct tools_ctx *tctx = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct group_info *root = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer int i;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer poptContext pc = NULL;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer struct poptOption long_options[] = {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer POPT_AUTOHELP
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer { "debug", '\0', POPT_ARG_INT | POPT_ARGFLAG_DOC_HIDDEN, &pc_debug,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer 0, _("The debug level to run with"), NULL },
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer { "recursive", 'R', POPT_ARG_NONE, NULL, 'r',
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer _("Print indirect group members recursively"), NULL },
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer POPT_TABLEEND
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer };
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer debug_prg_name = argv[0];
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ret = set_locale();
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder if (ret != EOK) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret)));
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ERROR("Error setting the locale\n");
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ret = EXIT_FAILURE;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer goto fini;
12368e292c1abf7eaf975f20ee30ef7820ac5dd5Christian Maeder }
12368e292c1abf7eaf975f20ee30ef7820ac5dd5Christian Maeder
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer /* parse ops_ctx */
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer pc = poptGetContext(NULL, argc, argv, long_options, 0);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer poptSetOtherOptionHelp(pc, "GROUPNAME");
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer while ((ret = poptGetNextOpt(pc)) > 0) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer switch (ret) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer case 'r':
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer pc_recursive = true;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer break;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer DEBUG_INIT(pc_debug);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (ret != -1) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer BAD_POPT_PARAMS(pc, poptStrerror(ret), ret, fini);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer pc_groupname = poptGetArg(pc);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (pc_groupname == NULL) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer BAD_POPT_PARAMS(pc, _("Specify group to show\n"), ret, fini);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer CHECK_ROOT(ret, debug_prg_name);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = init_sss_tools(&tctx);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (ret != EOK) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret)));
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (ret == ENOENT) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ERROR("Error initializing the tools - no local domain\n");
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer } else {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ERROR("Error initializing the tools\n");
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ret = EXIT_FAILURE;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer goto fini;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
c41a1c38edbd787d8fd12b9b5f11b73a37dafe0fChristian Maeder /* if the domain was not given as part of FQDN, default to local domain */
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ret = parse_name_domain(tctx, pc_groupname);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (ret != EOK) {
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer ERROR("Invalid domain specified in FQDN\n");
c41a1c38edbd787d8fd12b9b5f11b73a37dafe0fChristian Maeder ret = EXIT_FAILURE;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer goto fini;
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer }
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer /* The search itself */
c41a1c38edbd787d8fd12b9b5f11b73a37dafe0fChristian Maeder ret = group_show(tctx, tctx->sysdb,
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer tctx->local, pc_recursive, tctx->octx->name, &root);
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer /* Also show MPGs */
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer if (ret == ENOENT) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = group_show_mpg(tctx, tctx->sysdb, tctx->local,
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer tctx->octx->name, &root);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer /* Process result */
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (ret) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer DEBUG(1, ("sysdb operation failed (%d)[%s]\n", ret, strerror(ret)));
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer switch (ret) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer case ENOENT:
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ERROR("No such group in local domain. "
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer "Printing groups only allowed in local domain.\n");
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer break;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer default:
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ERROR("Internal error. Could not print group.\n");
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer break;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer ret = EXIT_FAILURE;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer goto fini;
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer }
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer /* print the results */
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer print_group_info(root, 0);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (pc_recursive) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer printf("\n");
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer print_recursive(root->group_members, 0);
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer } else {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer if (root->group_members) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer for (i=0; root->group_members[i]; ++i) {
66fd8f017efdb8a6c862c3f1856dfaef90865dd5Thiemo Wiedemeyer printf("%s%s", i>0 ? "," : "",
53e76316f409f6b1b57ed3d2e5cb9cfe1cb511e5Thiemo Wiedemeyer root->group_members[i]->name);
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer }
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer }
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer printf("\n");
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer }
38f8320f50c5f63965ba42e4e48f38be07c823cfChristian Maeder
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyerfini:
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer talloc_free(tctx);
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer poptFreeContext(pc);
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer exit(ret);
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer}
966a6c024c828387023fccb0cd0049f78687e5dcThiemo Wiedemeyer