#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) :
mKeychain(Keychain::optional(NULL)), mItem(itemClass, itemAttrList, 0, NULL), mFoundInKeychain(false), mRememberInKeychain(false)
{
if (searchAttrList && itemAttrList)
{
mUseKeychain = true;
StorageManager::KeychainList keychains;
globals().storageManager.optionalSearchList(NULL, keychains);
KCCursor cursor(keychains, itemClass, searchAttrList);
if (cursor->next(mItem))
mFoundInKeychain = true;
}
else
mUseKeychain = false;
}
PasswordImpl::~PasswordImpl() throw()
{
}
void
PasswordImpl::setData(UInt32 length, const void *data)
{
assert(mUseKeychain);
mItem->setData(length,data);
}
bool
PasswordImpl::getData(UInt32 *length, const void **data)
{
if (mItem->isPersistant())
{
CssmDataContainer outData;
try
{
mItem->getData(outData);
if (length && data)
{
*length=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))
{
}