summaryrefslogtreecommitdiff
path: root/server/responder
diff options
context:
space:
mode:
Diffstat (limited to 'server/responder')
-rw-r--r--server/responder/common/responder_common.c71
-rw-r--r--server/responder/nss/nsssrv.c83
-rw-r--r--server/responder/nss/nsssrv.h9
-rw-r--r--server/responder/nss/nsssrv_cmd.c36
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++) {