summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2013-03-08 08:32:50 +0100
committerStef Walter <stefw@gnome.org>2013-03-08 14:01:54 +0100
commit082bc5773abe1c003bf34bbb3bf6a6b5282a212c (patch)
tree167fb12b1fb9be112d4ca7ff45f1c9d79ee4a907 /tools
parentfc383e025f09af70d3eb52fcd7e03c02733b14b0 (diff)
extract: Fix regression in --purpose option
The --purpose option would only match certificates that had no purposes marked on them. Fix it so that it correctly matches certificates with the given purpose. https://bugs.freedesktop.org/show_bug.cgi?id=62009
Diffstat (limited to 'tools')
-rw-r--r--tools/extract-info.c13
-rw-r--r--tools/tests/test-extract.c50
2 files changed, 61 insertions, 2 deletions
diff --git a/tools/extract-info.c b/tools/extract-info.c
index aa66c83..ee6dbe1 100644
--- a/tools/extract-info.c
+++ b/tools/extract-info.c
@@ -316,9 +316,18 @@ void
p11_extract_info_limit_purpose (p11_extract_info *ex,
const char *purpose)
{
- if (!ex->limit_to_purposes)
+ char *value;
+
+ if (!ex->limit_to_purposes) {
ex->limit_to_purposes = p11_dict_new (p11_dict_str_hash, p11_dict_str_equal, free, NULL);
- p11_dict_set (ex->limit_to_purposes, strdup (purpose), NULL);
+ return_if_fail (ex->limit_to_purposes != NULL);
+ }
+
+ value = strdup (purpose);
+ return_if_fail (value != NULL);
+
+ if (!p11_dict_set (ex->limit_to_purposes, value, value))
+ return_if_reached ();
}
static char *
diff --git a/tools/tests/test-extract.c b/tools/tests/test-extract.c
index 8bdd600..5e2f6fe 100644
--- a/tools/tests/test-extract.c
+++ b/tools/tests/test-extract.c
@@ -272,6 +272,54 @@ test_info_skip_non_certificate (CuTest *tc)
teardown (tc);
}
+static void
+test_limit_to_purpose_match (CuTest *tc)
+{
+ CK_RV rv;
+
+ setup (tc);
+
+ mock_module_add_object (MOCK_SLOT_ONE_ID, cacert3_authority_attrs);
+ mock_module_add_object (MOCK_SLOT_ONE_ID, extension_eku_server_client);
+
+ p11_extract_info_limit_purpose (&test.ex, P11_OID_SERVER_AUTH_STR);
+ p11_kit_iter_add_callback (test.iter, p11_extract_info_load_filter, &test.ex, NULL);
+ p11_kit_iter_begin_with (test.iter, &test.module, 0, 0);
+
+ p11_message_quiet ();
+
+ rv = p11_kit_iter_next (test.iter);
+ CuAssertIntEquals (tc, CKR_OK, rv);
+
+ p11_message_loud ();
+
+ teardown (tc);
+}
+
+static void
+test_limit_to_purpose_no_match (CuTest *tc)
+{
+ CK_RV rv;
+
+ setup (tc);
+
+ mock_module_add_object (MOCK_SLOT_ONE_ID, cacert3_authority_attrs);
+ mock_module_add_object (MOCK_SLOT_ONE_ID, extension_eku_server_client);
+
+ p11_extract_info_limit_purpose (&test.ex, "3.3.3.3");
+ p11_kit_iter_add_callback (test.iter, p11_extract_info_load_filter, &test.ex, NULL);
+ p11_kit_iter_begin_with (test.iter, &test.module, 0, 0);
+
+ p11_message_quiet ();
+
+ rv = p11_kit_iter_next (test.iter);
+ CuAssertIntEquals (tc, CKR_CANCEL, rv);
+
+ p11_message_loud ();
+
+ teardown (tc);
+}
+
int
main (void)
{
@@ -290,6 +338,8 @@ main (void)
SUITE_ADD_TEST (suite, test_info_limit_purposes);
SUITE_ADD_TEST (suite, test_info_invalid_purposes);
SUITE_ADD_TEST (suite, test_info_skip_non_certificate);
+ SUITE_ADD_TEST (suite, test_limit_to_purpose_match);
+ SUITE_ADD_TEST (suite, test_limit_to_purpose_no_match);
CuSuiteRun (suite);
CuSuiteSummary (suite, output);