6793475: krb5.ini not found on some Windows
Reviewed-by: xuelei
This commit is contained in:
parent
640ed7d08b
commit
220ed00264
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Portions Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -74,7 +74,7 @@ public class Config {
|
||||
private String defaultRealm; // default kdc realm.
|
||||
|
||||
// used for native interface
|
||||
private static native String getWindowsDirectory();
|
||||
private static native String getWindowsDirectory(boolean isSystem);
|
||||
|
||||
|
||||
/**
|
||||
@ -661,38 +661,37 @@ public class Config {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the default configuration file name. The file will be searched
|
||||
* in a list of possible loations in the following order:
|
||||
* 1. the location and file name defined by system property
|
||||
* "java.security.krb5.conf",
|
||||
* 2. at Java home lib\security directory with "krb5.conf" name,
|
||||
* 3. "krb5.ini" at Java home,
|
||||
* 4. at windows directory with the name of "krb5.ini" for Windows,
|
||||
* /etc/krb5/krb5.conf for Solaris, /etc/krb5.conf for Linux.
|
||||
* Gets the default configuration file name. This method will never
|
||||
* return null.
|
||||
*
|
||||
* If the system property "java.security.krb5.conf" is defined, we'll
|
||||
* use its value, no matter if the file exists or not. Otherwise,
|
||||
* the file will be searched in a list of possible loations in the
|
||||
* following order:
|
||||
*
|
||||
* 1. at Java home lib\security directory with "krb5.conf" name,
|
||||
* 2. at windows directory with the name of "krb5.ini" for Windows,
|
||||
* /etc/krb5/krb5.conf for Solaris, /etc/krb5.conf otherwise.
|
||||
*
|
||||
* Note: When the Terminal Service is started in Windows (from 2003),
|
||||
* there are two kinds of Windows directories: A system one (say,
|
||||
* C:\Windows), and a user-private one (say, C:\Users\Me\Windows).
|
||||
* We will first look for krb5.ini in the user-private one. If not
|
||||
* found, try the system one instead.
|
||||
*/
|
||||
private String getFileName() {
|
||||
String name =
|
||||
java.security.AccessController.doPrivileged(
|
||||
new sun.security.action.
|
||||
GetPropertyAction("java.security.krb5.conf"));
|
||||
if (name != null) {
|
||||
boolean temp =
|
||||
java.security.AccessController.doPrivileged(
|
||||
new FileExistsAction(name));
|
||||
if (temp)
|
||||
return name;
|
||||
} else {
|
||||
if (name == null) {
|
||||
name = java.security.AccessController.doPrivileged(
|
||||
new sun.security.action.
|
||||
GetPropertyAction("java.home")) + File.separator +
|
||||
"lib" + File.separator + "security" +
|
||||
File.separator + "krb5.conf";
|
||||
boolean temp =
|
||||
java.security.AccessController.doPrivileged(
|
||||
new FileExistsAction(name));
|
||||
if (temp) {
|
||||
return name;
|
||||
} else {
|
||||
if (!fileExists(name)) {
|
||||
name = null;
|
||||
String osname =
|
||||
java.security.AccessController.doPrivileged(
|
||||
new sun.security.action.GetPropertyAction("os.name"));
|
||||
@ -703,19 +702,35 @@ public class Config {
|
||||
// ignore exceptions
|
||||
}
|
||||
if (Credentials.alreadyLoaded) {
|
||||
if ((name = getWindowsDirectory()) == null) {
|
||||
name = "c:\\winnt\\krb5.ini";
|
||||
} else if (name.endsWith("\\")) {
|
||||
name += "krb5.ini";
|
||||
} else {
|
||||
name += "\\krb5.ini";
|
||||
String path = getWindowsDirectory(false);
|
||||
if (path != null) {
|
||||
if (path.endsWith("\\")) {
|
||||
path = path + "krb5.ini";
|
||||
} else {
|
||||
path = path + "\\krb5.ini";
|
||||
}
|
||||
if (fileExists(path)) {
|
||||
name = path;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (name == null) {
|
||||
path = getWindowsDirectory(true);
|
||||
if (path != null) {
|
||||
if (path.endsWith("\\")) {
|
||||
path = path + "krb5.ini";
|
||||
} else {
|
||||
path = path + "\\krb5.ini";
|
||||
}
|
||||
name = path;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (name == null) {
|
||||
name = "c:\\winnt\\krb5.ini";
|
||||
}
|
||||
} else if (osname.startsWith("SunOS")) {
|
||||
name = "/etc/krb5/krb5.conf";
|
||||
} else if (osname.startsWith("Linux")) {
|
||||
} else {
|
||||
name = "/etc/krb5.conf";
|
||||
}
|
||||
}
|
||||
@ -1171,6 +1186,11 @@ public class Config {
|
||||
return kdcs;
|
||||
}
|
||||
|
||||
private boolean fileExists(String name) {
|
||||
return java.security.AccessController.doPrivileged(
|
||||
new FileExistsAction(name));
|
||||
}
|
||||
|
||||
static class FileExistsAction
|
||||
implements java.security.PrivilegedAction<Boolean> {
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,6 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
#define UNICODE
|
||||
#include <jni.h>
|
||||
#include <windows.h>
|
||||
#include <stdlib.h>
|
||||
@ -30,22 +31,20 @@
|
||||
/*
|
||||
* Class: sun_security_krb5_Config
|
||||
* Method: getWindowsDirectory
|
||||
* Signature: ()Ljava/lang/String;
|
||||
* Signature: (Z)Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_sun_security_krb5_Config_getWindowsDirectory(
|
||||
JNIEnv* env, jclass configClass) {
|
||||
LPTSTR lpPath = NULL;
|
||||
UINT uLength ;
|
||||
jstring path = NULL;
|
||||
|
||||
if (uLength = GetWindowsDirectory(lpPath, 0)) {
|
||||
lpPath = (LPTSTR)malloc(sizeof(TCHAR) * uLength);
|
||||
if (lpPath != NULL) {
|
||||
if (GetWindowsDirectory(lpPath, uLength)) {
|
||||
path = (*env)->NewStringUTF(env, lpPath);
|
||||
}
|
||||
free(lpPath);
|
||||
}
|
||||
JNIEnv* env, jclass configClass, jboolean isSystem) {
|
||||
TCHAR lpPath[MAX_PATH+1];
|
||||
UINT len;
|
||||
if (isSystem) {
|
||||
len = GetSystemWindowsDirectory(lpPath, MAX_PATH);
|
||||
} else {
|
||||
len = GetWindowsDirectory(lpPath, MAX_PATH);
|
||||
}
|
||||
if (len) {
|
||||
return (*env)->NewString(env, lpPath, len);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user