summaryrefslogtreecommitdiffstats
path: root/src/responder/sudo/sudosrv_cache.c
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2012-02-22 16:41:45 +0100
committerStephen Gallagher <sgallagh@redhat.com>2012-02-23 20:53:40 -0500
commit6005a2814979262e505cc5357fc6260604214cd7 (patch)
tree6370857eb0e1b39c5b51e03a13c034b1f2a7ff04 /src/responder/sudo/sudosrv_cache.c
parent436e9f8fcc2759cc32f5c8af85bd5d14dc1a78d0 (diff)
downloadsssd-6005a2814979262e505cc5357fc6260604214cd7.tar.gz
sssd-6005a2814979262e505cc5357fc6260604214cd7.tar.xz
sssd-6005a2814979262e505cc5357fc6260604214cd7.zip
Honor case_sensitive option in sudo responder
https://fedorahosted.org/sssd/ticket/1205
Diffstat (limited to 'src/responder/sudo/sudosrv_cache.c')
-rw-r--r--src/responder/sudo/sudosrv_cache.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/src/responder/sudo/sudosrv_cache.c b/src/responder/sudo/sudosrv_cache.c
index a3a13cadf..ee44a5ad6 100644
--- a/src/responder/sudo/sudosrv_cache.c
+++ b/src/responder/sudo/sudosrv_cache.c
@@ -266,11 +266,23 @@ errno_t sudosrv_cache_lookup(hash_table_t *table,
struct sysdb_attrs ***rules)
{
struct sss_domain_info *domain = dctx->domain;
+ char *name = NULL;
errno_t ret;
if (!check_next) {
- return sudosrv_cache_lookup_internal(table, dctx->domain, username,
- num_rules, rules);
+ if (username != NULL) {
+ name = sss_get_cased_name(NULL, username,
+ dctx->domain->case_sensitive);
+ if (name == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory\n"));
+ ret = ENOMEM;
+ goto done;
+ }
+ }
+
+ ret = sudosrv_cache_lookup_internal(table, dctx->domain, name,
+ num_rules, rules);
+ goto done;
}
while (domain != NULL) {
@@ -279,15 +291,26 @@ errno_t sudosrv_cache_lookup(hash_table_t *table,
continue;
}
- ret = sudosrv_cache_lookup_internal(table, domain, username,
+ if (username != NULL) {
+ talloc_free(name);
+ name = sss_get_cased_name(NULL, username,
+ dctx->domain->case_sensitive);
+ if (name == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory\n"));
+ ret = ENOMEM;
+ goto done;
+ }
+ }
+
+ ret = sudosrv_cache_lookup_internal(table, domain, name,
num_rules, rules);
if (ret == EOK) {
/* user is in this domain */
dctx->domain = domain;
- return ret;
+ goto done;
} else if (ret != ENOENT) {
/* error */
- return ret;
+ goto done;
}
/* user is not in this domain cache, check next */
@@ -295,5 +318,9 @@ errno_t sudosrv_cache_lookup(hash_table_t *table,
}
/* user is not in cache */
- return ENOENT;
+ ret = ENOENT;
+
+done:
+ talloc_free(name);
+ return ret;
}