1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * ident	"%Z%%M%	%I%	%E% SMI"
24 *
25 * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
26 * All rights reserved.
27 */
28
29//
30// Class representing the info from /etc/krb5/krb5.conf.
31// Currently, the admin tool only needs to access all of the
32// admin servers for all of the realms enumerated in the file,
33// and the default realm.
34// A sample file looks like this:
35
36/*
37
38[libdefaults]
39	default_realm = SUNSOFT.FOO.SUN.COM
40
41[realms]
42	GENESIS.FOO.SUN.COM = {
43		kdc = xxxxx.eng.sun.com
44		admin_server = xxxxx.eng.sun.com
45	}
46	SUNSOFT.FOO.SUN.COM = {
47		kdc = gandolf.eng.sun.com
48		kdc = ulong.eng.sun.com
49		admin_server = gandolf.eng.sun.com:749
50	}
51
52[domain_realm]
53	.eng.sun.com = SUNSOFT.FOO.SUN.COM
54	.sun.com = SUNSOFT.FOO.SUN.COM
55
56[logging]
57	default = FILE:/var/krb5/kdc.log
58	kdc = FILE:/var/krb5/kdc.log
59
60[appdefaults]
61	gkadmin = {
62                help_url = http:...
63	}
64*/
65
66import java.io.*;
67import java.util.Vector;
68import java.util.StringTokenizer;
69
70public class Krb5Conf {
71
72    private String DefRealm = null;
73    private String HelpURL = null;
74    private Vector RealmVector = new Vector(10, 10);
75
76    public Krb5Conf() {
77
78    	FileReader fr = null;
79
80    	try {
81	    fr = new FileReader("/etc/krb5/krb5.conf");
82	} catch (FileNotFoundException e) {
83	    // System.out.println("Error: " + e);
84	    return;
85	}
86	BufferedReader in = new BufferedReader(fr);
87
88	String line = null, Name = null, Server = "", Port = "0";
89	boolean wantdef = false, wantrealm = false;
90	boolean wantadmin = false, skipcurly = false;
91	boolean wantapp = false, wanturl = false;
92	RealmInfo r = null;
93
94	// Read each line of the file
95	do {
96	    try {
97		line = in.readLine();
98	    } catch (IOException e) {
99		// System.out.println("Error: " + e);
100		return;
101	    }
102	    if (line == null)
103		break;
104//	    System.out.println(line);
105
106	    // Get some help with parsing
107	    StringTokenizer t = new StringTokenizer(line);
108	    if (!t.hasMoreTokens())
109		continue;
110	    String s = t.nextToken();
111	    if (s.charAt(0) == '#')
112		continue;
113
114	    // Look for [realm], [libdefaults] or [appdefaults]
115	    if (s.charAt(0) == '[') {
116		wantdef = false;
117		wantrealm = false;
118		wantapp = false;
119		if (s.compareTo("[libdefaults]") == 0)
120		    wantdef = true;
121		if (s.compareTo("[realms]") == 0)
122		    wantrealm = true;
123		if (s.compareTo("[appdefaults]") == 0)
124		    wantapp = true;
125	    } else {
126
127		// Have we seen [libdefaults]?
128		if (wantdef && s.compareTo("default_realm") == 0) {
129		    if (t.hasMoreTokens()) {
130			DefRealm = t.nextToken(" \t\n\r=");
131			wantdef = false;
132		    }
133
134		// Have we seen [realm] instead?
135		} else if (wantrealm) {
136
137		    // We got what we needed; skip until "{" is balanced
138		    if (skipcurly && s.compareTo("}") == 0) {
139			skipcurly = false;
140			continue;
141		    }
142		    // First the realm name, then the admin server
143		    if (!wantadmin) {
144			Name = new String(s);
145			wantadmin = true;
146			Server = "";
147			Port = "0";
148		    } else {
149			if (s.compareTo("admin_server") == 0) {
150			    s = t.nextToken(" \t\n\r=:");
151			    Server = new String(s);
152			    if (t.hasMoreTokens()) {
153				s = t.nextToken(" \t\n\r=:");
154				Port = new String(s);
155			    }
156
157			    // Store result in the vector
158			    r = new RealmInfo(Name, Server, Port);
159			    RealmVector.addElement(r);
160			    wantadmin = false;
161			    skipcurly = true;
162			}
163		    }
164		} else if (wantapp) {
165		    if (wanturl && s.compareTo("help_url") == 0) {
166			if (t.hasMoreTokens()) {
167			    HelpURL = t.nextToken(" \t\n\r=");
168			    wantapp = false;
169			    wanturl = false;
170			}
171		    } else if (s.compareTo("gkadmin") == 0)
172			wanturl = true;
173		}
174	    }
175	} while (line != null);
176    }
177
178    public String getDefaultRealm() {
179	return DefRealm;
180    }
181
182    public String getHelpURL() {
183	return HelpURL;
184    }
185
186    public String getAllRealms() {
187	String s = "";
188	for (int i = 0; i < RealmVector.size(); i++) {
189	    RealmInfo r = (RealmInfo)RealmVector.elementAt(i);
190	    s = new String(s + " " + r.RealmName);
191	}
192	return s;
193    }
194
195    public String getRealmServer(String realm) {
196	for (int i = 0; i < RealmVector.size(); i++) {
197	    RealmInfo r = (RealmInfo)RealmVector.elementAt(i);
198	    if (realm.compareTo(r.RealmName) == 0)
199		return r.AdminServer;
200	}
201	return null;
202    }
203
204    public String getRealmPort(String realm) {
205	for (int i = 0; i < RealmVector.size(); i++) {
206	    RealmInfo r = (RealmInfo)RealmVector.elementAt(i);
207	    if (realm.compareTo(r.RealmName) == 0)
208		return r.ServerPort;
209	}
210	return null;
211    }
212
213    class RealmInfo extends Object {
214	String RealmName;
215	String AdminServer;
216	String ServerPort;
217
218	public RealmInfo(String name, String server, String port) {
219	    RealmName = new String(name);
220	    AdminServer = new String(server);
221	    ServerPort = new String(port);
222	}
223    }
224
225    public static void main(String[] args) {
226	Krb5Conf c = new Krb5Conf();
227	System.out.println("Default: " + c.getDefaultRealm());
228	System.out.println("Realms: " + c.getAllRealms());
229	StringTokenizer t = new StringTokenizer(c.getAllRealms());
230	while (t.hasMoreTokens()) {
231	    String r = t.nextToken();
232	    String s = c.getRealmServer(r);
233	    String p = c.getRealmPort(r);
234	    System.out.println("For realm " + r + ", server is " + s
235				     + ", port is " + p);
236	}
237	System.out.println("HelpURL: " + c.getHelpURL());
238    }
239}
240