Code review request: 7184246: Simplify Config.get() of krb5
Weijun Wang
weijun.wang at oracle.com
Wed Aug 15 12:25:54 UTC 2012
Updated at
http://cr.openjdk.java.net/~weijun/7184246/webrev.01
Changes:
1. String values (even if there is only one) for the same key are stored
in a vector. Two methods are provided:
get(String... keys) returns the last value
getAll(String... keys) returns all values concatenated
so if you see
[realms]
R = {
kdc = k1
kdc = k2
}
then get("realms","R","kdc") returns k2, getAll("realms","R","kdc")
returns "k1 k2".
2. SCDynamicStore is updated to be consistent with above. I also break
the getConfig() method into 2 so that I can write a test.
Thanks
Max
On 08/02/2012 10:14 PM, Weijun Wang wrote:
> Hi Valerie
>
> Please take a look at this
>
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7184246
>
> The code changes include:
>
> 1. Config.java:
> a. Retrieve settings using .get(String... keys) now
> b. Some changes to parsing. The sub-section depth can be at any
> level. For compatibility reasons, multiple values for the same key are
> only for [realms] and [capaths] sections.
> c. Still using Hashtable and Vector because I don't want to make
> changes to Mac's SCDynamicStoreConfig.m.
>
> 2. initStatic() methods in several classes that read krb5.conf settings
> to static fields
>
> 3. All other old calls to getDefault() methods.
>
> Thanks
> Max
>
>
>
> -------- Original Message --------
> 7184246: Simplify Config.get() of krb5
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7184246
>
> === *Description*
> ============================================================
> This is about the internal class sun.security.krb5.Config.
>
> If you want to get a value from inside krb5.conf, you can call
> getDefault(String). This might be good to get a value from the
> [libdefaults] section. However, the method was designed to be so smart
> that it can recursively search for key/value pairs no matter where and
> how deep it is.
>
> For example, given a krb5.conf
>
> [s1]
> a=b
>
> [s2]
> c=d
>
> [s3]
> e = {
> f = g
> }
>
> getDefault("a") = "b", getDefault("c") = "d", and astonishingly,
> getDefault("f") = "g".
>
> I don't think this is a good design, for several reasons:
>
> 1. It depends on the order of sections if there are key/value pairs with
> the same key in different sections.
>
> 2. It ignores wrong settings. For example, when doing a cross-realm
> auth, the Realm.getRealmsList(from,to) is used to get a path which
> should be defined in [capaths]. However, the method simply crawls
> recursively into any subsection it found and won't notice the [capaths]
> being mistakenly typed as [capath]
>
> 3. It lacks certain features. Because the function always return a
> String (same with the getDefault(String,String) method), getDefault("e")
> can only return a null. Therefore there is no way to find out the
> existence of the subsection e unless we also know it contains a key f.
>
> 4. The current Config class needs to know what subsections contains more
> subsections, and it hardcodes names like [capaths] and [realms].
>
> In short, it's just too smart and becomes unsafe to use. I suggest
> removing all this smartness and a user must use the full paths to get a
> value, say,
>
> kdc = config.get("realms", "SUN.COM", "kdc")
>
> My proposed spec is:
>
> 1. The Config class should understand a krb5.conf without knowing any
> specific section names. All it maintains is a Value, which can be either of
>
> String
> List<Value>
> TreeMap<String,Value>
>
> Here I use TreeMap to preserve the order (might not be necessary).
>
> 2. The basic retrieval method will be
>
> Value get(String... key)
>
> 3. There are simpler methods if you already know what the type in your
> case is
>
> String getAsString(String... key)
> List<String> getAsStringList(String... key)
>
> The compatibility risk will be low, and if there really comes a
> compatibility issue, most likely it will be because the caller had
> written his krb5.conf wrong.
>
> One of the advantages of the original design is that when a key is
> provided in both [libdefaults] and a given realm, the method can find it
> anyway. This will be useful for keys like kdc_timeout, max_retries.
> However, I think this automatic retrieval is confusing and error-prone,
> I'd rather manually call the get() method twice.
>
More information about the security-dev
mailing list