//+-------------------------------------------------------------------------- // File: officer.h // Contents: officer rights classes //--------------------------------------------------------------------------- #include "sid.h" #include "tptrlist.h" namespace CertSrv { class CClientPermission { public: CClientPermission(BOOL fAllow, PSID pSid); ~CClientPermission() {} static BOOL IsInitialized(CClientPermission* pObj) { return NULL != pObj && NULL != ((PSID)pObj->m_Sid); } void SetPermission(BOOL fAllow) { m_fAllow = fAllow;} BOOL GetPermission() { return m_fAllow; } LPCWSTR GetName() { return m_Sid.GetName(); } PSID GetSid() { return m_Sid.GetSid(); } friend class COfficerRights; BOOL operator==(const CClientPermission& rhs) { return EqualSid(GetSid(), (const_cast(rhs)).GetSid()); } protected: BOOL m_fAllow; CSid m_Sid; }; class COfficerRights { public: COfficerRights() : m_pSid(NULL), m_List() {} ~COfficerRights() { delete m_pSid; } HRESULT Init(PACCESS_ALLOWED_CALLBACK_ACE pAce); HRESULT Add(PSID pSID, BOOL fAllow); HRESULT RemoveAt(DWORD dwIndex) { return m_List.RemoveAt(dwIndex)?S_OK:E_INVALIDARG; } HRESULT SetAt(DWORD dwIndex, BOOL fAllow) { CClientPermission *pClient = m_List.GetAt(dwIndex); if(!pClient) return E_INVALIDARG; pClient->SetPermission(fAllow); return S_OK; } CClientPermission* GetAt(DWORD dwIndex) { return m_List.GetAt(dwIndex); } DWORD Find(PSID pSid); DWORD GetCount() { return m_List.GetCount(); } LPCWSTR GetName() { return m_pSid->GetName(); }; PSID GetSid() { return m_pSid->GetSid(); } friend class COfficerRightsList; protected: DWORD GetAceSize(BOOL fAllow); HRESULT AddAce(PACL pAcl, BOOL fAllow); HRESULT AddSidList(PACCESS_ALLOWED_CALLBACK_ACE pAce); void Cleanup() { if (m_pSid) { delete m_pSid; m_pSid=NULL; } m_List.Cleanup(); } // following bools are used to decide if this COfficerRights has to // be represented as one or two aces (allow/deny) in the ACL CSid* m_pSid; // use pointer instead of member object because // we don't know the sid at construct time TPtrList m_List; }; class COfficerRightsList { public: COfficerRightsList() : m_List(NULL), m_dwCountList(0) {} ~COfficerRightsList(); HRESULT Load(PSECURITY_DESCRIPTOR pSD); HRESULT Save(PSECURITY_DESCRIPTOR &rpSD); COfficerRights* GetAt(DWORD dwIndex) { if(dwIndex>=m_dwCountList) return NULL; return m_List[dwIndex]; } DWORD GetCount() { return m_dwCountList;} void Dump(); void Cleanup() { if (m_List != NULL) { for(DWORD dwCount=0;dwCount