Path: blob/main/crypto/krb5/src/clients/kcpytkt/kcpytkt.c
34914 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */12#include <stdio.h>3#include <stdlib.h>4#include <string.h>5#include <krb5.h>6#include "k5-platform.h"78static char *prog;9static int quiet = 0;1011static void12xusage(void)13{14fprintf(stderr, "xusage: %s [-c from_ccache] [-e etype] [-f flags] "15"dest_ccache service1 service2 ...\n", prog);16exit(1);17}1819static void20do_kcpytkt(int argc, char *argv[], char *fromccachestr, char *etypestr,21int flags);2223int24main(int argc, char *argv[])25{26int option;27char *etypestr = NULL, *fromccachestr = NULL;28int flags = 0;2930prog = strrchr(argv[0], '/');31prog = (prog != NULL) ? prog + 1 : argv[0];3233while ((option = getopt(argc, argv, "c:e:f:hq")) != -1) {34switch (option) {35case 'c':36fromccachestr = optarg;37break;38case 'e':39etypestr = optarg;40break;41case 'f':42flags = atoi(optarg);43break;44case 'q':45quiet = 1;46break;47case 'h':48default:49xusage();50break;51}52}5354if (argc - optind < 2)55xusage();5657do_kcpytkt(argc - optind, argv + optind, fromccachestr, etypestr, flags);58return 0;59}6061static void62do_kcpytkt(int count, char *names[], const char *fromccachestr, char *etypestr,63int flags)64{65krb5_context context;66krb5_error_code ret;67krb5_enctype etype;68krb5_ccache fromccache, destccache;69krb5_principal me;70krb5_creds in_creds, out_creds;71int i, errors, retflags;72char *princ;7374ret = krb5_init_context(&context);75if (ret) {76com_err(prog, ret, "while initializing krb5 library");77exit(1);78}79if (etypestr != NULL) {80ret = krb5_string_to_enctype(etypestr, &etype);81if (ret) {82com_err(prog, ret, "while converting etype");83exit(1);84}85retflags = KRB5_TC_MATCH_SRV_NAMEONLY | KRB5_TC_SUPPORTED_KTYPES;86} else {87etype = 0;88retflags = KRB5_TC_MATCH_SRV_NAMEONLY;89}9091if (fromccachestr != NULL)92ret = krb5_cc_resolve(context, fromccachestr, &fromccache);93else94ret = krb5_cc_default(context, &fromccache);95if (ret) {96com_err(prog, ret, "while opening source ccache");97exit(1);98}99100ret = krb5_cc_get_principal(context, fromccache, &me);101if (ret) {102com_err(prog, ret, "while getting client principal name");103exit(1);104}105106ret = krb5_cc_resolve(context, names[0], &destccache);107if (ret) {108com_err(prog, ret, "while opening destination cache");109exit(1);110}111112errors = 0;113114for (i = 1; i < count; i++) {115memset(&in_creds, 0, sizeof(in_creds));116117in_creds.client = me;118119ret = krb5_parse_name(context, names[i], &in_creds.server);120if (ret) {121if (!quiet) {122fprintf(stderr, "%s: %s while parsing principal name\n",123names[i], error_message(ret));124}125errors++;126continue;127}128129ret = krb5_unparse_name(context, in_creds.server, &princ);130if (ret) {131fprintf(stderr, "%s: %s while printing principal name\n",132names[i], error_message(ret));133errors++;134continue;135}136137in_creds.keyblock.enctype = etype;138139ret = krb5_cc_retrieve_cred(context, fromccache, retflags,140&in_creds, &out_creds);141if (ret) {142fprintf(stderr, "%s: %s while retrieving credentials\n",143princ, error_message(ret));144krb5_free_unparsed_name(context, princ);145errors++;146continue;147}148149ret = krb5_cc_store_cred(context, destccache, &out_creds);150krb5_free_principal(context, in_creds.server);151if (ret) {152fprintf(stderr, "%s: %s while removing credentials\n",153princ, error_message(ret));154krb5_free_cred_contents(context, &out_creds);155krb5_free_unparsed_name(context, princ);156errors++;157continue;158}159160krb5_free_unparsed_name(context, princ);161krb5_free_cred_contents(context, &out_creds);162}163164krb5_free_principal(context, me);165krb5_cc_close(context, fromccache);166krb5_cc_close(context, destccache);167krb5_free_context(context);168169if (errors)170exit(1);171172exit(0);173}174175176