xref: /freebsd-src/crypto/heimdal/kuser/kcc.c (revision 6a068746777241722b2b32c5d0bc443a2a64d80b)
1*ae771770SStanislav Sedov /*
2*ae771770SStanislav Sedov  * Copyright (c) 2010 Kungliga Tekniska Högskolan
3*ae771770SStanislav Sedov  * (Royal Institute of Technology, Stockholm, Sweden).
4*ae771770SStanislav Sedov  * All rights reserved.
5*ae771770SStanislav Sedov  *
6*ae771770SStanislav Sedov  * Redistribution and use in source and binary forms, with or without
7*ae771770SStanislav Sedov  * modification, are permitted provided that the following conditions
8*ae771770SStanislav Sedov  * are met:
9*ae771770SStanislav Sedov  *
10*ae771770SStanislav Sedov  * 1. Redistributions of source code must retain the above copyright
11*ae771770SStanislav Sedov  *    notice, this list of conditions and the following disclaimer.
12*ae771770SStanislav Sedov  *
13*ae771770SStanislav Sedov  * 2. Redistributions in binary form must reproduce the above copyright
14*ae771770SStanislav Sedov  *    notice, this list of conditions and the following disclaimer in the
15*ae771770SStanislav Sedov  *    documentation and/or other materials provided with the distribution.
16*ae771770SStanislav Sedov  *
17*ae771770SStanislav Sedov  * 3. Neither the name of the Institute nor the names of its contributors
18*ae771770SStanislav Sedov  *    may be used to endorse or promote products derived from this software
19*ae771770SStanislav Sedov  *    without specific prior written permission.
20*ae771770SStanislav Sedov  *
21*ae771770SStanislav Sedov  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22*ae771770SStanislav Sedov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23*ae771770SStanislav Sedov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24*ae771770SStanislav Sedov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25*ae771770SStanislav Sedov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26*ae771770SStanislav Sedov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27*ae771770SStanislav Sedov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28*ae771770SStanislav Sedov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29*ae771770SStanislav Sedov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30*ae771770SStanislav Sedov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*ae771770SStanislav Sedov  * SUCH DAMAGE.
32*ae771770SStanislav Sedov  */
33*ae771770SStanislav Sedov 
34*ae771770SStanislav Sedov #include "kuser_locl.h"
35*ae771770SStanislav Sedov #include <sl.h>
36*ae771770SStanislav Sedov #include "kcc-commands.h"
37*ae771770SStanislav Sedov 
38*ae771770SStanislav Sedov krb5_context kcc_context;
39*ae771770SStanislav Sedov static int version_flag;
40*ae771770SStanislav Sedov static int help_flag;
41*ae771770SStanislav Sedov 
42*ae771770SStanislav Sedov static struct getargs args[] = {
43*ae771770SStanislav Sedov     { "version", 	0,   arg_flag, &version_flag, NULL, NULL },
44*ae771770SStanislav Sedov     { "help",		0,   arg_flag, &help_flag, NULL, NULL }
45*ae771770SStanislav Sedov };
46*ae771770SStanislav Sedov 
47*ae771770SStanislav Sedov static void
usage(int ret)48*ae771770SStanislav Sedov usage(int ret)
49*ae771770SStanislav Sedov {
50*ae771770SStanislav Sedov     arg_printusage_i18n(args,
51*ae771770SStanislav Sedov 			sizeof(args)/sizeof(*args),
52*ae771770SStanislav Sedov 			N_("Usage: ", ""),
53*ae771770SStanislav Sedov 			NULL,
54*ae771770SStanislav Sedov 			"command ..",
55*ae771770SStanislav Sedov 			getarg_i18n);
56*ae771770SStanislav Sedov     exit (ret);
57*ae771770SStanislav Sedov }
58*ae771770SStanislav Sedov 
59*ae771770SStanislav Sedov int
help(void * opt,int argc,char ** argv)60*ae771770SStanislav Sedov help(void *opt, int argc, char **argv)
61*ae771770SStanislav Sedov {
62*ae771770SStanislav Sedov     sl_slc_help(commands, argc, argv);
63*ae771770SStanislav Sedov     return 0;
64*ae771770SStanislav Sedov }
65*ae771770SStanislav Sedov 
66*ae771770SStanislav Sedov int
kgetcred(struct kgetcred_options * opt,int argc,char ** argv)67*ae771770SStanislav Sedov kgetcred(struct kgetcred_options *opt, int argc, char **argv)
68*ae771770SStanislav Sedov {
69*ae771770SStanislav Sedov     return 0;
70*ae771770SStanislav Sedov }
71*ae771770SStanislav Sedov 
72*ae771770SStanislav Sedov /*
73*ae771770SStanislav Sedov  * Wrapper for command line compatiblity
74*ae771770SStanislav Sedov  */
75*ae771770SStanislav Sedov 
76*ae771770SStanislav Sedov int
kvno(struct kvno_options * opt,int argc,char ** argv)77*ae771770SStanislav Sedov kvno(struct kvno_options *opt, int argc, char **argv)
78*ae771770SStanislav Sedov {
79*ae771770SStanislav Sedov     struct kgetcred_options k;
80*ae771770SStanislav Sedov     memset(&k, 0, sizeof(k));
81*ae771770SStanislav Sedov 
82*ae771770SStanislav Sedov     k.cache_string = opt->cache_string;
83*ae771770SStanislav Sedov     k.enctype_string = opt->enctype_string;
84*ae771770SStanislav Sedov 
85*ae771770SStanislav Sedov     return kgetcred(&k, argc, argv);
86*ae771770SStanislav Sedov }
87*ae771770SStanislav Sedov 
88*ae771770SStanislav Sedov static int
command_alias(const char * name)89*ae771770SStanislav Sedov command_alias(const char *name)
90*ae771770SStanislav Sedov {
91*ae771770SStanislav Sedov     const char *aliases[] = {
92*ae771770SStanislav Sedov 	"kinit", "klist", "kswitch", "kgetcred", "kvno", "kdeltkt",
93*ae771770SStanislav Sedov 	"kdestroy", "kcpytkt", NULL
94*ae771770SStanislav Sedov     }, **p = aliases;
95*ae771770SStanislav Sedov 
96*ae771770SStanislav Sedov     while (*p && strcmp(name, *p) != 0)
97*ae771770SStanislav Sedov 	p++;
98*ae771770SStanislav Sedov     return *p != NULL;
99*ae771770SStanislav Sedov }
100*ae771770SStanislav Sedov 
101*ae771770SStanislav Sedov 
102*ae771770SStanislav Sedov int
main(int argc,char ** argv)103*ae771770SStanislav Sedov main(int argc, char **argv)
104*ae771770SStanislav Sedov {
105*ae771770SStanislav Sedov     krb5_error_code ret;
106*ae771770SStanislav Sedov     int optidx = 0;
107*ae771770SStanislav Sedov     int exit_status = 0;
108*ae771770SStanislav Sedov 
109*ae771770SStanislav Sedov     setprogname (argv[0]);
110*ae771770SStanislav Sedov 
111*ae771770SStanislav Sedov     setlocale (LC_ALL, "");
112*ae771770SStanislav Sedov     bindtextdomain ("heimdal_kuser", HEIMDAL_LOCALEDIR);
113*ae771770SStanislav Sedov     textdomain("heimdal_kuser");
114*ae771770SStanislav Sedov 
115*ae771770SStanislav Sedov     ret = krb5_init_context(&kcc_context);
116*ae771770SStanislav Sedov     if (ret == KRB5_CONFIG_BADFORMAT)
117*ae771770SStanislav Sedov 	errx (1, "krb5_init_context failed to parse configuration file");
118*ae771770SStanislav Sedov     else if (ret)
119*ae771770SStanislav Sedov 	errx(1, "krb5_init_context failed: %d", ret);
120*ae771770SStanislav Sedov 
121*ae771770SStanislav Sedov     /*
122*ae771770SStanislav Sedov      * Support linking of kcc to commands
123*ae771770SStanislav Sedov      */
124*ae771770SStanislav Sedov 
125*ae771770SStanislav Sedov     if (!command_alias(getprogname())) {
126*ae771770SStanislav Sedov 
127*ae771770SStanislav Sedov 	if (argc == 1) {
128*ae771770SStanislav Sedov 	    sl_slc_help(commands, 0, NULL);
129*ae771770SStanislav Sedov 	    return 1;
130*ae771770SStanislav Sedov 	}
131*ae771770SStanislav Sedov 
132*ae771770SStanislav Sedov 	if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
133*ae771770SStanislav Sedov 	    usage(1);
134*ae771770SStanislav Sedov 
135*ae771770SStanislav Sedov 	if (help_flag)
136*ae771770SStanislav Sedov 	    usage (0);
137*ae771770SStanislav Sedov 
138*ae771770SStanislav Sedov 	if(version_flag) {
139*ae771770SStanislav Sedov 	    print_version(NULL);
140*ae771770SStanislav Sedov 	    exit(0);
141*ae771770SStanislav Sedov 	}
142*ae771770SStanislav Sedov 
143*ae771770SStanislav Sedov     } else {
144*ae771770SStanislav Sedov 	argv[0] = rk_UNCONST(getprogname());
145*ae771770SStanislav Sedov     }
146*ae771770SStanislav Sedov 
147*ae771770SStanislav Sedov     argc -= optidx;
148*ae771770SStanislav Sedov     argv += optidx;
149*ae771770SStanislav Sedov 
150*ae771770SStanislav Sedov     if (argc != 0) {
151*ae771770SStanislav Sedov 	ret = sl_command(commands, argc, argv);
152*ae771770SStanislav Sedov 	if(ret == -1)
153*ae771770SStanislav Sedov 	    krb5_warnx(kcc_context, "unrecognized command: %s", argv[0]);
154*ae771770SStanislav Sedov 	else if (ret == -2)
155*ae771770SStanislav Sedov 	    ret = 0;
156*ae771770SStanislav Sedov 	if(ret != 0)
157*ae771770SStanislav Sedov 	    exit_status = 1;
158*ae771770SStanislav Sedov     } else {
159*ae771770SStanislav Sedov 	sl_slc_help(commands, argc, argv);
160*ae771770SStanislav Sedov 	exit_status = 1;
161*ae771770SStanislav Sedov     }
162*ae771770SStanislav Sedov 
163*ae771770SStanislav Sedov     krb5_free_context(kcc_context);
164*ae771770SStanislav Sedov     return exit_status;
165*ae771770SStanislav Sedov }
166