cache_req_domain.c revision dae798231fc2c575f213785768bc24ed765ba243
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/*
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen Authors:
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen Fabiano FidĂȘncio <fidencio@redhat.com>
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen Copyright (C) 2017 Red Hat
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen This program is free software; you can redistribute it and/or modify
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen it under the terms of the GNU General Public License as published by
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen the Free Software Foundation; either version 3 of the License, or
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen (at your option) any later version.
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen This program is distributed in the hope that it will be useful,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen GNU General Public License for more details.
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen You should have received a copy of the GNU General Public License
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen*/
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen#include "responder/common/cache_req/cache_req_domain.h"
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainenstruct cache_req_domain *
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainencache_req_domain_get_domain_by_name(struct cache_req_domain *domains,
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen const char *name)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen struct cache_req_domain *dom;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen struct cache_req_domain *ret = NULL;
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen DLIST_FOR_EACH(dom, domains) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (sss_domain_get_state(dom->domain) == DOM_DISABLED) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen continue;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (strcasecmp(dom->domain->name, name) == 0 ||
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen (dom->domain->flat_name != NULL &&
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen strcasecmp(dom->domain->flat_name, name) == 0)) {
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen ret = dom;
9224645cf699abae90fdd2cdf54247444f7acc18Timo Sirainen break;
9522aa5f33cc37fe8ccd0d647cc51dd3ba6a9b55Timo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (ret == NULL) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, "Unknown domains [%s].\n", name);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return ret;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid cache_req_domain_list_zfree(struct cache_req_domain **cr_domains)
5a530f778cc3eae05e70d13b8e5d7d501e7ba0b3Timo Sirainen{
5a530f778cc3eae05e70d13b8e5d7d501e7ba0b3Timo Sirainen struct cache_req_domain *p, *q, *r;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen DLIST_FOR_EACH_SAFE(p, q, *cr_domains) {
fe7f9298fb789717d26dc4cb6317a9d376acd8fcTimo Sirainen r = p;
3574bab52a67dfe1291f6306e707c6199e777043Timo Sirainen DLIST_REMOVE(*cr_domains, p);
3574bab52a67dfe1291f6306e707c6199e777043Timo Sirainen talloc_zfree(r);
3574bab52a67dfe1291f6306e707c6199e777043Timo Sirainen }
5a5b39ce7c6ba6d6ff2218ae1679e0485bf43b47Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen *cr_domains = NULL;
5c8dec7f648cb0de2293a13265873baa640aa0cfTimo Sirainen}
5c8dec7f648cb0de2293a13265873baa640aa0cfTimo Sirainen
5c8dec7f648cb0de2293a13265873baa640aa0cfTimo Sirainenstatic bool
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainencache_req_domain_use_fqnames(struct sss_domain_info *domain,
fe7f9298fb789717d26dc4cb6317a9d376acd8fcTimo Sirainen bool enforce_non_fqnames)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen{
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen struct sss_domain_info *head;
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen head = get_domains_head(domain);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen /*
4bc4042782c465636eff2c713bc85f5a1d773d91Timo Sirainen * In order to decide whether fully_qualified_names must be used on the
4bc4042782c465636eff2c713bc85f5a1d773d91Timo Sirainen * lookups we have to take into consideration:
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen * - use_fully_qualified_name value of the head of the domains;
d8a93844f0b25be82da9c0ab79c321c110f5fb5fTimo Sirainen * (head->fqnames)
9a656df90290a5fef45b3a1191ae75864f17602dTimo Sirainen * - the presence of a domains' resolution order list;
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen * (non_fqnames_enforced)
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen *
468c28dfb03613ab8d487b5aebc985a969193aceTimo Sirainen * The relationship between those two can be described by:
dfbd56c81cb8fb7fe70393c4682cc99e68fe06b6Timo Sirainen * - head->fqnames:
dfbd56c81cb8fb7fe70393c4682cc99e68fe06b6Timo Sirainen * - true: in this case doesn't matter whether it's enforced or not,
dfbd56c81cb8fb7fe70393c4682cc99e68fe06b6Timo Sirainen * fully-qualified-names will _always_ be used
dfbd56c81cb8fb7fe70393c4682cc99e68fe06b6Timo Sirainen * - false: in this case (which is also the default case), the usage
9054b5f92a7e5666c6beaa04916699a1408bf021Timo Sirainen * depends on it being enforced;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen *
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * - enforce_non_fqnames:
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * - true: in this case, the usage of fully-qualified-names is not
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * needed;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen * - false: in this case, the usage of fully-qualified-names will be
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen * done accordingly to what's set for the domain itself.
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen */
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen switch (head->fqnames) {
eb209d12e3b1cfed564c35cf19fdb1bf7fcc6811Timo Sirainen case true:
eb209d12e3b1cfed564c35cf19fdb1bf7fcc6811Timo Sirainen return true;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case false:
312213260e384239ac93c77951c2f1f5f3d3611eTimo Sirainen switch (enforce_non_fqnames) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen case true:
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen return false;
7fd22d5521c8ecf84c40fbef553e70bf2553a663Timo Sirainen case false:
ee3362f3b78827a2c9a7e9ddee83f5a429c06213Timo Sirainen return domain->fqnames;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen }
9224645cf699abae90fdd2cdf54247444f7acc18Timo Sirainen }
9224645cf699abae90fdd2cdf54247444f7acc18Timo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic struct cache_req_domain *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainencache_req_domain_new_list_from_string_list(TALLOC_CTX *mem_ctx,
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen struct sss_domain_info *domains,
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen char **resolution_order)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct cache_req_domain *cr_domains = NULL;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct cache_req_domain *cr_domain;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct sss_domain_info *dom;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen char *name;
6cb8e7d726a7e9d157e87fb379982d52100b283fTimo Sirainen int flag = SSS_GND_ALL_DOMAINS;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int i;
1f7f4294207557edf83171642ef62ce4922ffc9dTimo Sirainen bool enforce_non_fqnames = false;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen errno_t ret;
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen if (resolution_order != NULL) {
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen enforce_non_fqnames = true;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen for (i = 0; resolution_order[i] != NULL; i++) {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen name = resolution_order[i];
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen for (dom = domains; dom; dom = get_next_domain(dom, flag)) {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen if (strcasecmp(name, dom->name) != 0) {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen continue;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen }
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen cr_domain = talloc_zero(mem_ctx, struct cache_req_domain);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen if (cr_domain == NULL) {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen ret = ENOMEM;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen goto done;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen cr_domain->domain = dom;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen cr_domain->fqnames =
312213260e384239ac93c77951c2f1f5f3d3611eTimo Sirainen cache_req_domain_use_fqnames(dom, enforce_non_fqnames);
a9ade104616bbb81c34cc6f8bfde5dab0571afacTimo Sirainen
d3ee83b4c24529fac4be5c1f30e254295e7addd9Timo Sirainen DLIST_ADD_END(cr_domains, cr_domain,
d3ee83b4c24529fac4be5c1f30e254295e7addd9Timo Sirainen struct cache_req_domain *);
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen break;
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen }
06fc82430569125dccb8cd20e122e77b44698c7eTimo Sirainen }
d3ee83b4c24529fac4be5c1f30e254295e7addd9Timo Sirainen }
d3ee83b4c24529fac4be5c1f30e254295e7addd9Timo Sirainen
eb209d12e3b1cfed564c35cf19fdb1bf7fcc6811Timo Sirainen for (dom = domains; dom; dom = get_next_domain(dom, flag)) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (string_in_list(dom->name, resolution_order, false)) {
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen continue;
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen }
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen cr_domain = talloc_zero(mem_ctx, struct cache_req_domain);
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen if (cr_domain == NULL) {
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen ret = ENOMEM;
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen goto done;
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen }
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen cr_domain->domain = dom;
4847d74a7442a3efabe76a8ad18dd464082d6581Timo Sirainen cr_domain->fqnames =
34115224152b94328ffe3ec4ff4f30927c8f9aa1Timo Sirainen cache_req_domain_use_fqnames(dom, enforce_non_fqnames);
34115224152b94328ffe3ec4ff4f30927c8f9aa1Timo Sirainen
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen DLIST_ADD_END(cr_domains, cr_domain, struct cache_req_domain *);
98d5941dc28754f32432edc38578b946ba71dd0bTimo Sirainen }
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen ret = EOK;
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainendone:
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen if (ret != EOK) {
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen cache_req_domain_list_zfree(&cr_domains);
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen }
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainen
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainen return cr_domains;
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainen}
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainen
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainenerrno_t
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainencache_req_domain_new_list_from_domain_resolution_order(
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainen TALLOC_CTX *mem_ctx,
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainen struct sss_domain_info *domains,
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainen const char *domain_resolution_order,
8a513c80e95a51c29f5af5c702fbf71ecbad41f4Timo Sirainen struct cache_req_domain **_cr_domains)
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen{
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen TALLOC_CTX *tmp_ctx;
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen struct cache_req_domain *cr_domains;
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen char **list = NULL;
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen errno_t ret;
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen tmp_ctx = talloc_new(NULL);
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen if (tmp_ctx == NULL) {
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen return ENOMEM;
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (domain_resolution_order != NULL) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (strcmp(domain_resolution_order, ":") != 0) {
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen ret = split_on_separator(tmp_ctx, domain_resolution_order, ':',
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen true, true, &list, NULL);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen if (ret != EOK) {
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen DEBUG(SSSDBG_MINOR_FAILURE,
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen "split_on_separator() failed [%d]: [%s].\n",
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen ret, sss_strerror(ret));
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen goto done;
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen }
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen }
6ccc7f584c832a3212d70952881cb0eb2d6e2cb9Timo Sirainen }
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen cr_domains = cache_req_domain_new_list_from_string_list(mem_ctx, domains,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen list);
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen if (cr_domains == NULL) {
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen ret = ENOMEM;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen DEBUG(SSSDBG_OP_FAILURE,
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen "cache_req_domain_new_list_from_domain_resolution_order() "
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen "failed [%d]: [%s].\n",
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen ret, sss_strerror(ret));
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen goto done;
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen }
1ef9754a5169dc886d15089e59b45a7017d647d7Timo Sirainen
d3ee83b4c24529fac4be5c1f30e254295e7addd9Timo Sirainen *_cr_domains = cr_domains;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ret = EOK;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainendone:
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen talloc_free(tmp_ctx);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen return ret;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen