From a9057bbc6287c2f916285566ef73f2f35542a538 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Fri, 3 Jul 2009 14:34:47 +0200 Subject: [PATCH] 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/po/POTFILES.in | 1 + 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 ++++++++++++ 9 files changed, 99 insertions(+), 4 deletions(-) diff --git a/server/po/POTFILES.in b/server/po/POTFILES.in index 8de37f6..3f3e10a 100644 --- a/server/po/POTFILES.in +++ b/server/po/POTFILES.in @@ -4,6 +4,7 @@ tools/sss_groupdel.c tools/sss_groupmod.c tools/sss_userdel.c tools/tools_util.c +tools/tools_util.h tools/sss_useradd.c tools/sss_groupadd.c tools/sss_usermod.c diff --git a/server/tools/sss_groupadd.c b/server/tools/sss_groupadd.c index 685de6f..f72bae1 100644 --- a/server/tools/sss_groupadd.c +++ b/server/tools/sss_groupadd.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -135,6 +136,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 fa23ea8..f89bbd0 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" @@ -127,6 +128,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 9bc3ef6..891ecbc 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" @@ -254,6 +255,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 5ee0116..8cb9e80 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" @@ -337,6 +338,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 90dfdaf..85112dd 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" @@ -126,6 +127,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 d34a6c7..57d5fc1 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" @@ -323,6 +324,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 d15a1a7..cc711d9 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; + 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 7c66c11..0520731 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__ */ -- 1.6.2.5