Imported Upstream version 1.17
[platform/upstream/krb5.git] / src / lib / krb5 / krb / t_kerb.c
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /*
3  * This driver routine is used to test many of the standard Kerberos library
4  * routines.
5  */
6
7 #include "autoconf.h"
8 #include "k5-int.h"
9 #include <time.h>
10
11 #include "com_err.h"
12
13 void test_string_to_timestamp (krb5_context, char *);
14 void test_425_conv_principal (krb5_context, char *, char*, char *);
15 void test_524_conv_principal (krb5_context, char *);
16 void test_parse_name (krb5_context, const char *);
17 void test_set_realm (krb5_context, const char *, const char *);
18 void usage (char *);
19
20 void
21 test_string_to_timestamp(krb5_context ctx, char *ktime)
22 {
23     krb5_timestamp      timestamp;
24     time_t              t;
25     krb5_error_code     retval;
26
27     retval = krb5_string_to_timestamp(ktime, &timestamp);
28     if (retval) {
29         com_err("krb5_string_to_timestamp", retval, 0);
30         return;
31     }
32     t = ts2tt(timestamp);
33     printf("Parsed time was %s", ctime(&t));
34 }
35
36 void
37 test_425_conv_principal(krb5_context ctx, char *name, char *inst, char *realm)
38 {
39     krb5_error_code     retval;
40     krb5_principal      princ;
41     char                *out_name;
42
43     retval = krb5_425_conv_principal(ctx, name, inst, realm, &princ);
44     if (retval) {
45         com_err("krb5_425_conv_principal", retval, 0);
46         return;
47     }
48     retval = krb5_unparse_name(ctx, princ, &out_name);
49     if (retval) {
50         com_err("krb5_unparse_name", retval, 0);
51         return;
52     }
53     printf("425_converted principal(%s, %s, %s): '%s'\n",
54            name, inst, realm, out_name);
55     free(out_name);
56     krb5_free_principal(ctx, princ);
57 }
58
59 void
60 test_524_conv_principal(krb5_context ctx, char *name)
61 {
62     krb5_principal princ = 0;
63     krb5_error_code retval;
64 #define ANAME_SZ 40
65 #define INST_SZ  40
66 #define REALM_SZ  40
67     char aname[ANAME_SZ+1], inst[INST_SZ+1], realm[REALM_SZ+1];
68
69     aname[ANAME_SZ] = inst[INST_SZ] = realm[REALM_SZ] = 0;
70     retval = krb5_parse_name(ctx, name, &princ);
71     if (retval) {
72         com_err("krb5_parse_name", retval, 0);
73         goto fail;
74     }
75     retval = krb5_524_conv_principal(ctx, princ, aname, inst, realm);
76     if (retval) {
77         com_err("krb5_524_conv_principal", retval, 0);
78         goto fail;
79     }
80     printf("524_converted_principal(%s): '%s' '%s' '%s'\n",
81            name, aname, inst, realm);
82 fail:
83     if (princ)
84         krb5_free_principal (ctx, princ);
85 }
86
87 void
88 test_parse_name(krb5_context ctx, const char *name)
89 {
90     krb5_error_code retval;
91     krb5_principal  princ = 0, princ2 = 0;
92     char            *outname = 0;
93
94     retval = krb5_parse_name(ctx, name, &princ);
95     if (retval) {
96         com_err("krb5_parse_name", retval, 0);
97         goto fail;
98     }
99     retval = krb5_copy_principal(ctx, princ, &princ2);
100     if (retval) {
101         com_err("krb5_copy_principal", retval, 0);
102         goto fail;
103     }
104     retval = krb5_unparse_name(ctx, princ2, &outname);
105     if (retval) {
106         com_err("krb5_unparse_name", retval, 0);
107         goto fail;
108     }
109     printf("parsed (and unparsed) principal(%s): ", name);
110     if (strcmp(name, outname) == 0)
111         printf("MATCH\n");
112     else
113         printf("'%s'\n", outname);
114 fail:
115     if (outname)
116         free(outname);
117     if (princ)
118         krb5_free_principal(ctx, princ);
119     if (princ2)
120         krb5_free_principal(ctx, princ2);
121 }
122
123 void
124 test_set_realm(krb5_context ctx, const char *name, const char *realm)
125 {
126     krb5_error_code retval;
127     krb5_principal  princ = 0;
128     char            *outname = 0;
129
130     retval = krb5_parse_name(ctx, name, &princ);
131     if (retval) {
132         com_err("krb5_parse_name", retval, 0);
133         goto fail;
134     }
135     retval = krb5_set_principal_realm(ctx, princ, realm);
136     if (retval) {
137         com_err("krb5_set_principal_realm", retval, 0);
138         goto fail;
139     }
140     retval = krb5_unparse_name(ctx, princ, &outname);
141     if (retval) {
142         com_err("krb5_unparse_name", retval, 0);
143         goto fail;
144     }
145     printf("old principal: %s, modified principal: %s\n", name,
146            outname);
147 fail:
148     if (outname)
149         free(outname);
150     if (princ)
151         krb5_free_principal(ctx, princ);
152 }
153
154 void
155 usage(char *progname)
156 {
157     fprintf(stderr, "%s: Usage: %s 425_conv_principal <name> <inst> <realm\n",
158             progname, progname);
159     fprintf(stderr, "\t%s 524_conv_principal <name>\n", progname);
160     fprintf(stderr, "\t%s parse_name <name>\n", progname);
161     fprintf(stderr, "\t%s set_realm <name> <realm>\n", progname);
162     fprintf(stderr, "\t%s string_to_timestamp <time>\n", progname);
163     exit(1);
164 }
165
166 int
167 main(int argc, char **argv)
168 {
169     krb5_context ctx;
170     krb5_error_code retval;
171     char *progname;
172     char *name, *inst, *realm;
173
174     retval = krb5_init_context(&ctx);
175     if (retval) {
176         fprintf(stderr, "krb5_init_context returned error %ld\n",
177                 (long) retval);
178         exit(1);
179     }
180     progname = argv[0];
181
182     /* Parse arguments. */
183     argc--; argv++;
184     while (argc) {
185         if (strcmp(*argv, "425_conv_principal") == 0) {
186             argc--; argv++;
187             if (!argc) usage(progname);
188             name = *argv;
189             argc--; argv++;
190             if (!argc) usage(progname);
191             inst = *argv;
192             argc--; argv++;
193             if (!argc) usage(progname);
194             realm = *argv;
195             test_425_conv_principal(ctx, name, inst, realm);
196         } else if (strcmp(*argv, "parse_name") == 0) {
197             argc--; argv++;
198             if (!argc) usage(progname);
199             name = *argv;
200             test_parse_name(ctx, name);
201         } else if (strcmp(*argv, "set_realm") == 0) {
202             argc--; argv++;
203             if (!argc) usage(progname);
204             name = *argv;
205             argc--; argv++;
206             if (!argc) usage(progname);
207             realm = *argv;
208             test_set_realm(ctx, name, realm);
209         } else if (strcmp(*argv, "string_to_timestamp") == 0) {
210             argc--; argv++;
211             if (!argc) usage(progname);
212             test_string_to_timestamp(ctx, *argv);
213         } else if (strcmp(*argv, "524_conv_principal") == 0) {
214             argc--; argv++;
215             if (!argc) usage(progname);
216             test_524_conv_principal(ctx, *argv);
217         }
218         else
219             usage(progname);
220         argc--; argv++;
221     }
222
223     krb5_free_context(ctx);
224
225     return 0;
226 }