summaryrefslogtreecommitdiffstats
path: root/server/tools/sss_useradd.c
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2009-07-27 09:49:45 +0200
committerStephen Gallagher <sgallagh@redhat.com>2009-08-05 10:19:20 -0400
commit1f6d7dfad2956cb2f6c33104eda4fdbefe380a42 (patch)
tree3763e4fd1cfe233bbdcd342b26545577f141273e /server/tools/sss_useradd.c
parenta5fe74914ab920bfaed87c046c525ee7148623f2 (diff)
downloadsssd-1f6d7dfad2956cb2f6c33104eda4fdbefe380a42.tar.gz
sssd-1f6d7dfad2956cb2f6c33104eda4fdbefe380a42.tar.xz
sssd-1f6d7dfad2956cb2f6c33104eda4fdbefe380a42.zip
Parse fully qualified names in tools
Allow adding users into different domains not only by specifying ID directly but also by specifying fully qualified name. Exit when both specifications are used in conflict.
Diffstat (limited to 'server/tools/sss_useradd.c')
-rw-r--r--server/tools/sss_useradd.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/server/tools/sss_useradd.c b/server/tools/sss_useradd.c
index 22698e6f3..35dcee760 100644
--- a/server/tools/sss_useradd.c
+++ b/server/tools/sss_useradd.c
@@ -327,6 +327,7 @@ int main(int argc, const char **argv)
char *pc_shell = NULL;
char *basedir = NULL;
int pc_debug = 0;
+ const char *pc_username = NULL;
struct poptOption long_options[] = {
POPT_AUTOHELP
{ "debug", '\0', POPT_ARG_INT | POPT_ARGFLAG_DOC_HIDDEN, &pc_debug, 0, _("The debug level to run with"), NULL },
@@ -401,13 +402,19 @@ int main(int argc, const char **argv)
}
/* username is an argument without --option */
- data->name = poptGetArg(pc);
- if (data->name == NULL) {
+ pc_username = poptGetArg(pc);
+ if (pc_username == NULL) {
usage(pc, (_("Specify user to add\n")));
ret = EXIT_FAILURE;
goto fini;
}
+ ret = parse_name_domain(data, pc_username);
+ if (ret != EOK) {
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+
/* Same as shadow-utils useradd, -g can specify gid or group name */
if (pc_group != NULL) {
ret = get_gid(data, pc_group);
@@ -470,14 +477,28 @@ int main(int argc, const char **argv)
}
/* arguments processed, go on to actual work */
- ret = find_domain_for_id(ctx, data->uid, &dom);
+ ret = get_domain_by_id(data->ctx, data->uid, &dom);
+ if (ret != EOK) {
+ ERROR("Cannot get domain info\n");
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+ if (data->domain && data->uid && data->domain != dom) {
+ ERROR("Selected domain %s conflicts with selected UID %llu\n",
+ data->domain->name, (unsigned long long int) data->uid);
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+ if (data->domain == NULL && dom) {
+ data->domain = dom;
+ }
+
+ ret = get_domain_type(data->ctx, data->domain);
switch (ret) {
case ID_IN_LOCAL:
- data->domain = dom;
break;
case ID_IN_LEGACY_LOCAL:
- data->domain = dom;
case ID_OUTSIDE:
ret = useradd_legacy(data, groups);
if(ret != EOK) {
@@ -492,7 +513,7 @@ int main(int argc, const char **argv)
goto fini;
default:
- DEBUG(1, ("Unknown return code %d from find_domain_for_id\n", ret));
+ DEBUG(1, ("Unknown return code %d from get_domain_type\n", ret));
ERROR("Error looking up domain\n");
ret = EXIT_FAILURE;
goto fini;