2 * Copyright (c) 2004 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
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. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 __RCSID("$Heimdal: copy_cred_cache.c 15542 2005-07-01 07:20:54Z lha $"
44 #include <parse_units.h>
45 #include <parse_time.h>
47 static int krbtgt_only_flag
;
48 static char *service_string
;
49 static char *enctype_string
;
50 static char *flags_string
;
51 static char *valid_string
;
52 static int fcache_version
;
54 static int version_flag
;
56 static struct getargs args
[] = {
57 { "krbtgt-only", 0, arg_flag
, &krbtgt_only_flag
,
58 "only copy local krbtgt" },
59 { "service", 0, arg_string
, &service_string
,
60 "limit to this service", "principal" },
61 { "enctype", 0, arg_string
, &enctype_string
,
62 "limit to this enctype", "enctype" },
63 { "flags", 0, arg_string
, &flags_string
,
64 "limit to these flags", "ticketflags" },
65 { "valid-for", 0, arg_string
, &valid_string
,
66 "limit to creds valid for at least this long", "time" },
67 { "fcache-version", 0, arg_integer
, &fcache_version
,
68 "file cache version to create" },
69 { "version", 0, arg_flag
, &version_flag
},
70 { "help", 'h', arg_flag
, &help_flag
}
77 sizeof(args
) / sizeof(*args
),
79 "[from-cache] to-cache");
88 for (i
= 0; i
< 32; i
++) {
96 parse_ticket_flags(krb5_context context
,
97 const char *string
, krb5_ticket_flags
*ret_flags
)
100 int flags
= parse_flags(string
, asn1_TicketFlags_units(), 0);
101 if (flags
== -1) /* XXX */
102 krb5_errx(context
, 1, "bad flags specified: \"%s\"", string
);
104 memset(&ff
, 0, sizeof(ff
));
106 if (parse_flags("proxy", asn1_TicketFlags_units(), 0) == TicketFlags2int(ff
))
107 ret_flags
->i
= flags
;
109 ret_flags
->i
= bitswap32(flags
);
113 main(int argc
, char **argv
)
116 krb5_context context
;
118 const char *from_name
, *to_name
;
119 krb5_ccache from_ccache
, to_ccache
;
120 krb5_flags whichfields
= 0;
122 unsigned int matched
;
124 setprogname(argv
[0]);
126 memset(&mcreds
, 0, sizeof(mcreds
));
128 if (getarg(args
, sizeof(args
) / sizeof(args
[0]), argc
, argv
, &optidx
))
141 if (argc
< 1 || argc
> 2)
144 if (krb5_init_context(&context
))
145 errx(1, "krb5_init_context failed");
147 if (service_string
) {
148 ret
= krb5_parse_name(context
, service_string
, &mcreds
.server
);
150 krb5_err(context
, 1, ret
, "%s", service_string
);
152 if (enctype_string
) {
153 krb5_enctype enctype
;
154 ret
= krb5_string_to_enctype(context
, enctype_string
, &enctype
);
156 krb5_err(context
, 1, ret
, "%s", enctype_string
);
157 whichfields
|= KRB5_TC_MATCH_KEYTYPE
;
158 mcreds
.session
.keytype
= enctype
;
161 parse_ticket_flags(context
, flags_string
, &mcreds
.flags
);
162 whichfields
|= KRB5_TC_MATCH_FLAGS
;
165 time_t t
= parse_time(valid_string
, "s");
167 errx(1, "unknown time \"%s\"", valid_string
);
168 mcreds
.times
.endtime
= time(NULL
) + t
;
169 whichfields
|= KRB5_TC_MATCH_TIMES
;
172 krb5_set_fcache_version(context
, fcache_version
);
175 from_name
= krb5_cc_default_name(context
);
182 ret
= krb5_cc_resolve(context
, from_name
, &from_ccache
);
184 krb5_err(context
, 1, ret
, "%s", from_name
);
186 if (krbtgt_only_flag
) {
187 krb5_principal client
;
188 ret
= krb5_cc_get_principal(context
, from_ccache
, &client
);
190 krb5_err(context
, 1, ret
, "getting default principal");
191 ret
= krb5_make_principal(context
, &mcreds
.server
,
192 krb5_principal_get_realm(context
, client
),
194 krb5_principal_get_realm(context
, client
),
197 krb5_err(context
, 1, ret
, "constructing krbtgt principal");
198 krb5_free_principal(context
, client
);
200 ret
= krb5_cc_resolve(context
, to_name
, &to_ccache
);
202 krb5_err(context
, 1, ret
, "%s", to_name
);
204 ret
= krb5_cc_copy_cache_match(context
, from_ccache
, to_ccache
,
205 whichfields
, &mcreds
, &matched
);
207 krb5_err(context
, 1, ret
, "copying cred cache");
209 krb5_cc_close(context
, from_ccache
);
211 krb5_cc_destroy(context
, to_ccache
);
213 krb5_cc_close(context
, to_ccache
);
214 krb5_free_context(context
);