< 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 >