public void MSOXCMSG_S05_TC08_RopOpenMessageWithoutRight()
{
this.CheckMapiHttpIsSupported();
this.ConnectToServer(ConnectionType.PrivateMailboxServer);
string commonUser = Common.GetConfigurationPropertyValue("CommonUser", Site);
string commonUserPassword = Common.GetConfigurationPropertyValue("CommonUserPassword", Site);
string commonUserEssdn = Common.GetConfigurationPropertyValue("CommonUserEssdn", Site);
uint pidTagMemberRights;
#region Call RopLogon to logon the private mailbox with administrator.
RopLogonResponse logonResponse = this.Logon(LogonType.Mailbox, out this.insideObjHandle);
#endregion
#region Call RopOpenFolder to open the inbox folder.
ulong parentFolderId = logonResponse.FolderIds[4];
uint openedInboxFolderHandle = this.OpenSpecificFolder(parentFolderId, this.insideObjHandle);
#endregion
#region Call RopCreateFolder to create a new subfolder.
ulong thirdSubfolderId;
uint thirdSubFolderHandle = this.CreateSubFolder(openedInboxFolderHandle, out thirdSubfolderId);
LongTermId thirdSubfolderLongTermID = this.GetLongTermIdFormID(thirdSubfolderId, this.insideObjHandle);
#endregion
#region Call RopCreateMessage and RopSaveChangesMessage to create a Message object in subfolder created.
// Create a message in InBox
this.MessageHandle = this.CreatedMessage(thirdSubfolderId, this.insideObjHandle);
RopSaveChangesMessageResponse saveChangesMessageResponse = this.SaveMessage(this.MessageHandle, (byte)SaveFlags.KeepOpenReadWrite);
ulong thirdMessageId = saveChangesMessageResponse.MessageId;
LongTermId thirdMessageLongTermID = this.GetLongTermIdFormID(thirdMessageId, this.insideObjHandle);
this.ReleaseRop(this.MessageHandle);
#endregion
#region Add Read permission to "CommonUser" on inbox folder.
// Add folder visible permission for the inbox.
pidTagMemberRights = (uint)PidTagMemberRights.FolderVisible | (uint)PidTagMemberRights.ReadAny;
this.AddPermission(commonUserEssdn, pidTagMemberRights, openedInboxFolderHandle);
#endregion
#region Add Read and write permission to "CommonUser" on subfolder
pidTagMemberRights = (uint)PidTagMemberRights.FolderVisible;
this.AddPermission(commonUserEssdn, pidTagMemberRights, thirdSubFolderHandle);
#endregion
#region Call RopLogon to logon the private mailbox with "CommonUser"
this.rawData = null;
this.insideObjHandle = 0;
this.response = null;
this.ResponseSOHs = null;
this.MSOXCMSGAdapter.RpcDisconnect();
this.MSOXCMSGAdapter.Reset();
this.MSOXCMSGAdapter.RpcConnect(ConnectionType.PrivateMailboxServer, commonUser, commonUserPassword, commonUserEssdn);
string userDN = Common.GetConfigurationPropertyValue("AdminUserEssdn", this.Site) + "\0";
RopLogonRequest logonRequest = new RopLogonRequest()
{
RopId = (byte)RopId.RopLogon,
LogonId = CommonLogonId,
OutputHandleIndex = 0x00, // This index specifies the location 0x00 in the Server Object Handle Table where the handle for the output Server Object is stored.
StoreState = 0,
LogonFlags = 0x01, // Logon to a private mailbox
OpenFlags = (uint)OpenFlags.UsePerMDBReplipMapping, // Requesting admin access to the mail box
EssdnSize = (ushort)Encoding.ASCII.GetByteCount(userDN),
Essdn = Encoding.ASCII.GetBytes(userDN)
};
this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(logonRequest, this.insideObjHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None);
logonResponse = (RopLogonResponse)this.response;
Site.Assert.AreEqual<uint>(TestSuiteBase.Success, logonResponse.ReturnValue, "Call RopLogon should success.");
uint objHandle = this.ResponseSOHs[0][logonResponse.OutputHandleIndex];
#endregion
#region Call RopOpenMessage to open a message that the user does not have rights to the message.
thirdSubfolderId = this.GetObjectIdFormLongTermID(thirdSubfolderLongTermID, objHandle);
thirdMessageId = this.GetObjectIdFormLongTermID(thirdMessageLongTermID, objHandle);
RopOpenMessageRequest openMessageRequest = new RopOpenMessageRequest()
{
RopId = (byte)RopId.RopOpenMessage,
LogonId = CommonLogonId,
InputHandleIndex = CommonInputHandleIndex,
OutputHandleIndex = CommonOutputHandleIndex,
CodePageId = 0x0FFF, // Code page of Logon object is used
FolderId = thirdSubfolderId,
OpenModeFlags = (byte)MessageOpenModeFlags.ReadWrite,
MessageId = thirdMessageId
};
this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(openMessageRequest, objHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None);
RopOpenMessageResponse openMessageResponse = (RopOpenMessageResponse)this.response;
#region Verify requirements
// Add the debug information
this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMSG_R324");
// Verify MS-OXCMSG requirement: MS-OXCMSG_R324
this.Site.CaptureRequirementIfAreNotEqual<uint>(
TestSuiteBase.Success,
openMessageResponse.ReturnValue,
324,
@"[in Receiving a RopOpenMessage ROP Request] RopOpenMessage MUST NOT succeed if the client has insufficient access rights to the folder in which the Message object is stored.");
// Add the debug information
this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMSG_R2184");
// Verify MS-OXCMSG requirement: MS-OXCMSG_R2184
this.Site.CaptureRequirementIfAreEqual<uint>(
0x80070005,
openMessageResponse.ReturnValue,
2184,
@"[In Receiving a RopOpenMessage ROP Request] [ecAccessDenied(0x80070005)] The user does not have rights to the message.");
#endregion
#endregion
#region Call RopLogon to logon the private mailbox with administrator
this.rawData = null;
this.insideObjHandle = 0;
this.response = null;
this.ResponseSOHs = null;
this.MSOXCMSGAdapter.RpcDisconnect();
this.MSOXCMSGAdapter.Reset();
this.ConnectToServer(ConnectionType.PrivateMailboxServer);
logonResponse = this.Logon(LogonType.Mailbox, out this.insideObjHandle);
openedInboxFolderHandle = this.OpenSpecificFolder(logonResponse.FolderIds[4], this.insideObjHandle);
#endregion
#region Call RopDeleteFolder to delete the subfolder created
thirdSubfolderId = this.GetObjectIdFormLongTermID(thirdSubfolderLongTermID, this.insideObjHandle);
RopDeleteFolderRequest deleteFolderRequest = new RopDeleteFolderRequest()
{
RopId = (byte)RopId.RopDeleteFolder,
LogonId = CommonLogonId,
InputHandleIndex = CommonInputHandleIndex,
DeleteFolderFlags = (byte)DeleteFolderFlags.DeleteHardDelete | (byte)DeleteFolderFlags.DelMessages,
FolderId = thirdSubfolderId
};
this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(deleteFolderRequest, openedInboxFolderHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None);
RopDeleteFolderResponse deleteFolderresponse = (RopDeleteFolderResponse)this.response;
Site.Assert.AreEqual<uint>(TestSuiteBase.Success, deleteFolderresponse.ReturnValue, "Call RopDeleteFolder should success.");
#endregion
}
}