/* * SecKeychainAddIToolsPassword.c * * Created by jhurley on Thu Jun 19 2003. * Copyright (c) 2003 Apple. All rights reserved. * * Based on Keychain item access control example * Created by Perry Kiehtreiber on Wed Jun 19 2002 * Modified by Ken McLeod, Mon Apr 21 2003 -- added "always allow" ACL support */ #include #include #include #include #include #include #include #include static CFArrayRef CopyTrustedAppListFromBundle(); static SecAccessRef createAccess(CFStringRef accessLabel,const int allowAny); OSStatus SecKeychainAddIToolsPassword(SecKeychainRef keychain, UInt32 accountNameLength, const char *accountName, UInt32 passwordLength, const void *passwordData, SecKeychainItemRef *itemRef) { OSStatus err; SecKeychainItemRef item = nil; const char *serviceUTF8 = "iTools"; CFStringRef itemLabel = CFSTR("iTools"); const int allowAny = 0; // create initial access control settings for the item SecAccessRef access = createAccess(itemLabel, allowAny); // below is the lower-layer equivalent to the SecKeychainAddGenericPassword() function; // it does the same thing (except specify the access controls) // set up attribute vector (each attribute consists of {tag, length, pointer}) SecKeychainAttribute attrs[] = { { kSecLabelItemAttr, strlen(serviceUTF8), (char *)serviceUTF8 }, // use the service string as the name of this item for display purposes { kSecAccountItemAttr, accountNameLength, (char *)accountName }, { kSecServiceItemAttr, strlen(serviceUTF8), (char *)serviceUTF8 } }; SecKeychainAttributeList attributes = { sizeof(attrs) / sizeof(attrs[0]), attrs }; err = SecKeychainItemCreateFromContent(kSecGenericPasswordItemClass, &attributes, passwordLength, (const char *)passwordData, keychain, access, &item); if (access) CFRelease(access); if (item) CFRelease(item); return noErr; } SecAccessRef createAccess(CFStringRef accessLabel,const int allowAny) { OSStatus err; SecAccessRef access=nil; CFMutableArrayRef trustedApplications=nil; if (!allowAny) // use default access ("confirm access") { // make an exception list of applications you want to trust, // which are allowed to access the item without requiring user confirmation SecTrustedApplicationRef myself=NULL, someOther=NULL; CFArrayRef trustedAppListFromBundle=NULL; trustedApplications=CFArrayCreateMutable(kCFAllocatorDefault,0,&kCFTypeArrayCallBacks); err = SecTrustedApplicationCreateFromPath(NULL, &myself); if (!err) CFArrayAppendValue(trustedApplications,myself); trustedAppListFromBundle=CopyTrustedAppListFromBundle(); if (trustedAppListFromBundle) { int ix,top; char buffer[MAXPATHLEN]; top = CFArrayGetCount(trustedAppListFromBundle); for (ix=0;ix