/// <summary> /// Set the value of properties identified by long ID or name in message. /// </summary> /// <param name="messageHandle">The specified message handle.</param> /// <param name="property">The PropertyName of specified property.</param> /// <param name="value">The value of specified property.</param> private void SetNamedProperty(uint messageHandle, PropertyNameObject property, byte[] value) { #region Call RopGetPropertyIdsFromNames to get property ID. PropertyName[] propertyNames = new PropertyName[1]; propertyNames[0] = property.PropertyName; RopGetPropertyIdsFromNamesRequest getPropertyIdsFromNamesRequest = new RopGetPropertyIdsFromNamesRequest() { RopId = (byte)RopId.RopGetPropertyIdsFromNames, LogonId = CommonLogonId, InputHandleIndex = CommonInputHandleIndex, Flags = (byte)GetPropertyIdsFromNamesFlags.Create, PropertyNameCount = (ushort)propertyNames.Length, PropertyNames = propertyNames, }; this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(getPropertyIdsFromNamesRequest, messageHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None); RopGetPropertyIdsFromNamesResponse getPropertyIdsFromNamesResponse = (RopGetPropertyIdsFromNamesResponse)this.response; Site.Assert.AreEqual<uint>(TestSuiteBase.Success, getPropertyIdsFromNamesResponse.ReturnValue, "Call RopGetPropertyIdsFromNames should success."); #endregion #region Set property value. List<TaggedPropertyValue> taggedPropertyValues = new List<TaggedPropertyValue>(); int valueSize = 0; PropertyTag propertyTag = new PropertyTag { PropertyId = getPropertyIdsFromNamesResponse.PropertyIds[0].ID, PropertyType = (ushort)property.PropertyType }; TaggedPropertyValue taggedPropertyValue = new TaggedPropertyValue { PropertyTag = propertyTag, Value = value }; valueSize += taggedPropertyValue.Size(); taggedPropertyValues.Add(taggedPropertyValue); RopSetPropertiesRequest rpmSetRequest = new RopSetPropertiesRequest() { RopId = (byte)RopId.RopSetProperties, LogonId = CommonLogonId, InputHandleIndex = CommonInputHandleIndex, PropertyValueCount = (ushort)taggedPropertyValues.Count, PropertyValueSize = (ushort)(valueSize + 2), PropertyValues = taggedPropertyValues.ToArray() }; this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(rpmSetRequest, messageHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None); RopSetPropertiesResponse rpmSetResponse = (RopSetPropertiesResponse)this.response; Site.Assert.AreEqual<uint>(TestSuiteBase.Success, rpmSetResponse.PropertyProblemCount, "If ROP succeeds, the PropertyProblemCount of its response is 0(success)."); #endregion }
public void MSOXCMSG_S05_TC07_RopOpenMessageAsBestAccess() { this.CheckMapiHttpIsSupported(); this.ConnectToServer(ConnectionType.PrivateMailboxServer); #region Call RopLogon to logon the private mailbox with administrator. RopLogonResponse logonResponse = this.Logon(LogonType.Mailbox, out this.insideObjHandle); #endregion List<PropertyObj> propertyValues = new List<PropertyObj> { new PropertyObj(PropertyNames.PidTagNormalizedSubject, Common.GetBytesFromUnicodeString(TestDataOfPidTagNormalizedSubject)) }; string commonUser = Common.GetConfigurationPropertyValue("CommonUser", Site); string commonUserPassword = Common.GetConfigurationPropertyValue("CommonUserPassword", Site); string commonUserEssdn = Common.GetConfigurationPropertyValue("CommonUserEssdn", Site); uint pidTagMemberRights; RopSetPropertiesResponse rpmSetResponse; #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 subfolder in inbox folder. ulong firstSubfolderId; uint firstSubFolderHandle = this.CreateSubFolder(openedInboxFolderHandle, out firstSubfolderId); LongTermId firstSubfolderLongTermID = this.GetLongTermIdFormID(firstSubfolderId, this.insideObjHandle); #endregion #region Call RopCreateMessage and RopSaveChangesMessage to create a Message object in subfolder created by step 3. // Create a message in InBox this.MessageHandle = this.CreatedMessage(firstSubfolderId, this.insideObjHandle); RopSaveChangesMessageResponse saveChangesMessageResponse = this.SaveMessage(this.MessageHandle, (byte)SaveFlags.KeepOpenReadWrite); ulong firstMessageId = saveChangesMessageResponse.MessageId; LongTermId firstMessageLongTermID = this.GetLongTermIdFormID(firstMessageId, this.insideObjHandle); this.ReleaseRop(this.MessageHandle); #endregion #region Call RopCreateFolder to create a new subfolder. ulong secondSubfolderId; System.Threading.Thread.Sleep(1); // Sleep 1 millisecond to generate different named folder uint secondSubFolderHandle = this.CreateSubFolder(openedInboxFolderHandle, out secondSubfolderId); LongTermId secondSubfolderLongTermID = this.GetLongTermIdFormID(secondSubfolderId, this.insideObjHandle); #endregion #region Call RopCreateMessage and RopSaveChangesMessage to create a Message object in subfolder created by step 5. // Create a message in InBox this.MessageHandle = this.CreatedMessage(secondSubfolderId, this.insideObjHandle); saveChangesMessageResponse = this.SaveMessage(this.MessageHandle, (byte)SaveFlags.KeepOpenReadWrite); ulong secondMessageId = saveChangesMessageResponse.MessageId; LongTermId secondMessageLongTermID = this.GetLongTermIdFormID(secondMessageId, 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 permission to "CommonUser" on subfolder created by step 3. // Add folder visible permission for the subfolder1. pidTagMemberRights = (uint)PidTagMemberRights.FolderVisible | (uint)PidTagMemberRights.ReadAny; this.AddPermission(commonUserEssdn, pidTagMemberRights, firstSubFolderHandle); #endregion #region Add Read and write permission to "CommonUser" on subfolder by step 5 pidTagMemberRights = (uint)PidTagMemberRights.FolderVisible | (uint)PidTagMemberRights.ReadAny | (uint)PidTagMemberRights.EditAny; this.AddPermission(commonUserEssdn, pidTagMemberRights, secondSubFolderHandle); #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 which OpenModeFlags is BestAccess to open the message in subfolder created by step 3. firstSubfolderId = this.GetObjectIdFormLongTermID(firstSubfolderLongTermID, objHandle); firstMessageId = this.GetObjectIdFormLongTermID(firstMessageLongTermID, objHandle); uint openedMessageBestReadOnlyHandle = this.OpenSpecificMessage(firstSubfolderId, firstMessageId, objHandle, MessageOpenModeFlags.BestAccess); #endregion #region Call RopSetProperties to set PidTagNormalizedSubject property of message in subfolder created by step 3. List<TaggedPropertyValue> taggedPropertyValueList = new List<TaggedPropertyValue>(); int valueSize = 0; foreach (PropertyObj propertyObj in propertyValues) { PropertyTag propertyTag = new PropertyTag { PropertyId = (ushort)propertyObj.PropertyID, PropertyType = (ushort)propertyObj.ValueTypeCode }; TaggedPropertyValue taggedPropertyValue = new TaggedPropertyValue { PropertyTag = propertyTag, Value = (byte[])propertyObj.Value }; valueSize += taggedPropertyValue.Size(); taggedPropertyValueList.Add(taggedPropertyValue); } RopSetPropertiesRequest rpmSetRequest = new RopSetPropertiesRequest() { RopId = (byte)RopId.RopSetProperties, LogonId = CommonLogonId, InputHandleIndex = CommonInputHandleIndex, PropertyValueCount = (ushort)taggedPropertyValueList.Count, PropertyValueSize = (ushort)(valueSize + 2), PropertyValues = taggedPropertyValueList.ToArray(), }; uint returnValue; this.response = null; this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(rpmSetRequest, openedMessageBestReadOnlyHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None, out returnValue); if(Common.IsRequirementEnabled(3009,this.Site)) { rpmSetResponse = (RopSetPropertiesResponse)this.response; // Add the debug information this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMSG_R3009"); // Verify MS-OXCMSG requirement: MS-OXCMSG_R3009 this.Site.CaptureRequirementIfAreEqual<uint>( TestSuiteBase.Success, rpmSetResponse.ReturnValue, 3009, @"[In Appendix A: Product Behavior] BestAccess is read/write if the user don't have write permissions. (<12> Section 2.2.3.1.1: Exchange 2010 and above follow this behavior.)"); } if(Common.IsRequirementEnabled(3010,this.Site)) { if (this.response == null) { Site.Assert.AreNotEqual<uint>(0, returnValue, "Call RopSetProperties should fail."); } else { rpmSetResponse = (RopSetPropertiesResponse)this.response; Site.Assert.AreNotEqual<uint>(0, rpmSetResponse.ReturnValue, "Call RopSetProperties should fail."); } // Add the debug information this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMSG_R3010"); // Verify MS-OXCMSG requirement: MS-OXCMSG_R661 // Because when call RopSetProperties to set property of specified Message object that opened by read-only, server will fail and return error code. // R661 will be verified. this.Site.CaptureRequirement( 3010, @"[In Appendix A: Product Behavior] BestAccess is read-only if the user don't have write permissions. (Exchange 2007 follows this behavior.)"); } #endregion #region Call RopRelease to release created message in subfolder created by step 3. this.ReleaseRop(openedMessageBestReadOnlyHandle); #endregion #region Call RopOpenMessage which OpenModeFlags is BestAccess to open the message in subfolder created by step 5. secondSubfolderId = this.GetObjectIdFormLongTermID(secondSubfolderLongTermID, objHandle); secondMessageId = this.GetObjectIdFormLongTermID(secondMessageLongTermID, objHandle); uint openedMessageBestReadWrietHandle = this.OpenSpecificMessage(secondSubfolderId, secondMessageId, objHandle, MessageOpenModeFlags.BestAccess); #endregion #region Call RopSetProperties to set PidTagSubjectPrefix property of message in subfolder created by step 5. this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(rpmSetRequest, openedMessageBestReadWrietHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None); rpmSetResponse = (RopSetPropertiesResponse)this.response; // Add the debug information this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMSG_R665"); // Verify MS-OXCMSG requirement: MS-OXCMSG_R665 this.Site.CaptureRequirementIfAreEqual<uint>( TestSuiteBase.Success, rpmSetResponse.ReturnValue, 665, @"[In RopOpenMessage ROP Request Buffer] [OpenModeFlags] [BestAccess (0x03)] Open for read/write if the user has write permissions for the folder."); #endregion #region Call RopRelease to release created message in subfolder created by step 5. this.ReleaseRop(openedMessageBestReadWrietHandle); #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 by 3. firstSubfolderId = this.GetObjectIdFormLongTermID(firstSubfolderLongTermID, this.insideObjHandle); RopDeleteFolderRequest deleteFolderRequest = new RopDeleteFolderRequest() { RopId = (byte)RopId.RopDeleteFolder, LogonId = CommonLogonId, InputHandleIndex = CommonInputHandleIndex, DeleteFolderFlags = (byte)DeleteFolderFlags.DeleteHardDelete | (byte)DeleteFolderFlags.DelMessages, FolderId = firstSubfolderId }; 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 #region Call RopDeleteFolder to delete the subfolder created by 5 secondSubfolderId = this.GetObjectIdFormLongTermID(secondSubfolderLongTermID, this.insideObjHandle); deleteFolderRequest.FolderId = secondSubfolderId; this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(deleteFolderRequest, openedInboxFolderHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None); deleteFolderresponse = (RopDeleteFolderResponse)this.response; Site.Assert.AreEqual<uint>(TestSuiteBase.Success, deleteFolderresponse.ReturnValue, "Call RopDeleteFolder should success."); #endregion this.ReleaseRop(openedInboxFolderHandle); }
public void MSOXCMSG_S05_TC05_RopOpenMessageAsReadOnly() { this.CheckMapiHttpIsSupported(); this.ConnectToServer(ConnectionType.PrivateMailboxServer); List<PropertyObj> propertyValues = new List<PropertyObj> { new PropertyObj(PropertyNames.PidTagNormalizedSubject, Common.GetBytesFromUnicodeString(TestDataOfPidTagNormalizedSubject)) }; #region Call RopLogon to logon the private mailbox with administrator. RopLogonResponse logonResponse = this.Logon(LogonType.Mailbox, out this.insideObjHandle); #endregion #region Call RopCreateMessage to create a Message object. uint targetMessageHandle = this.CreatedMessage(logonResponse.FolderIds[4], this.insideObjHandle); #endregion #region Call RopSaveChangesMessage to save created message. RopSaveChangesMessageResponse saveChangesMessageResponse = this.SaveMessage(targetMessageHandle, (byte)SaveFlags.ForceSave); ulong messageId = saveChangesMessageResponse.MessageId; #endregion #region Call RopOpenMessage which OpenModeFlags is read-only to open created message. uint openedMessageReadOnlyHandle = this.OpenSpecificMessage(logonResponse.FolderIds[4], messageId, this.insideObjHandle, MessageOpenModeFlags.ReadOnly); #endregion #region Call RopSetProperties to set PidTagNormalizedSubject property of created message. if (Common.IsRequirementEnabled(661, this.Site)) { List<TaggedPropertyValue> taggedPropertyValueList = new List<TaggedPropertyValue>(); int valueSize = 0; foreach (PropertyObj propertyObj in propertyValues) { PropertyTag propertyTag = new PropertyTag { PropertyId = (ushort)propertyObj.PropertyID, PropertyType = (ushort)propertyObj.ValueTypeCode }; TaggedPropertyValue taggedPropertyValue = new TaggedPropertyValue { PropertyTag = propertyTag, Value = (byte[])propertyObj.Value }; valueSize += taggedPropertyValue.Size(); taggedPropertyValueList.Add(taggedPropertyValue); } RopSetPropertiesRequest rpmSetRequest = new RopSetPropertiesRequest() { RopId = (byte)RopId.RopSetProperties, LogonId = CommonLogonId, InputHandleIndex = CommonInputHandleIndex, PropertyValueCount = (ushort)taggedPropertyValueList.Count, PropertyValueSize = (ushort)(valueSize + 2), PropertyValues = taggedPropertyValueList.ToArray() }; uint returnValue; this.response = null; this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(rpmSetRequest, openedMessageReadOnlyHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None, out returnValue); #region Verify MS-OXCMSG_R661 if (this.response == null) { Site.Assert.AreNotEqual<uint>(0, returnValue, "Call RopSetProperties should fail."); } else { RopSetPropertiesResponse rpmSetResponse = (RopSetPropertiesResponse)this.response; Site.Assert.AreNotEqual<uint>(0, rpmSetResponse.ReturnValue, "Call RopSetProperties should fail."); } // Add the debug information this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMSG_R661"); // Verify MS-OXCMSG requirement: MS-OXCMSG_R661 // Because when call RopSetProperties to set property of specified Message object that opened by read-only, server will fail and return error code. // R661 will be verified. this.Site.CaptureRequirement( 661, @"[In RopOpenMessage ROP Request Buffer] [OpenModeFlags] [ReadOnly (0x00)] Message will be opened as read only."); #endregion } #endregion #region Call RopRelease to release created message. this.ReleaseRop(openedMessageReadOnlyHandle); #endregion }
public void MSOXCMSG_S05_TC06_RopOpenMessageAsReadWrite() { this.CheckMapiHttpIsSupported(); this.ConnectToServer(ConnectionType.PrivateMailboxServer); #region Call RopLogon to logon the private mailbox with administrator. RopLogonResponse logonResponse = this.Logon(LogonType.Mailbox, out this.insideObjHandle); #endregion List<PropertyObj> propertyValues = new List<PropertyObj> { new PropertyObj(PropertyNames.PidTagNormalizedSubject, Common.GetBytesFromUnicodeString(TestDataOfPidTagNormalizedSubject)) }; #region Call RopCreateMessage to create a Message object. uint targetMessageHandle = this.CreatedMessage(logonResponse.FolderIds[4], this.insideObjHandle); #endregion #region Call RopSaveChangesMessage to save created message. RopSaveChangesMessageResponse saveChangesMessageResponse = this.SaveMessage(targetMessageHandle, (byte)SaveFlags.ForceSave); ulong messageId = saveChangesMessageResponse.MessageId; #endregion #region Call RopOpenMessage which OpenModeFlags is ReadWrite to open created message. uint openedMessageReadWriteHandle = this.OpenSpecificMessage(logonResponse.FolderIds[4], messageId, this.insideObjHandle, MessageOpenModeFlags.ReadWrite); #endregion #region Call RopSetProperties to set PidTagNormalizedSubject property of created message. List<TaggedPropertyValue> taggedPropertyValueList = new List<TaggedPropertyValue>(); int valueSize = 0; foreach (PropertyObj propertyObj in propertyValues) { PropertyTag propertyTag = new PropertyTag { PropertyId = (ushort)propertyObj.PropertyID, PropertyType = (ushort)propertyObj.ValueTypeCode }; TaggedPropertyValue taggedPropertyValue = new TaggedPropertyValue { PropertyTag = propertyTag, Value = (byte[])propertyObj.Value }; valueSize += taggedPropertyValue.Size(); taggedPropertyValueList.Add(taggedPropertyValue); } RopSetPropertiesRequest rpmSetRequest = new RopSetPropertiesRequest() { RopId = (byte)RopId.RopSetProperties, LogonId = CommonLogonId, InputHandleIndex = CommonInputHandleIndex, PropertyValueCount = (ushort)taggedPropertyValueList.Count, PropertyValueSize = (ushort)(valueSize + 2), PropertyValues = taggedPropertyValueList.ToArray() }; this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(rpmSetRequest, openedMessageReadWriteHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None); RopSetPropertiesResponse rpmSetResponse = (RopSetPropertiesResponse)this.response; #region Verify MS-OXCMSG_R663 // Add the debug information this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMSG_R663"); // Verify MS-OXCMSG requirement: MS-OXCMSG_R663 this.Site.CaptureRequirementIfAreEqual<uint>( TestSuiteBase.Success, rpmSetResponse.ReturnValue, 663, @"[In RopOpenMessage ROP Request Buffer] [OpenModeFlags] [ReadWrite (0x01)] Message will be opened for both reading and writing."); #endregion #endregion #region Call RopRelease to release created message. this.ReleaseRop(openedMessageReadWriteHandle); #endregion }
/// <summary> /// Set properties' value for a message /// </summary> /// <param name="messageHandle">Unsigned integer value indicates a message object handle.</param> /// <param name="pts">PropertyObj list value</param> /// <param name="rpmSetResponse">The response of calling RopSetProperties.</param> protected void SetPropertiesForMessage(uint messageHandle, List<PropertyObj> pts, out RopSetPropertiesResponse rpmSetResponse) { List<TaggedPropertyValue> pvs = new List<TaggedPropertyValue>(); int valueSize = 0; foreach (PropertyObj pt in pts) { PropertyTag pg = new PropertyTag { PropertyId = (ushort)pt.PropertyID, PropertyType = (ushort)pt.ValueTypeCode }; TaggedPropertyValue pv = new TaggedPropertyValue { PropertyTag = pg, Value = (byte[])pt.Value }; valueSize += pv.Size(); pvs.Add(pv); } RopSetPropertiesRequest rpmSetRequest = new RopSetPropertiesRequest() { RopId = (byte)RopId.RopSetProperties, LogonId = CommonLogonId, // The logonId 0x00 is associated with this operation. InputHandleIndex = CommonInputHandleIndex, // This index specifies the location 0x00 in the Server Object Handle Table where the handle for the input Server Object is stored. PropertyValueCount = (ushort)pvs.Count, PropertyValueSize = (ushort)(valueSize + 2), PropertyValues = pvs.ToArray() }; this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(rpmSetRequest, messageHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None); rpmSetResponse = (RopSetPropertiesResponse)this.response; Site.Assert.AreEqual<uint>(TestSuiteBase.Success, rpmSetResponse.PropertyProblemCount, "If ROP succeeds, the PropertyProblemCount of its response is 0(success)."); }