|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.security.jgss.wrapper; |
|
|
|
import java.util.HashMap; |
|
import java.security.Provider; |
|
import java.security.AccessController; |
|
import java.security.PrivilegedAction; |
|
import org.ietf.jgss.Oid; |
|
import sun.security.action.PutAllAction; |
|
|
|
/** |
|
* Defines the Sun NativeGSS provider for plugging in the |
|
* native GSS mechanisms to Java GSS. |
|
* |
|
* List of supported mechanisms depends on the local |
|
* machine configuration. |
|
* |
|
* @author Yu-Ching Valerie Peng |
|
*/ |
|
|
|
public final class SunNativeProvider extends Provider { |
|
|
|
private static final long serialVersionUID = -238911724858694204L; |
|
|
|
private static final String NAME = "SunNativeGSS"; |
|
private static final String INFO = "Sun Native GSS provider"; |
|
private static final String MF_CLASS = |
|
"sun.security.jgss.wrapper.NativeGSSFactory"; |
|
private static final String LIB_PROP = "sun.security.jgss.lib"; |
|
private static final String DEBUG_PROP = "sun.security.nativegss.debug"; |
|
private static HashMap<String, String> MECH_MAP; |
|
static final Provider INSTANCE = new SunNativeProvider(); |
|
static boolean DEBUG; |
|
static void debug(String message) { |
|
if (DEBUG) { |
|
if (message == null) { |
|
throw new NullPointerException(); |
|
} |
|
System.out.println(NAME + ": " + message); |
|
} |
|
} |
|
|
|
static { |
|
MECH_MAP = |
|
AccessController.doPrivileged( |
|
new PrivilegedAction<HashMap<String, String>>() { |
|
public HashMap<String, String> run() { |
|
DEBUG = Boolean.parseBoolean |
|
(System.getProperty(DEBUG_PROP)); |
|
try { |
|
System.loadLibrary("j2gss"); |
|
} catch (Error err) { |
|
debug("No j2gss library found!"); |
|
if (DEBUG) err.printStackTrace(); |
|
return null; |
|
} |
|
String gssLibs[] = new String[0]; |
|
String defaultLib = System.getProperty(LIB_PROP); |
|
if (defaultLib == null || defaultLib.trim().equals("")) { |
|
String osname = System.getProperty("os.name"); |
|
if (osname.startsWith("SunOS")) { |
|
gssLibs = new String[]{ "libgss.so" }; |
|
} else if (osname.startsWith("Linux")) { |
|
gssLibs = new String[]{ |
|
"libgssapi.so", |
|
"libgssapi_krb5.so", |
|
"libgssapi_krb5.so.2", |
|
}; |
|
} else if (osname.contains("OS X")) { |
|
gssLibs = new String[]{ |
|
"libgssapi_krb5.dylib", |
|
"/usr/lib/sasl2/libgssapiv2.2.so", |
|
}; |
|
} |
|
} else { |
|
gssLibs = new String[]{ defaultLib }; |
|
} |
|
for (String libName: gssLibs) { |
|
if (GSSLibStub.init(libName, DEBUG)) { |
|
debug("Loaded GSS library: " + libName); |
|
Oid[] mechs = GSSLibStub.indicateMechs(); |
|
HashMap<String, String> map = |
|
new HashMap<String, String>(); |
|
for (int i = 0; i < mechs.length; i++) { |
|
debug("Native MF for " + mechs[i]); |
|
map.put("GssApiMechanism." + mechs[i], |
|
MF_CLASS); |
|
} |
|
return map; |
|
} |
|
} |
|
return null; |
|
} |
|
}); |
|
} |
|
|
|
public SunNativeProvider() { |
|
|
|
super(NAME, 1.8d, INFO); |
|
|
|
if (MECH_MAP != null) { |
|
AccessController.doPrivileged(new PutAllAction(this, MECH_MAP)); |
|
} |
|
} |
|
} |