summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSumit Bose <sbose@redhat.com>2012-10-11 12:35:32 +0200
committerJakub Hrozek <jhrozek@redhat.com>2012-10-12 16:42:17 +0200
commit70eaade10feedd7845e39170d0b7eebf3a030af1 (patch)
tree5c78acb29cdbc356ec5621210400dbe3661a411e
parent1774ee9a61b9d691dadd1a0538f32bcdcc84f72f (diff)
downloadsssd-70eaade10feedd7845e39170d0b7eebf3a030af1.tar.gz
sssd-70eaade10feedd7845e39170d0b7eebf3a030af1.tar.bz2
sssd-70eaade10feedd7845e39170d0b7eebf3a030af1.zip
Allow extdom exop to return flat domain name as well
There are case where the extdom extended operation will return the flat or NetBIOS name of a domain instead of the DNS domain name. If this name is available for the current domain we accept it as well. Related to https://fedorahosted.org/sssd/ticket/1561
-rw-r--r--src/providers/ipa/ipa_s2n_exop.c10
-rw-r--r--src/providers/ipa/ipa_subdomains.c24
-rw-r--r--src/providers/ipa/ipa_subdomains.h3
-rw-r--r--src/providers/ipa/ipa_subdomains_id.c4
4 files changed, 37 insertions, 4 deletions
diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
index 26cb0aad..a96304d4 100644
--- a/src/providers/ipa/ipa_s2n_exop.c
+++ b/src/providers/ipa/ipa_s2n_exop.c
@@ -599,10 +599,14 @@ static void ipa_s2n_get_user_done(struct tevent_req *subreq)
goto done;
}
- if (strcasecmp(state->dom->name, attrs->domain_name) != 0) {
+ if (!(strcasecmp(state->dom->name, attrs->domain_name) == 0 ||
+ (state->dom->flat_name != NULL &&
+ strcasecmp(state->dom->flat_name, attrs->domain_name) == 0))) {
DEBUG(SSSDBG_OP_FAILURE, ("Unexpected domain name returned, "
- "expected [%s], got [%s].\n",
- state->dom->name, attrs->domain_name));
+ "expected [%s] or [%s], got [%s].\n",
+ state->dom->name,
+ state->dom->flat_name == NULL ? "" : state->dom->flat_name,
+ attrs->domain_name));
ret = EINVAL;
goto done;
}
diff --git a/src/providers/ipa/ipa_subdomains.c b/src/providers/ipa/ipa_subdomains.c
index 1da2b8cd..36ffafd9 100644
--- a/src/providers/ipa/ipa_subdomains.c
+++ b/src/providers/ipa/ipa_subdomains.c
@@ -80,6 +80,30 @@ struct ipa_subdomains_ctx {
struct sysdb_subdom *subdoms;
};
+const char *get_flat_name_from_subdomain_name(struct be_ctx *be_ctx,
+ const char *name)
+{
+ size_t c;
+ struct ipa_subdomains_ctx *ctx;
+
+ ctx = talloc_get_type(be_ctx->bet_info[BET_SUBDOMAINS].pvt_bet_data,
+ struct ipa_subdomains_ctx);
+ if (ctx == NULL) {
+ DEBUG(SSSDBG_TRACE_ALL, ("Subdomains are not configured.\n"));
+ return NULL;
+ }
+
+ for (c = 0; c < ctx->num_subdoms; c++) {
+ if (strcasecmp(ctx->subdoms[c].name, name) == 0 ||
+ (ctx->subdoms[c].flat_name != NULL &&
+ strcasecmp(ctx->subdoms[c].flat_name, name) == 0)) {
+ return ctx->subdoms[c].flat_name;
+ }
+ }
+
+ return NULL;
+}
+
static void ipa_subdomains_reply(struct be_req *be_req, int dp_err, int result)
{
if (be_req) {
diff --git a/src/providers/ipa/ipa_subdomains.h b/src/providers/ipa/ipa_subdomains.h
index 9d24bccf..35b42b41 100644
--- a/src/providers/ipa/ipa_subdomains.h
+++ b/src/providers/ipa/ipa_subdomains.h
@@ -28,6 +28,9 @@
#include "providers/dp_backend.h"
#include "providers/ipa/ipa_common.h"
+const char *get_flat_name_from_subdomain_name(struct be_ctx *be_ctx,
+ const char *name);
+
int ipa_subdom_init(struct be_ctx *be_ctx,
struct ipa_id_ctx *id_ctx,
struct bet_ops **ops,
diff --git a/src/providers/ipa/ipa_subdomains_id.c b/src/providers/ipa/ipa_subdomains_id.c
index eed8170c..5a4ab40b 100644
--- a/src/providers/ipa/ipa_subdomains_id.c
+++ b/src/providers/ipa/ipa_subdomains_id.c
@@ -30,6 +30,7 @@
#include "providers/ldap/ldap_common.h"
#include "providers/ldap/sdap_async.h"
#include "providers/ipa/ipa_id.h"
+#include "providers/ipa/ipa_subdomains.h"
struct ipa_user_get_state {
struct tevent_context *ev;
@@ -74,7 +75,8 @@ struct tevent_req *ipa_get_subdomain_account_info_send(TALLOC_CTX *memctx,
}
state->domain = new_subdomain(state, state->ctx->be->domain, ar->domain,
- NULL, NULL);
+ get_flat_name_from_subdomain_name(ctx->be,ar->domain),
+ NULL);
if (state->domain == NULL) {
DEBUG(SSSDBG_OP_FAILURE, ("new_subdomain failed.\n"));
ret = ENOMEM;