1 /* windows/ms2mit/mit2ms.c */
2 /*
3 * Copyright (C) 2003,2004 by the Massachusetts Institute of Technology.
4 * All rights reserved.
5 *
6 * Export of this software from the United States of America may
7 * require a specific license from the United States Government.
8 * It is the responsibility of any person or organization contemplating
9 * export to obtain such a license before exporting.
10 *
11 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
12 * distribute this software and its documentation for any purpose and
13 * without fee is hereby granted, provided that the above copyright
14 * notice appear in all copies and that both that copyright notice and
15 * this permission notice appear in supporting documentation, and that
16 * the name of M.I.T. not be used in advertising or publicity pertaining
17 * to distribution of the software without specific, written prior
18 * permission. Furthermore if you modify this software you must label
19 * your software as modified software and not distribute it in such a
20 * fashion that it might be confused with the original M.I.T. software.
21 * M.I.T. makes no representations about the suitability of
22 * this software for any purpose. It is provided "as is" without express
23 * or implied warranty.
24 */
25
26 #include "krb5.h"
27 #include <stdio.h>
28 #include <string.h>
29 #include "k5-platform.h"
30
31 static char *prog;
32
33 static void
xusage(void)34 xusage(void)
35 {
36 fprintf(stderr, "xusage: %s [-c ccache]\n", prog);
37 exit(1);
38 }
39
40 void
main(int argc,char * argv[])41 main(
42 int argc,
43 char *argv[]
44 )
45 {
46 krb5_context kcontext;
47 krb5_error_code code;
48 krb5_ccache ccache=NULL;
49 krb5_ccache mslsa_ccache=NULL;
50 krb5_cc_cursor cursor;
51 krb5_creds creds;
52 krb5_principal princ;
53 int initial_ticket = 0;
54 int option;
55 char * ccachestr = 0;
56
57 prog = strrchr(argv[0], '/');
58 prog = prog ? (prog + 1) : argv[0];
59
60 while ((option = getopt(argc, argv, "c:h")) != -1) {
61 switch (option) {
62 case 'c':
63 ccachestr = optarg;
64 break;
65 case 'h':
66 default:
67 xusage();
68 break;
69 }
70 }
71
72 if (code = krb5_init_context(&kcontext)) {
73 com_err(argv[0], code, "while initializing kerberos library");
74 exit(1);
75 }
76
77 if (ccachestr)
78 code = krb5_cc_resolve(kcontext, ccachestr, &ccache);
79 else
80 code = krb5_cc_default(kcontext, &ccache);
81 if (code) {
82 com_err(argv[0], code, "while getting default ccache");
83 krb5_free_principal(kcontext, princ);
84 krb5_free_context(kcontext);
85 exit(1);
86 }
87
88 /* Enumerate tickets from cache looking for an initial ticket */
89 if ((code = krb5_cc_start_seq_get(kcontext, ccache, &cursor))) {
90 com_err(argv[0], code, "while initiating the cred sequence of MS LSA ccache");
91 krb5_cc_close(kcontext, ccache);
92 krb5_free_context(kcontext);
93 exit(1);
94 }
95
96 while (!(code = krb5_cc_next_cred(kcontext, ccache, &cursor, &creds)))
97 {
98 if ( creds.ticket_flags & TKT_FLG_INITIAL ) {
99 krb5_free_cred_contents(kcontext, &creds);
100 initial_ticket = 1;
101 break;
102 }
103 krb5_free_cred_contents(kcontext, &creds);
104 }
105 krb5_cc_end_seq_get(kcontext, ccache, &cursor);
106
107 if ( !initial_ticket ) {
108 fprintf(stderr, "%s: Initial Ticket Getting Tickets are not available from the MIT default cache\n",
109 argv[0]);
110 krb5_cc_close(kcontext, ccache);
111 krb5_free_context(kcontext);
112 exit(1);
113 }
114
115 if (code = krb5_cc_get_principal(kcontext, ccache, &princ)) {
116 com_err(argv[0], code, "while obtaining default MIT principal");
117 krb5_cc_close(kcontext, ccache);
118 krb5_free_context(kcontext);
119 exit(1);
120 }
121
122 if (code = krb5_cc_resolve(kcontext, "MSLSA:", &mslsa_ccache)) {
123 com_err(argv[0], code, "while opening MS LSA ccache");
124 krb5_cc_close(kcontext, ccache);
125 krb5_free_context(kcontext);
126 exit(1);
127 }
128
129 if (code = krb5_cc_copy_creds(kcontext, ccache, mslsa_ccache)) {
130 com_err (argv[0], code, "while copying default MIT ccache to MSLSA ccache");
131 krb5_free_principal(kcontext, princ);
132 krb5_cc_close(kcontext, ccache);
133 krb5_cc_close(kcontext, mslsa_ccache);
134 krb5_free_context(kcontext);
135 exit(1);
136 }
137
138 krb5_free_principal(kcontext, princ);
139 krb5_cc_close(kcontext, ccache);
140 krb5_cc_close(kcontext, mslsa_ccache);
141 krb5_free_context(kcontext);
142 return(0);
143 }
144