#ifndef _H_PROCESS
#define _H_PROCESS
#include "securityserver.h"
#include "SecurityAgentClient.h"
#include <Security/refcount.h>
#include "key.h"
#include "codesigdb.h"
#include "notifications.h"
#include <string>
using MachPlusPlus::Port;
using MachPlusPlus::TaskPort;
class Session;
class AuthorizationToken;
class Process : public CodeSignatures::Identity {
public:
Process(Port servicePort, TaskPort tPort,
const ClientSetupInfo *info, const char *identity,
uid_t uid, gid_t gid);
virtual ~Process();
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; }
CodeSigning::OSXCode *clientCode() const { return (mClientIdent == unknown) ? NULL : mClientCode; }
void addAuthorization(AuthorizationToken *auth);
void checkAuthorization(AuthorizationToken *auth);
bool removeAuthorization(AuthorizationToken *auth);
void beginConnection(Connection &);
bool endConnection(Connection &);
bool kill(bool keepTaskPort = false);
void addDatabase(Database *database);
void removeDatabase(Database *database);
void requestNotifications(Port port, Listener::Domain domain, Listener::EventMask events);
void stopNotifications(Port port);
void postNotification(Listener::Domain domain, Listener::Event event, const CssmData &data);
Session &session;
Mutex aclSequence;
protected:
std::string getPath() const;
const CssmData getHash(CodeSigning::OSXSigner &signer) const;
private:
Mutex mLock; uint32 mBusyCount; bool mDying;
TaskPort mTaskPort; bool mByteFlipped; pid_t mPid; uid_t mUid; gid_t mGid;
RefPointer<CodeSigning::OSXCode> mClientCode; mutable enum { deferred, known, unknown } mClientIdent; mutable auto_ptr<CodeSigning::Signature> mCachedSignature;
typedef multiset<AuthorizationToken *> AuthorizationSet;
AuthorizationSet mAuthorizations;
typedef set<Database *> DatabaseSet;
DatabaseSet mDatabases; };
#endif //_H_PROCESS