Path: blob/main/crypto/krb5/src/clients/kdeltkt/kdeltkt.c
34889 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 ccache] [-e etype] [-f flags] service1 "15"service2 ...\n", prog);16exit(1);17}1819static void20do_kdeltkt(int argc, char *argv[], char *ccachestr, char *etypestr, int flags);2122int23main(int argc, char *argv[])24{25int option;26char *etypestr = NULL, *ccachestr = NULL;27int flags = 0;2829prog = strrchr(argv[0], '/');30prog = (prog != NULL) ? prog + 1 : argv[0];3132while ((option = getopt(argc, argv, "c:e:f:hq")) != -1) {33switch (option) {34case 'c':35ccachestr = optarg;36break;37case 'e':38etypestr = optarg;39break;40case 'f':41flags = atoi(optarg);42break;43case 'q':44quiet = 1;45break;46case 'h':47default:48xusage();49break;50}51}5253if (argc - optind < 1)54xusage();5556do_kdeltkt(argc - optind, argv + optind, ccachestr, etypestr, flags);57return 0;58}5960static void61do_kdeltkt(int count, char *names[], const char *ccachestr, char *etypestr,62int flags)63{64krb5_context context;65krb5_error_code ret;66int i, errors;67krb5_enctype etype;68krb5_ccache ccache;69krb5_principal me;70krb5_creds in_creds, out_creds;71int retflags;72char *princ;7374ret = krb5_init_context(&context);75if (ret) {76com_err(prog, ret, "while initializing krb5 library");77exit(1);78}7980if (etypestr != NULL) {81ret = krb5_string_to_enctype(etypestr, &etype);82if (ret) {83com_err(prog, ret, "while converting etype");84exit(1);85}86retflags = KRB5_TC_MATCH_SRV_NAMEONLY | KRB5_TC_SUPPORTED_KTYPES;87} else {88etype = 0;89retflags = KRB5_TC_MATCH_SRV_NAMEONLY;90}9192if (ccachestr)93ret = krb5_cc_resolve(context, ccachestr, &ccache);94else95ret = krb5_cc_default(context, &ccache);96if (ret) {97com_err(prog, ret, "while opening ccache");98exit(1);99}100101ret = krb5_cc_get_principal(context, ccache, &me);102if (ret) {103com_err(prog, ret, "while getting client principal name");104exit(1);105}106107errors = 0;108109for (i = 0; i < count; i++) {110memset(&in_creds, 0, sizeof(in_creds));111112in_creds.client = me;113114ret = krb5_parse_name(context, names[i], &in_creds.server);115if (ret) {116if (!quiet) {117fprintf(stderr, "%s: %s while parsing principal name\n",118names[i], error_message(ret));119}120errors++;121continue;122}123124ret = krb5_unparse_name(context, in_creds.server, &princ);125if (ret) {126fprintf(stderr, "%s: %s while printing principal name\n",127names[i], error_message(ret));128errors++;129continue;130}131132in_creds.keyblock.enctype = etype;133134ret = krb5_cc_retrieve_cred(context, ccache, retflags,135&in_creds, &out_creds);136if (ret) {137fprintf(stderr, "%s: %s while retrieving credentials\n",138princ, error_message(ret));139krb5_free_unparsed_name(context, princ);140errors++;141continue;142}143144ret = krb5_cc_remove_cred(context, ccache, flags, &out_creds);145146krb5_free_principal(context, in_creds.server);147148if (ret) {149fprintf(stderr, "%s: %s while removing credentials\n",150princ, error_message(ret));151krb5_free_cred_contents(context, &out_creds);152krb5_free_unparsed_name(context, princ);153errors++;154continue;155}156krb5_free_unparsed_name(context, princ);157krb5_free_cred_contents(context, &out_creds);158}159160krb5_free_principal(context, me);161krb5_cc_close(context, ccache);162krb5_free_context(context);163164if (errors)165exit(1);166167exit(0);168}169170171