| Index: chrome/browser/mac/security_wrappers.cc
|
| diff --git a/chrome/browser/mac/security_wrappers.cc b/chrome/browser/mac/security_wrappers.cc
|
| index 85488d13b77e5a8d6a597e4020380ba643db6712..0bf17849dc6df3f64388cd310debeefb9f4cef40 100644
|
| --- a/chrome/browser/mac/security_wrappers.cc
|
| +++ b/chrome/browser/mac/security_wrappers.cc
|
| @@ -4,14 +4,9 @@
|
|
|
| #include "chrome/browser/mac/security_wrappers.h"
|
|
|
| -#include "base/mac/foundation_util.h"
|
| -#include "base/mac/mac_logging.h"
|
| +#include <Security/Security.h>
|
|
|
| -extern "C" {
|
| -OSStatus SecTrustedApplicationCopyRequirement(
|
| - SecTrustedApplicationRef application,
|
| - SecRequirementRef* requirement);
|
| -} // extern "C"
|
| +#include "base/mac/mac_logging.h"
|
|
|
| namespace chrome {
|
|
|
| @@ -37,374 +32,4 @@ ScopedSecKeychainSetUserInteractionAllowed::
|
| }
|
| }
|
|
|
| -CrSKeychainItemAndAccess::CrSKeychainItemAndAccess(SecKeychainItemRef item,
|
| - SecAccessRef access)
|
| - : item_(item),
|
| - access_(access) {
|
| - // These CFRetain calls aren't leaks. They're balanced by an implicit
|
| - // CFRelease at destruction because the fields are of type ScopedCFTypeRef.
|
| - // These fields are retained on construction (unlike the typical
|
| - // ScopedCFTypeRef pattern) because this class is intended for use as an STL
|
| - // type adapter to keep two related objects together, and thus must
|
| - // implement proper reference counting in the methods required for STL
|
| - // container use. This class and is not intended to act as a scoper for the
|
| - // underlying objects in user code. For that, just use ScopedCFTypeRef.
|
| - CFRetain(item_);
|
| - CFRetain(access_);
|
| -}
|
| -
|
| -CrSKeychainItemAndAccess::CrSKeychainItemAndAccess(
|
| - const CrSKeychainItemAndAccess& that)
|
| - : item_(that.item_.get()),
|
| - access_(that.access_.get()) {
|
| - // See the comment above in the two-argument constructor.
|
| - CFRetain(item_);
|
| - CFRetain(access_);
|
| -}
|
| -
|
| -CrSKeychainItemAndAccess::~CrSKeychainItemAndAccess() {
|
| -}
|
| -
|
| -void CrSKeychainItemAndAccess::operator=(const CrSKeychainItemAndAccess& that) {
|
| - // See the comment above in the two-argument constructor.
|
| - CFRetain(that.item_);
|
| - item_.reset(that.item_);
|
| -
|
| - CFRetain(that.access_);
|
| - access_.reset(that.access_);
|
| -}
|
| -
|
| -CrSACLSimpleContents::CrSACLSimpleContents() {
|
| -}
|
| -
|
| -CrSACLSimpleContents::~CrSACLSimpleContents() {
|
| -}
|
| -
|
| -ScopedSecKeychainAttributeInfo::ScopedSecKeychainAttributeInfo(
|
| - SecKeychainAttributeInfo* attribute_info)
|
| - : attribute_info_(attribute_info) {
|
| -}
|
| -
|
| -ScopedSecKeychainAttributeInfo::~ScopedSecKeychainAttributeInfo() {
|
| - OSStatus status = SecKeychainFreeAttributeInfo(attribute_info_);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - }
|
| -}
|
| -
|
| -ScopedCrSKeychainItemAttributesAndData::ScopedCrSKeychainItemAttributesAndData(
|
| - CrSKeychainItemAttributesAndData* attributes_and_data)
|
| - : attributes_and_data_(attributes_and_data) {
|
| -}
|
| -
|
| -ScopedCrSKeychainItemAttributesAndData::
|
| - ~ScopedCrSKeychainItemAttributesAndData() {
|
| - if (attributes_and_data_.get()) {
|
| - CrSKeychainItemFreeAttributesAndData(
|
| - attributes_and_data_->attribute_list, attributes_and_data_->data);
|
| - }
|
| -}
|
| -
|
| -SecKeychainSearchRef CrSKeychainSearchCreateFromAttributes(
|
| - CFTypeRef keychain_or_array,
|
| - SecItemClass item_class,
|
| - const SecKeychainAttributeList* attribute_list) {
|
| - SecKeychainSearchRef search;
|
| - OSStatus status = SecKeychainSearchCreateFromAttributes(keychain_or_array,
|
| - item_class,
|
| - attribute_list,
|
| - &search);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - return search;
|
| -}
|
| -
|
| -SecKeychainItemRef CrSKeychainSearchCopyNext(SecKeychainSearchRef search) {
|
| - if (!search) {
|
| - return NULL;
|
| - }
|
| -
|
| - SecKeychainItemRef item;
|
| - OSStatus status = SecKeychainSearchCopyNext(search, &item);
|
| - if (status != errSecSuccess) {
|
| - if (status != errSecItemNotFound) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - }
|
| - return NULL;
|
| - }
|
| -
|
| - return item;
|
| -}
|
| -
|
| -void CrSKeychainItemFreeAttributesAndData(
|
| - SecKeychainAttributeList* attribute_list,
|
| - void* data) {
|
| - OSStatus status = SecKeychainItemFreeAttributesAndData(attribute_list, data);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - }
|
| -}
|
| -
|
| -bool CrSKeychainItemTestAccess(SecKeychainItemRef item) {
|
| - UInt32 length;
|
| - void* data;
|
| - OSStatus status = SecKeychainItemCopyAttributesAndData(item,
|
| - NULL,
|
| - NULL,
|
| - NULL,
|
| - &length,
|
| - &data);
|
| - if (status != errSecSuccess) {
|
| - if (status != errSecAuthFailed) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - CrSKeychainItemFreeAttributesAndData(NULL, data);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -SecAccessRef CrSKeychainItemCopyAccess(SecKeychainItemRef item) {
|
| - SecAccessRef access;
|
| - OSStatus status = SecKeychainItemCopyAccess(item, &access);
|
| - if (status != errSecSuccess) {
|
| - if (status != errSecNoAccessForItem && status != errSecAuthFailed) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - }
|
| - return NULL;
|
| - }
|
| -
|
| - return access;
|
| -}
|
| -
|
| -CFArrayRef CrSAccessCopyACLList(SecAccessRef access) {
|
| - if (!access) {
|
| - return NULL;
|
| - }
|
| -
|
| - CFArrayRef acl_list;
|
| - OSStatus status = SecAccessCopyACLList(access, &acl_list);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - return acl_list;
|
| -}
|
| -
|
| -CrSACLSimpleContents* CrSACLCopySimpleContents(SecACLRef acl) {
|
| - if (!acl) {
|
| - return NULL;
|
| - }
|
| -
|
| - scoped_ptr<CrSACLSimpleContents> acl_simple_contents(
|
| - new CrSACLSimpleContents());
|
| - CFArrayRef application_list;
|
| - CFStringRef description;
|
| - OSStatus status =
|
| - SecACLCopySimpleContents(acl,
|
| - &application_list,
|
| - &description,
|
| - &acl_simple_contents->prompt_selector);
|
| - if (status != errSecSuccess) {
|
| - if (status != errSecACLNotSimple) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - }
|
| - return NULL;
|
| - }
|
| -
|
| - acl_simple_contents->application_list.reset(application_list);
|
| - acl_simple_contents->description.reset(description);
|
| -
|
| - return acl_simple_contents.release();
|
| -}
|
| -
|
| -SecRequirementRef CrSTrustedApplicationCopyRequirement(
|
| - SecTrustedApplicationRef application) {
|
| - if (!application) {
|
| - return NULL;
|
| - }
|
| -
|
| - SecRequirementRef requirement;
|
| - OSStatus status = SecTrustedApplicationCopyRequirement(application,
|
| - &requirement);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - return requirement;
|
| -}
|
| -
|
| -CFStringRef CrSRequirementCopyString(SecRequirementRef requirement,
|
| - SecCSFlags flags) {
|
| - if (!requirement) {
|
| - return NULL;
|
| - }
|
| -
|
| - CFStringRef requirement_string;
|
| - OSStatus status = SecRequirementCopyString(requirement,
|
| - flags,
|
| - &requirement_string);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - return requirement_string;
|
| -}
|
| -
|
| -SecTrustedApplicationRef CrSTrustedApplicationCreateFromPath(const char* path) {
|
| - SecTrustedApplicationRef application;
|
| - OSStatus status = SecTrustedApplicationCreateFromPath(path, &application);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - return application;
|
| -}
|
| -
|
| -bool CrSACLSetSimpleContents(SecACLRef acl,
|
| - const CrSACLSimpleContents& acl_simple_contents) {
|
| - OSStatus status =
|
| - SecACLSetSimpleContents(acl,
|
| - acl_simple_contents.application_list,
|
| - acl_simple_contents.description,
|
| - &acl_simple_contents.prompt_selector);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -SecKeychainRef CrSKeychainItemCopyKeychain(SecKeychainItemRef item) {
|
| - SecKeychainRef keychain;
|
| - OSStatus status = SecKeychainItemCopyKeychain(item, &keychain);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - return keychain;
|
| -}
|
| -
|
| -SecKeychainAttributeInfo* CrSKeychainAttributeInfoForItemID(
|
| - SecKeychainRef keychain,
|
| - UInt32 item_id) {
|
| - SecKeychainAttributeInfo* attribute_info;
|
| - OSStatus status = SecKeychainAttributeInfoForItemID(keychain,
|
| - item_id,
|
| - &attribute_info);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - return attribute_info;
|
| -}
|
| -
|
| -CrSKeychainItemAttributesAndData* CrSKeychainItemCopyAttributesAndData(
|
| - SecKeychainRef keychain,
|
| - SecKeychainItemRef item) {
|
| - ScopedCrSKeychainItemAttributesAndData attributes_and_data(
|
| - new CrSKeychainItemAttributesAndData());
|
| - OSStatus status =
|
| - SecKeychainItemCopyAttributesAndData(item,
|
| - NULL,
|
| - attributes_and_data.item_class_ptr(),
|
| - NULL,
|
| - NULL,
|
| - NULL);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - // This looks really weird, but it's right. See 10.7.3
|
| - // libsecurity_keychain-55044 lib/SecItem.cpp
|
| - // _CreateAttributesDictionaryFromKeyItem and 10.7.3 SecurityTool-55002
|
| - // keychain_utilities.c print_keychain_item_attributes.
|
| - UInt32 item_id;
|
| - switch (attributes_and_data.item_class()) {
|
| - case kSecInternetPasswordItemClass:
|
| - item_id = CSSM_DL_DB_RECORD_INTERNET_PASSWORD;
|
| - break;
|
| - case kSecGenericPasswordItemClass:
|
| - item_id = CSSM_DL_DB_RECORD_GENERIC_PASSWORD;
|
| - break;
|
| - // kSecInternetPasswordItemClass is marked as deprecated in the 10.9 sdk,
|
| - // but the files in libsecurity_keychain from 10.7 referenced above still
|
| - // use it. Also see rdar://14281375 /
|
| - // http://openradar.appspot.com/radar?id=3143412 .
|
| -#pragma clang diagnostic push
|
| -#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
| - case kSecAppleSharePasswordItemClass:
|
| -#pragma clang diagnostic pop
|
| - item_id = CSSM_DL_DB_RECORD_APPLESHARE_PASSWORD;
|
| - break;
|
| - default:
|
| - item_id = attributes_and_data.item_class();
|
| - break;
|
| - }
|
| -
|
| - ScopedSecKeychainAttributeInfo attribute_info(
|
| - CrSKeychainAttributeInfoForItemID(keychain, item_id));
|
| - if (!attribute_info) {
|
| - return NULL;
|
| - }
|
| -
|
| - status = SecKeychainItemCopyAttributesAndData(
|
| - item,
|
| - attribute_info,
|
| - attributes_and_data.item_class_ptr(),
|
| - attributes_and_data.attribute_list_ptr(),
|
| - attributes_and_data.length_ptr(),
|
| - attributes_and_data.data_ptr());
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - return attributes_and_data.release();
|
| -}
|
| -
|
| -bool CrSKeychainItemDelete(SecKeychainItemRef item) {
|
| - OSStatus status = SecKeychainItemDelete(item);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -SecKeychainItemRef CrSKeychainItemCreateFromContent(
|
| - const CrSKeychainItemAttributesAndData& attributes_and_data,
|
| - SecKeychainRef keychain,
|
| - SecAccessRef access) {
|
| - SecKeychainItemRef item;
|
| - OSStatus status =
|
| - SecKeychainItemCreateFromContent(attributes_and_data.item_class,
|
| - attributes_and_data.attribute_list,
|
| - attributes_and_data.length,
|
| - attributes_and_data.data,
|
| - keychain,
|
| - access,
|
| - &item);
|
| - if (status != errSecSuccess) {
|
| - OSSTATUS_LOG(ERROR, status);
|
| - return NULL;
|
| - }
|
| -
|
| - return item;
|
| -}
|
| -
|
| } // namespace chrome
|
|
|