aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Steffen <andreas.steffen@strongswan.org>2008-04-01 10:26:27 +0000
committerAndreas Steffen <andreas.steffen@strongswan.org>2008-04-01 10:26:27 +0000
commit946d1ecd59f27871fb82c54d5b5f79ca60bf8eee (patch)
treefd3e2f87f6c733bdbf860e35a58d8b1aa8ef3c3f
parentdd2efc2c03cc09f15c1d46d26cac44171737095d (diff)
downloadstrongswan-946d1ecd59f27871fb82c54d5b5f79ca60bf8eee.tar.bz2
strongswan-946d1ecd59f27871fb82c54d5b5f79ca60bf8eee.tar.xz
stroke_list groups certificates by issuer
-rw-r--r--src/charon/plugins/stroke/stroke_list.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/charon/plugins/stroke/stroke_list.c b/src/charon/plugins/stroke/stroke_list.c
index 1ec855899..da0a5e9a6 100644
--- a/src/charon/plugins/stroke/stroke_list.c
+++ b/src/charon/plugins/stroke/stroke_list.c
@@ -284,27 +284,38 @@ static linked_list_t* create_unique_cert_list(certificate_type_t type)
charon->credentials, type, KEY_ANY,
NULL, FALSE);
certificate_t *cert;
-
+
while (enumerator->enumerate(enumerator, (void**)&cert))
{
- enumerator_t *list_enum = list->create_enumerator(list);
+ iterator_t *iterator = list->create_iterator(list, TRUE);
+ identification_t *issuer = cert->get_issuer(cert);
+ bool previous_same, same = FALSE, last = TRUE;
certificate_t *list_cert;
- bool unique = TRUE;
- while (list_enum->enumerate(list_enum, (void**)&list_cert))
+ while (iterator->iterate(iterator, (void**)&list_cert))
{
/* exit if we have a duplicate? */
if (list_cert == cert)
{
- unique = FALSE;
+ last = FALSE;
+ break;
+ }
+ /* group certificates with same issuer */
+ previous_same = same;
+ same = list_cert->has_issuer(list_cert, issuer);
+ if (previous_same && !same)
+ {
+ iterator->insert_before(iterator, (void *)cert->get_ref(cert));
+ last = FALSE;
break;
}
}
- if (unique)
+ iterator->destroy(iterator);
+
+ if (last)
{
list->insert_last(list, (void *)cert->get_ref(cert));
}
- list_enum->destroy(list_enum);
}
enumerator->destroy(enumerator);
return list;