--- old/src/macosx/native/java/util/SCDynamicStoreConfig.m 2014-02-09 17:05:59.421428640 +0000 +++ /dev/null 2013-11-25 15:01:06.400581647 +0000 @@ -1,222 +0,0 @@ -/* - * 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 - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#import -#import -#import - - -@interface JNFVectorCoercion : NSObject { } -@end - -@implementation JNFVectorCoercion - -- (jobject) coerceNSObject:(id)obj withEnv:(JNIEnv *)env usingCoercer:(JNFTypeCoercion *)coercer { - static JNF_CLASS_CACHE(jc_Vector, "java/util/Vector"); - static JNF_CTOR_CACHE(jm_Vector_ctor, jc_Vector, "(I)V"); - static JNF_MEMBER_CACHE(jm_Vector_add, jc_Vector, "add", "(Ljava/lang/Object;)Z"); - - NSArray *nsArray = (NSArray *)obj; - jobject javaArray = JNFNewObject(env, jm_Vector_ctor, (jint)[nsArray count]); - - for (id obj in nsArray) { - jobject jobj = [coercer coerceNSObject:obj withEnv:env usingCoercer:coercer]; - JNFCallBooleanMethod(env, javaArray, jm_Vector_add, jobj); - if (jobj != NULL) (*env)->DeleteLocalRef(env, jobj); - } - - return javaArray; -} - -- (id) coerceJavaObject:(jobject)obj withEnv:(JNIEnv *)env usingCoercer:(JNFTypeCoercion *)coercer { - return nil; -} - -@end - - -@interface JNFHashtableCoercion : NSObject { } -@end - -@implementation JNFHashtableCoercion - -- (jobject) coerceNSObject:(id)obj withEnv:(JNIEnv *)env usingCoercer:(JNFTypeCoercion *)coercer { - static JNF_CLASS_CACHE(jc_Hashtable, "java/util/Hashtable"); - static JNF_CTOR_CACHE(jm_Hashtable_ctor, jc_Hashtable, "()V"); - static JNF_MEMBER_CACHE(jm_Hashtable_put, jc_Hashtable, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - - NSDictionary *nsDict = (NSDictionary *)obj; - NSEnumerator *keyEnum = [nsDict keyEnumerator]; - - jobject jHashTable = JNFNewObject(env, jm_Hashtable_ctor); - - id key = nil; - while ((key = [keyEnum nextObject]) != nil) { - jobject jkey = [coercer coerceNSObject:key withEnv:env usingCoercer:coercer]; - - id value = [nsDict objectForKey:key]; - jobject jvalue = [coercer coerceNSObject:value withEnv:env usingCoercer:coercer]; - - JNFCallObjectMethod(env, jHashTable, jm_Hashtable_put, jkey, jvalue); - - if (jkey != NULL) (*env)->DeleteLocalRef(env, jkey); - if (jvalue != NULL) (*env)->DeleteLocalRef(env, jvalue); - } - - return jHashTable; -} - -- (id) coerceJavaObject:(jobject)obj withEnv:(JNIEnv *)env usingCoercer:(JNFTypeCoercion *)coercer { - return nil; -} - -@end - - - -NSDictionary *realmConfigsForRealms(SCDynamicStoreRef store, NSArray *realms) { - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - - for (NSString *realm in realms) { - CFTypeRef realmInfo = SCDynamicStoreCopyValue(store, (CFStringRef) [NSString stringWithFormat:@"Kerberos:%@", realm]); - - if (CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) { - return nil; - } - - [dict setObject:(NSArray *)realmInfo forKey:realm]; - CFRelease(realmInfo); - } - - return dict; -} - - -#define KERBEROS_DEFAULT_REALMS @"Kerberos-Default-Realms" -#define KERBEROS_DEFAULT_REALM_MAPPINGS @"Kerberos-Domain-Realm-Mappings" - -void _SCDynamicStoreCallBack(SCDynamicStoreRef store, CFArrayRef changedKeys, void *info) { - NSArray *keys = (NSArray *)changedKeys; - if ([keys count] == 0) return; - if (![keys containsObject:KERBEROS_DEFAULT_REALMS] && ![keys containsObject:KERBEROS_DEFAULT_REALM_MAPPINGS]) return; - - JNFPerformEnvBlock(JNFThreadDetachOnThreadDeath | JNFThreadSetSystemClassLoaderOnAttach | JNFThreadAttachAsDaemon, ^(JNIEnv *env) { - static JNF_CLASS_CACHE(jc_Config, "sun/security/krb5/Config"); - static JNF_STATIC_MEMBER_CACHE(jm_Config_refresh, jc_Config, "refresh", "()V"); - JNFCallStaticVoidMethod(env, jm_Config_refresh); - }); -} - -/* - * Class: sun_security_krb5_SCDynamicStoreConfig - * Method: installNotificationCallback - */ -JNIEXPORT void JNICALL Java_sun_security_krb5_SCDynamicStoreConfig_installNotificationCallback(JNIEnv *env, jclass klass) { - -JNF_COCOA_ENTER(env); - - SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java"), _SCDynamicStoreCallBack, NULL); - if (store == NULL) { - return; - } - - NSArray *keys = [NSArray arrayWithObjects:KERBEROS_DEFAULT_REALMS, KERBEROS_DEFAULT_REALM_MAPPINGS, nil]; - SCDynamicStoreSetNotificationKeys(store, (CFArrayRef) keys, NULL); - - CFRunLoopSourceRef rls = SCDynamicStoreCreateRunLoopSource(NULL, store, 0); - if (rls != NULL) { - CFRunLoopAddSource(CFRunLoopGetMain(), rls, kCFRunLoopDefaultMode); - CFRelease(rls); - } - - CFRelease(store); - -JNF_COCOA_EXIT(env); - -} - -/* - * Class: sun_security_krb5_SCDynamicStoreConfig - * Method: getKerberosConfig - * Signature: ()Ljava/util/Hashtable; - */ -JNIEXPORT jobject JNICALL Java_sun_security_krb5_SCDynamicStoreConfig_getKerberosConfig(JNIEnv *env, jclass klass) { - jobject jHashTable = NULL; - -JNF_COCOA_ENTER(env); - - SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java-kerberos"), NULL, NULL); - if (store == NULL) { - return NULL; - } - - CFTypeRef realms = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALMS); - if (realms == NULL || CFGetTypeID(realms) != CFArrayGetTypeID()) { - if (realms) CFRelease(realms); - CFRelease(store); - return NULL; - } - - CFTypeRef realmMappings = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALM_MAPPINGS); - - if (realmMappings == NULL || CFGetTypeID(realmMappings) != CFArrayGetTypeID()) { - if (realmMappings) CFRelease(realmMappings); - CFRelease(realms); - CFRelease(store); - return NULL; - } - - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - - if (CFArrayGetCount(realms) > 0) { - NSDictionary *defaultRealmsDict = [NSDictionary dictionaryWithObject:[(NSArray *)realms objectAtIndex:0] forKey:@"default_realm"]; - [dict setObject:defaultRealmsDict forKey:@"libdefaults"]; - - NSDictionary *realmConfigs = realmConfigsForRealms(store, (NSArray *)realms); - [dict setObject:realmConfigs forKey:@"realms"]; - } - CFRelease(realms); - CFRelease(store); - - if (CFArrayGetCount(realmMappings) > 0) { - [dict setObject:[(NSArray *)realmMappings objectAtIndex:0] forKey:@"domain_realm"]; - } - CFRelease(realmMappings); - - - // create and load a coercer with all of the different coercions to convert each type of object - JNFTypeCoercer *coercer = [[[JNFTypeCoercer alloc] init] autorelease]; - [JNFDefaultCoercions addStringCoercionTo:coercer]; - [JNFDefaultCoercions addNumberCoercionTo:coercer]; - [coercer addCoercion:[[[JNFHashtableCoercion alloc] init] autorelease] forNSClass:[NSDictionary class] javaClass:@"java/util/Map"]; - [coercer addCoercion:[[[JNFVectorCoercion alloc] init] autorelease] forNSClass:[NSArray class] javaClass:@"java/util/List"]; - - // convert Cocoa graph to Java graph - jHashTable = [coercer coerceNSObject:dict withEnv:env]; - -JNF_COCOA_EXIT(env); - - return jHashTable; -} --- /dev/null 2013-11-25 15:01:06.400581647 +0000 +++ new/src/macosx/native/sun/security/krb5/SCDynamicStoreConfig.m 2014-02-09 17:05:59.077428648 +0000 @@ -0,0 +1,222 @@ +/* + * 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 + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#import +#import +#import + + +@interface JNFVectorCoercion : NSObject { } +@end + +@implementation JNFVectorCoercion + +- (jobject) coerceNSObject:(id)obj withEnv:(JNIEnv *)env usingCoercer:(JNFTypeCoercion *)coercer { + static JNF_CLASS_CACHE(jc_Vector, "java/util/Vector"); + static JNF_CTOR_CACHE(jm_Vector_ctor, jc_Vector, "(I)V"); + static JNF_MEMBER_CACHE(jm_Vector_add, jc_Vector, "add", "(Ljava/lang/Object;)Z"); + + NSArray *nsArray = (NSArray *)obj; + jobject javaArray = JNFNewObject(env, jm_Vector_ctor, (jint)[nsArray count]); + + for (id obj in nsArray) { + jobject jobj = [coercer coerceNSObject:obj withEnv:env usingCoercer:coercer]; + JNFCallBooleanMethod(env, javaArray, jm_Vector_add, jobj); + if (jobj != NULL) (*env)->DeleteLocalRef(env, jobj); + } + + return javaArray; +} + +- (id) coerceJavaObject:(jobject)obj withEnv:(JNIEnv *)env usingCoercer:(JNFTypeCoercion *)coercer { + return nil; +} + +@end + + +@interface JNFHashtableCoercion : NSObject { } +@end + +@implementation JNFHashtableCoercion + +- (jobject) coerceNSObject:(id)obj withEnv:(JNIEnv *)env usingCoercer:(JNFTypeCoercion *)coercer { + static JNF_CLASS_CACHE(jc_Hashtable, "java/util/Hashtable"); + static JNF_CTOR_CACHE(jm_Hashtable_ctor, jc_Hashtable, "()V"); + static JNF_MEMBER_CACHE(jm_Hashtable_put, jc_Hashtable, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + + NSDictionary *nsDict = (NSDictionary *)obj; + NSEnumerator *keyEnum = [nsDict keyEnumerator]; + + jobject jHashTable = JNFNewObject(env, jm_Hashtable_ctor); + + id key = nil; + while ((key = [keyEnum nextObject]) != nil) { + jobject jkey = [coercer coerceNSObject:key withEnv:env usingCoercer:coercer]; + + id value = [nsDict objectForKey:key]; + jobject jvalue = [coercer coerceNSObject:value withEnv:env usingCoercer:coercer]; + + JNFCallObjectMethod(env, jHashTable, jm_Hashtable_put, jkey, jvalue); + + if (jkey != NULL) (*env)->DeleteLocalRef(env, jkey); + if (jvalue != NULL) (*env)->DeleteLocalRef(env, jvalue); + } + + return jHashTable; +} + +- (id) coerceJavaObject:(jobject)obj withEnv:(JNIEnv *)env usingCoercer:(JNFTypeCoercion *)coercer { + return nil; +} + +@end + + + +NSDictionary *realmConfigsForRealms(SCDynamicStoreRef store, NSArray *realms) { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + + for (NSString *realm in realms) { + CFTypeRef realmInfo = SCDynamicStoreCopyValue(store, (CFStringRef) [NSString stringWithFormat:@"Kerberos:%@", realm]); + + if (CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) { + return nil; + } + + [dict setObject:(NSArray *)realmInfo forKey:realm]; + CFRelease(realmInfo); + } + + return dict; +} + + +#define KERBEROS_DEFAULT_REALMS @"Kerberos-Default-Realms" +#define KERBEROS_DEFAULT_REALM_MAPPINGS @"Kerberos-Domain-Realm-Mappings" + +void _SCDynamicStoreCallBack(SCDynamicStoreRef store, CFArrayRef changedKeys, void *info) { + NSArray *keys = (NSArray *)changedKeys; + if ([keys count] == 0) return; + if (![keys containsObject:KERBEROS_DEFAULT_REALMS] && ![keys containsObject:KERBEROS_DEFAULT_REALM_MAPPINGS]) return; + + JNFPerformEnvBlock(JNFThreadDetachOnThreadDeath | JNFThreadSetSystemClassLoaderOnAttach | JNFThreadAttachAsDaemon, ^(JNIEnv *env) { + static JNF_CLASS_CACHE(jc_Config, "sun/security/krb5/Config"); + static JNF_STATIC_MEMBER_CACHE(jm_Config_refresh, jc_Config, "refresh", "()V"); + JNFCallStaticVoidMethod(env, jm_Config_refresh); + }); +} + +/* + * Class: sun_security_krb5_SCDynamicStoreConfig + * Method: installNotificationCallback + */ +JNIEXPORT void JNICALL Java_sun_security_krb5_SCDynamicStoreConfig_installNotificationCallback(JNIEnv *env, jclass klass) { + +JNF_COCOA_ENTER(env); + + SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java"), _SCDynamicStoreCallBack, NULL); + if (store == NULL) { + return; + } + + NSArray *keys = [NSArray arrayWithObjects:KERBEROS_DEFAULT_REALMS, KERBEROS_DEFAULT_REALM_MAPPINGS, nil]; + SCDynamicStoreSetNotificationKeys(store, (CFArrayRef) keys, NULL); + + CFRunLoopSourceRef rls = SCDynamicStoreCreateRunLoopSource(NULL, store, 0); + if (rls != NULL) { + CFRunLoopAddSource(CFRunLoopGetMain(), rls, kCFRunLoopDefaultMode); + CFRelease(rls); + } + + CFRelease(store); + +JNF_COCOA_EXIT(env); + +} + +/* + * Class: sun_security_krb5_SCDynamicStoreConfig + * Method: getKerberosConfig + * Signature: ()Ljava/util/Hashtable; + */ +JNIEXPORT jobject JNICALL Java_sun_security_krb5_SCDynamicStoreConfig_getKerberosConfig(JNIEnv *env, jclass klass) { + jobject jHashTable = NULL; + +JNF_COCOA_ENTER(env); + + SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java-kerberos"), NULL, NULL); + if (store == NULL) { + return NULL; + } + + CFTypeRef realms = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALMS); + if (realms == NULL || CFGetTypeID(realms) != CFArrayGetTypeID()) { + if (realms) CFRelease(realms); + CFRelease(store); + return NULL; + } + + CFTypeRef realmMappings = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALM_MAPPINGS); + + if (realmMappings == NULL || CFGetTypeID(realmMappings) != CFArrayGetTypeID()) { + if (realmMappings) CFRelease(realmMappings); + CFRelease(realms); + CFRelease(store); + return NULL; + } + + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + + if (CFArrayGetCount(realms) > 0) { + NSDictionary *defaultRealmsDict = [NSDictionary dictionaryWithObject:[(NSArray *)realms objectAtIndex:0] forKey:@"default_realm"]; + [dict setObject:defaultRealmsDict forKey:@"libdefaults"]; + + NSDictionary *realmConfigs = realmConfigsForRealms(store, (NSArray *)realms); + [dict setObject:realmConfigs forKey:@"realms"]; + } + CFRelease(realms); + CFRelease(store); + + if (CFArrayGetCount(realmMappings) > 0) { + [dict setObject:[(NSArray *)realmMappings objectAtIndex:0] forKey:@"domain_realm"]; + } + CFRelease(realmMappings); + + + // create and load a coercer with all of the different coercions to convert each type of object + JNFTypeCoercer *coercer = [[[JNFTypeCoercer alloc] init] autorelease]; + [JNFDefaultCoercions addStringCoercionTo:coercer]; + [JNFDefaultCoercions addNumberCoercionTo:coercer]; + [coercer addCoercion:[[[JNFHashtableCoercion alloc] init] autorelease] forNSClass:[NSDictionary class] javaClass:@"java/util/Map"]; + [coercer addCoercion:[[[JNFVectorCoercion alloc] init] autorelease] forNSClass:[NSArray class] javaClass:@"java/util/List"]; + + // convert Cocoa graph to Java graph + jHashTable = [coercer coerceNSObject:dict withEnv:env]; + +JNF_COCOA_EXIT(env); + + return jHashTable; +}