diff --git a/src/tests/gssapi/t_credstore.c b/src/tests/gssapi/t_credstore.c index 085bc79..575f96d 100644 --- a/src/tests/gssapi/t_credstore.c +++ b/src/tests/gssapi/t_credstore.c @@ -33,7 +33,7 @@ static void usage(void) { fprintf(stderr, - "Usage: t_credstore principal [--cred_store {key value} ...]\n"); + "Usage: t_credstore [-sabi] principal [{key value} ...]\n"); exit(1); } @@ -42,63 +42,66 @@ main(int argc, char *argv[]) { OM_uint32 minor, major; gss_key_value_set_desc store; - gss_buffer_desc buf; - gss_name_t service = GSS_C_NO_NAME; + gss_name_t name; + gss_cred_usage_t cred_usage = GSS_C_BOTH; + gss_OID_set mechs = GSS_C_NO_OID_SET; gss_cred_id_t cred = GSS_C_NO_CREDENTIAL; - int i, e; - - if (argc < 2 || ((argc - 3) % 2)) - usage(); - - store.count = (argc - 3) / 2; - store.elements = calloc(store.count, - sizeof(struct gss_key_value_element_struct)); - if (!store.elements) { - fprintf(stderr, "OOM\n"); - exit(1); + krb5_boolean store_creds = FALSE; + char opt; + + /* Parse options. */ + for (argv++; *argv != NULL && **argv == '-'; argv++) { + opt = (*argv)[1]; + if (opt == 's') + store_creds = TRUE; + else if (opt == 'a') + cred_usage = GSS_C_ACCEPT; + else if (opt == 'b') + cred_usage = GSS_C_BOTH; + else if (opt == 'i') + cred_usage = GSS_C_INITIATE; + else + usage(); } - if (argc > 2) { - if (strcmp(argv[2], "--cred_store") != 0) + /* Get the principal name. */ + if (*argv == NULL) + usage(); + name = import_name(*argv++); + + /* Put any remaining arguments into the store. */ + store.elements = calloc(argc, sizeof(struct gss_key_value_element_struct)); + if (!store.elements) + errout("OOM"); + store.count = 0; + while (*argv != NULL) { + if (*(argv + 1) == NULL) usage(); - - for (i = 3, e = 0; i < argc; i += 2, e++) { - store.elements[e].key = argv[i]; - store.elements[e].value = argv[i + 1]; - continue; - } + store.elements[store.count].key = *argv; + store.elements[store.count].value = *(argv + 1); + store.count++; + argv += 2; } - /* First acquire default creds and try to store them in the cred store. */ - - major = gss_acquire_cred(&minor, GSS_C_NO_NAME, 0, GSS_C_NO_OID_SET, - GSS_C_INITIATE, &cred, NULL, NULL); - check_gsserr("gss_acquire_cred", major, minor); + if (store_creds) { + /* Acquire default creds and try to store them in the cred store. */ + major = gss_acquire_cred(&minor, GSS_C_NO_NAME, 0, GSS_C_NO_OID_SET, + GSS_C_INITIATE, &cred, NULL, NULL); + check_gsserr("gss_acquire_cred", major, minor); - major = gss_store_cred_into(&minor, cred, GSS_C_INITIATE, - GSS_C_NO_OID, 1, 0, &store, NULL, NULL); - check_gsserr("gss_store_cred_into", major, minor); + major = gss_store_cred_into(&minor, cred, GSS_C_INITIATE, + GSS_C_NO_OID, 1, 0, &store, NULL, NULL); + check_gsserr("gss_store_cred_into", major, minor); - gss_release_cred(&minor, &cred); - - /* Then try to acquire creds from store. */ - - buf.value = argv[1]; - buf.length = strlen(argv[1]); - - major = gss_import_name(&minor, &buf, - (gss_OID)GSS_KRB5_NT_PRINCIPAL_NAME, - &service); - check_gsserr("gss_import_name", major, minor); + gss_release_cred(&minor, &cred); + } - major = gss_acquire_cred_from(&minor, service, - 0, GSS_C_NO_OID_SET, GSS_C_BOTH, + /* Try to acquire creds from store. */ + major = gss_acquire_cred_from(&minor, name, 0, mechs, cred_usage, &store, &cred, NULL, NULL); check_gsserr("gss_acquire_cred_from", major, minor); - fprintf(stdout, "Cred Store Success\n"); - - gss_release_name(&minor, &service); + gss_release_name(&minor, &name); gss_release_cred(&minor, &cred); free(store.elements); return 0;