sss_override.c revision 1b45fed9f629d47fefc3feaba01810ca2200fed3
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/*
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina Authors:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina Pavel Březina <pbrezina@redhat.com>
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina Copyright (C) 2015 Red Hat
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina This program is free software; you can redistribute it and/or modify
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina it under the terms of the GNU General Public License as published by
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina the Free Software Foundation; either version 3 of the License, or
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina (at your option) any later version.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina This program is distributed in the hope that it will be useful,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina GNU General Public License for more details.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina You should have received a copy of the GNU General Public License
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina*/
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina#include <stdlib.h>
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina#include "util/util.h"
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina#include "db/sysdb.h"
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina#include "tools/common/sss_tools.h"
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#include "tools/common/sss_colondb.h"
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina#define LOCALVIEW SYSDB_LOCAL_VIEW_NAME
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define ORIGNAME "originalName"
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastruct override_user {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *input_name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *orig_name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_domain_info *domain;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina uid_t uid;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina gid_t gid;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *home;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *shell;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *gecos;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastruct override_group {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *input_name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *orig_name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_domain_info *domain;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina gid_t gid;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic int parse_cmdline(struct sss_cmdline *cmdline,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_tool_ctx *tool_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct poptOption *options,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char **_input_name,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char **_orig_name,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_domain_info **_domain)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina enum sss_tool_opt require;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *input_name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *orig_name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_domain_info *domain;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina int ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina require = options == NULL ? SSS_TOOL_OPT_OPTIONAL : SSS_TOOL_OPT_REQUIRED;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sss_tool_popt_ex(cmdline, options, require,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina NULL, NULL, "NAME", _("Specify name of modified "
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina "object."), &input_name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EXIT_SUCCESS) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command arguments\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sss_tool_parse_name(tool_ctx, tool_ctx, input_name,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina &orig_name, &domain);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
4285cf181abd1d12dc144d5f86d73162bbd9cf05Pavel Březina fprintf(stderr, _("Unable to parse name %s.\n"), input_name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina *_input_name = input_name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina *_orig_name = orig_name;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina *_domain = domain;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_SUCCESS;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic int parse_cmdline_user_add(struct sss_cmdline *cmdline,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_tool_ctx *tool_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_user *user)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct poptOption options[] = {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"name", 'n', POPT_ARG_STRING, &user->name, 0, _("Override name"), NULL },
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"uid", 'u', POPT_ARG_INT, &user->uid, 0, _("Override uid (non-zero value)"), NULL },
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"gid", 'g', POPT_ARG_INT, &user->gid, 0, _("Override gid (non-zero value)"), NULL },
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"home", 'h', POPT_ARG_STRING, &user->home, 0, _("Override home directory"), NULL },
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"shell", 's', POPT_ARG_STRING, &user->shell, 0, _("Override shell"), NULL },
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"gecos", 'c', POPT_ARG_STRING, &user->gecos, 0, _("Override gecos"), NULL },
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina POPT_TABLEEND
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina };
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return parse_cmdline(cmdline, tool_ctx, options, &user->input_name,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina &user->orig_name, &user->domain);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic int parse_cmdline_user_del(struct sss_cmdline *cmdline,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_tool_ctx *tool_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_user *user)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return parse_cmdline(cmdline, tool_ctx, NULL, &user->input_name,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina &user->orig_name, &user->domain);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic int parse_cmdline_group_add(struct sss_cmdline *cmdline,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_tool_ctx *tool_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_group *group)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct poptOption options[] = {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"name", 'n', POPT_ARG_STRING, &group->name, 0, _("Override name"), NULL },
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"gid", 'g', POPT_ARG_INT, &group->gid, 0, _("Override gid"), NULL },
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina POPT_TABLEEND
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina };
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return parse_cmdline(cmdline, tool_ctx, options, &group->input_name,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina &group->orig_name, &group->domain);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic int parse_cmdline_group_del(struct sss_cmdline *cmdline,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_tool_ctx *tool_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_group *group)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return parse_cmdline(cmdline, tool_ctx, NULL, &group->input_name,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina &group->orig_name, &group->domain);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březinastatic int parse_cmdline_find(struct sss_cmdline *cmdline,
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct sss_tool_ctx *tool_ctx,
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct sss_domain_info **_dom)
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina{
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct sss_domain_info *dom;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina const char *domname = NULL;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina int ret;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct poptOption options[] = {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {"domain", 'd', POPT_ARG_STRING | POPT_ARGFLAG_OPTIONAL,
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina &domname, 0, _("Domain name"), NULL },
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina POPT_TABLEEND
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina };
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina ret = sss_tool_popt_ex(cmdline, options, SSS_TOOL_OPT_OPTIONAL,
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina NULL, NULL, NULL, NULL, NULL);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (ret != EXIT_SUCCESS) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command arguments\n");
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return ret;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (domname == NULL) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina *_dom = NULL;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return EXIT_SUCCESS;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina dom = find_domain_by_name(tool_ctx->domains, domname, true);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (dom == NULL) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to find domain %s\n", domname);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina fprintf(stderr, _("Unable to find domain %s\n"), domname);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return EXIT_FAILURE;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina *_dom = dom;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return EXIT_SUCCESS;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina}
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic int parse_cmdline_import(struct sss_cmdline *cmdline,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char **_file)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = sss_tool_popt_ex(cmdline, NULL, SSS_TOOL_OPT_OPTIONAL,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina NULL, NULL, "FILE", "File to import the data from.",
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina _file);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EXIT_SUCCESS) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command arguments\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return EXIT_SUCCESS;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic int parse_cmdline_export(struct sss_cmdline *cmdline,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char **_file)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = sss_tool_popt_ex(cmdline, NULL, SSS_TOOL_OPT_OPTIONAL,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina NULL, NULL, "FILE", "File to export the data to.",
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina _file);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EXIT_SUCCESS) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command arguments\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return EXIT_SUCCESS;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic errno_t prepare_view(struct sss_domain_info *domain)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina char *viewname = NULL;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina errno_t ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_get_view_name(NULL, domain->sysdb, &viewname);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK && ret != ENOENT) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "sysdb_get_view_name() failed.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret == EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (is_local_view(viewname)) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "%s view is already present.\n", viewname);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = EOK;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina } else if (viewname != NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "There already exists view %s. "
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina "Only one view is supported. Nothing to do.\n", viewname);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = EEXIST;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Creating %s view.\n", LOCALVIEW);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_update_view_name(domain->sysdb, LOCALVIEW);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret == EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina printf("SSSD needs to be restarted for the changes to take effect.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinadone:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina talloc_free(viewname);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březinaerrno_t prepare_view_msg(struct sss_domain_info *domain)
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina{
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina errno_t ret;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = prepare_view(domain);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret == EEXIST) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina fprintf(stderr, _("Other than " LOCALVIEW " view already exist "
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina "in domain %s.\n"), domain->name);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina } else if (ret != EOK) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina fprintf(stderr, _("Unable to prepare " LOCALVIEW
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina " view in domain %s.\n"), domain->name);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina return ret;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina}
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic char *build_anchor(TALLOC_CTX *mem_ctx, const char *obj_dn)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina char *anchor;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina char *safe_dn;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina errno_t ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_dn_sanitize(mem_ctx, obj_dn, &safe_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_dn_sanitize() failed\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return NULL;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina anchor = talloc_asprintf(mem_ctx, ":%s:%s", LOCALVIEW, safe_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina talloc_free(safe_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return anchor;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic struct sysdb_attrs *build_attrs(TALLOC_CTX *mem_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *name,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina uid_t uid,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina gid_t gid,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *home,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *shell,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *gecos)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sysdb_attrs *attrs;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina errno_t ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina attrs = sysdb_new_attrs(mem_ctx);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (attrs == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return NULL;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (name != NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (uid != 0) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_attrs_add_uint32(attrs, SYSDB_UIDNUM, uid);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (gid != 0) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_attrs_add_uint32(attrs, SYSDB_GIDNUM, gid);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (home != NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_attrs_add_string(attrs, SYSDB_HOMEDIR, home);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (shell != NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_attrs_add_string(attrs, SYSDB_SHELL, shell);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (gecos != NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_attrs_add_string(attrs, SYSDB_GECOS, gecos);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = EOK;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinadone:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina talloc_free(attrs);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return NULL;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return attrs;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic struct sysdb_attrs *build_user_attrs(TALLOC_CTX *mem_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_user *user)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return build_attrs(mem_ctx, user->name, user->uid, user->gid, user->home,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina user->shell, user->gecos);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic struct sysdb_attrs *build_group_attrs(TALLOC_CTX *mem_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_group *group)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return build_attrs(mem_ctx, group->name, 0, group->gid, 0, NULL, NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březinastatic char *get_fqname(TALLOC_CTX *mem_ctx,
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina struct sss_domain_info *domain,
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina const char *name)
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina{
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina char *fqname;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int fqlen;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int check;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina if (domain == NULL) {
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina return NULL;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina }
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina /* Get length. */
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina fqlen = sss_fqname(NULL, 0, domain->names, domain, name);
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina if (fqlen > 0) {
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina fqlen++; /* \0 */
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina } else {
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina return NULL;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina }
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina fqname = talloc_zero_array(mem_ctx, char, fqlen);
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina if (fqname == NULL) {
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina return NULL;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina }
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina check = sss_fqname(fqname, fqlen, domain->names, domain, name);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (check < 0 || check != fqlen - 1) {
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed to generate a fully qualified name "
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina "for user [%s] in [%s]! Skipping user.\n", name, domain->name);
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina talloc_free(fqname);
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina return NULL;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina }
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina return fqname;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina}
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březinastatic char *get_sysname(TALLOC_CTX *mem_ctx,
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina struct sss_domain_info *domain,
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina const char *name)
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina{
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina if (domain == NULL || !domain->fqnames) {
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina return talloc_strdup(mem_ctx, name);
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina }
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina return get_fqname(mem_ctx, domain, name);
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina}
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březinastatic struct sss_domain_info *
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březinaget_object_domain(enum sysdb_member_type type,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char *name,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct sss_domain_info *domain,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct sss_domain_info *domains)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina TALLOC_CTX *tmp_ctx;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_domain_info *dom;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct ldb_result *res;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *strtype;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina char *sysname;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina bool check_next;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina errno_t ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina tmp_ctx = talloc_new(NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (tmp_ctx == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return NULL;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina sysname = get_sysname(tmp_ctx, domain, name);
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina if (sysname == NULL) {
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina ret = ENOMEM;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina goto done;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina }
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina /* Ensure that the object is in cache. */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina switch (type) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina case SYSDB_MEMBER_USER:
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina if (getpwnam(sysname) == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ENOENT;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina break;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina case SYSDB_MEMBER_GROUP:
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina if (getgrnam(sysname) == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ENOENT;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina break;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina default:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unsupported member type %d\n", type);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ERR_INTERNAL;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina /* Find domain if it is unknown. */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (domain == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina check_next = true;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina dom = domains;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina } else {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina check_next = false;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina dom = domain;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina do {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina switch (type) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina case SYSDB_MEMBER_USER:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Trying to find user %s@%s\n",
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina name, dom->name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_getpwnam(tmp_ctx, dom, name, &res);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina strtype = "user";
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina break;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina case SYSDB_MEMBER_GROUP:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Trying to find group %s@%s\n",
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina name, dom->name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_getgrnam(tmp_ctx, dom, name, &res);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina strtype = "group";
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina break;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina default:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unsupported member type %d\n", type);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ERR_INTERNAL;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret == EOK && res->count == 0) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ENOENT;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (check_next) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina dom = dom->next;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina continue;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to find %s %s@%s [%d]: %s\n",
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina strtype, name, dom->name, ret, sss_strerror(ret));
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina } else if (res->count != 1) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "More than one %s found?\n", strtype);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ERR_INTERNAL;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina check_next = false;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina } while (check_next && dom != NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (dom == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "No domain match for %s\n", name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ENOENT;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Domain of %s %s is %s\n",
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina strtype, name, dom->name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinadone:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina talloc_free(tmp_ctx);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return NULL;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina return dom;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březinastatic errno_t get_user_domain_msg(struct sss_tool_ctx *tool_ctx,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct override_user *user)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct sss_domain_info *newdom;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char *domname;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina newdom = get_object_domain(SYSDB_MEMBER_USER, user->orig_name,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina user->domain, tool_ctx->domains);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (newdom == NULL) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina domname = user->domain == NULL ? "[unknown]" : user->domain->name;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina fprintf(stderr, _("Unable to find user %s@%s.\n"),
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina user->orig_name, domname);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina return ENOENT;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina user->domain = newdom;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina return EOK;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březinastatic errno_t get_group_domain_msg(struct sss_tool_ctx *tool_ctx,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct override_group *group)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct sss_domain_info *newdom;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char *domname;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina newdom = get_object_domain(SYSDB_MEMBER_GROUP, group->orig_name,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina group->domain, tool_ctx->domains);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (newdom == NULL) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina domname = group->domain == NULL ? "[unknown]" : group->domain->name;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina fprintf(stderr, _("Unable to find group %s@%s.\n"),
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina group->orig_name, domname);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina return ENOENT;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina group->domain = newdom;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina return EOK;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina}
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březinastatic errno_t get_object_dn(TALLOC_CTX *mem_ctx,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct sss_domain_info *domain,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina enum sysdb_member_type type,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char *name,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct ldb_dn **_ldb_dn,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char **_str_dn)
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina{
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct ldb_dn *ldb_dn;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina switch (type) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina case SYSDB_MEMBER_USER:
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ldb_dn = sysdb_user_dn(mem_ctx, domain, name);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina break;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina case SYSDB_MEMBER_GROUP:
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ldb_dn = sysdb_group_dn(mem_ctx, domain, name);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina break;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina default:
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unsupported member type %d\n", type);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina return ERR_INTERNAL;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ldb_dn == NULL) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina return ENOMEM;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (_str_dn != NULL) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina *_str_dn = ldb_dn_get_linearized(ldb_dn);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (_ldb_dn != NULL) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina *_ldb_dn = ldb_dn;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina } else {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina talloc_free(ldb_dn);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina return EOK;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic errno_t override_object_add(struct sss_domain_info *domain,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina enum sysdb_member_type type,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sysdb_attrs *attrs,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char *name)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina TALLOC_CTX *tmp_ctx;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *anchor;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct ldb_dn *ldb_dn;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char *str_dn;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina errno_t ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina tmp_ctx = talloc_new(NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (tmp_ctx == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return ENOMEM;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_object_dn(tmp_ctx, domain, type, name, &ldb_dn, &str_dn);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina anchor = build_anchor(tmp_ctx, str_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (anchor == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ENOMEM;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_attrs_add_string(attrs, SYSDB_OVERRIDE_ANCHOR_UUID, anchor);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Creating override for %s\n", str_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_store_override(domain, LOCALVIEW, type, attrs, ldb_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinadone:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina talloc_free(tmp_ctx);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březinastatic errno_t override_fqn(TALLOC_CTX *mem_ctx,
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina struct sss_tool_ctx *tool_ctx,
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina struct sss_domain_info *domain,
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina const char *input,
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina const char **_name)
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina{
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina struct sss_domain_info *dom;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina errno_t ret;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina if (input == NULL) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina return EOK;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina }
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = sss_tool_parse_name(mem_ctx, tool_ctx, input, _name, &dom);
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina if (ret == EAGAIN) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Unable to find domain from "
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina "fqn %s\n", input);
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina fprintf(stderr, _("Changing domain is not allowed!\n"));
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = EINVAL;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina } else if (ret == EOK && dom != NULL && dom != domain) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Trying to change domain from "
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina "%s to %s, not allowed!\n", domain->name, dom->name);
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina fprintf(stderr, _("Changing domain is not allowed!\n"));
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = EINVAL;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina } else if (ret != EOK) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse name %s [%d]: %s\n",
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina input, ret, sss_strerror(ret));
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina }
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina return ret;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina}
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březinastatic errno_t override_user(struct sss_tool_ctx *tool_ctx,
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina struct override_user *input_user)
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina{
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina TALLOC_CTX *tmp_ctx;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina struct override_user user;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct sysdb_attrs *attrs;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina errno_t ret;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina tmp_ctx = talloc_new(NULL);
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina if (tmp_ctx == NULL) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina return ENOMEM;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina }
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina user = *input_user;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina /* We need to parse the name and ensure that domain did not change. */
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = override_fqn(tmp_ctx, tool_ctx, user.domain, user.name, &user.name);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina goto done;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina }
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = prepare_view_msg(user.domain);
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina if (ret != EOK) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina goto done;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina attrs = build_user_attrs(tool_ctx, &user);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (attrs == NULL) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build sysdb attrs.\n");
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = ENOMEM;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina goto done;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = override_object_add(user.domain, SYSDB_MEMBER_USER, attrs,
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina user.orig_name);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to add override object.\n");
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina goto done;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = EOK;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březinadone:
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina talloc_free(tmp_ctx);
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina return ret;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina}
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březinastatic errno_t override_group(struct sss_tool_ctx *tool_ctx,
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina struct override_group *input_group)
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina{
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina TALLOC_CTX *tmp_ctx;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina struct override_group group;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct sysdb_attrs *attrs;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina errno_t ret;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina tmp_ctx = talloc_new(NULL);
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina if (tmp_ctx == NULL) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina return ENOMEM;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina }
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina group = *input_group;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina /* We need to parse the name and ensure that domain did not change. */
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = override_fqn(tmp_ctx, tool_ctx, group.domain, group.name,
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina &group.name);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina goto done;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = prepare_view_msg(group.domain);
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina if (ret != EOK) {
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina goto done;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina }
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina attrs = build_group_attrs(tool_ctx, &group);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (attrs == NULL) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build sysdb attrs.\n");
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = ENOMEM;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina goto done;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = override_object_add(group.domain, SYSDB_MEMBER_GROUP, attrs,
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina group.orig_name);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to add override object.\n");
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina goto done;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina ret = EOK;
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březinadone:
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina talloc_free(tmp_ctx);
4649f19ea4b11c428ca75803beda8d495a0c9335Pavel Březina return ret;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina}
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic errno_t override_object_del(struct sss_domain_info *domain,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina enum sysdb_member_type type,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char *name)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina TALLOC_CTX *tmp_ctx;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct ldb_message *msg;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct ldb_dn *override_dn;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct ldb_dn *ldb_dn;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char *str_dn;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina const char *anchor;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina errno_t ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina int sret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina bool in_transaction = false;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct ldb_context *ldb = sysdb_ctx_get_ldb(domain->sysdb);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina tmp_ctx = talloc_new(NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (tmp_ctx == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return ENOMEM;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_object_dn(tmp_ctx, domain, type, name, &ldb_dn, &str_dn);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina goto done;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina anchor = build_anchor(tmp_ctx, str_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (anchor == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ENOMEM;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina override_dn = ldb_dn_new_fmt(tmp_ctx, ldb,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina SYSDB_TMPL_OVERRIDE, anchor, LOCALVIEW);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (override_dn == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ENOMEM;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Removing override for %s\n", str_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_transaction_start(domain->sysdb);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "sysdb_transaction_start() failed.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina in_transaction = true;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_delete_entry(domain->sysdb, override_dn, true);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "sysdb_delete_entry() failed.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina msg = ldb_msg_new(tmp_ctx);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (msg == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ENOMEM;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina msg->dn = talloc_steal(msg, ldb_dn);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (msg->dn == NULL) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ENOMEM;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ldb_msg_add_empty(msg, SYSDB_OVERRIDE_DN, LDB_FLAG_MOD_DELETE, NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != LDB_SUCCESS) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_add_empty() failed\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_error_to_errno(ret);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = ldb_modify(ldb, msg);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_ATTRIBUTE) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_OP_FAILURE,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina "ldb_modify() failed: [%s](%d)[%s]\n",
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ldb_strerror(ret), ret, ldb_errstring(ldb));
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_error_to_errno(ret);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = sysdb_transaction_commit(domain->sysdb);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed to commit transaction\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina goto done;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina in_transaction = false;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = EOK;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinadone:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (in_transaction) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina sret = sysdb_transaction_cancel(domain->sysdb);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (sret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Could not cancel transaction\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina talloc_free(tmp_ctx);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic errno_t append_name(struct sss_domain_info *domain,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_message *override)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina TALLOC_CTX *tmp_ctx;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_context *ldb = sysdb_ctx_get_ldb(domain->sysdb);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_dn *dn;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_message **msgs;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *attrs[] = {SYSDB_NAME, NULL};
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *name;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *fqname;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t count;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina errno_t ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina tmp_ctx = talloc_new(NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (tmp_ctx == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return ENOMEM;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina dn = ldb_msg_find_attr_as_dn(ldb, tmp_ctx, override,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina SYSDB_OVERRIDE_OBJECT_DN);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (dn == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Missing overrideObjectDN?\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = ERR_INTERNAL;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = sysdb_search_entry(tmp_ctx, domain->sysdb, dn, LDB_SCOPE_BASE,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina NULL, attrs, &count, &msgs);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_search_entry() failed [%d]: %s\n",
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret, sss_strerror(ret));
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina } else if (count != 1) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "More than one user found?\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = ERR_INTERNAL;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina name = ldb_msg_find_attr_as_string(msgs[0], SYSDB_NAME, NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (name == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Object with no name?\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = ERR_INTERNAL;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina fqname = get_fqname(tmp_ctx, domain, name);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (fqname == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get fqname\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = ENOMEM;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = ldb_msg_add_string(override, ORIGNAME, fqname);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != LDB_SUCCESS) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = sysdb_error_to_errno(ret);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to add attribute to msg\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_steal(override, fqname);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
220a4cbb7fcf30d954b2b4fecd62887373aa8764Pavel Březina ret = EOK;
220a4cbb7fcf30d954b2b4fecd62887373aa8764Pavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinadone:
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free(tmp_ctx);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic errno_t list_overrides(TALLOC_CTX *mem_ctx,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *filter,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char **attrs,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_domain_info *domain,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t *_count,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_message ***_msgs)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina TALLOC_CTX *tmp_ctx;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_dn *dn;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_context *ldb = sysdb_ctx_get_ldb(domain->sysdb);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t count;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_message **msgs;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t i;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina tmp_ctx = talloc_new(NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (tmp_ctx == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return ENOMEM;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina /* Acquire list of override objects. */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina dn = ldb_dn_new_fmt(tmp_ctx, ldb, SYSDB_TMPL_VIEW_SEARCH_BASE, LOCALVIEW);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (dn == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_OP_FAILURE, "ldb_dn_new_fmt() failed.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = EIO;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = sysdb_search_entry(tmp_ctx, domain->sysdb, dn, LDB_SCOPE_SUBTREE,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina filter, attrs, &count, &msgs);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_search_entry() failed [%d]: %s\n",
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret, sss_strerror(ret));
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina /* Amend messages with original name. */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina for (i = 0; i < count; i++) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = append_name(domain, msgs[i]);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to append name [%d]: %s\n",
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret, sss_strerror(ret));
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina *_msgs = talloc_steal(mem_ctx, msgs);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina *_count = count;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = EOK;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinadone:
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free(tmp_ctx);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic struct override_user *
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinalist_user_overrides(TALLOC_CTX *mem_ctx,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_domain_info *domain)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina TALLOC_CTX *tmp_ctx;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct override_user *objs;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_message **msgs;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t count;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t i;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina errno_t ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *attrs[] = SYSDB_PW_ATTRS;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina tmp_ctx = talloc_new(NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (tmp_ctx == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return NULL;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = list_overrides(tmp_ctx, "(objectClass=" SYSDB_OVERRIDE_USER_CLASS ")",
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina attrs, domain, &count, &msgs);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs = talloc_zero_array(tmp_ctx, struct override_user, count + 1);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (objs == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = ENOMEM;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina for (i = 0; i < count; i++) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].orig_name = ldb_msg_find_attr_as_string(msgs[i], ORIGNAME,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (objs[i].orig_name == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Missing name?!\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = ERR_INTERNAL;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].name = ldb_msg_find_attr_as_string(msgs[i], SYSDB_NAME, NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].uid = ldb_msg_find_attr_as_uint(msgs[i], SYSDB_UIDNUM, 0);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].gid = ldb_msg_find_attr_as_uint(msgs[i], SYSDB_GIDNUM, 0);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].home = ldb_msg_find_attr_as_string(msgs[i], SYSDB_HOMEDIR, NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].shell = ldb_msg_find_attr_as_string(msgs[i], SYSDB_SHELL, NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].gecos = ldb_msg_find_attr_as_string(msgs[i], SYSDB_GECOS, NULL);
3119225929463aecfbb1a7fc953263736955271ePavel Březina
3119225929463aecfbb1a7fc953263736955271ePavel Březina talloc_steal(objs, objs[i].orig_name);
3119225929463aecfbb1a7fc953263736955271ePavel Březina talloc_steal(objs, objs[i].name);
3119225929463aecfbb1a7fc953263736955271ePavel Březina talloc_steal(objs, objs[i].home);
3119225929463aecfbb1a7fc953263736955271ePavel Březina talloc_steal(objs, objs[i].shell);
3119225929463aecfbb1a7fc953263736955271ePavel Březina talloc_steal(objs, objs[i].gecos);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_steal(mem_ctx, objs);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinadone:
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free(tmp_ctx);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return NULL;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return objs;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic struct override_group *
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinalist_group_overrides(TALLOC_CTX *mem_ctx,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_domain_info *domain)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina TALLOC_CTX *tmp_ctx;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct override_group *objs;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct ldb_message **msgs;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t count;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t i;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina errno_t ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *attrs[] = SYSDB_GRSRC_ATTRS;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina tmp_ctx = talloc_new(NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (tmp_ctx == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return NULL;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = list_overrides(tmp_ctx, "(objectClass=" SYSDB_OVERRIDE_GROUP_CLASS ")",
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina attrs, domain, &count, &msgs);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs = talloc_zero_array(tmp_ctx, struct override_group, count + 1);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (objs == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = ENOMEM;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina for (i = 0; i < count; i++) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].orig_name = ldb_msg_find_attr_as_string(msgs[i], ORIGNAME,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (objs[i].orig_name == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Missing name?!\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = ERR_INTERNAL;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].name = ldb_msg_find_attr_as_string(msgs[i], SYSDB_NAME, NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina objs[i].gid = ldb_msg_find_attr_as_uint(msgs[i], SYSDB_GIDNUM, 0);
3119225929463aecfbb1a7fc953263736955271ePavel Březina
3119225929463aecfbb1a7fc953263736955271ePavel Březina talloc_steal(objs, objs[i].orig_name);
3119225929463aecfbb1a7fc953263736955271ePavel Březina talloc_steal(objs, objs[i].name);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_steal(mem_ctx, objs);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinadone:
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free(tmp_ctx);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return NULL;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return objs;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březinastatic errno_t user_export(const char *filename,
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct sss_domain_info *dom,
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina bool iterate)
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina{
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina TALLOC_CTX *tmp_ctx;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct sss_colondb *db;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct override_user *objs;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina errno_t ret;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina int i;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina tmp_ctx = talloc_new(NULL);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (tmp_ctx == NULL) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return ENOMEM;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina db = sss_colondb_open(tmp_ctx, SSS_COLONDB_WRITE, filename);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (db == NULL) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina fprintf(stderr, _("Unable to open %s.\n"),
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina filename == NULL ? "stdout" : filename);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina ret = EIO;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina goto done;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina do {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina objs = list_user_overrides(tmp_ctx, dom);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (objs == NULL) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get override objects\n");
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina ret = ENOMEM;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina goto done;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina for (i = 0; objs[i].orig_name != NULL; i++) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina /**
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina * Format: orig_name:name:uid:gid:gecos:home:shell
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina */
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct sss_colondb_write_field table[] = {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {SSS_COLONDB_STRING, {.str = objs[i].orig_name}},
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {SSS_COLONDB_STRING, {.str = objs[i].name}},
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {SSS_COLONDB_UINT32, {.uint32 = objs[i].uid}},
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {SSS_COLONDB_UINT32, {.uint32 = objs[i].gid}},
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {SSS_COLONDB_STRING, {.str = objs[i].gecos}},
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {SSS_COLONDB_STRING, {.str = objs[i].home}},
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {SSS_COLONDB_STRING, {.str = objs[i].shell}},
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {SSS_COLONDB_SENTINEL, {0}}
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina };
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina ret = sss_colondb_writeline(db, table);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (ret != EOK) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to write line to db\n");
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina goto done;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina /* All overrides are under the same subtree, so we don't want to
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina * descent into subdomains. */
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina dom = get_next_domain(dom, false);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina } while (dom != NULL && iterate);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina ret = EOK;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březinadone:
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina talloc_free(tmp_ctx);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return ret;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina}
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic int override_user_add(struct sss_cmdline *cmdline,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_tool_ctx *tool_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina void *pvt)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_user user = {NULL};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina int ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = parse_cmdline_user_add(cmdline, tool_ctx, &user);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_user_domain_msg(tool_ctx, &user);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = override_user(tool_ctx, &user);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_SUCCESS;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic int override_user_del(struct sss_cmdline *cmdline,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_tool_ctx *tool_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina void *pvt)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_user user = {NULL};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina int ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = parse_cmdline_user_del(cmdline, tool_ctx, &user);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_user_domain_msg(tool_ctx, &user);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = override_object_del(user.domain, SYSDB_MEMBER_USER, user.orig_name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to delete override object.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_SUCCESS;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březinastatic int override_user_find(struct sss_cmdline *cmdline,
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct sss_tool_ctx *tool_ctx,
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina void *pvt)
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina{
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina struct sss_domain_info *dom;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina bool iterate;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina errno_t ret;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina ret = parse_cmdline_find(cmdline, tool_ctx, &dom);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (ret != EOK) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return EXIT_FAILURE;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (dom == NULL) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina dom = tool_ctx->domains;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina iterate = true;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina } else {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina iterate = false;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina ret = user_export(NULL, dom, iterate);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (ret != EOK) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export users\n");
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return EXIT_FAILURE;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return EXIT_SUCCESS;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina}
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic int override_user_import(struct sss_cmdline *cmdline,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_tool_ctx *tool_ctx,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina void *pvt)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina TALLOC_CTX *tmp_ctx;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_colondb *db;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *filename;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct override_user obj;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int linenum = 1;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina errno_t ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int exit;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina tmp_ctx = talloc_new(NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (tmp_ctx == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina /**
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina * Format: orig_name:name:uid:gid:gecos:home:shell
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_colondb_read_field table[] = {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_STRING, {.str = &obj.input_name}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_STRING, {.str = &obj.name}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_UINT32, {.uint32 = &obj.uid}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_UINT32, {.uint32 = &obj.gid}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_STRING, {.str = &obj.gecos}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_STRING, {.str = &obj.home}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_STRING, {.str = &obj.shell}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_SENTINEL, {0}}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina };
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
c12cd2d95d08c9316bc358c2f7707d92551b6909Pavel Reichl ret = parse_cmdline_import(cmdline, &filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina db = sss_colondb_open(tool_ctx, SSS_COLONDB_READ, filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (db == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina fprintf(stderr, _("Unable to open %s.\n"), filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina while ((ret = sss_colondb_readline(tmp_ctx, db, table)) == EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina linenum++;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = sss_tool_parse_name(tool_ctx, tool_ctx, obj.input_name,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina &obj.orig_name, &obj.domain);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina fprintf(stderr, _("Unable to parse name %s.\n"), obj.input_name);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = get_user_domain_msg(tool_ctx, &obj);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = override_user(tool_ctx, &obj);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free_children(tmp_ctx);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOF) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina fprintf(stderr, _("Invalid format on line %d. "
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina "Use --debug option for more information.\n"), linenum);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_SUCCESS;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinadone:
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free(tmp_ctx);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return exit;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic int override_user_export(struct sss_cmdline *cmdline,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_tool_ctx *tool_ctx,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina void *pvt)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *filename;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina errno_t ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
c12cd2d95d08c9316bc358c2f7707d92551b6909Pavel Reichl ret = parse_cmdline_export(cmdline, &filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina ret = user_export(filename, tool_ctx->domains, true);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (ret != EOK) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export users\n");
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina return EXIT_SUCCESS;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic int override_group_add(struct sss_cmdline *cmdline,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_tool_ctx *tool_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina void *pvt)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_group group = {NULL};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina int ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = parse_cmdline_group_add(cmdline, tool_ctx, &group);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_group_domain_msg(tool_ctx, &group);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = override_group(tool_ctx, &group);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_SUCCESS;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastatic int override_group_del(struct sss_cmdline *cmdline,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_tool_ctx *tool_ctx,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina void *pvt)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct override_group group = {NULL};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina int ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina ret = parse_cmdline_group_del(cmdline, tool_ctx, &group);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_group_domain_msg(tool_ctx, &group);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = override_object_del(group.domain, SYSDB_MEMBER_GROUP,
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina group.orig_name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to delete override object.\n");
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_FAILURE;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return EXIT_SUCCESS;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic int override_group_import(struct sss_cmdline *cmdline,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_tool_ctx *tool_ctx,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina void *pvt)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina TALLOC_CTX *tmp_ctx;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_colondb *db;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *filename;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct override_group obj;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int linenum = 1;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina errno_t ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int exit;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina tmp_ctx = talloc_new(NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (tmp_ctx == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina /**
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina * Format: orig_name:name:gid
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_colondb_read_field table[] = {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_STRING, {.str = &obj.input_name}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_STRING, {.str = &obj.name}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_UINT32, {.uint32 = &obj.gid}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_SENTINEL, {0}}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina };
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
c12cd2d95d08c9316bc358c2f7707d92551b6909Pavel Reichl ret = parse_cmdline_import(cmdline, &filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina db = sss_colondb_open(tool_ctx, SSS_COLONDB_READ, filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (db == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina fprintf(stderr, _("Unable to open %s.\n"), filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina while ((ret = sss_colondb_readline(tmp_ctx, db, table)) == EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina linenum++;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = sss_tool_parse_name(tool_ctx, tool_ctx, obj.input_name,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina &obj.orig_name, &obj.domain);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina fprintf(stderr, _("Unable to parse name %s.\n"), obj.input_name);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = get_group_domain_msg(tool_ctx, &obj);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = override_group(tool_ctx, &obj);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free_children(tmp_ctx);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOF) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina fprintf(stderr, _("Invalid format on line %d. "
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina "Use --debug option for more information.\n"), linenum);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_SUCCESS;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinadone:
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free(tmp_ctx);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return exit;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastatic int override_group_export(struct sss_cmdline *cmdline,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_tool_ctx *tool_ctx,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina void *pvt)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_colondb *db;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *filename;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct override_group *objs;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_domain_info *dom;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina errno_t ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int exit;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int i;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
c12cd2d95d08c9316bc358c2f7707d92551b6909Pavel Reichl ret = parse_cmdline_export(cmdline, &filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina db = sss_colondb_open(tool_ctx, SSS_COLONDB_WRITE, filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (db == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina fprintf(stderr, _("Unable to open %s.\n"), filename);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina dom = tool_ctx->domains;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina do {
20222362cf9557e0e053e5e5f3b6f07899c7bfe7Pavel Březina objs = list_group_overrides(tool_ctx, dom);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (objs == NULL) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get override objects\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina for (i = 0; objs[i].orig_name != NULL; i++) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina /**
1bf0ada00f59c153fe00853394508021d0ff9b24Pavel Březina * Format: orig_name:name:gid
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct sss_colondb_write_field table[] = {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_STRING, {.str = objs[i].orig_name}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_STRING, {.str = objs[i].name}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_UINT32, {.uint32 = objs[i].gid}},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {SSS_COLONDB_SENTINEL, {0}}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina };
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ret = sss_colondb_writeline(db, table);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to write line to db\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_FAILURE;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina /* All overrides are under the same subtree, so we don't want to
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina * descent into subdomains. */
877b92e80bde510d5cd9f03dbf01e2bcf73ab072Michal Židek dom = get_next_domain(dom, 0);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina } while (dom != NULL);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina exit = EXIT_SUCCESS;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinadone:
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return exit;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinaint main(int argc, const char **argv)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sss_route_cmd commands[] = {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"user-add", override_user_add},
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"user-del", override_user_del},
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina {"user-find", override_user_find},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {"user-import", override_user_import},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {"user-export", override_user_export},
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"group-add", override_group_add},
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {"group-del", override_group_del},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {"group-import", override_group_import},
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina {"group-export", override_group_export},
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina {NULL, NULL}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina };
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return sss_tool_main(argc, argv, commands, NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}