Hi Ian,
That hack is indeed present in OpenSolaris. I can confirm the below
patch is working 100%. Will it be merged into autofs5?
Thx,
*nail
Ian Kent wrote:
> On Tue, 2007-08-14 at 17:44 -0500, Wolfe, Allan wrote:
>> Good question.
>>
>> I spent some time testing today. They only test box I could quickly
>> test on was a Solaris 8 with patch 108993-36 applied that affects
>> autofs, NSS, PAM, ldapclient and associated user utilities (this patch
>> is quite old --> current is 108993-67).
>>
>> The results were quite surprising as I distinctly remember having to
>> insert those delimited cn entries for the benefit of Solaris back 3
>> years ago when we integrated LDAP into our enterprise. Bottom line, I
>> see that a delimited entry is seemingly no longer needed. No matter
>> what the test case that was run, the cn as described in the dn prevailed
>> by default to appear as the stub. Oddly, when accessing a mount
>> directly pathed as an alternate cn, it would mount and appear in that
>> form. Here are notes from my testing below:
>
> But you guys confirmed that the % hack is present in OpenSolaris so
> perhaps the patch below will provide the behavior we need.
>
> Could someone try this patch out please.
>
> ---
> diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
> index de8d515..7cb4e58 100644
> --- a/modules/lookup_ldap.c
> +++ b/modules/lookup_ldap.c
> @@ -1226,34 +1226,50 @@ static int read_one_map(struct autofs_point *ap,
> * value.
> */
> count = ldap_count_values_len(bvKey);
> - if (count > 2) {
> - error(ap->logopt,
> - MODPREFIX
> - "key %.*s has duplicate entries - ignoring",
> - bvKey[0]->bv_len, bvKey[0]->bv_val);
> - goto next;
> - } else if (count == 2) {
> + if (count > 1) {
> unsigned int i;
>
> /* Check for the "/" and "*" and use as "/" if found */
> for (i = 0; i < count; i++) {
> - /* check for wildcard */
> - if (bvKey[i]->bv_len != 1)
> - continue;
> - if (*bvKey[i]->bv_val != '/' &&
> - *bvKey[i]->bv_val != '*')
> + bvKey[i]->bv_val[bvKey[i]->bv_len] = '\0';
> +
> + /*
> + * If multiple entries are present they could
> + * be the result of people using the "%" hack so
> + * ignore them.
> + */
> + if (strchr(bvKey[i]->bv_val, '%'))
> continue;
> - /* always use '/' internally */
> - *bvKey[i]->bv_val = '/';
> +
> + /* check for wildcard */
> + if (bvKey[i]->bv_len == 1 &&
> + (*bvKey[i]->bv_val == '/' ||
> + *bvKey[i]->bv_val == '*')) {
> + /* always use '/' internally */
> + *bvKey[i]->bv_val = '/';
> + k_val = bvKey[i]->bv_val;
> + k_len = 1;
> + break;
> + }
> +
> + /*
> + * We have a result from LDAP so this is a
> + * valid entry. Set the result to the LDAP
> + * key that isn't a wildcard and doesn't have
> + * any "%" hack values present. This should be
> + * the case insensitive match string for the
> + * nis schema, the default value.
> + */
> k_val = bvKey[i]->bv_val;
> - k_len = 1;
> + k_len = bvKey[i]->bv_len;
> +
> break;
> }
>
> if (!k_val) {
> error(ap->logopt,
> MODPREFIX
> - "key %.*s has duplicate entries -
> ignoring",
> + "invalid entry %.*s - ignoring",
> bvKey[0]->bv_len, bvKey[0]->bv_val);
> goto next;
> }
> @@ -1509,34 +1525,48 @@ static int lookup_one(struct autofs_point *ap,
> * value.
> */
> count = ldap_count_values_len(bvKey);
> - if (count > 2) {
> - error(ap->logopt,
> - MODPREFIX
> - "key %.*s has duplicate entries - ignoring",
> - bvKey[0]->bv_len, bvKey[0]->bv_val);
> - goto next;
> - } else if (count == 2) {
> + if (count > 1) {
> unsigned int i;
>
> /* Check for the "/" and "*" and use as "/" if found */
> for (i = 0; i < count; i++) {
> - /* check for wildcard */
> - if (bvKey[i]->bv_len != 1)
> + bvKey[i]->bv_val[bvKey[i]->bv_len] = '\0';
> +
> + /*
> + * If multiple entries are present they could
> + * be the result of people using the "%" hack so
> + * ignore them.
> + */
> + if (strchr(bvKey[i]->bv_val, '%'))
> continue;
> - if (*bvKey[i]->bv_val != '/' &&
> - *bvKey[i]->bv_val != '*')
> - continue;
> - /* always use '/' internally */
> - *bvKey[i]->bv_val = '/';
> - k_val = bvKey[i]->bv_val;
> - k_len = 1;
> +
> + /* check for wildcard */
> + if (bvKey[i]->bv_len == 1 &&
> + (*bvKey[i]->bv_val == '/' ||
> + *bvKey[i]->bv_val == '*')) {
> + /* always use '/' internally */
> + *bvKey[i]->bv_val = '/';
> + k_val = bvKey[i]->bv_val;
> + k_len = 1;
> + break;
> + }
> +
> + /*
> + * The key was matched by LDAP so this is a
> + * valid entry. Set the result key to the
> + * lookup key to provide the mixed case
> + * matching provided by the "%" hack.
> + */
> + k_val = qKey;
> + k_len = strlen(qKey);
> +
> break;
> }
>
> if (!k_val) {
> error(ap->logopt,
> - MODPREFIX "key %.*s has duplicate
> entries",
> - bvKey[0]->bv_len, bvKey[0]->bv_val);
> + MODPREFIX "no valid key found for %.*s",
> + qKey_len, qKey);
> ret = CHE_FAIL;
> goto next;
> }
>
_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs