From e1fdffdf9e94dee7de479c155188b80fd41dbcc8 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Fri, 3 Jul 2009 14:34:47 +0200 Subject: Check for root before initializing Also move setting locale to separate function to be called before anything else to make sure the "Not root" message would be localized. --- server/tools/sss_groupadd.c | 10 ++++++++++ server/tools/sss_groupdel.c | 10 ++++++++++ server/tools/sss_groupmod.c | 10 ++++++++++ server/tools/sss_useradd.c | 10 ++++++++++ server/tools/sss_userdel.c | 10 ++++++++++ server/tools/sss_usermod.c | 10 ++++++++++ server/tools/tools_util.c | 30 ++++++++++++++++++++++++++---- server/tools/tools_util.h | 12 ++++++++++++ 8 files changed, 98 insertions(+), 4 deletions(-) (limited to 'server/tools') diff --git a/server/tools/sss_groupadd.c b/server/tools/sss_groupadd.c index ea7320161..705056712 100644 --- a/server/tools/sss_groupadd.c +++ b/server/tools/sss_groupadd.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -176,6 +177,15 @@ int main(int argc, const char **argv) debug_prg_name = argv[0]; + ret = set_locale(); + if (ret != EOK) { + DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret))); + ERROR("Error setting the locale\n"); + ret = EXIT_FAILURE; + goto fini; + } + CHECK_ROOT(ret, debug_prg_name); + ret = init_sss_tools(&ctx); if(ret != EOK) { DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret))); diff --git a/server/tools/sss_groupdel.c b/server/tools/sss_groupdel.c index 194285c97..50ed112a8 100644 --- a/server/tools/sss_groupdel.c +++ b/server/tools/sss_groupdel.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "db/sysdb.h" #include "util/util.h" @@ -171,6 +172,15 @@ int main(int argc, const char **argv) debug_prg_name = argv[0]; + ret = set_locale(); + if (ret != EOK) { + DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret))); + ERROR("Error setting the locale\n"); + ret = EXIT_FAILURE; + goto fini; + } + CHECK_ROOT(ret, debug_prg_name); + ret = init_sss_tools(&ctx); if(ret != EOK) { DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret))); diff --git a/server/tools/sss_groupmod.c b/server/tools/sss_groupmod.c index cc7665d9d..30f8e54b2 100644 --- a/server/tools/sss_groupmod.c +++ b/server/tools/sss_groupmod.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "util/util.h" #include "db/sysdb.h" @@ -349,6 +350,15 @@ int main(int argc, const char **argv) debug_prg_name = argv[0]; + ret = set_locale(); + if (ret != EOK) { + DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret))); + ERROR("Error setting the locale\n"); + ret = EXIT_FAILURE; + goto fini; + } + CHECK_ROOT(ret, debug_prg_name); + ret = init_sss_tools(&ctx); if (ret != EOK) { DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret))); diff --git a/server/tools/sss_useradd.c b/server/tools/sss_useradd.c index ed9974fe8..e78e11cd5 100644 --- a/server/tools/sss_useradd.c +++ b/server/tools/sss_useradd.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "util/util.h" #include "db/sysdb.h" @@ -391,6 +392,15 @@ int main(int argc, const char **argv) debug_prg_name = argv[0]; + ret = set_locale(); + if (ret != EOK) { + DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret))); + ERROR("Error setting the locale\n"); + ret = EXIT_FAILURE; + goto fini; + } + CHECK_ROOT(ret, debug_prg_name); + ret = init_sss_tools(&ctx); if (ret != EOK) { DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret))); diff --git a/server/tools/sss_userdel.c b/server/tools/sss_userdel.c index bb0673b0a..857057fd4 100644 --- a/server/tools/sss_userdel.c +++ b/server/tools/sss_userdel.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "db/sysdb.h" #include "util/util.h" @@ -172,6 +173,15 @@ int main(int argc, const char **argv) debug_prg_name = argv[0]; + ret = set_locale(); + if (ret != EOK) { + DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret))); + ERROR("Error setting the locale\n"); + ret = EXIT_FAILURE; + goto fini; + } + CHECK_ROOT(ret, debug_prg_name); + ret = init_sss_tools(&ctx); if(ret != EOK) { DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret))); diff --git a/server/tools/sss_usermod.c b/server/tools/sss_usermod.c index 521c52645..1b1478af2 100644 --- a/server/tools/sss_usermod.c +++ b/server/tools/sss_usermod.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "util/util.h" #include "db/sysdb.h" @@ -406,6 +407,15 @@ int main(int argc, const char **argv) debug_prg_name = argv[0]; + ret = set_locale(); + if (ret != EOK) { + DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret))); + ERROR("Error setting the locale\n"); + ret = EXIT_FAILURE; + goto fini; + } + CHECK_ROOT(ret, debug_prg_name); + ret = init_sss_tools(&ctx); if (ret != EOK) { DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret))); diff --git a/server/tools/tools_util.c b/server/tools/tools_util.c index d15a1a78d..0d3220ee4 100644 --- a/server/tools/tools_util.c +++ b/server/tools/tools_util.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "util/util.h" #include "confdb/confdb.h" @@ -228,13 +229,33 @@ int parse_groups(TALLOC_CTX *mem_ctx, const char *optstr, char ***_out) return EOK; } +int set_locale(void) +{ + char *c; + + c = setlocale(LC_ALL, ""); + if (c == NULL) { + return EIO; + } + + errno = 0; + c = bindtextdomain(PACKAGE, LOCALEDIR); + if (c == NULL) { + return errno; + } + + errno = 0; + c = textdomain(PACKAGE); + if (c == NULL) { + return errno; + } + + return EOK; +} + int init_sss_tools(struct tools_ctx **ctx) { int ret; - /* Set up LOCALE */ - setlocale (LC_ALL, ""); - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); /* Connect to the database */ ret = setup_db(ctx); @@ -248,3 +269,4 @@ int init_sss_tools(struct tools_ctx **ctx) fini: return ret; } + diff --git a/server/tools/tools_util.h b/server/tools/tools_util.h index 7c66c119d..0520731ad 100644 --- a/server/tools/tools_util.h +++ b/server/tools/tools_util.h @@ -22,6 +22,16 @@ } \ } while(0) +#define CHECK_ROOT(val, prg_name) do { \ + val = getuid(); \ + if (val != 0) { \ + DEBUG(1, ("Running under %d, must be root\n", val)); \ + ERROR("%s must be run as root\n", prg_name); \ + val = EXIT_FAILURE; \ + goto fini; \ + } \ +} while(0) + enum id_domain { ID_IN_LOCAL = 0, ID_IN_LEGACY_LOCAL, @@ -50,4 +60,6 @@ enum id_domain find_domain_for_id(struct tools_ctx *ctx, uint32_t id, struct sss_domain_info **dom_ret); +int set_locale(void); + #endif /* __TOOLS_UTIL_H__ */ -- cgit