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