--- /dev/null
+/*
+ * idPref.cpp - maniuplate Identity Prefs
+ */
+
+#include <stdlib.h>
+#include <strings.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <clAppUtils/identPicker.h>
+#include <Security/Security.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+static void usage(char **argv)
+{
+ printf("usage: %s set|get [options]\n", argv[0]);
+ printf("Options:\n");
+ printf(" -p prefName\n");
+ printf(" -k keychain\n");
+ exit(1);
+}
+
+int main(int argc, char **argv)
+{
+ char *kcName = NULL;
+ SecKeychainRef kcRef = NULL;
+ char *prefName = NULL;
+ bool doSet = false;
+
+ if((argc < 2) || (argv[1][0] == 'h')) {
+ usage(argv);
+ }
+ if(!strcmp(argv[1], "get")) {
+ doSet = false;
+ }
+ else if(!strcmp(argv[1], "set")) {
+ doSet = true;
+ }
+ else {
+ printf("Bad op argument\n");
+ usage(argv);
+ }
+
+ extern int optind;
+ optind = 2;
+ extern char *optarg;
+ int arg;
+ while ((arg = getopt(argc, argv, "p:k:h")) != -1) {
+ switch (arg) {
+ case 'p':
+ prefName = optarg;
+ break;
+ case 'k':
+ kcName = optarg;
+ break;
+ case 'h':
+ usage(argv);
+ }
+ }
+ if(optind != argc) {
+ usage(argv);
+ }
+ if(prefName == NULL) {
+ printf("***You must specify a preference name via -p.\n");
+ usage(argv);
+ }
+ CFStringRef prefStr = CFStringCreateWithCString(NULL, prefName, kCFStringEncodingASCII);
+ if(prefStr == NULL) {
+ printf("***Error converting pref name '%s' to CFString.\n", prefName);
+ exit(1);
+ }
+
+ OSStatus ortn;
+ if(kcName) {
+ ortn = SecKeychainOpen(kcName, &kcRef);
+ if(ortn) {
+ cssmPerror("SecKeychainOpen", ortn);
+ exit(1);
+ }
+ }
+
+ SecIdentityRef idRef = NULL;
+ if(doSet) {
+ ortn = sslSimpleIdentPicker(kcRef, &idRef);
+ if(ortn) {
+ printf("Error picking identity; aborting.\n");
+ exit(1);
+ }
+ ortn = SecIdentitySetPreference(idRef, prefStr, 0);
+ if(ortn) {
+ cssmPerror("SecIdentitySetPreference", ortn);
+ exit(1);
+ }
+ printf("...Identity preference set for name '%s'.\n", prefName);
+ }
+ else {
+ ortn = SecIdentityCopyPreference(prefStr, 0, NULL, &idRef);
+ if(ortn) {
+ cssmPerror("SecIdentityCopyPreference", ortn);
+ }
+ else {
+ SecCertificateRef certRef = NULL;
+ ortn = SecIdentityCopyCertificate(idRef, &certRef);
+ if(ortn) {
+ cssmPerror("SecIdentityCopyCertificate", ortn);
+ exit(1);
+ }
+ char *idName = kcItemPrintableName((SecKeychainItemRef)certRef);
+ printf("Identity for prefName '%s' found : '%s'\n",
+ prefName, idName);
+ free(idName);
+ CFRelease(certRef);
+ }
+ }
+ CFRelease(idRef);
+
+ return 0;
+}
+