xref: /freebsd/crypto/krb5/src/lib/krb5/os/t_std_conf.c (revision 7f2fe78b9dd5f51c821d771b63d2e096f6fd49e9)
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