#ifndef _H_SESSION
#define _H_SESSION
#include "structure.h"
#include "acls.h"
#include "authority.h"
#include "authhost.h"
#include <Security/AuthSession.h>
#include <security_cdsa_utilities/handletemplates_defs.h>
#include <security_cdsa_utilities/u32handleobject.h>
#include <security_cdsa_utilities/cssmdb.h>
#if __GNUC__ > 2
#include <ext/hash_map>
using __gnu_cxx::hash_map;
#else
#include <hash_map>
#endif
class Key;
class Connection;
class Server;
class AuthHostInstance;
class Session : public U32HandleObject, public PerSession {
public:
typedef MachPlusPlus::Bootstrap Bootstrap;
Session(Bootstrap bootstrap, Port servicePort, SessionAttributeBits attrs = 0);
virtual ~Session();
Bootstrap bootstrapPort() const { return mBootstrap; }
Port servicePort() const { return mServicePort; }
IFDUMP(virtual void dumpNode());
public:
static const SessionAttributeBits settableAttributes =
sessionHasGraphicAccess | sessionHasTTY | sessionIsRemote;
SessionAttributeBits attributes() const { return mAttributes; }
bool attribute(SessionAttributeBits bits) const { return mAttributes & bits; }
virtual void setupAttributes(SessionCreationFlags flags, SessionAttributeBits attrs);
virtual bool haveOriginatorUid() const = 0;
virtual uid_t originatorUid() const = 0;
Credential originatorCredential() const { return mOriginatorCredential; }
virtual CFDataRef copyUserPrefs() = 0;
static std::string kUsername;
static std::string kRealname;
protected:
void setAttributes(SessionAttributeBits attrs) { mAttributes |= attrs; }
public:
const CredentialSet &authCredentials() const { return mSessionCreds; }
OSStatus authCreate(const AuthItemSet &rights, const AuthItemSet &environment,
AuthorizationFlags flags, AuthorizationBlob &newHandle, const audit_token_t &auditToken);
void authFree(const AuthorizationBlob &auth, AuthorizationFlags flags);
static OSStatus authGetRights(const AuthorizationBlob &auth,
const AuthItemSet &requestedRights, const AuthItemSet &environment,
AuthorizationFlags flags, AuthItemSet &grantedRights);
OSStatus authGetInfo(const AuthorizationBlob &auth, const char *tag, AuthItemSet &contextInfo);
OSStatus authExternalize(const AuthorizationBlob &auth, AuthorizationExternalForm &extForm);
OSStatus authInternalize(const AuthorizationExternalForm &extForm, AuthorizationBlob &auth);
OSStatus authorizationdbGet(AuthorizationString inRightName, CFDictionaryRef *rightDict);
OSStatus authorizationdbSet(const AuthorizationBlob &authBlob, AuthorizationString inRightName, CFDictionaryRef rightDict);
OSStatus authorizationdbRemove(const AuthorizationBlob &authBlob, AuthorizationString inRightName);
OSStatus authCheckRight(string &rightName, Connection &connection, bool allowUI);
bool isRightAuthorized(string &rightName, Connection &connection, bool allowUI);
private:
struct AuthorizationExternalBlob {
AuthorizationBlob blob;
mach_port_t session;
};
protected:
static AuthorizationToken &authorization(const AuthorizationBlob &blob);
OSStatus authGetRights(AuthorizationToken &auth,
const AuthItemSet &requestedRights, const AuthItemSet &environment,
AuthorizationFlags flags, AuthItemSet &grantedRights);
void mergeCredentials(CredentialSet &creds);
public:
static Session &find(Port servPort);
static Session &find(SecuritySessionId id);
template <class SessionType> static SessionType &find(SecuritySessionId id);
static void destroy(Port servPort);
void invalidateSessionAuthHosts(); static void invalidateAuthHosts();
static void processSystemSleep();
void processLockAll();
RefPointer<AuthHostInstance> authhost(const AuthHostType hostType = securityAgent, const bool restart = false);
protected:
Bootstrap mBootstrap; Port mServicePort; SessionAttributeBits mAttributes;
mutable Mutex mCredsLock; CredentialSet mSessionCreds;
mutable Mutex mAuthHostLock;
AuthHostInstance *mSecurityAgent;
AuthHostInstance *mAuthHost;
CFRef<CFDataRef> mSessionAgentPrefs;
Credential mOriginatorCredential;
void kill();
protected:
static PortMap<Session> mSessions;
};
template <class SessionType>
SessionType &Session::find(SecuritySessionId id)
{
if (SessionType *ssn = dynamic_cast<SessionType *>(&find(id)))
return *ssn;
else
MacOSError::throwMe(errSessionInvalidId);
}
class RootSession : public Session {
public:
RootSession(Server &server, SessionAttributeBits attrs = 0);
bool haveOriginatorUid() const { return true; }
uid_t originatorUid() const { return 0; }
CFDataRef copyUserPrefs() { return NULL; }
};
class DynamicSession : private ReceivePort, public Session {
public:
DynamicSession(TaskPort taskPort);
~DynamicSession();
void setupAttributes(SessionCreationFlags flags, SessionAttributeBits attrs);
bool haveOriginatorUid() const { return mHaveOriginatorUid; }
uid_t originatorUid() const;
void originatorUid(uid_t uid);
void setUserPrefs(CFDataRef userPrefsDict);
CFDataRef copyUserPrefs();
protected:
void checkOriginator(); void kill();
private:
Port mOriginatorTask; bool mHaveOriginatorUid; uid_t mOriginatorUid; };
#endif //_H_SESSION