| 912 | */ |
| 913 | |
| 914 | int /* O - 0 on success, -1 on error */ |
| 915 | httpLoadCredentials( |
| 916 | const char *path, /* I - Keychain path or @code NULL@ for default */ |
| 917 | cups_array_t **credentials, /* IO - Credentials */ |
| 918 | const char *common_name) /* I - Common name for credentials */ |
| 919 | { |
| 920 | OSStatus err; /* Error info */ |
| 921 | #if TARGET_OS_OSX |
| 922 | char filename[1024]; /* Filename for keychain */ |
| 923 | SecKeychainRef keychain = NULL,/* Keychain reference */ |
| 924 | syschain = NULL;/* System keychain */ |
| 925 | CFArrayRef list; /* Keychain list */ |
| 926 | #endif /* TARGET_OS_OSX */ |
| 927 | SecCertificateRef cert = NULL; /* Certificate */ |
| 928 | CFDataRef data; /* Certificate data */ |
| 929 | SecPolicyRef policy = NULL; /* Policy ref */ |
| 930 | CFStringRef cfcommon_name = NULL; |
| 931 | /* Server name */ |
| 932 | CFMutableDictionaryRef query = NULL; /* Query qualifiers */ |
| 933 | |
| 934 | |
| 935 | DEBUG_printf(("httpLoadCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, (void *)credentials, common_name)); |
| 936 | |
| 937 | if (!credentials) |
| 938 | return (-1); |
| 939 | |
| 940 | *credentials = NULL; |
| 941 | |
| 942 | #if TARGET_OS_OSX |
| 943 | keychain = http_cdsa_open_keychain(path, filename, sizeof(filename)); |
| 944 | |
| 945 | if (!keychain) |
| 946 | goto cleanup; |
| 947 | |
| 948 | syschain = http_cdsa_open_system_keychain(); |
| 949 | |
| 950 | #else |
| 951 | if (path) |
| 952 | return (-1); |
| 953 | #endif /* TARGET_OS_OSX */ |
| 954 | |
| 955 | cfcommon_name = CFStringCreateWithCString(kCFAllocatorDefault, common_name, kCFStringEncodingUTF8); |
| 956 | |
| 957 | policy = SecPolicyCreateSSL(1, cfcommon_name); |
| 958 | |
| 959 | if (cfcommon_name) |
| 960 | CFRelease(cfcommon_name); |
| 961 | |
| 962 | if (!policy) |
| 963 | goto cleanup; |
| 964 | |
| 965 | if (!(query = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks))) |
| 966 | goto cleanup; |
| 967 | |
| 968 | CFDictionaryAddValue(query, kSecClass, kSecClassCertificate); |
| 969 | CFDictionaryAddValue(query, kSecMatchPolicy, policy); |
| 970 | CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue); |
| 971 | CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne); |
no test coverage detected