diff options
Diffstat (limited to 'server/responder')
-rw-r--r-- | server/responder/common/responder_common.c | 71 | ||||
-rw-r--r-- | server/responder/nss/nsssrv.c | 83 | ||||
-rw-r--r-- | server/responder/nss/nsssrv.h | 9 | ||||
-rw-r--r-- | server/responder/nss/nsssrv_cmd.c | 36 |
4 files changed, 31 insertions, 168 deletions
diff --git a/server/responder/common/responder_common.c b/server/responder/common/responder_common.c index 74e03215..f532102f 100644 --- a/server/responder/common/responder_common.c +++ b/server/responder/common/responder_common.c @@ -319,85 +319,20 @@ failed: return EIO; } -/* domain names are case insensitive for now - * NOTE: this function is not utf-8 safe, - * only ASCII names for now */ -static int _domain_comparator(const void *key1, const void *key2) -{ - return strcasecmp((const char *)key1, (const char *)key2); -} - static int sss_init_domains(struct nss_ctx *nctx) { - char *path; - char **domains; - char *provider; TALLOC_CTX *tmp_ctx; - struct nss_domain_info *info; - int ret, i, c; + int ret; int retval; tmp_ctx = talloc_new(nctx); - ret = confdb_get_domains(nctx->cdb, tmp_ctx, &domains); + ret = confdb_get_domains(nctx->cdb, nctx, &nctx->domain_map); if (ret != EOK) { retval = ret; goto done; } - i = 0; - c = 0; - while (domains[i] != NULL) { - DEBUG(3, ("Adding domain %s to the map\n", domains[i])); - - path = talloc_asprintf(tmp_ctx, "config/domains/%s", domains[i]); - if (!path) { - retval = ENOMEM; - goto done; - } - - /* alloc on tmp_ctx, it will be stolen by btreemap_set_value */ - info = talloc_zero(tmp_ctx, struct nss_domain_info); - if (!info) { - retval = ENOMEM; - goto done; - } - - /* Build the basedn for this domain */ - info->basedn = talloc_asprintf(info, SYSDB_DOM_BASE, domains[i]); - DEBUG(3, ("BaseDN: %s\n", info->basedn)); - - ret = confdb_get_int(nctx->cdb, tmp_ctx, path, - "enumerate", false, &(info->enumerate)); - if (ret != EOK) { - DEBUG(0, ("Failed to fetch enumerate for [%s]!\n", domains[i])); - } - - ret = confdb_get_bool(nctx->cdb, tmp_ctx, path, - "legacy", false, &(info->legacy)); - if (ret != EOK) { - DEBUG(0, ("Failed to fetch legacy for [%s]!\n", domains[i])); - } - - ret = confdb_get_string(nctx->cdb, tmp_ctx, path, "provider", - NULL, &provider); - if (ret != EOK) { - DEBUG(0, ("Failed to fetch provider for [%s]!\n", domains[i])); - } - if (provider) info->has_provider = true; - - ret = btreemap_set_value(nctx, &nctx->domain_map, - domains[i], info, - _domain_comparator); - if (ret != EOK) { - DEBUG(1, ("Failed to store domain info, aborting!\n")); - retval = ret; - goto done; - } - - i++; - c++; - } - if (c == 0) { + if (nctx->domain_map == NULL) { /* No domains configured! * Note: this should never happen, since LOCAL should * always be configured */ diff --git a/server/responder/nss/nsssrv.c b/server/responder/nss/nsssrv.c index 2fbe3970..7c68ba19 100644 --- a/server/responder/nss/nsssrv.c +++ b/server/responder/nss/nsssrv.c @@ -49,7 +49,6 @@ static int service_identity(DBusMessage *message, struct sbus_conn_ctx *sconn); static int service_pong(DBusMessage *message, struct sbus_conn_ctx *sconn); static int service_reload(DBusMessage *message, struct sbus_conn_ctx *sconn); static int nss_init_domains(struct nss_ctx *nctx); -static int _domain_comparator(const void *key1, const void *key2); struct sbus_method nss_sbus_methods[] = { {SERVICE_METHOD_IDENTITY, service_identity}, @@ -392,93 +391,18 @@ failed: return EIO; } -/* domain names are case insensitive for now - * NOTE: this function is not utf-8 safe, - * only ASCII names for now */ -static int _domain_comparator(const void *key1, const void *key2) -{ - int ret; - - ret = strcasecmp((const char *)key1, (const char *)key2); - if (ret) { - /* special case LOCAL to be always the first domain */ - if (strcmp(key1, "LOCAL") == 0) return 1; - if (strcmp(key2, "LOCAL") == 0) return -1; - } - return ret; -} - static int nss_init_domains(struct nss_ctx *nctx) { - char *path; - char **domains; - char *provider; - TALLOC_CTX *tmp_ctx; - struct nss_domain_info *info; - int ret, i, c; + int ret; int retval; - tmp_ctx = talloc_new(nctx); - ret = confdb_get_domains(nctx->cdb, tmp_ctx, &domains); + ret = confdb_get_domains(nctx->cdb, nctx, &nctx->domain_map); if (ret != EOK) { retval = ret; goto done; } - i = 0; - c = 0; - while (domains[i] != NULL) { - DEBUG(3, ("Adding domain %s to the map\n", domains[i])); - - path = talloc_asprintf(tmp_ctx, "config/domains/%s", domains[i]); - if (!path) { - retval = ENOMEM; - goto done; - } - - /* alloc on tmp_ctx, it will be stolen by btreemap_set_value */ - info = talloc_zero(tmp_ctx, struct nss_domain_info); - if (!info) { - retval = ENOMEM; - goto done; - } - - /* Build the basedn for this domain */ - info->basedn = talloc_asprintf(info, SYSDB_DOM_BASE, domains[i]); - DEBUG(3, ("BaseDN: %s\n", info->basedn)); - - ret = confdb_get_int(nctx->cdb, tmp_ctx, path, - "enumerate", false, &(info->enumerate)); - if (ret != EOK) { - DEBUG(0, ("Failed to fetch enumerate for [%s]!\n", domains[i])); - } - - ret = confdb_get_bool(nctx->cdb, tmp_ctx, path, - "legacy", false, &(info->legacy)); - if (ret != EOK) { - DEBUG(0, ("Failed to fetch legacy for [%s]!\n", domains[i])); - } - - ret = confdb_get_string(nctx->cdb, tmp_ctx, path, "provider", - NULL, &provider); - if (ret != EOK) { - DEBUG(0, ("Failed to fetch provider for [%s]!\n", domains[i])); - } - if (provider) info->has_provider = true; - - ret = btreemap_set_value(nctx, &nctx->domain_map, - domains[i], info, - _domain_comparator); - if (ret != EOK) { - DEBUG(1, ("Failed to store domain info, aborting!\n")); - retval = ret; - goto done; - } - - i++; - c++; - } - if (c == 0) { + if (nctx->domain_map == NULL) { /* No domains configured! * Note: this should never happen, since LOCAL should * always be configured */ @@ -498,7 +422,6 @@ static int nss_init_domains(struct nss_ctx *nctx) retval = EOK; done: - talloc_free(tmp_ctx); return retval; } diff --git a/server/responder/nss/nsssrv.h b/server/responder/nss/nsssrv.h index 333e4281..1431dded 100644 --- a/server/responder/nss/nsssrv.h +++ b/server/responder/nss/nsssrv.h @@ -65,7 +65,7 @@ struct nss_ctx { int cache_timeout; struct sbus_method *sss_sbus_methods; - struct sss_cmd_table *sss_cmds; + struct sss_cmd_table *sss_cmds; const char *sss_pipe_name; const char *confdb_socket_path; struct sbus_method *dp_methods; @@ -81,13 +81,6 @@ struct cli_ctx { struct getent_ctx *gctx; }; -struct nss_domain_info { - char *basedn; - int enumerate; - bool has_provider; - bool legacy; -}; - struct nss_packet; struct cli_request { diff --git a/server/responder/nss/nsssrv_cmd.c b/server/responder/nss/nsssrv_cmd.c index 16146585..76da6e06 100644 --- a/server/responder/nss/nsssrv_cmd.c +++ b/server/responder/nss/nsssrv_cmd.c @@ -25,6 +25,7 @@ #include "responder/nss/nsssrv.h" #include "db/sysdb.h" #include <time.h> +#include "confdb/confdb.h" struct nss_cmd_ctx { struct cli_ctx *cctx; @@ -92,7 +93,7 @@ static int nss_parse_name(struct nss_dom_ctx *dctx, const char *fullname) { struct nss_cmd_ctx *cmdctx = dctx->cmdctx; struct nss_ctx *nctx = cmdctx->cctx->nctx; - struct nss_domain_info *info; + struct sss_domain_info *info; struct btreemap *domain_map; char *delim; char *domain; @@ -617,7 +618,7 @@ static int nss_cmd_getpwuid(struct cli_ctx *cctx) { struct nss_cmd_ctx *cmdctx; struct nss_dom_ctx *dctx; - struct nss_domain_info *info; + struct sss_domain_info *info; const char **domains; uint8_t *body; size_t blen; @@ -643,8 +644,10 @@ static int nss_cmd_getpwuid(struct cli_ctx *cctx) domains = NULL; num = 0; /* get domains list */ - btreemap_get_keys(cmdctx, cctx->nctx->domain_map, - (const void ***)&domains, &num); + ret = btreemap_get_keys(cmdctx, cctx->nctx->domain_map, + (const void ***)&domains, &num); + if (ret != EOK) + return ret; cmdctx->nr = num; @@ -797,7 +800,7 @@ static void nss_cmd_setpw_dp_callback(uint16_t err_maj, uint32_t err_min, static int nss_cmd_setpwent_ext(struct cli_ctx *cctx, bool immediate) { - struct nss_domain_info *info; + struct sss_domain_info *info; struct nss_cmd_ctx *cmdctx; struct nss_dom_ctx *dctx; struct getent_ctx *gctx; @@ -832,8 +835,11 @@ static int nss_cmd_setpwent_ext(struct cli_ctx *cctx, bool immediate) domains = NULL; num = 0; /* get domains list */ - btreemap_get_keys(cmdctx, cctx->nctx->domain_map, + ret = btreemap_get_keys(cmdctx, cctx->nctx->domain_map, (const void ***)&domains, &num); + if (ret != EOK) { + return ret; + } /* check if enumeration is enabled in any domain */ for (i = 0; i < num; i++) { @@ -1515,7 +1521,7 @@ static int nss_cmd_getgrgid(struct cli_ctx *cctx) { struct nss_cmd_ctx *cmdctx; struct nss_dom_ctx *dctx; - struct nss_domain_info *info; + struct sss_domain_info *info; const char **domains; uint8_t *body; size_t blen; @@ -1541,8 +1547,11 @@ static int nss_cmd_getgrgid(struct cli_ctx *cctx) domains = NULL; num = 0; /* get domains list */ - btreemap_get_keys(cmdctx, cctx->nctx->domain_map, - (const void ***)&domains, &num); + ret = btreemap_get_keys(cmdctx, cctx->nctx->domain_map, + (const void ***)&domains, &num); + if (ret != EOK) { + return ret; + } cmdctx->nr = num; @@ -1693,7 +1702,7 @@ static void nss_cmd_setgr_dp_callback(uint16_t err_maj, uint32_t err_min, static int nss_cmd_setgrent_ext(struct cli_ctx *cctx, bool immediate) { - struct nss_domain_info *info; + struct sss_domain_info *info; struct nss_cmd_ctx *cmdctx; struct nss_dom_ctx *dctx; struct getent_ctx *gctx; @@ -1728,8 +1737,11 @@ static int nss_cmd_setgrent_ext(struct cli_ctx *cctx, bool immediate) domains = NULL; num = 0; /* get domains list */ - btreemap_get_keys(cmdctx, cctx->nctx->domain_map, - (const void ***)&domains, &num); + ret = btreemap_get_keys(cmdctx, cctx->nctx->domain_map, + (const void ***)&domains, &num); + if(ret != EOK) { + return ret; + } /* check if enumeration is enabled in any domain */ for (i = 0; i < num; i++) { |