Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

399 lines
8.2 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
mailrm.h
Abstract:
The header file for the sample AuthZ resource manager for mailboxes
Author:
t-eugenz - August 2000
Environment:
User mode only.
Revision History:
Created - August 2000
--*/
#pragma once
#include "pch.h"
#include <string>
#include <map>
using namespace std;
//
// RM-specific access masks used in the ACEs inside the mail RM.
// The lower 16 bits of the access mask are for user-specified rights
// such as these
//
//
// Access mask needed to read the contents of a mailbox
//
#define ACCESS_MAIL_READ 0x00000001
//
// Access mask needed to delete messages from a mailbox
//
#define ACCESS_MAIL_WRITE 0x00000002
//
// Access mask for Administrative access to a mailbox
//
#define ACCESS_MAIL_ADMIN 0x00000004
//
// The SIDs used in the RM, allocated elsewhere
//
extern PSID InsecureSid;
extern PSID BobSid;
extern PSID MarthaSid;
extern PSID JoeSid;
extern PSID JaneSid;
extern PSID MailAdminsSid;
extern PSID PrincipalSelfSid;
//
// Forward declarations
//
class Mailbox;
class MailRM;
//
// Comparison for PSIDs which works with STL map and multimap
// These are needed to impose a total ordering on the SIDs by value
//
struct CompareSidStruct
{
bool operator()(const PSID pSid1, const PSID pSid2) const;
};
struct CompareSidPairStruct
{
bool operator()(const pair<PSID, DWORD > pair1,
const pair<PSID, DWORD > pair2) const;
};
//
// Element of the multiple mailbox access request
//
typedef struct
{
//
// Mailbox to access
//
PSID psMailbox;
//
// Access mask requested for mailbox
//
ACCESS_MASK amAccessRequested;
} MAILRM_MULTI_REQUEST_ELEM, *PMAILRM_MULTI_REQUEST_ELEM;
//
// Used for multiple mailbox access request
//
typedef struct
{
//
// SID of the user getting access
//
PSID psUser;
//
// IP address of the user
//
DWORD dwIp;
//
// Number of MAILRM_MULTI_REQUEST_ELEM's
//
DWORD dwNumElems;
//
// Pointer to the first element
//
PMAILRM_MULTI_REQUEST_ELEM pRequestElem;
} MAILRM_MULTI_REQUEST, *PMAILRM_MULTI_REQUEST;
//
// Reply to a multiple mailbox access request is returned
// as an array of these.
//
typedef struct
{
//
// Pointer to mailbox, or NULL on failure
//
Mailbox * pMailbox;
//
// Granted access mask
//
ACCESS_MASK amAccessGranted;
} MAILRM_MULTI_REPLY, *PMAILRM_MULTI_REPLY;
class Mailbox
/*++
Class: Mailbox
Description:
This class is the mailbox container for a user's mail. It contains the
SID of the mailbox owner, and also keeps track of whether any sensitive
information is contained in the mailbox.
Base Classes: none
Friend Classes: none
--*/
{
private:
//
// Whether the mailbox contains sensitive data
//
BOOL _bIsSensitive;
//
// Owner of the mailbox, for PRINCIPAL_SELF evaluation
//
PSID _pOwnerSid;
//
// All messages in the mailbox
//
wstring _MailboxData;
//
// Name of the mailbox/mail owner
//
wstring _MailboxOwner;
public:
Mailbox(IN PSID pOwnerSid,
IN BOOL bIsSensitive,
IN WCHAR *szOwner)
{
_bIsSensitive = bIsSensitive;
_pOwnerSid = pOwnerSid;
_MailboxOwner.append(szOwner);
}
//
// Accessors
//
BOOL IsSensitive() const
{ return _bIsSensitive; }
const PSID GetOwnerSid() const
{ return _pOwnerSid; }
const WCHAR * GetOwnerName() const
{ return _MailboxOwner.c_str(); }
const WCHAR * GetMail() const
{ return _MailboxData.c_str(); }
public:
//
// Manipulate the stored mail
//
void SendMail(IN const WCHAR *szMessage,
IN BOOL bIsSensitive )
{ _MailboxData.append(szMessage); _bIsSensitive |= bIsSensitive; }
void Flush()
{ _MailboxData.erase(0, _MailboxData.length()); _bIsSensitive = FALSE; }
};
class MailRM
/*++
Class: MailRM
Description:
This class manages a set of mailboxes, granting access to the mailboxes
based on a single internally stored security descriptor containing
callback and regular ACEs. It also audits certain mailbox activity.
Base Classes: none
Friend Classes: none
--*/
{
private:
//
// Security descriptor common to all mailboxes
//
SECURITY_DESCRIPTOR _sd;
//
// Mapping of SIDs to mailboxes
//
//map<const PSID, Mailbox *, CompareSidStruct> _mapSidMailbox;
map<const PSID, Mailbox *> _mapSidMailbox;
//
// AuthZ contexts should only be created once for a given SID,IP pair
// This stores the contexts once they are created
//
map<pair<PSID, DWORD >,
AUTHZ_CLIENT_CONTEXT_HANDLE,
CompareSidPairStruct> _mapSidContext;
//
// Handle to the resource manager to be initialized with the callbacks
//
AUTHZ_RESOURCE_MANAGER_HANDLE _hRM;
public:
//
// Constructor, initializes resource manager
//
MailRM();
//
// Destructor, frees RM's memory
//
~MailRM();
public:
//
// Attempts to access the mailbox as psUser from the given IP address,
// requesting amAccessRequested access mask. If access is granted and the
// mailbox exists, the pointer to the mailbox is returned.
//
Mailbox * GetMailboxAccess(
IN const PSID psMailbox,
IN const PSID psUser,
IN DWORD dwIncomingIp,
IN ACCESS_MASK amAccessRequested
);
//
// Attempt to access a set of mailboxes using a cached access check
// pReply should be an allocated array with the same number of elements
// as the request
//
BOOL GetMultipleMailboxAccess(
IN const PMAILRM_MULTI_REQUEST pRequest,
IN OUT PMAILRM_MULTI_REPLY pReply
);
//
// Adds a mailbox to be controlled by the RM
//
void AddMailbox(Mailbox * pMailbox);
private:
//
// Internal function to completely set up the security descriptor
// Should only be called once per instance, by the contructor
//
void InitializeMailSecurityDescriptor();
//
// Resource manager callbacks
// These must be static, since they are called as C functions.
// Non-static member functions expect a this pointer as the first
// argument on the stack, and therefore cannot be called as C
// functions. These callbacks do not depend on any instance-specific
// data, and therefore can and should be static.
//
static BOOL CALLBACK AccessCheck(
IN AUTHZ_CLIENT_CONTEXT_HANDLE pAuthzClientContext,
IN PACE_HEADER pAce,
IN PVOID pArgs OPTIONAL,
IN OUT PBOOL pbAceApplicable
);
static BOOL CALLBACK ComputeDynamicGroups(
IN AUTHZ_CLIENT_CONTEXT_HANDLE pAuthzClientContext,
IN PVOID Args,
OUT PSID_AND_ATTRIBUTES *pSidAttrArray,
OUT PDWORD pSidCount,
OUT PSID_AND_ATTRIBUTES *pRestrictedSidAttrArray,
OUT PDWORD pRestrictedSidCount
);
static VOID CALLBACK FreeDynamicGroups (
IN PSID_AND_ATTRIBUTES pSidAttrArray
);
};