Krb5Conf.java revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* ident "%Z%%M% %I% %E% SMI"
*
* Copyright (c) 1999-2000 by Sun Microsystems, Inc.
* All rights reserved.
*/
//
// Class representing the info from /etc/krb5/krb5.conf.
// Currently, the admin tool only needs to access all of the
// admin servers for all of the realms enumerated in the file,
// and the default realm.
// A sample file looks like this:
/*
[libdefaults]
default_realm = SUNSOFT.FOO.SUN.COM
[realms]
GENESIS.FOO.SUN.COM = {
kdc = xxxxx.eng.sun.com
admin_server = xxxxx.eng.sun.com
}
SUNSOFT.FOO.SUN.COM = {
kdc = gandolf.eng.sun.com
kdc = ulong.eng.sun.com
admin_server = gandolf.eng.sun.com:749
}
[domain_realm]
.eng.sun.com = SUNSOFT.FOO.SUN.COM
.sun.com = SUNSOFT.FOO.SUN.COM
[logging]
default = FILE:/var/krb5/kdc.log
kdc = FILE:/var/krb5/kdc.log
[appdefaults]
gkadmin = {
help_url = http:...
}
*/
import java.io.*;
import java.util.Vector;
import java.util.StringTokenizer;
public class Krb5Conf {
private String DefRealm = null;
private String HelpURL = null;
private Vector RealmVector = new Vector(10, 10);
public Krb5Conf() {
FileReader fr = null;
try {
fr = new FileReader("/etc/krb5/krb5.conf");
} catch (FileNotFoundException e) {
// System.out.println("Error: " + e);
return;
}
BufferedReader in = new BufferedReader(fr);
String line = null, Name = null, Server = "", Port = "0";
boolean wantdef = false, wantrealm = false;
boolean wantadmin = false, skipcurly = false;
boolean wantapp = false, wanturl = false;
RealmInfo r = null;
// Read each line of the file
do {
try {
line = in.readLine();
} catch (IOException e) {
// System.out.println("Error: " + e);
return;
}
if (line == null)
break;
// System.out.println(line);
// Get some help with parsing
StringTokenizer t = new StringTokenizer(line);
if (!t.hasMoreTokens())
continue;
String s = t.nextToken();
if (s.charAt(0) == '#')
continue;
// Look for [realm], [libdefaults] or [appdefaults]
if (s.charAt(0) == '[') {
wantdef = false;
wantrealm = false;
wantapp = false;
if (s.compareTo("[libdefaults]") == 0)
wantdef = true;
if (s.compareTo("[realms]") == 0)
wantrealm = true;
if (s.compareTo("[appdefaults]") == 0)
wantapp = true;
} else {
// Have we seen [libdefaults]?
if (wantdef && s.compareTo("default_realm") == 0) {
if (t.hasMoreTokens()) {
DefRealm = t.nextToken(" \t\n\r=");
wantdef = false;
}
// Have we seen [realm] instead?
} else if (wantrealm) {
// We got what we needed; skip until "{" is balanced
if (skipcurly && s.compareTo("}") == 0) {
skipcurly = false;
continue;
}
// First the realm name, then the admin server
if (!wantadmin) {
Name = new String(s);
wantadmin = true;
Server = "";
Port = "0";
} else {
if (s.compareTo("admin_server") == 0) {
s = t.nextToken(" \t\n\r=:");
Server = new String(s);
if (t.hasMoreTokens()) {
s = t.nextToken(" \t\n\r=:");
Port = new String(s);
}
// Store result in the vector
r = new RealmInfo(Name, Server, Port);
RealmVector.addElement(r);
wantadmin = false;
skipcurly = true;
}
}
} else if (wantapp) {
if (wanturl && s.compareTo("help_url") == 0) {
if (t.hasMoreTokens()) {
HelpURL = t.nextToken(" \t\n\r=");
wantapp = false;
wanturl = false;
}
} else if (s.compareTo("gkadmin") == 0)
wanturl = true;
}
}
} while (line != null);
}
public String getDefaultRealm() {
return DefRealm;
}
public String getHelpURL() {
return HelpURL;
}
public String getAllRealms() {
String s = "";
for (int i = 0; i < RealmVector.size(); i++) {
RealmInfo r = (RealmInfo)RealmVector.elementAt(i);
s = new String(s + " " + r.RealmName);
}
return s;
}
public String getRealmServer(String realm) {
for (int i = 0; i < RealmVector.size(); i++) {
RealmInfo r = (RealmInfo)RealmVector.elementAt(i);
if (realm.compareTo(r.RealmName) == 0)
return r.AdminServer;
}
return null;
}
public String getRealmPort(String realm) {
for (int i = 0; i < RealmVector.size(); i++) {
RealmInfo r = (RealmInfo)RealmVector.elementAt(i);
if (realm.compareTo(r.RealmName) == 0)
return r.ServerPort;
}
return null;
}
class RealmInfo extends Object {
String RealmName;
String AdminServer;
String ServerPort;
public RealmInfo(String name, String server, String port) {
RealmName = new String(name);
AdminServer = new String(server);
ServerPort = new String(port);
}
}
public static void main(String[] args) {
Krb5Conf c = new Krb5Conf();
System.out.println("Default: " + c.getDefaultRealm());
System.out.println("Realms: " + c.getAllRealms());
StringTokenizer t = new StringTokenizer(c.getAllRealms());
while (t.hasMoreTokens()) {
String r = t.nextToken();
String s = c.getRealmServer(r);
String p = c.getRealmPort(r);
System.out.println("For realm " + r + ", server is " + s
+ ", port is " + p);
}
System.out.println("HelpURL: " + c.getHelpURL());
}
}