Index: chrome/browser/mac/security_wrappers.h |
=================================================================== |
--- chrome/browser/mac/security_wrappers.h (revision 0) |
+++ chrome/browser/mac/security_wrappers.h (revision 0) |
@@ -0,0 +1,252 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_MAC_SECURITY_WRAPPERS_H_ |
+#define CHROME_BROWSER_MAC_SECURITY_WRAPPERS_H_ |
+#pragma once |
+ |
+#include <Security/Security.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/mac/scoped_cftyperef.h" |
+#include "base/memory/scoped_ptr.h" |
+ |
+#if defined(MAC_OS_X_VERSION_10_6) && \ |
+ MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 |
+ |
+#include <Security/SecRequirement.h> |
+ |
+#else |
+ |
+typedef struct __SecRequirement* SecRequirementRef; |
+typedef uint32_t SecCSFlags; |
+ |
+enum { |
+ kSecCSDefaultFlags = 0 |
+}; |
+ |
+#endif |
+ |
+namespace chrome { |
+namespace browser { |
+namespace mac { |
+ |
+// Wraps SecKeychainSetUserInteractionAllowed, restoring the previous setting |
+// on destruction. |
+class ScopedSecKeychainSetUserInteractionAllowed { |
+ public: |
+ explicit ScopedSecKeychainSetUserInteractionAllowed(Boolean allowed); |
+ ~ScopedSecKeychainSetUserInteractionAllowed(); |
+ |
+ private: |
+ Boolean old_allowed_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedSecKeychainSetUserInteractionAllowed); |
+}; |
+ |
+// Holds a paired SecKeychainItemRef and SecAccessRef, maintaining the |
+// association between the two, and managing their ownership by retaining |
+// the SecKeychainItemRef and SecAccessRef elements placed into a |
+// CrSKeychainItemAndAccess object. Suitable for use |
+// in standard C++ containers. |
+class CrSKeychainItemAndAccess { |
+ public: |
+ CrSKeychainItemAndAccess(SecKeychainItemRef item, SecAccessRef access); |
+ CrSKeychainItemAndAccess(const CrSKeychainItemAndAccess& that); |
+ |
+ ~CrSKeychainItemAndAccess(); |
+ |
+ void operator=(const CrSKeychainItemAndAccess& that); |
+ |
+ SecKeychainItemRef item() const { return item_; } |
+ SecAccessRef access() const { return access_; } |
+ |
+ private: |
+ base::mac::ScopedCFTypeRef<SecKeychainItemRef> item_; |
+ base::mac::ScopedCFTypeRef<SecAccessRef> access_; |
+}; |
+ |
+// Holds the return value from CrSACLCopySimpleContents and an argument to |
+// CrSACLSetSimpleContents, managing ownership. Used in those wrappers to keep |
+// logically grouped data together. |
+struct CrSACLSimpleContents { |
+ CrSACLSimpleContents(); |
+ ~CrSACLSimpleContents(); |
+ |
+ base::mac::ScopedCFTypeRef<CFArrayRef> application_list; |
+ base::mac::ScopedCFTypeRef<CFStringRef> description; |
+ CSSM_ACL_KEYCHAIN_PROMPT_SELECTOR prompt_selector; |
+}; |
+ |
+// Holds a SecKeychainAttributeInfo*, calling SecKeychainFreeAttributeInfo on |
+// destruction. |
+class ScopedSecKeychainAttributeInfo { |
+ public: |
+ explicit ScopedSecKeychainAttributeInfo( |
+ SecKeychainAttributeInfo* attribute_info); |
+ ~ScopedSecKeychainAttributeInfo(); |
+ |
+ operator SecKeychainAttributeInfo*() const { |
+ return attribute_info_; |
+ } |
+ |
+ private: |
+ SecKeychainAttributeInfo* attribute_info_; |
+}; |
+ |
+// Holds the return value from CrSKeychainItemCopyAttributesAndData and an |
+// argument to CrSKeychainItemCreateFromContent. Used in those wrappers to |
+// keep logically grouped data together. |
+struct CrSKeychainItemAttributesAndData { |
+ SecItemClass item_class; |
+ SecKeychainAttributeList* attribute_list; |
+ UInt32 length; |
+ void* data; |
+}; |
+ |
+// Holds a CrSKeychainItemAttributesAndData*, calling |
+// CrSKeychainItemFreeAttributesAndData and freeing the owned |
+// CrSKeychainItemAttributesAndData* on destruction. |
+class ScopedCrSKeychainItemAttributesAndData { |
+ public: |
+ ScopedCrSKeychainItemAttributesAndData( |
+ CrSKeychainItemAttributesAndData* attributes_and_data); |
+ ~ScopedCrSKeychainItemAttributesAndData(); |
+ |
+ CrSKeychainItemAttributesAndData* get() const { |
+ return attributes_and_data_.get(); |
+ } |
+ |
+ CrSKeychainItemAttributesAndData* release() { |
+ return attributes_and_data_.release(); |
+ } |
+ |
+ SecItemClass item_class() const { |
+ return attributes_and_data_->item_class; |
+ } |
+ |
+ SecItemClass* item_class_ptr() const { |
+ return &attributes_and_data_->item_class; |
+ } |
+ |
+ SecKeychainAttributeList* attribute_list() const { |
+ return attributes_and_data_->attribute_list; |
+ } |
+ |
+ SecKeychainAttributeList** attribute_list_ptr() const { |
+ return &attributes_and_data_->attribute_list; |
+ } |
+ |
+ UInt32 length() const { |
+ return attributes_and_data_->length; |
+ } |
+ |
+ UInt32* length_ptr() const { |
+ return &attributes_and_data_->length; |
+ } |
+ |
+ void* data() const { |
+ return attributes_and_data_->data; |
+ } |
+ |
+ void** data_ptr() const { |
+ return &attributes_and_data_->data; |
+ } |
+ |
+ private: |
+ scoped_ptr<CrSKeychainItemAttributesAndData> attributes_and_data_; |
+}; |
+ |
+// Wraps SecKeychainSearchCreateFromAttributes, returning NULL on error and a |
+// SecKeychainSearchRef owned by the caller on success. |
+SecKeychainSearchRef CrSKeychainSearchCreateFromAttributes( |
+ CFTypeRef keychain_or_array, |
+ SecItemClass item_class, |
+ const SecKeychainAttributeList* attribute_list); |
+ |
+// Wraps SecKeychainSearchCopyNext, tolerating a NULL argument (resulting in |
+// a NULL return value but nothing logged), returning NULL on error and a |
+// SecKeychainItemRef owned by the caller on success. |
+SecKeychainItemRef CrSKeychainSearchCopyNext(SecKeychainSearchRef search); |
+ |
+// Wraps SecKeychainItemFreeAttributesAndData. |
+void CrSKeychainItemFreeAttributesAndData( |
+ SecKeychainAttributeList* attribute_list, |
+ void* data); |
+ |
+// Tests access to |item| by calling SecKeychainItemCopyAttributesAndData, |
+// taking care to properly free any returned data. Returns true if access to |
+// |item| is authorized. errSecAuthFailed is considered an "expected" error |
+// for which nothing will be logged, although false will be returned. |
+bool CrSKeychainItemTestAccess(SecKeychainItemRef item); |
+ |
+// Wraps SecKeychainItemCopyAccess, returning NULL on error and a SecAccessRef |
+// owned by the caller on success. errSecNoAccessForItem and errSecAuthFailed |
+// are considered "expected" errors for which nothing will be logged, although |
+// NULL will be returned. |
+SecAccessRef CrSKeychainItemCopyAccess(SecKeychainItemRef item); |
+ |
+// Wraps SecAccessCopyACLList, returning NULL on error and a CFArrayRef owned |
+// by the caller on success. |
+CFArrayRef CrSAccessCopyACLList(SecAccessRef access); |
+ |
+// Wraps SecACLCopySimpleContents, returning NULL on error and a |
+// CrSACLSimpleContents* owned by the caller on success. errSecACLNotSimple is |
+// considered an "expected" error for which nothing will be logged, although |
+// NULL will be returned. |
+CrSACLSimpleContents* CrSACLCopySimpleContents(SecACLRef acl); |
+ |
+// Wraps SecTrustedApplicationCopyRequirement, tolerating a NULL argument |
+// (resulting in a NULL return value but nothing logged) and returning NULL on |
+// error or a SecRequirementRef owned by the caller on success. |
+SecRequirementRef CrSTrustedApplicationCopyRequirement( |
+ SecTrustedApplicationRef application); |
+ |
+// Wraps SecRequirementCopyString, tolerating a NULL argument (resulting in |
+// a NULL return value but nothing logged) and returning NULL on error or a |
+// CFStringRef owned by the caller on success. |
+CFStringRef CrSRequirementCopyString(SecRequirementRef requirement, |
+ SecCSFlags flags); |
+ |
+// Wraps SecTrustedApplicationCreateFromPath, returning NULL on error or a |
+// SecTrustedApplicationRef owned by the caller on success. |
+SecTrustedApplicationRef CrSTrustedApplicationCreateFromPath(const char* path); |
+ |
+// Wraps SecACLSetSimpleContents, adapting it to the CrSACLSimpleContents |
+// argument, returning false on error or true on success. |
+bool CrSACLSetSimpleContents(SecACLRef acl, |
+ const CrSACLSimpleContents& acl_simple_contents); |
+ |
+// Wraps SecKeychainItemCopyKeychain, returning NULL on error or a |
+// SecKeychainRef owned by the caller on success. |
+SecKeychainRef CrSKeychainItemCopyKeychain(SecKeychainItemRef item); |
+ |
+// Wraps SecKeychainAttributeInfoForItemID, returning NULL on error or a |
+// SecKeychainAttributeInfo* owned by the caller on success. |
+SecKeychainAttributeInfo* CrSKeychainAttributeInfoForItemID( |
+ SecKeychainRef keychain, |
+ UInt32 item_id); |
+ |
+// Wraps SecKeychainItemCopyAttributesAndData, returning NULL on error or a |
+// CrSKeychainItemAttributesAndData* owned by the caller on success. |
+CrSKeychainItemAttributesAndData* CrSKeychainItemCopyAttributesAndData( |
+ SecKeychainRef keychain, |
+ SecKeychainItemRef item); |
+ |
+// Wraps SecKeychainItemDelete, returning false on error or true on success. |
+bool CrSKeychainItemDelete(SecKeychainItemRef item); |
+ |
+// Wraps SecKeychainItemCreateFromContent, adapting it to the |
+// CrSKeychainItemAttributesAndData argument, returning NULL on error or a |
+// SecKeychainItemRef owned by the caller on success. |
+SecKeychainItemRef CrSKeychainItemCreateFromContent( |
+ const CrSKeychainItemAttributesAndData& attributes_and_data, |
+ SecKeychainRef keychain, |
+ SecAccessRef access); |
+ |
+} // namespace mac |
+} // namespace browser |
+} // namespace chrome |
+ |
+#endif // CHROME_BROWSER_MAC_SECURITY_WRAPPERS_H_ |