(base64_encode): check return value from malloc
[heimdal.git] / kuser / kinit.c
blob4dbb73b06f1a2e5b11a122a5fa385d3cd4d6602f
1 /*
2 * Copyright (c) 1997 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by Kungliga Tekniska
20 * Högskolan and its contributors.
22 * 4. Neither the name of the Institute nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
39 #include "kuser_locl.h"
40 RCSID("$Id$");
42 int forwardable;
43 int renewable;
44 int version_flag = 0;
45 int help_flag = 0;
46 char *lifetime = NULL;
47 char *server = NULL;
49 struct getargs args[] = {
50 { "forwardable", 'f', arg_flag, &forwardable,
51 "get forwardable tickets", NULL },
52 { "renewable", 'r', arg_flag, &renewable,
53 "get renewable tickets", NULL },
54 { "lifetime", 'l', arg_string, &lifetime,
55 "lifetime of tickets", "seconds"},
56 { "server", 's', arg_string, &server,
57 "server to get ticket for", "principal" },
58 { "version", 0, arg_flag, &version_flag,
59 NULL, NULL },
60 { "help", 0, arg_flag, &help_flag,
61 NULL, NULL}
64 static void
65 usage (int ret)
67 arg_printusage (args,
68 sizeof(args)/sizeof(*args),
69 "[principal]");
70 exit (ret);
73 int
74 main (int argc, char **argv)
76 krb5_error_code ret;
77 krb5_context context;
78 krb5_ccache ccache;
79 krb5_principal principal;
80 krb5_creds cred;
81 int optind = 0;
82 krb5_get_init_creds_opt opt;
84 set_progname (argv[0]);
85 memset(&cred, 0, sizeof(cred));
87 ret = krb5_init_context (&context);
88 if (ret)
89 errx(1, "krb5_init_context failed: %u", ret);
91 if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind))
92 usage(1);
94 if (help_flag)
95 usage (0);
97 if(version_flag)
98 krb5_errx(context, 0, "%s", heimdal_version);
100 krb5_get_init_creds_opt_init (&opt);
102 if (forwardable)
103 krb5_get_init_creds_opt_set_forwardable (&opt, forwardable);
104 if (renewable)
105 krb5_get_init_creds_opt_set_renew_life (&opt, 1 << 30);
107 if (lifetime) {
108 int tmp = parse_time (lifetime, NULL);
109 if (tmp < 0)
110 errx (1, "unparsable time: %s", lifetime);
112 krb5_get_init_creds_opt_set_tkt_life (&opt, tmp);
115 argc -= optind;
116 argv += optind;
118 if (argc > 1)
119 usage (1);
121 ret = krb5_cc_default (context, &ccache);
122 if (ret)
123 krb5_err (context, 1, ret, "krb5_cc_default");
125 if (argv[0]) {
126 ret = krb5_parse_name (context, argv[0], &principal);
127 if (ret)
128 krb5_err (context, 1, ret, "krb5_parse_name");
129 } else
130 principal = NULL;
132 ret = krb5_get_init_creds_password (context,
133 &cred,
134 principal,
135 NULL,
136 krb5_prompter_posix,
137 NULL,
139 server,
140 &opt);
141 switch(ret){
142 case 0:
143 break;
144 case KRB5KRB_AP_ERR_BAD_INTEGRITY:
145 case KRB5KRB_AP_ERR_MODIFIED:
146 krb5_errx(context, 1, "Password incorrect");
147 break;
148 default:
149 krb5_err(context, 1, ret, "krb5_get_init_creds");
152 ret = krb5_cc_initialize (context, ccache, cred.client);
153 if (ret)
154 krb5_err (context, 1, ret, "krb5_cc_initialize");
156 ret = krb5_cc_store_cred (context, ccache, &cred);
157 if (ret)
158 krb5_err (context, 1, ret, "krb5_cc_store_cred");
159 krb5_free_creds_contents (context, &cred);
160 krb5_cc_close (context, ccache);
161 krb5_free_context (context);
162 return 0;