summaryrefslogtreecommitdiff
path: root/src/lib/krb5/krb/t_in_ccache.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/krb5/krb/t_in_ccache.c')
-rw-r--r--src/lib/krb5/krb/t_in_ccache.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/lib/krb5/krb/t_in_ccache.c b/src/lib/krb5/krb/t_in_ccache.c
new file mode 100644
index 000000000000..3f157a488a02
--- /dev/null
+++ b/src/lib/krb5/krb/t_in_ccache.c
@@ -0,0 +1,149 @@
+/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/* t_in_ccache.c: get creds while using input and/or armor ccaches */
+/*
+ * Copyright (C) 2012 by the Massachusetts Institute of Technology.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * A test helper that exercises the input-ccache option, potentially in
+ * combination with armor-ccache options.
+ */
+
+#include "k5-int.h"
+
+static void
+bail_on_err(krb5_context context, const char *msg, krb5_error_code code)
+{
+ const char *errmsg;
+
+ if (code) {
+ errmsg = krb5_get_error_message(context, code);
+ printf("%s: %s\n", msg, errmsg);
+ krb5_free_error_message(context, errmsg);
+ exit(1);
+ }
+}
+
+static krb5_error_code
+prompter_cb(krb5_context ctx, void *data, const char *name,
+ const char *banner, int num_prompts, krb5_prompt prompts[])
+{
+ /* Not expecting any actual prompts. */
+ if (num_prompts != 0) {
+ printf("too many prompts passed to prompter callback (%d), failing\n",
+ num_prompts);
+ exit(1);
+ }
+ return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+ krb5_context ctx;
+ krb5_ccache in_ccache, out_ccache, armor_ccache;
+ krb5_get_init_creds_opt *opt;
+ char *user, *password, *armor_ccname = NULL, *in_ccname = NULL, *perr;
+ const char *err;
+ krb5_principal client;
+ krb5_creds creds;
+ krb5_flags fast_flags;
+ krb5_error_code ret;
+ int c;
+
+ while ((c = getopt(argc, argv, "I:A:")) != -1) {
+ switch (c) {
+ case 'A':
+ armor_ccname = optarg;
+ break;
+ case 'I':
+ in_ccname = optarg;
+ break;
+ }
+ }
+ if (argc - optind < 2) {
+ fprintf(stderr, "Usage: %s [-A armor_ccache] [-I in_ccache] "
+ "username password\n", argv[0]);
+ return 1;
+ }
+ user = argv[optind];
+ password = argv[optind + 1];
+
+ bail_on_err(NULL, "Error initializing Kerberos", krb5_init_context(&ctx));
+ bail_on_err(ctx, "Error allocating space for get_init_creds options",
+ krb5_get_init_creds_opt_alloc(ctx, &opt));
+ if (in_ccname != NULL) {
+ bail_on_err(ctx, "Error resolving input ccache",
+ krb5_cc_resolve(ctx, in_ccname, &in_ccache));
+ bail_on_err(ctx, "Error setting input_ccache option",
+ krb5_get_init_creds_opt_set_in_ccache(ctx, opt,
+ in_ccache));
+ } else {
+ in_ccache = NULL;
+ }
+ if (armor_ccname != NULL) {
+ bail_on_err(ctx, "Error resolving armor ccache",
+ krb5_cc_resolve(ctx, armor_ccname, &armor_ccache));
+ bail_on_err(ctx, "Error setting fast_ccache option",
+ krb5_get_init_creds_opt_set_fast_ccache(ctx, opt,
+ armor_ccache));
+ fast_flags = KRB5_FAST_REQUIRED;
+ bail_on_err(ctx, "Error setting option to force use of FAST",
+ krb5_get_init_creds_opt_set_fast_flags(ctx, opt,
+ fast_flags));
+ } else {
+ armor_ccache = NULL;
+ }
+ bail_on_err(ctx, "Error resolving output (default) ccache",
+ krb5_cc_default(ctx, &out_ccache));
+ bail_on_err(ctx, "Error setting output ccache option",
+ krb5_get_init_creds_opt_set_out_ccache(ctx, opt, out_ccache));
+ if (asprintf(&perr, "Error parsing principal name \"%s\"", user) < 0)
+ abort();
+ bail_on_err(ctx, perr, krb5_parse_name(ctx, user, &client));
+ ret = krb5_get_init_creds_password(ctx, &creds, client, password,
+ prompter_cb, NULL, 0, NULL, opt);
+ if (ret) {
+ err = krb5_get_error_message(ctx, ret);
+ printf("%s\n", err);
+ krb5_free_error_message(ctx, err);
+ } else {
+ krb5_free_cred_contents(ctx, &creds);
+ }
+ krb5_get_init_creds_opt_free(ctx, opt);
+ krb5_free_principal(ctx, client);
+ krb5_cc_close(ctx, out_ccache);
+ if (armor_ccache != NULL)
+ krb5_cc_close(ctx, armor_ccache);
+ if (in_ccache != NULL)
+ krb5_cc_close(ctx, in_ccache);
+ krb5_free_context(ctx);
+ free(perr);
+ return ret ? (ret - KRB5KDC_ERR_NONE) : 0;
+}