#ifndef _H_PROCESS
#define _H_PROCESS
#include "structure.h"
#include <security_agent_client/agentclient.h>
#include <security_utilities/refcount.h>
#include <security_utilities/ccaudit.h>
#include "localkey.h"
#include "codesigdb.h"
#include "notifications.h"
#include <string>
using MachPlusPlus::Port;
using MachPlusPlus::TaskPort;
class Session;
class LocalDatabase;
class AuthorizationToken;
class Process : public PerProcess, public CodeSignatures::Identity {
public:
Process(Port servicePort, TaskPort tPort,
const ClientSetupInfo *info, const char *identity,
const CommonCriteria::AuditToken &audit);
virtual ~Process();
void reset(Port servicePort, TaskPort tPort,
const ClientSetupInfo *info, const char *identity,
const CommonCriteria::AuditToken &audit);
uid_t uid() const { return mUid; }
gid_t gid() const { return mGid; }
pid_t pid() const { return mPid; }
TaskPort taskPort() const { return mTaskPort; }
bool byteFlipped() const { return mByteFlipped; }
OSXCode *clientCode() const { return (mClientIdent == unknown) ? NULL : mClientCode; }
void addAuthorization(AuthorizationToken *auth);
void checkAuthorization(AuthorizationToken *auth);
bool removeAuthorization(AuthorizationToken *auth);
using PerProcess::kill;
void kill();
void changeSession(Port servicePort);
void requestNotifications(Port port, NotificationDomain domain, NotificationMask events);
void stopNotifications(Port port);
Session& session() const;
LocalDatabase &localStore();
Key *makeTemporaryKey(const CssmKey &key, CSSM_KEYATTR_FLAGS moreAttributes,
const AclEntryPrototype *owner);
Mutex aclSequence;
IFDUMP(void dumpNode());
protected:
std::string getPath() const;
const CssmData getHash(CodeSigning::OSXSigner &signer) const;
void setup(const ClientSetupInfo *info, const char *identity);
private:
TaskPort mTaskPort; bool mByteFlipped; pid_t mPid; uid_t mUid; gid_t mGid;
RefPointer<OSXCode> mClientCode; mutable enum { deferred, known, unknown } mClientIdent; mutable auto_ptr<CodeSigning::Signature> mCachedSignature;
typedef multiset<AuthorizationToken *> AuthorizationSet;
AuthorizationSet mAuthorizations;
RefPointer<LocalDatabase> mLocalStore;
};
inline bool operator == (const Process &p1, const Process &p2)
{
return &p1 == &p2;
}
#endif //_H_PROCESS