#ifndef _H_SSDATABASE_
#define _H_SSDATABASE_
#include <Security/dlclient.h>
#include <Security/unix++.h>
#include <Security/SecurityServerClient.h>
class SSCSPDLSession;
class SSUniqueRecord;
class SSDatabaseImpl : public CssmClient::DbImpl
{
static const char *const DBBlobRelationName;
enum {
DBBlobRelationID = CSSM_DB_RECORDTYPE_APP_DEFINED_START + 0x8000
};
public:
SSDatabaseImpl(SecurityServer::ClientSession &inClientSession,
const CssmClient::DL &dl,
const char *inDbName, const CSSM_NET_ADDRESS *inDbLocation);
virtual ~SSDatabaseImpl();
void create(const DLDbIdentifier &dlDbIdentifier);
void open(const DLDbIdentifier &dlDbIdentifier);
SSUniqueRecord insert(CSSM_DB_RECORDTYPE recordType,
const CSSM_DB_RECORD_ATTRIBUTE_DATA *attributes,
const CSSM_DATA *data, bool);
void authenticate(CSSM_DB_ACCESS_TYPE inAccessRequest,
const CSSM_ACCESS_CREDENTIALS *inAccessCredentials);
void lock();
void unlock();
void unlock(const CSSM_DATA &password);
void getSettings(uint32 &outIdleTimeout, bool &outLockOnSleep);
void setSettings(uint32 inIdleTimeout, bool inLockOnSleep);
bool isLocked();
void changePassphrase(const CSSM_ACCESS_CREDENTIALS *cred);
CssmClient::DbUniqueRecordImpl *newDbUniqueRecord();
SecurityServer::DbHandle dbHandle();
protected:
CssmClient::DbUniqueRecord getDbBlobId(CssmDataContainer *dbb);
private:
enum
{
kDefaultIdleTimeout = 5 * 60, kDefaultLockOnSleep = true
};
DLDbIdentifier mIdentifier;
UnixPlusPlus::ForkMonitor mForked;
SecurityServer::ClientSession &mClientSession;
SecurityServer::DbHandle mSSDbHandle;
};
class SSDatabase : public CssmClient::Db
{
public:
typedef SSDatabaseImpl Impl;
explicit SSDatabase(SSDatabaseImpl *impl) : CssmClient::Db(impl) {}
SSDatabase() : CssmClient::Db(NULL) {}
SSDatabase(SecurityServer::ClientSession &inClientSession,
const CssmClient::DL &dl,
const char *inDbName, const CSSM_NET_ADDRESS *inDbLocation)
: CssmClient::Db(new SSDatabaseImpl(inClientSession, dl, inDbName, inDbLocation)) {}
SSDatabaseImpl *operator ->() const { return &impl<SSDatabaseImpl>(); }
SSDatabaseImpl &operator *() const { return impl<SSDatabaseImpl>(); }
SecurityServer::DbHandle dbHandle() { return (*this) ? (*this)->dbHandle() : SecurityServer::noDb; }
};
class SSUniqueRecordImpl : public CssmClient::DbUniqueRecordImpl
{
public:
SSUniqueRecordImpl(const SSDatabase &db);
virtual ~SSUniqueRecordImpl();
SSDatabase database() const;
};
class SSUniqueRecord : public CssmClient::DbUniqueRecord
{
public:
typedef SSUniqueRecordImpl Impl;
explicit SSUniqueRecord(SSUniqueRecordImpl *impl) : CssmClient::DbUniqueRecord(impl) {}
SSUniqueRecord() : CssmClient::DbUniqueRecord(NULL) {}
SSUniqueRecord(const SSDatabase &db) : CssmClient::DbUniqueRecord(new SSUniqueRecordImpl(db)) {}
SSUniqueRecordImpl *operator ->() const { return &impl<SSUniqueRecordImpl>(); }
SSUniqueRecordImpl &operator *() const { return impl<SSUniqueRecordImpl>(); }
};
#endif // _H_SSDATABASE_