case insensitive identification_t.equals() for FQDN and RFC822ADDR

This commit is contained in:
Martin Willi 2007-06-14 07:02:01 +00:00
parent 424e0c467e
commit eda454a261
1 changed files with 25 additions and 3 deletions

View File

@ -758,6 +758,24 @@ static bool equals_dn(private_identification_t *this,
return same_dn(this->encoded, other->encoded);
}
/**
* Special implementation of identification_t.equals for RFC822 and FQDN.
*/
static bool equals_strcasecmp(private_identification_t *this,
private_identification_t *other)
{
/* we do some extra sanity checks to check for invalid IDs with a
* terminating null in it. */
if (this->encoded.len == other->encoded.len &&
memchr(this->encoded.ptr, 0, this->encoded.len) == NULL &&
memchr(other->encoded.ptr, 0, other->encoded.len) == NULL &&
strncasecmp(this->encoded.ptr, other->encoded.ptr, this->encoded.len) == 0)
{
return TRUE;
}
return FALSE;
}
/**
* Default implementation of identification_t.matches.
*/
@ -1094,6 +1112,8 @@ identification_t *identification_create_from_string(char *string)
this->encoded.len = strlen(string + 1);
this->public.matches = (bool (*)
(identification_t*,identification_t*,int*))matches_string;
this->public.equals = (bool (*)
(identification_t*,identification_t*))equals_strcasecmp;
return &(this->public);
}
}
@ -1104,6 +1124,8 @@ identification_t *identification_create_from_string(char *string)
this->encoded.len = strlen(string);
this->public.matches = (bool (*)
(identification_t*,identification_t*,int*))matches_string;
this->public.equals = (bool (*)
(identification_t*,identification_t*))equals_strcasecmp;
return &(this->public);
}
}
@ -1123,12 +1145,11 @@ identification_t *identification_create_from_encoding(id_type_t type, chunk_t en
(identification_t*,identification_t*,int*))matches_any;
break;
case ID_FQDN:
this->public.matches = (bool (*)
(identification_t*,identification_t*,int*))matches_string;
break;
case ID_RFC822_ADDR:
this->public.matches = (bool (*)
(identification_t*,identification_t*,int*))matches_string;
this->public.equals = (bool (*)
(identification_t*,identification_t*))equals_strcasecmp;
break;
case ID_DER_ASN1_DN:
this->public.equals = (bool (*)
@ -1152,3 +1173,4 @@ identification_t *identification_create_from_encoding(id_type_t type, chunk_t en
}
return &(this->public);
}