#include "Password.h"
#include <Security/SecBase.h>
#include "SecBridge.h"
#include "KCCursor.h"
using namespace KeychainCore;
using namespace CssmClient;
PasswordImpl::PasswordImpl(SecItemClass itemClass, SecKeychainAttributeList *searchAttrList, SecKeychainAttributeList *itemAttrList) :
mItem(itemClass, itemAttrList, 0, NULL), mUseKeychain(false), mFoundInKeychain(false), mRememberInKeychain(false), mMutex(Mutex::recursive)
{
if (searchAttrList && itemAttrList)
{
mUseKeychain = true;
mKeychain = Keychain::optional(NULL);
mRememberInKeychain = true;
StorageManager::KeychainList keychains;
globals().storageManager.optionalSearchList(NULL, keychains);
KCCursor cursor(keychains, itemClass, searchAttrList);
if (cursor->next(mItem))
mFoundInKeychain = true;
}
}
PasswordImpl::PasswordImpl(PasswordImpl& existing)
{
mKeychain = existing.mKeychain;
mItem = existing.mItem;
mUseKeychain = existing.mUseKeychain;
mFoundInKeychain = existing.mFoundInKeychain;
mRememberInKeychain = existing.mRememberInKeychain;
}
PasswordImpl::~PasswordImpl() throw()
{
}
void
PasswordImpl::setAccess(Access *access)
{
if (!mFoundInKeychain)
mItem->setAccess(access);
}
void
PasswordImpl::setData(UInt32 length, const void *data)
{
assert(mUseKeychain);
mItem->setData(length,data);
}
bool
PasswordImpl::getData(UInt32 *length, const void **data)
{
if (mItem->isPersistent())
{
CssmDataContainer outData;
try
{
mItem->getData(outData);
if (length && data)
{
*length=(uint32)outData.length();
outData.Length=0;
*data=outData.data();
outData.Data=NULL;
}
return true;
}
catch (...)
{
return false;
}
}
else
return false;
}
void
PasswordImpl::save()
{
assert(mUseKeychain);
if (mFoundInKeychain)
{
mItem->update();
}
else
{
mKeychain->add(mItem);
mFoundInKeychain = true; }
}
Password::Password(SecItemClass itemClass, SecKeychainAttributeList *searchAttrList, SecKeychainAttributeList *itemAttrList) :
SecPointer<PasswordImpl>(new PasswordImpl(itemClass, searchAttrList, itemAttrList))
{
}
Password::Password(PasswordImpl *impl) : SecPointer<PasswordImpl>(impl)
{
}
Password::Password(PasswordImpl &impl) : SecPointer<PasswordImpl>(new PasswordImpl(impl))
{
}