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"
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose#include "util/crypto/sss_crypto.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;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek const char *sysdb_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;
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose const char *cert;
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;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek const char *sysdb_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
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct sss_tool_ctx *tool_ctx,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct poptOption *options,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina const char **_input_name,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina const char **_orig_name,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel 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;
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t 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,
3bc651a611a3e5be508875f3ae58bfb5ece2525cPavel Březina NULL, NULL, "NAME", _("Specify name."),
3bc651a611a3e5be508875f3ae58bfb5ece2525cPavel Březina &input_name, NULL);
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
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline_user_add(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct sss_tool_ctx *tool_ctx,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel 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 },
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose {"certificate", 'x', POPT_ARG_STRING, &user->cert, 0, _("Override certificate"), 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
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline_user_del(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct sss_tool_ctx *tool_ctx,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel 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
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline_user_show(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct sss_tool_ctx *tool_ctx,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct override_user *user)
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina{
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina return parse_cmdline(cmdline, tool_ctx, NULL, &user->input_name,
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina &user->orig_name, &user->domain);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina}
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline_group_add(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct sss_tool_ctx *tool_ctx,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel 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
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline_group_del(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct sss_tool_ctx *tool_ctx,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel 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
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline_group_show(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct sss_tool_ctx *tool_ctx,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct override_group *group)
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina{
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina return parse_cmdline(cmdline, tool_ctx, NULL, &group->input_name,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina &group->orig_name, &group->domain);
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina}
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline_find(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina struct sss_tool_ctx *tool_ctx,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel 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;
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t 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,
3bc651a611a3e5be508875f3ae58bfb5ece2525cPavel Březina NULL, NULL, NULL, NULL, NULL, NULL);
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina if (ret != EOK) {
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;
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
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);
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EINVAL;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina *_dom = dom;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina}
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline_import(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina const char **_file)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t 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.",
3bc651a611a3e5be508875f3ae58bfb5ece2525cPavel Březina _file, NULL);
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command arguments\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina}
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březinastatic errno_t parse_cmdline_export(struct sss_cmdline *cmdline,
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina const char **_file)
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina{
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t 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.",
3bc651a611a3e5be508875f3ae58bfb5ece2525cPavel Březina _file, NULL);
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina if (ret != EOK) {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command arguments\n");
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
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) {
9be0fce9bc1f48241425726ddd612ffd64556715Fabiano Fidêncio fprintf(stderr, _("Other than " LOCALVIEW " view already exists "
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,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek struct sss_domain_info *dom,
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,
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose const char *gecos,
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose const char *cert)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina{
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina struct sysdb_attrs *attrs;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina errno_t ret;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek char *fqname;
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) {
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek fqname = sss_create_internal_fqname(attrs, name, dom->name);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek if (fqname == NULL) {
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek return NULL;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek }
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, fqname);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek talloc_free(fqname);
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
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose if (cert != NULL) {
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose ret = sysdb_attrs_add_base64_blob(attrs, SYSDB_USER_CERT, cert);
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose if (ret != EOK) {
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose goto done;
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose }
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose }
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose
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{
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek return build_attrs(mem_ctx, user->domain, user->name, user->uid, user->gid,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek user->home, user->shell, user->gecos, user->cert);
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{
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek return build_attrs(mem_ctx, group->domain, group->name, 0, group->gid,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek 0, NULL, 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{
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek char *fqname = NULL;
e45096aead1d2e2b8f8b2b386b420c5f62ad07d3Sumit Bose char *dummy_domain = NULL;
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t ret;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek TALLOC_CTX *tmp_ctx;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek char *shortname;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek struct sss_domain_info *dom;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
e45096aead1d2e2b8f8b2b386b420c5f62ad07d3Sumit Bose if (domain == NULL || domain->names == NULL) {
e45096aead1d2e2b8f8b2b386b420c5f62ad07d3Sumit Bose return NULL;
e45096aead1d2e2b8f8b2b386b420c5f62ad07d3Sumit Bose }
e45096aead1d2e2b8f8b2b386b420c5f62ad07d3Sumit Bose
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek tmp_ctx = talloc_new(NULL);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek if (tmp_ctx == NULL) {
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina return NULL;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina }
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek /* the name stored in sysdb already contains the lowercased domain */
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek ret = sss_parse_internal_fqname(tmp_ctx, name, &shortname, &dummy_domain);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek if (ret != EOK) {
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek "sss_parse_internal_fqname failed [%d]: %s\n",
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek ret, sss_strerror(ret));
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek goto done;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina }
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek dom = find_domain_by_name(get_domains_head(domain), dummy_domain, true);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek if (dom == NULL) {
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek goto done;
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina }
7eba58cfcf78e61af1c4ff98619aa97223eb7a5bPavel Březina
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek /* Get length. */
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek fqname = sss_tc_fqname(mem_ctx, dom->names, dom, shortname);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozekdone:
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek talloc_free(tmp_ctx);
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
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek return sss_tc_fqname(mem_ctx, domain->names, 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;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek char *fqname = NULL;
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 {
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek talloc_zfree(fqname);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek fqname = sss_create_internal_fqname(tmp_ctx, name, dom->name);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek if (fqname == NULL) {
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek ret = ENOMEM;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek goto done;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek }
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek
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);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek ret = sysdb_getpwnam(tmp_ctx, dom, fqname, &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);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek ret = sysdb_getgrnam(tmp_ctx, dom, fqname, &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
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek user->sysdb_name = sss_create_internal_fqname(tool_ctx, user->orig_name,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek newdom->name);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek if (user->sysdb_name == NULL) {
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek return ENOMEM;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek }
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek
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
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek group->sysdb_name = sss_create_internal_fqname(tool_ctx, group->orig_name,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek newdom->name);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek if (group->sysdb_name == NULL) {
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek return ENOMEM;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek }
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek
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{
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina TALLOC_CTX *tmp_ctx;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina struct ldb_dn *ldb_dn;
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina const char *str_dn;
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina errno_t ret;
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose struct ldb_result *res;
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina tmp_ctx = talloc_new(NULL);
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina if (tmp_ctx == NULL) {
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina return ENOMEM;
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina switch (type) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina case SYSDB_MEMBER_USER:
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose ret = sysdb_getpwnam(tmp_ctx, domain, name, &res);
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose break;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina case SYSDB_MEMBER_GROUP:
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose ret = sysdb_getgrnam(tmp_ctx, domain, name, &res);
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose break;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina default:
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE, "Unsupported member type %d\n", type);
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose ret = ERR_INTERNAL;
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose goto done;
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose }
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose if (ret != EOK) {
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE,
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose "Failed to look up original object in cache.\n");
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose goto done;
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose }
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose if (res->count == 0) {
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose DEBUG(SSSDBG_MINOR_FAILURE, "Original object not found in cache.\n");
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose ret = ENOENT;
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose goto done;
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose } else if (res->count > 1) {
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE,
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose "There are multiple object with name [%s] in the cache.\n", name);
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose ret = EINVAL;
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose goto done;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose ldb_dn = res->msgs[0]->dn;
e6e2d1575ac7feb3494649f94ef51ef13cbdce48Sumit Bose
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ldb_dn == NULL) {
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina ret = ENOMEM;
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina goto done;
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (_str_dn != NULL) {
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina str_dn = talloc_strdup(tmp_ctx, ldb_dn_get_linearized(ldb_dn));
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina if (str_dn == NULL) {
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina ret = ENOMEM;
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina goto done;
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina }
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina *_str_dn = talloc_steal(mem_ctx, str_dn);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (_ldb_dn != NULL) {
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina *_ldb_dn = talloc_steal(mem_ctx, ldb_dn);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina }
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina ret = EOK;
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březinadone:
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina talloc_free(tmp_ctx);
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina
2341c8ccfe6225ee4ac5904c177a9200ba617a04Pavel Březina return ret;
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,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek user.sysdb_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,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek group.sysdb_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,
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina const char *base_filter,
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina const char *ext_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;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina const char *filter;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t i;
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel 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
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina filter = base_filter;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (ext_filter != NULL) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina filter = talloc_asprintf(tmp_ctx, "(&%s%s)", filter, ext_filter);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (filter == NULL) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed.\n");
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = ENOMEM;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina goto done;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel 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);
7bf750f6b3b47dcc8a192cc7bcbdecfb94e6cefbPavel Březina if (ret == ENOENT) {
7bf750f6b3b47dcc8a192cc7bcbdecfb94e6cefbPavel Březina *_msgs = NULL;
7bf750f6b3b47dcc8a192cc7bcbdecfb94e6cefbPavel Březina *_count = 0;
7bf750f6b3b47dcc8a192cc7bcbdecfb94e6cefbPavel Březina ret = EOK;
7bf750f6b3b47dcc8a192cc7bcbdecfb94e6cefbPavel Březina goto done;
7bf750f6b3b47dcc8a192cc7bcbdecfb94e6cefbPavel Březina } else 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,
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina struct sss_domain_info *domain,
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina const char *filter)
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;
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose struct ldb_message_element *el;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek const char *fqname;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek char *name;
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 ")",
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina filter, 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
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek fqname = ldb_msg_find_attr_as_string(msgs[i], SYSDB_NAME, NULL);
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek if (fqname != NULL) {
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek ret = sss_parse_internal_fqname(tmp_ctx, fqname, &name, NULL);
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek if (ret != EOK) {
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek ret = ERR_WRONG_NAME_FORMAT;
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek goto done;
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek }
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek objs[i].name = talloc_steal(objs, name);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek }
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek
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
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose el = ldb_msg_find_element(msgs[i], SYSDB_USER_CERT);
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose if (el != NULL && el->num_values > 0) {
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose /* Currently we support only 1 certificate override */
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose objs[i].cert = sss_base64_encode(objs, el->values[0].data,
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose el->values[0].length);
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose if (objs[i].cert == NULL) {
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE, "sss_base64_encode failed.\n");
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose ret = ERR_INTERNAL;
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose goto done;
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose }
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose } else {
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose objs[i].cert = NULL;
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose }
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose
3119225929463aecfbb1a7fc953263736955271ePavel Březina talloc_steal(objs, objs[i].orig_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,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina struct sss_domain_info *domain,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina const char *filter)
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;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek const char *fqname;
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek char *name;
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 ")",
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina filter, 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 }
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek talloc_steal(objs, objs[i].orig_name);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek fqname = ldb_msg_find_attr_as_string(msgs[i], SYSDB_NAME, NULL);
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek if (fqname != NULL) {
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek ret = sss_parse_internal_fqname(tmp_ctx, fqname, &name, NULL);
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek if (ret != EOK) {
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek ret = ERR_WRONG_NAME_FORMAT;
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek goto done;
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek }
07e7683f5a86991feaa764e2055116554ada1b93Michal Židek objs[i].name = talloc_steal(objs, name);
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek }
3119225929463aecfbb1a7fc953263736955271ePavel Březina
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek objs[i].gid = ldb_msg_find_attr_as_uint(msgs[i], SYSDB_GIDNUM, 0);
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,
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina bool iterate,
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina const char *filter)
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 {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina objs = list_user_overrides(tmp_ctx, dom, filter);
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 /**
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose * Format: orig_name:name:uid:gid:gecos:home:shell:certificate
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}},
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose {SSS_COLONDB_STRING, {.str = objs[i].cert}},
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
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březinastatic errno_t group_export(const char *filename,
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina struct sss_domain_info *dom,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina bool iterate,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina const char *filter)
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina{
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina TALLOC_CTX *tmp_ctx;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina struct sss_colondb *db;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina struct override_group *objs;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina errno_t ret;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina int i;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina tmp_ctx = talloc_new(NULL);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina if (tmp_ctx == NULL) {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina return ENOMEM;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina }
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina db = sss_colondb_open(tmp_ctx, SSS_COLONDB_WRITE, filename);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina if (db == NULL) {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina fprintf(stderr, _("Unable to open %s.\n"),
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina filename == NULL ? "stdout" : filename);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina ret = EIO;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina goto done;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina }
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina do {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina objs = list_group_overrides(tmp_ctx, dom, filter);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina if (objs == NULL) {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get override objects\n");
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina ret = ENOMEM;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina goto done;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina }
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina for (i = 0; objs[i].orig_name != NULL; i++) {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina /**
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina * Format: orig_name:name:gid
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina */
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina struct sss_colondb_write_field table[] = {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina {SSS_COLONDB_STRING, {.str = objs[i].orig_name}},
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina {SSS_COLONDB_STRING, {.str = objs[i].name}},
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina {SSS_COLONDB_UINT32, {.uint32 = objs[i].gid}},
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina {SSS_COLONDB_SENTINEL, {0}}
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina };
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina ret = sss_colondb_writeline(db, table);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina if (ret != EOK) {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to write line to db\n");
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina goto done;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina }
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina }
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina /* All overrides are under the same subtree, so we don't want to
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina * descent into subdomains. */
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina dom = get_next_domain(dom, false);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina } while (dom != NULL && iterate);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina ret = EOK;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březinadone:
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina talloc_free(tmp_ctx);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina return ret;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina}
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel 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};
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t 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");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_user_domain_msg(tool_ctx, &user);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = override_user(tool_ctx, &user);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
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};
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t 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");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_user_domain_msg(tool_ctx, &user);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek ret = override_object_del(user.domain, SYSDB_MEMBER_USER, user.sysdb_name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to delete override object.\n");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
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");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
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
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = user_export(NULL, dom, iterate, NULL);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (ret != EOK) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export users\n");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina }
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina}
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březinastatic int override_user_show(struct sss_cmdline *cmdline,
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina struct sss_tool_ctx *tool_ctx,
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina void *pvt)
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina{
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina TALLOC_CTX *tmp_ctx;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina struct override_user input = {NULL};
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina const char *dn;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina char *anchor;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina const char *filter;
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t ret;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina tmp_ctx = talloc_new(NULL);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (tmp_ctx == NULL) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed.\n");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ENOMEM;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = parse_cmdline_user_show(cmdline, tool_ctx, &input);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (ret != EOK) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina goto done;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = get_user_domain_msg(tool_ctx, &input);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (ret != EOK) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get object domain\n");
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina goto done;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = get_object_dn(tmp_ctx, input.domain, SYSDB_MEMBER_USER,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek input.sysdb_name, NULL, &dn);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (ret != EOK) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get object dn\n");
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina goto done;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina anchor = build_anchor(tmp_ctx, dn);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (anchor == NULL) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = ENOMEM;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina goto done;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = sss_filter_sanitize(tmp_ctx, anchor, &anchor);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (ret != EOK) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = ENOMEM;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina goto done;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina filter = talloc_asprintf(tmp_ctx, "(%s=%s)",
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina SYSDB_OVERRIDE_ANCHOR_UUID, anchor);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (filter == NULL) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed\n");
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = ENOMEM;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina goto done;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = user_export(NULL, input.domain, false, filter);
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina if (ret != EOK) {
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export users\n");
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina goto done;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina }
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = EOK;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březinadone:
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina talloc_free(tmp_ctx);
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina}
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel 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
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 /**
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose * Format: orig_name:name:uid:gid:gecos:home:shell:certificate
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}},
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose {SSS_COLONDB_STRING, {.str = &obj.cert}},
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 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);
47ce713ef8c7b32f2ce19cc3ace8e88f123fafacPavel Březina ret = EIO;
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 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 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 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 goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina ret = EOK;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinadone:
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free(tmp_ctx);
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
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");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina ret = user_export(filename, tool_ctx->domains, true, NULL);
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina if (ret != EOK) {
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export users\n");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
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};
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t 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");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_group_domain_msg(tool_ctx, &group);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = override_group(tool_ctx, &group);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
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};
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t 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");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = get_group_domain_msg(tool_ctx, &group);
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina if (ret != EOK) {
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina ret = override_object_del(group.domain, SYSDB_MEMBER_GROUP,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek group.sysdb_name);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina if (ret != EOK) {
5df5a6b852eccaafc8a3fb4eb31296d9587be483Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to delete override object.\n");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina }
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březinastatic int override_group_find(struct sss_cmdline *cmdline,
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina struct sss_tool_ctx *tool_ctx,
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina void *pvt)
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina{
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina struct sss_domain_info *dom;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina bool iterate;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina errno_t ret;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina ret = parse_cmdline_find(cmdline, tool_ctx, &dom);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina if (ret != EOK) {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina }
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina if (dom == NULL) {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina dom = tool_ctx->domains;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina iterate = true;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina } else {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina iterate = false;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina }
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = group_export(NULL, dom, iterate, NULL);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina if (ret != EOK) {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export groups\n");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina }
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina}
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březinastatic int override_group_show(struct sss_cmdline *cmdline,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina struct sss_tool_ctx *tool_ctx,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina void *pvt)
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina{
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina TALLOC_CTX *tmp_ctx;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina struct override_group input = {NULL};
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina const char *dn;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina char *anchor;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina const char *filter;
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina errno_t ret;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina tmp_ctx = talloc_new(NULL);
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina if (tmp_ctx == NULL) {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed.\n");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ENOMEM;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina }
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = parse_cmdline_group_show(cmdline, tool_ctx, &input);
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina if (ret != EOK) {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse command line.\n");
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina goto done;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina }
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = get_group_domain_msg(tool_ctx, &input);
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina if (ret != EOK) {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get object domain\n");
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina goto done;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina }
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = get_object_dn(tmp_ctx, input.domain, SYSDB_MEMBER_GROUP,
26c722d568b0061e0f1edb8d07093bf051d76083Jakub Hrozek input.sysdb_name, NULL, &dn);
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina if (ret != EOK) {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get object dn\n");
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina goto done;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina }
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina anchor = build_anchor(tmp_ctx, dn);
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina if (anchor == NULL) {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = ENOMEM;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina goto done;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina }
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = sss_filter_sanitize(tmp_ctx, anchor, &anchor);
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina if (ret != EOK) {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = ENOMEM;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina goto done;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina }
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina filter = talloc_asprintf(tmp_ctx, "(%s=%s)",
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina SYSDB_OVERRIDE_ANCHOR_UUID, anchor);
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina if (filter == NULL) {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed\n");
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = ENOMEM;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina goto done;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina }
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = group_export(NULL, input.domain, false, filter);
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina if (ret != EOK) {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export groups\n");
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina goto done;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina }
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = EOK;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březinadone:
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina talloc_free(tmp_ctx);
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina}
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel 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
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");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ENOMEM;
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 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);
47ce713ef8c7b32f2ce19cc3ace8e88f123fafacPavel Březina ret = EIO;
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 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 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 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 goto done;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina ret = EOK;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinadone:
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina talloc_free(tmp_ctx);
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
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 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");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina ret = group_export(filename, tool_ctx->domains, true, NULL);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina if (ret != EOK) {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to export groups\n");
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return ret;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina }
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
e98ccef2609811186711b79d8ef5d0a4450ab6e0Pavel Březina return EOK;
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[] = {
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("user-add", 0, override_user_add),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("user-del", 0, override_user_del),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("user-find", 0, override_user_find),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("user-show", 0, override_user_show),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("user-import", 0, override_user_import),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("user-export", 0, override_user_export),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("group-add", 0, override_group_add),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("group-del", 0, override_group_del),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("group-find", 0, override_group_find),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("group-show", 0, override_group_show),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("group-import", 0, override_group_import),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_COMMAND_NOMSG("group-export", 0, override_group_export),
488b455f6b7881ec108a127840b1c1f1523d937fMichal Židek SSS_TOOL_LAST
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina };
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina return sss_tool_main(argc, argv, commands, NULL);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina}