#ifndef _SECURITY_ITEM_H_
#define _SECURITY_ITEM_H_
#include <Security/Keychains.h>
#include <Security/PrimaryKey.h>
#include <Security/securestorage.h>
#include <Security/Access.h>
namespace Security
{
using namespace CssmClient;
namespace KeychainCore
{
class Keychain;
class ItemImpl : public SecCFObject
{
public:
SECCFFUNCTIONS(ItemImpl, SecKeychainItemRef, errSecInvalidItemRef)
friend class Item;
friend class KeychainImpl;
protected:
ItemImpl(SecItemClass itemClass, OSType itemCreator, UInt32 length, const void* data);
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);
ItemImpl(ItemImpl &item);
void getAttributeFrom(CssmDbAttributeData *data, SecKeychainAttribute &attr, UInt32 *actualLength);
void getClass(SecKeychainAttribute &attr, UInt32 *actualLength);
protected:
virtual PrimaryKey add(Keychain &keychain);
static const CSSM_DATA &defaultAttributeValue(const CSSM_DB_ATTRIBUTE_INFO &info);
public:
virtual ~ItemImpl() throw();
bool isPersistant() const;
bool isModified() const;
virtual void update();
virtual Item copyTo(const Keychain &keychain, Access *newAccess = NULL);
CSSM_DB_RECORDTYPE recordType() const;
CssmClient::DbUniqueRecord dbUniqueRecord();
const CssmClient::DbAttributes *modifiedAttributes() const;
const CssmData *modifiedData() const;
virtual void didModify();
Keychain keychain() const;
PrimaryKey primaryKey() const;
bool operator <(const ItemImpl &other) const;
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);
SSGroup group();
protected:
void getContent(DbAttributes *dbAttributes, CssmDataContainer *itemData);
void getLocalContent(SecKeychainAttributeList &attributeList);
bool useSecureStorage(const CssmClient::Db &db);
auto_ptr<CssmDataContainer> mData;
auto_ptr<CssmClient::DbAttributes> mDbAttributes;
SecPointer<Access> mAccess;
CssmClient::DbUniqueRecord mUniqueId;
Keychain mKeychain;
PrimaryKey mPrimaryKey;
};
class Item : public SecPointer<ItemImpl>
{
public:
Item();
Item(ItemImpl *impl);
Item(SecItemClass itemClass, OSType itemCreator, UInt32 length, const void* data);
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);
};
}
}
#endif // !_SECURITY_ITEM_H_