#ifndef _SECURITY_ITEM_H_
#define _SECURITY_ITEM_H_
#include <security_keychain/Keychains.h>
#include <security_keychain/PrimaryKey.h>
#include <security_cdsa_client/securestorage.h>
#include <security_keychain/Access.h>
namespace Security
{
using namespace CssmClient;
namespace KeychainCore
{
class Keychain;
class ItemImpl : public SecCFObject
{
public:
SECCFFUNCTIONS(ItemImpl, SecKeychainItemRef, errSecInvalidItemRef, gTypes().ItemImpl)
friend class Item;
friend class KeychainImpl;
protected:
ItemImpl(SecItemClass itemClass, OSType itemCreator, UInt32 length, const void* data, bool inhibitCheck = false);
ItemImpl(SecItemClass itemClass, SecKeychainAttributeList *attrList, UInt32 length, const void* data);
ItemImpl(const Keychain &keychain, const PrimaryKey &primaryKey, const CssmClient::DbUniqueRecord &uniqueId);
ItemImpl(const Keychain &keychain, const PrimaryKey &primaryKey);
public:
static ItemImpl* make(const Keychain &keychain, const PrimaryKey &primaryKey, const CssmClient::DbUniqueRecord &uniqueId);
static ItemImpl* make(const Keychain &keychain, const PrimaryKey &primaryKey);
ItemImpl(ItemImpl &item);
void getAttributeFrom(CssmDbAttributeData *data, SecKeychainAttribute &attr, UInt32 *actualLength);
void getClass(SecKeychainAttribute &attr, UInt32 *actualLength);
PrimaryKey addWithCopyInfo(Keychain &keychain, bool isCopy);
Mutex* getMutexForObject();
protected:
virtual PrimaryKey add(Keychain &keychain);
static const CSSM_DATA &defaultAttributeValue(const CSSM_DB_ATTRIBUTE_INFO &info);
public:
virtual ~ItemImpl();
bool isPersistent();
bool isModified();
virtual void update();
void aboutToDestruct();
virtual Item copyTo(const Keychain &keychain, Access *newAccess = NULL);
CSSM_DB_RECORDTYPE recordType();
CssmClient::DbUniqueRecord dbUniqueRecord();
const CssmClient::DbAttributes *modifiedAttributes();
const CssmData *modifiedData();
virtual void didModify();
Keychain keychain();
PrimaryKey primaryKey();
bool operator < (const ItemImpl &other);
void getAttribute(SecKeychainAttribute& attr, UInt32 *actualLength);
void getData(CssmDataContainer& outData);
void modifyContent(const SecKeychainAttributeList *attrList, UInt32 dataLength, const void *inData);
void getContent(SecItemClass *itemClass, SecKeychainAttributeList *attrList, UInt32 *length, void **outData);
static void freeContent(SecKeychainAttributeList *attrList, void *data);
static void freeAttributesAndData(SecKeychainAttributeList *attrList, void *data);
void getAttributesAndData(SecKeychainAttributeInfo *info, SecItemClass *itemClass,
SecKeychainAttributeList **attrList, UInt32 *length, void **outData);
void modifyAttributesAndData(const SecKeychainAttributeList *attrList, UInt32 dataLength, const void *inData);
void setAttribute(SecKeychainAttribute& attr);
void setAttribute(const CssmDbAttributeInfo &info, const CssmPolyData &data);
void setData(UInt32 length,const void *data);
void setAccess(Access *newAccess);
void copyRecordIdentifier(CSSM_DATA &data);
SSGroup group();
void getContent(DbAttributes *dbAttributes, CssmDataContainer *itemData);
void getLocalContent(SecKeychainAttributeList *attributeList, UInt32 *outLength, void **outData);
bool useSecureStorage(const CssmClient::Db &db);
virtual void willRead();
void copyPersistentReference(CFDataRef &outDataRef);
void doNotEncrypt () {mDoNotEncrypt = true;}
void postItemEvent (SecKeychainEvent theEvent);
bool inCache() const throw() { return mInCache; }
void inCache(bool inCache) throw() { mInCache = inCache; }
virtual const CssmData &itemID();
protected:
RefPointer<CssmDataContainer> mData;
auto_ptr<CssmClient::DbAttributes> mDbAttributes;
SecPointer<Access> mAccess;
CssmClient::DbUniqueRecord mUniqueId;
Keychain mKeychain;
PrimaryKey mPrimaryKey;
private:
bool mDoNotEncrypt;
bool mInCache;
protected:
Mutex mMutex;
};
class Item : public SecPointer<ItemImpl>
{
public:
Item();
Item(ItemImpl *impl);
Item(SecItemClass itemClass, OSType itemCreator, UInt32 length, const void* data, bool inhibitCheck);
Item(SecItemClass itemClass, SecKeychainAttributeList *attrList, UInt32 length, const void* data);
Item(const Keychain &keychain, const PrimaryKey &primaryKey, const CssmClient::DbUniqueRecord &uniqueId);
Item(const Keychain &keychain, const PrimaryKey &primaryKey);
Item(ItemImpl &item);
};
CFIndex GetItemRetainCount(Item& item);
}
}
#endif // !_SECURITY_ITEM_H_