1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /*
3 * t_std_conf.c --- This program tests standard Krb5 routines which pull
4 * values from the krb5 config file(s).
5 */
6
7 #include "k5-int.h"
8 #include "fake-addrinfo.h"
9
10 #include <stdio.h>
11 #include <string.h>
12 #include <stdlib.h>
13 #include <unistd.h>
14 #include <sys/types.h>
15 #include <sys/socket.h>
16 #include <netinet/in.h>
17 #include <arpa/inet.h>
18
19 #include "os-proto.h"
20
21 static void
test_get_default_realm(krb5_context ctx)22 test_get_default_realm(krb5_context ctx)
23 {
24 char *realm;
25 krb5_error_code retval;
26
27 retval = krb5_get_default_realm(ctx, &realm);
28 if (retval) {
29 com_err("krb5_get_default_realm", retval, 0);
30 return;
31 }
32 printf("krb5_get_default_realm() returned '%s'\n", realm);
33 free(realm);
34 }
35
36 static void
test_set_default_realm(krb5_context ctx,char * realm)37 test_set_default_realm(krb5_context ctx, char *realm)
38 {
39 krb5_error_code retval;
40
41 retval = krb5_set_default_realm(ctx, realm);
42 if (retval) {
43 com_err("krb5_set_default_realm", retval, 0);
44 return;
45 }
46 printf("krb5_set_default_realm(%s)\n", realm);
47 }
48
49 static void
test_get_default_ccname(krb5_context ctx)50 test_get_default_ccname(krb5_context ctx)
51 {
52 const char *ccname;
53
54 ccname = krb5_cc_default_name(ctx);
55 if (ccname)
56 printf("krb5_cc_default_name() returned '%s'\n", ccname);
57 else
58 printf("krb5_cc_default_name() returned NULL\n");
59 }
60
61 static void
test_set_default_ccname(krb5_context ctx,char * ccname)62 test_set_default_ccname(krb5_context ctx, char *ccname)
63 {
64 krb5_error_code retval;
65
66 retval = krb5_cc_set_default_name(ctx, ccname);
67 if (retval) {
68 com_err("krb5_set_default_ccname", retval, 0);
69 return;
70 }
71 printf("krb5_set_default_ccname(%s)\n", ccname);
72 }
73
74 static void
test_locate_kdc(krb5_context ctx,char * realm)75 test_locate_kdc(krb5_context ctx, char *realm)
76 {
77 struct serverlist servers;
78 size_t i;
79 int get_primaries = FALSE;
80 krb5_data rlm;
81 krb5_error_code retval;
82
83 rlm.data = realm;
84 rlm.length = strlen(realm);
85 retval = k5_locate_kdc(ctx, &rlm, &servers, get_primaries, FALSE);
86 if (retval) {
87 com_err("krb5_locate_kdc", retval, 0);
88 return;
89 }
90 printf("krb_locate_kdc(%s) returned:", realm);
91 for (i = 0; i < servers.nservers; i++) {
92 struct server_entry *entry = &servers.servers[i];
93 if (entry->hostname) {
94 printf(" host:%s/%d", entry->hostname, entry->port);
95 continue;
96 }
97 switch (entry->family) {
98 case AF_INET:
99 {
100 struct sockaddr_in *s_sin = (struct sockaddr_in *)&entry->addr;
101 printf(" inet:%s/%d", inet_ntoa(s_sin->sin_addr),
102 ntohs(s_sin->sin_port));
103 }
104 break;
105 case AF_INET6:
106 {
107 struct sockaddr_in6 *s_sin6 = (struct sockaddr_in6 *)&entry->addr;
108 int j;
109 printf(" inet6");
110 for (j = 0; j < 8; j++)
111 printf(":%x",
112 (s_sin6->sin6_addr.s6_addr[2*j] * 256
113 + s_sin6->sin6_addr.s6_addr[2*j+1]));
114 printf("/%d", ntohs(s_sin6->sin6_port));
115 break;
116 }
117 default:
118 printf(" unknown-af-%d", entry->family);
119 break;
120 }
121 }
122 k5_free_serverlist(&servers);
123 printf("\n");
124 }
125
126 static void
test_get_host_realm(krb5_context ctx,char * host)127 test_get_host_realm(krb5_context ctx, char *host)
128 {
129 char **realms, **cpp;
130 krb5_error_code retval;
131
132 retval = krb5_get_host_realm(ctx, host, &realms);
133 if (retval) {
134 com_err("krb5_get_host_realm", retval, 0);
135 return;
136 }
137 printf("krb_get_host_realm(%s) returned:", host);
138 if (realms == 0) {
139 printf(" (null)\n");
140 return;
141 }
142 if (realms[0] == 0) {
143 printf(" (none)\n");
144 free(realms);
145 return;
146 }
147 for (cpp = realms; *cpp; cpp++) {
148 printf(" '%s'", *cpp);
149 free(*cpp);
150 }
151 free(realms);
152 printf("\n");
153 }
154
155 static void
test_get_realm_domain(krb5_context ctx,char * realm)156 test_get_realm_domain(krb5_context ctx, char *realm)
157 {
158 krb5_error_code retval;
159 char *domain;
160
161 retval = krb5_get_realm_domain(ctx, realm, &domain);
162 if (retval) {
163 com_err("krb5_get_realm_domain", retval, 0);
164 return;
165 }
166 printf("krb5_get_realm_domain(%s) returned '%s'\n", realm, domain);
167 free(domain);
168 }
169
170 static void
usage(char * progname)171 usage(char *progname)
172 {
173 fprintf(stderr, "%s: Usage: %s [-dc] [-k realm] [-r host] [-C ccname] [-D realm]\n",
174 progname, progname);
175 exit(1);
176 }
177
178 int
main(int argc,char ** argv)179 main(int argc, char **argv)
180 {
181 int c;
182 krb5_context ctx;
183 krb5_error_code retval;
184 extern char *optarg;
185
186 retval = krb5_init_context(&ctx);
187 if (retval) {
188 fprintf(stderr, "krb5_init_context returned error %u\n",
189 retval);
190 exit(1);
191 }
192
193 while ((c = getopt(argc, argv, "cdr:C:D:l:s:")) != -1) {
194 switch (c) {
195 case 'c': /* Get default ccname */
196 test_get_default_ccname(ctx);
197 break;
198 case 'd': /* Get default realm */
199 test_get_default_realm(ctx);
200 break;
201 case 'l':
202 test_locate_kdc(ctx, optarg);
203 break;
204 case 'r':
205 test_get_host_realm(ctx, optarg);
206 break;
207 case 's':
208 test_set_default_realm(ctx, optarg);
209 break;
210 case 'C':
211 test_set_default_ccname(ctx, optarg);
212 break;
213 case 'D':
214 test_get_realm_domain(ctx, optarg);
215 break;
216 default:
217 usage(argv[0]);
218 }
219 }
220
221
222 krb5_free_context(ctx);
223 exit(0);
224 }
225