diff --git a/lib/api/kolab_api_service_form_value.php b/lib/api/kolab_api_service_form_value.php --- a/lib/api/kolab_api_service_form_value.php +++ b/lib/api/kolab_api_service_form_value.php @@ -1594,6 +1594,12 @@ return $valid; } + /** + * Lists the valid domains given a primary domain name space. + * + * Includes the parent domain and any alias or child domains. + * Considers domains that point to the same base dn to be child domains. + */ private function _get_valid_domains($my_primary_domain = null) { $my_primary_domain = $my_primary_domain !== null @@ -1604,10 +1610,11 @@ $conf = Conf::get_instance(); $all_domains = $auth->list_domains(); $all_domains = $all_domains['list']; + $all_basedns = Array(); $dna = $conf->get('domain_name_attribute'); + $dra = $conf->get('domain_rootdn_attribute'); - Log::trace("__get_valid_domains( " . $my_primary_domain . ")"); - Log::trace("\$all_domains includes: " . var_export($all_domains, TRUE) . " (must include domain for \$my_primary_domain)"); + Log::trace("_get_valid_domains(" . $my_primary_domain . ")"); $valid_domains = $my_primary_domain ? array($my_primary_domain) : array(); foreach ($all_domains as $domain_id => $domain_attrs) { @@ -1618,9 +1625,27 @@ if (in_array($my_primary_domain, $domain_attrs[$dna])) { $valid_domains = array_merge($valid_domains, $domain_attrs[$dna]); } + + if (array_key_exists($dra, $domain_attrs)) { + if (array_key_exists($domain_attrs[$dra], $all_basedns)) { + $all_basedns[$domain_attrs[$dra]] = array_merge($all_basedns[$domain_attrs[$dra]], $domain_attrs[$dna]); + } else { + $all_basedns[$domain_attrs[$dra]] = $domain_attrs[$dna]; + } + } } - return array_unique($valid_domains); + foreach ($all_basedns as $base_dn => $domains) { + if (in_array($my_primary_domain, $domains)) { + $valid_domains = array_merge($valid_domains, $domains); + } + } + + $result = array_unique($valid_domains); + + Log::trace("_get_valid_domains result: " . var_export($result, TRUE)); + + return array_unique($result); } private function _validate_email_address_in_any_of_my_domains($mail_address)