< 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 +1,7 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * 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,18 +24,24 @@
  */
 
 package sun.security.krb5;
 
 import java.io.IOException;
-import java.util.Collection;
 import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Vector;
 
 
 public class SCDynamicStoreConfig {
     private static native void installNotificationCallback();
-    private static native Hashtable<String, Object> getKerberosConfig();
+
+    /**
+     * 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,98 +55,74 @@
                 }
             });
         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) {
+        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: " + stanzaTable);
-        return convertNativeConfig(stanzaTable);
-    }
+        if (DEBUG) System.out.println("Raw map from JNI: " + list);
 
-    @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");
+        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);
         }
-        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);
+            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 >