< prev index next >
src/java.security.jgss/share/classes/sun/security/krb5/SCDynamicStoreConfig.java
Print this page
rev 54093 : 8257858: [macOS]: Remove JNF dependency from libosxsecurity/KeystoreImpl.m
8257860: [macOS]: Remove JNF dependency from libosxkrb5/SCDynamicStoreConfig.m
*** 1,7 ****
/*
! * Copyright (c) 2011, 2012, Oracle and/or its affiliates. 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2011, 2021, Oracle and/or its affiliates. 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 24,41 ****
*/
package sun.security.krb5;
import java.io.IOException;
- import java.util.Collection;
import java.util.Hashtable;
import java.util.Vector;
public class SCDynamicStoreConfig {
private static native void installNotificationCallback();
! private static native Hashtable<String, Object> getKerberosConfig();
private static boolean DEBUG = sun.security.krb5.internal.Krb5.DEBUG;
static {
boolean isMac = java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<Boolean>() {
--- 24,47 ----
*/
package sun.security.krb5;
import java.io.IOException;
import java.util.Hashtable;
+ import java.util.Iterator;
+ import java.util.List;
import java.util.Vector;
public class SCDynamicStoreConfig {
private static native void installNotificationCallback();
!
! /**
! * Returns the dynamic store setting for kerberos in a string array.
! * (realm kdc* null) null (mapping-domain mapping-realm)*
! */
! private static native List<String> getKerberosConfig();
private static boolean DEBUG = sun.security.krb5.internal.Krb5.DEBUG;
static {
boolean isMac = java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<Boolean>() {
*** 49,146 ****
}
});
if (isMac) installNotificationCallback();
}
- private static Vector<String> unwrapHost(
- Collection<Hashtable<String, String>> c) {
- Vector<String> vector = new Vector<String>();
- for (Hashtable<String, String> m : c) {
- vector.add(m.get("host"));
- }
- return vector;
- }
-
- /**
- * convertRealmConfigs: Maps the Object graph that we get from JNI to the
- * object graph that Config expects. Also the items inside the kdc array
- * are wrapped inside Hashtables
- */
- @SuppressWarnings("unchecked")
- private static Hashtable<String, Object>
- convertRealmConfigs(Hashtable<String, ?> configs) {
- Hashtable<String, Object> realmsTable = new Hashtable<String, Object>();
-
- for (String realm : configs.keySet()) {
- // get the kdc
- Hashtable<String, Collection<?>> map =
- (Hashtable<String, Collection<?>>) configs.get(realm);
- Hashtable<String, Vector<String>> realmMap =
- new Hashtable<String, Vector<String>>();
-
- // put the kdc into the realmMap
- Collection<Hashtable<String, String>> kdc =
- (Collection<Hashtable<String, String>>) map.get("kdc");
- if (kdc != null) realmMap.put("kdc", unwrapHost(kdc));
-
- // put the admin server into the realmMap
- Collection<Hashtable<String, String>> kadmin =
- (Collection<Hashtable<String, String>>) map.get("kadmin");
- if (kadmin != null) realmMap.put("admin_server", unwrapHost(kadmin));
-
- // add the full entry to the realmTable
- realmsTable.put(realm, realmMap);
- }
-
- return realmsTable;
- }
-
/**
* Calls down to JNI to get the raw Kerberos Config and maps the object
* graph to the one that Kerberos Config in Java expects
*
* @return
* @throws IOException
*/
public static Hashtable<String, Object> getConfig() throws IOException {
! Hashtable<String, Object> stanzaTable = getKerberosConfig();
! if (stanzaTable == null) {
throw new IOException(
"Could not load configuration from SCDynamicStore");
}
! if (DEBUG) System.out.println("Raw map from JNI: " + stanzaTable);
! return convertNativeConfig(stanzaTable);
! }
! @SuppressWarnings("unchecked")
! private static Hashtable<String, Object> convertNativeConfig(
! Hashtable<String, Object> stanzaTable) throws IOException {
! // convert SCDynamicStore realm structure to Java realm structure
! Hashtable<String, ?> realms =
! (Hashtable<String, ?>) stanzaTable.get("realms");
! if (realms == null || realms.isEmpty()) {
! throw new IOException(
! "SCDynamicStore contains an empty Kerberos setting");
}
! stanzaTable.remove("realms");
! Hashtable<String, Object> realmsTable = convertRealmConfigs(realms);
! stanzaTable.put("realms", realmsTable);
! WrapAllStringInVector(stanzaTable);
! if (DEBUG) System.out.println("stanzaTable : " + stanzaTable);
! return stanzaTable;
! }
!
! @SuppressWarnings("unchecked")
! private static void WrapAllStringInVector(
! Hashtable<String, Object> stanzaTable) {
! for (String s: stanzaTable.keySet()) {
! Object v = stanzaTable.get(s);
! if (v instanceof Hashtable) {
! WrapAllStringInVector((Hashtable<String,Object>)v);
! } else if (v instanceof String) {
! Vector<String> vec = new Vector<>();
! vec.add((String)v);
! stanzaTable.put(s, vec);
}
}
}
}
--- 55,128 ----
}
});
if (isMac) installNotificationCallback();
}
/**
* Calls down to JNI to get the raw Kerberos Config and maps the object
* graph to the one that Kerberos Config in Java expects
*
* @return
* @throws IOException
*/
public static Hashtable<String, Object> getConfig() throws IOException {
! List<String> list = getKerberosConfig();
! if (list == null) {
throw new IOException(
"Could not load configuration from SCDynamicStore");
}
! if (DEBUG) System.out.println("Raw map from JNI: " + list);
! Hashtable<String,Object> v = new Hashtable<>();
! Hashtable<String,Object> realms = new Hashtable<>();
! Iterator<String> iterator = list.iterator();
! String defaultRealm = null;
!
! while (true) {
! String nextRealm = iterator.next();
! if (nextRealm == null) {
! break;
! }
! if (defaultRealm == null) {
! defaultRealm = nextRealm;
! Hashtable<String,Object> dr = new Hashtable<>();
! dr.put("default_realm", v1(defaultRealm));
! v.put("libdefaults", dr);
! }
! Vector<String> kdcs = new Vector<>();
! while (true) {
! String nextKdc = iterator.next();
! if (nextKdc == null) {
! break;
! }
! kdcs.add(nextKdc);
}
! if (!kdcs.isEmpty()) {
! Hashtable<String,Object> ri = new Hashtable<>();
! ri.put("kdc", kdcs);
! realms.put(nextRealm, ri);
}
}
+ if (!realms.isEmpty()) {
+ v.put("realms", realms);
+ }
+ Hashtable<String,Object> mapping = new Hashtable<>();
+ while (true) {
+ if (!iterator.hasNext()) {
+ break;
+ }
+ mapping.put(iterator.next(), v1(iterator.next()));
+ }
+ if (!mapping.isEmpty()) {
+ v.put("domain_realm", mapping);
+ }
+ return v;
+ }
+
+ // Make a single value Vector. Config's stanzaTable always
+ // use Vector as end values.
+ private static Vector<String> v1(String s) {
+ Vector<String> out = new Vector<>();
+ out.add(s);
+ return out;
}
}
< prev index next >