From 3b9efe831c6a408cd71a7bea6fa95f65c141911b Mon Sep 17 00:00:00 2001 From: Bevan Weiss Date: Thu, 16 Jan 2025 21:29:43 +1100 Subject: Fix up missing 'Wix4' prefixes on MSMQ Permission tables. And updated decompiler to Wix4 table names etc in line with firewall CA. Fixes wixtoolset/issues#8902 Signed-off-by: Bevan Weiss --- src/ext/Msmq/ca/mqqueuesched.cpp | 10 +- src/ext/Msmq/ca/mqsched.cpp | 6 +- .../WixToolsetTest.Msmq/MsmqExtensionFixture.cs | 9 +- .../UsingMessageQueue/PackageComponents.wxs | 10 +- .../WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj | 1 + src/ext/Msmq/wixext/MsmqDecompiler.cs | 310 ++++++++++++++------- 6 files changed, 236 insertions(+), 110 deletions(-) (limited to 'src') diff --git a/src/ext/Msmq/ca/mqqueuesched.cpp b/src/ext/Msmq/ca/mqqueuesched.cpp index 7fdf65e3..42a25ea6 100644 --- a/src/ext/Msmq/ca/mqqueuesched.cpp +++ b/src/ext/Msmq/ca/mqqueuesched.cpp @@ -10,9 +10,9 @@ LPCWSTR vcsMessageQueueQuery = enum eMessageQueueQuery { mqqMessageQueue = 1, mqqComponent, mqqBasePriority, mqqJournalQuota, mqqLabel, mqqMulticastAddress, mqqPathName, mqqPrivLevel, mqqQuota, mqqServiceTypeGuid, mqqAttributes }; LPCWSTR vcsMessageQueueUserPermissionQuery = - L"SELECT `MessageQueueUserPermission`, `MessageQueue_`, `MessageQueueUserPermission`.`Component_`, `Domain`, `Name`, `Permissions` FROM `Wix4MessageQueueUserPermission`, `Wix4User` WHERE `User_` = `User`"; + L"SELECT `MessageQueueUserPermission`, `MessageQueue_`, `Wix4MessageQueueUserPermission`.`Component_`, `Domain`, `Name`, `Permissions` FROM `Wix4MessageQueueUserPermission`, `Wix4User` WHERE `User_` = `User`"; LPCWSTR vcsMessageQueueGroupPermissionQuery = - L"SELECT `MessageQueueGroupPermission`, `MessageQueue_`, `MessageQueueGroupPermission`.`Component_`, `Domain`, `Name`, `Permissions` FROM `Wix4MessageQueueGroupPermission`, `Wix4Group` WHERE `Group_` = `Group`"; + L"SELECT `MessageQueueGroupPermission`, `MessageQueue_`, `Wix4MessageQueueGroupPermission`.`Component_`, `Domain`, `Name`, `Permissions` FROM `Wix4MessageQueueGroupPermission`, `Wix4Group` WHERE `Group_` = `Group`"; enum eMessageQueuePermissionQuery { mqpqMessageQueuePermission = 1, mqpqMessageQueue, mqpqComponent, mqpqDomain, mqpqName, mqpqPermissions }; @@ -94,7 +94,7 @@ HRESULT MqiMessageQueueRead( // loop through all partitions hr = WcaOpenExecuteView(vcsMessageQueueQuery, &hView); - ExitOnFailure(hr, "Failed to execute view on MessageQueue table"); + ExitOnFailure(hr, "Failed to execute view on Wix4MessageQueue table"); while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) { @@ -324,14 +324,14 @@ HRESULT MqiMessageQueuePermissionRead( HRESULT hr = S_OK; // read message queue user permissions - if (S_OK == WcaTableExists(L"MessageQueueUserPermission")) + if (S_OK == WcaTableExists(L"Wix4MessageQueueUserPermission")) { hr = MessageQueueTrusteePermissionsRead(vcsMessageQueueUserPermissionQuery, pMessageQueueList, pList); ExitOnFailure(hr, "Failed to read message queue user permissions"); } // read message queue group permissions - if (S_OK == WcaTableExists(L"MessageQueueGroupPermission")) + if (S_OK == WcaTableExists(L"Wix4MessageQueueGroupPermission")) { hr = MessageQueueTrusteePermissionsRead(vcsMessageQueueGroupPermissionQuery, pMessageQueueList, pList); ExitOnFailure(hr, "Failed to read message queue group permissions"); diff --git a/src/ext/Msmq/ca/mqsched.cpp b/src/ext/Msmq/ca/mqsched.cpp index ab5a5ee7..c4f43ca2 100644 --- a/src/ext/Msmq/ca/mqsched.cpp +++ b/src/ext/Msmq/ca/mqsched.cpp @@ -49,7 +49,7 @@ extern "C" UINT __stdcall MessageQueuingInstall(MSIHANDLE hInstall) // read message queues hr = MqiMessageQueueRead(&lstMessageQueues); - ExitOnFailure(hr, "Failed to read MessageQueue table"); + ExitOnFailure(hr, "Failed to read Wix4MessageQueue table"); // read message queue permissions hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions); @@ -78,7 +78,7 @@ extern "C" UINT __stdcall MessageQueuingInstall(MSIHANDLE hInstall) hr = MqiMessageQueuePermissionInstall(&lstMessageQueuePermissions, &pwzExecuteActionData); ExitOnFailure(hr, "Failed to add message queue permissions to execute action data"); - iCost += lstMessageQueues.iInstallCount * COST_MESSAGE_QUEUE_PERMISSION_ADD; + iCost += lstMessageQueuePermissions.iInstallCount * COST_MESSAGE_QUEUE_PERMISSION_ADD; hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"MessageQueuingExecuteInstall"), pwzExecuteActionData, iCost); ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteInstall"); @@ -148,7 +148,7 @@ extern "C" UINT __stdcall MessageQueuingUninstall(MSIHANDLE hInstall) // read message queues hr = MqiMessageQueueRead(&lstMessageQueues); - ExitOnFailure(hr, "Failed to read MessageQueue table"); + ExitOnFailure(hr, "Failed to read Wix4MessageQueue table"); // read message queue permissions hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions); diff --git a/src/ext/Msmq/test/WixToolsetTest.Msmq/MsmqExtensionFixture.cs b/src/ext/Msmq/test/WixToolsetTest.Msmq/MsmqExtensionFixture.cs index 674d6a66..424d3d5b 100644 --- a/src/ext/Msmq/test/WixToolsetTest.Msmq/MsmqExtensionFixture.cs +++ b/src/ext/Msmq/test/WixToolsetTest.Msmq/MsmqExtensionFixture.cs @@ -6,6 +6,7 @@ namespace WixToolsetTest.Msmq using WixInternal.TestSupport; using WixInternal.Core.TestPackage; using WixToolset.Msmq; + using WixToolset.Util; using Xunit; public class MsmqExtensionFixture @@ -14,9 +15,9 @@ namespace WixToolsetTest.Msmq public void CanBuildUsingMessageQueue() { var folder = TestData.Get(@"TestData\UsingMessageQueue"); - var build = new Builder(folder, typeof(MsmqExtensionFactory), new[] { folder }); + var build = new Builder(folder, new[] { typeof(MsmqExtensionFactory), typeof(UtilExtensionFactory) }, new[] { folder }); - var results = build.BuildAndQuery(Build, "Wix4MessageQueue", "CustomAction"); + var results = build.BuildAndQuery(Build, "Wix4MessageQueue", "CustomAction", "Wix4MessageQueueUserPermission", "Wix4MessageQueueGroupPermission", "Wix4Group", "Wix4User"); WixAssert.CompareLineByLine(new[] { "CustomAction:Wix4MessageQueuingExecuteInstall_A64\t3073\tWix4MsmqCA_A64\tMessageQueuingExecuteInstall\t", @@ -25,7 +26,11 @@ namespace WixToolsetTest.Msmq "CustomAction:Wix4MessageQueuingRollbackInstall_A64\t3329\tWix4MsmqCA_A64\tMessageQueuingRollbackInstall\t", "CustomAction:Wix4MessageQueuingRollbackUninstall_A64\t3329\tWix4MsmqCA_A64\tMessageQueuingRollbackUninstall\t", "CustomAction:Wix4MessageQueuingUninstall_A64\t1\tWix4MsmqCA_A64\tMessageQueuingUninstall\t", + "Wix4Group:TestGroup\t\tTestGroup\t", "Wix4MessageQueue:TestMQ\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\t\t\tMQLabel\t\tMQPath\t\t\t\t0", + "Wix4MessageQueueGroupPermission:TestMQ_TestGroup\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tTestMQ\tTestGroup\t160", + "Wix4MessageQueueUserPermission:TestMQ_TestUser\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tTestMQ\tTestUser\t160", + "Wix4User:TestUser\t\tTestUser\t\t\t\t0", }, results); } diff --git a/src/ext/Msmq/test/WixToolsetTest.Msmq/TestData/UsingMessageQueue/PackageComponents.wxs b/src/ext/Msmq/test/WixToolsetTest.Msmq/TestData/UsingMessageQueue/PackageComponents.wxs index ff9f7d92..bba105a0 100644 --- a/src/ext/Msmq/test/WixToolsetTest.Msmq/TestData/UsingMessageQueue/PackageComponents.wxs +++ b/src/ext/Msmq/test/WixToolsetTest.Msmq/TestData/UsingMessageQueue/PackageComponents.wxs @@ -1,11 +1,17 @@ + xmlns:msmq="http://wixtoolset.org/schemas/v4/wxs/msmq" + xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> + + - + + + + diff --git a/src/ext/Msmq/test/WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj b/src/ext/Msmq/test/WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj index e7b6f21e..88718f98 100644 --- a/src/ext/Msmq/test/WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj +++ b/src/ext/Msmq/test/WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj @@ -16,6 +16,7 @@ + diff --git a/src/ext/Msmq/wixext/MsmqDecompiler.cs b/src/ext/Msmq/wixext/MsmqDecompiler.cs index aa8c34b6..53734e88 100644 --- a/src/ext/Msmq/wixext/MsmqDecompiler.cs +++ b/src/ext/Msmq/wixext/MsmqDecompiler.cs @@ -2,59 +2,79 @@ namespace WixToolset.Msmq { -#if TODO_CONSIDER_DECOMPILER using System; - using System.Collections; - using System.Globalization; + using System.Collections.Generic; + using System.Reflection; + using System.Security; + using System.Xml.Linq; using WixToolset.Data; + using WixToolset.Data.WindowsInstaller; using WixToolset.Extensibility; - using Msmq = WixToolset.Extensions.Serialize.Msmq; - using Wix = WixToolset.Data.Serialize; + using WixToolset.Extensibility.Data; + using WixToolset.Extensibility.Services; /// /// The decompiler for the WiX Toolset MSMQ Extension. /// - public sealed class MsmqDecompiler : DecompilerExtension + public sealed class MsmqDecompiler : BaseWindowsInstallerDecompilerExtension { - /// - /// Creates a decompiler for MSMQ Extension. - /// - public MsmqDecompiler() + public override IReadOnlyCollection TableDefinitions => MsmqTableDefinitions.All; + + private IParseHelper ParseHelper { get; set; } + + internal static XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/msmq"; + internal static XName MessageQueueName => Namespace + "MessageQueue"; + internal static XName MessageQueuePermissionName => Namespace + "MessageQueuePermission"; + + public override void PreDecompile(IWindowsInstallerDecompileContext context, IWindowsInstallerDecompilerHelper helper) { - this.TableDefinitions = MsmqExtensionData.GetExtensionTableDefinitions(); + base.PreDecompile(context, helper); + this.ParseHelper = context.ServiceProvider.GetService(); } /// - /// Get the extensions library to be removed. + /// Called at the beginning of the decompilation of a database. /// - /// Table definitions for library. - /// Library to remove from decompiled output. - public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions) + /// The collection of all tables. + public override void PreDecompileTables(TableIndexedCollection tables) { - return MsmqExtensionData.GetExtensionLibrary(tableDefinitions); } /// /// Decompiles an extension table. /// /// The table to decompile. - public override void DecompileTable(Table table) + public override bool TryDecompileTable(Table table) { switch (table.Name) { case "MessageQueue": + case "Wix4MessageQueue": this.DecompileMessageQueueTable(table); break; case "MessageQueueUserPermission": + case "Wix4MessageQueueUserPermission": this.DecompileMessageQueueUserPermissionTable(table); break; case "MessageQueueGroupPermission": + case "Wix4MessageQueueGroupPermission": this.DecompileMessageQueueGroupPermissionTable(table); break; default: - base.DecompileTable(table); - break; + return false; } + return true; + } + + /// + /// Finalize decompilation. + /// + /// The collection of all tables. + public override void PostDecompileTables(TableIndexedCollection tables) + { + this.FinalizeMessageQueueTable(tables); + this.FinalizeMessageQueueUserPermissionTable(tables); + this.FinalizeMessageQueueGroupPermissionTable(tables); } /// @@ -65,82 +85,106 @@ namespace WixToolset.Msmq { foreach (Row row in table.Rows) { - Msmq.MessageQueue queue = new Msmq.MessageQueue(); + var messageQueue = new XElement(MessageQueueName, + new XAttribute("Id", row.FieldAsString(0)) + ); - queue.Id = (string)row[0]; + // Column(1) Component_ resolved in FinalizeMessageQueueTable - if (null != row[2]) + if (!row.IsColumnEmpty(2)) { - queue.BasePriority = (int)row[2]; + messageQueue.Add(new XAttribute("BasePriority", row.FieldAsString(2))); } - if (null != row[3]) + if (!row.IsColumnEmpty(3)) { - queue.JournalQuota = (int)row[3]; + messageQueue.Add(new XAttribute("JournalQuota", row.FieldAsString(3))); } - queue.Label = (string)row[4]; + messageQueue.Add(new XAttribute("Label", row.FieldAsString(4))); - if (null != row[5]) + if (!row.IsColumnEmpty(5)) { - queue.MulticastAddress = (string)row[5]; + messageQueue.Add(new XAttribute("MulticastAddress", row.FieldAsString(5))); } - queue.PathName = (string)row[6]; + messageQueue.Add(new XAttribute("PathName", row.FieldAsString(6))); - if (null != row[7]) + + if (!row.IsColumnEmpty(7)) { - switch ((MsmqCompiler.MqiMessageQueuePrivacyLevel)row[7]) + int privLevel = row.FieldAsInteger(7); + switch ((MsmqCompiler.MqiMessageQueuePrivacyLevel)privLevel) { case MsmqCompiler.MqiMessageQueuePrivacyLevel.None: - queue.PrivLevel = Msmq.MessageQueue.PrivLevelType.none; + messageQueue.Add(new XAttribute("PrivLevel", "none")); break; case MsmqCompiler.MqiMessageQueuePrivacyLevel.Optional: - queue.PrivLevel = Msmq.MessageQueue.PrivLevelType.optional; + messageQueue.Add(new XAttribute("PrivLevel", "optional")); break; case MsmqCompiler.MqiMessageQueuePrivacyLevel.Body: - queue.PrivLevel = Msmq.MessageQueue.PrivLevelType.body; + messageQueue.Add(new XAttribute("PrivLevel", "body")); break; default: break; } } - if (null != row[8]) + if (!row.IsColumnEmpty(8)) { - queue.Quota = (int)row[8]; + messageQueue.Add(new XAttribute("Quota", row.FieldAsString(8))); } - if (null != row[9]) + if (!row.IsColumnEmpty(9)) { - queue.ServiceTypeGuid = (string)row[9]; + messageQueue.Add(new XAttribute("ServiceTypeGuid", row.FieldAsString(9))); } - int attributes = (int)row[10]; + int attributes = row.FieldAsInteger(10); if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueueAttributes.Authenticate)) { - queue.Authenticate = Msmq.YesNoType.yes; + messageQueue.Add(new XAttribute("Authenticate", YesNoType.Yes)); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueueAttributes.Journal)) { - queue.Journal = Msmq.YesNoType.yes; + messageQueue.Add(new XAttribute("Journal", YesNoType.Yes)); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueueAttributes.Transactional)) { - queue.Transactional = Msmq.YesNoType.yes; + messageQueue.Add(new XAttribute("Transactional", YesNoType.Yes)); } - Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]); - if (null != component) - { - component.AddChild(queue); - } - else + this.DecompilerHelper.IndexElement(row, messageQueue); + } + + } + + /// + /// Finalize the MessageQueue table. + /// + /// Collection of all tables. + private void FinalizeMessageQueueTable(TableIndexedCollection tables) + { + Table messageQueueTable; + if (tables.TryGetTable("MessageQueue", out messageQueueTable) + || tables.TryGetTable("Wix4MessageQueue", out messageQueueTable)) + { + foreach (var row in messageQueueTable.Rows) { - this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component")); + var xmlConfig = this.DecompilerHelper.GetIndexedElement(row); + + var componentId = row.FieldAsString(1); + if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component)) + { + component.Add(xmlConfig); + } + else + { + this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component")); + } } } } @@ -153,27 +197,63 @@ namespace WixToolset.Msmq { foreach (Row row in table.Rows) { - Msmq.MessageQueuePermission queuePermission = new Msmq.MessageQueuePermission(); + var queuePermission = new XElement(MessageQueuePermissionName, + new XAttribute("Id", row.FieldAsString(0)) + ); - queuePermission.Id = (string)row[0]; + DecompileMessageQueuePermissionAttributes(row, queuePermission); + this.DecompilerHelper.IndexElement(row, queuePermission); + } - if (null != row[2]) + } + + /// + /// Finalize the MessageQueueUserPermissionTable table. + /// + /// Collection of all tables. + private void FinalizeMessageQueueUserPermissionTable(TableIndexedCollection tables) + { + Table messageQueueUserPermissionTable; + if (tables.TryGetTable("MessageQueueUserPermission", out messageQueueUserPermissionTable) + || tables.TryGetTable("Wix4MessageQueueUserPermission", out messageQueueUserPermissionTable)) + { + foreach (var row in messageQueueUserPermissionTable.Rows) { - queuePermission.MessageQueue = (string)row[2]; - } + var xmlConfig = this.DecompilerHelper.GetIndexedElement(row); - queuePermission.User = (string)row[3]; + var componentId = row.FieldAsString(1); + if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component)) + { + component.Add(xmlConfig); + } + else + { + this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueUserPermissionTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component")); + } - DecompileMessageQueuePermissionAttributes(row, queuePermission); + var messageQueueId = row.FieldAsString(2); + XElement messageQueue; + if (this.DecompilerHelper.TryGetIndexedElement("MessageQueue", messageQueueId, out messageQueue) + || this.DecompilerHelper.TryGetIndexedElement("Wix4MessageQueue", messageQueueId, out messageQueue)) + { + xmlConfig.Add(new XAttribute("MessageQueue", messageQueueId)); + } + else + { + this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueUserPermissionTable.Name, row.GetPrimaryKey(), "MessageQueue_", messageQueueId, "Wix4MessageQueue")); + } - Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]); - if (null != component) - { - component.AddChild(queuePermission); - } - else - { - this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component")); + var userId = row.FieldAsString(3); + XElement user; + if (this.DecompilerHelper.TryGetIndexedElement("User", userId, out user) + || this.DecompilerHelper.TryGetIndexedElement("Wix4User", userId, out user)) + { + xmlConfig.Add(new XAttribute("User", userId)); + } + else + { + this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueUserPermissionTable.Name, row.GetPrimaryKey(), "User_", userId, "Wix4User")); + } } } } @@ -186,27 +266,62 @@ namespace WixToolset.Msmq { foreach (Row row in table.Rows) { - Msmq.MessageQueuePermission queuePermission = new Msmq.MessageQueuePermission(); + var queuePermission = new XElement(MessageQueuePermissionName, + new XAttribute("Id", row.FieldAsString(0)) + ); - queuePermission.Id = (string)row[0]; + DecompileMessageQueuePermissionAttributes(row, queuePermission); + this.DecompilerHelper.IndexElement(row, queuePermission); + } + } - if (null != row[2]) + /// + /// Finalize the MessageQueueGroupPermissionTable table. + /// + /// Collection of all tables. + private void FinalizeMessageQueueGroupPermissionTable(TableIndexedCollection tables) + { + Table messageQueueGroupPermissionTable; + if (tables.TryGetTable("MessageQueueGroupPermission", out messageQueueGroupPermissionTable) + || tables.TryGetTable("Wix4MessageQueueGroupPermission", out messageQueueGroupPermissionTable)) + { + foreach (var row in messageQueueGroupPermissionTable.Rows) { - queuePermission.MessageQueue = (string)row[2]; - } + var xmlConfig = this.DecompilerHelper.GetIndexedElement(row); - queuePermission.Group = (string)row[3]; + var componentId = row.FieldAsString(1); + if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component)) + { + component.Add(xmlConfig); + } + else + { + this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueGroupPermissionTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component")); + } - DecompileMessageQueuePermissionAttributes(row, queuePermission); + var messageQueueId = row.FieldAsString(2); + XElement messageQueue; + if (this.DecompilerHelper.TryGetIndexedElement("MessageQueue", messageQueueId, out messageQueue) + || this.DecompilerHelper.TryGetIndexedElement("Wix4MessageQueue", messageQueueId, out messageQueue)) + { + xmlConfig.Add(new XAttribute("MessageQueue", messageQueueId)); + } + else + { + this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueGroupPermissionTable.Name, row.GetPrimaryKey(), "MessageQueue_", messageQueueId, "Wix4MessageQueue")); + } - Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]); - if (null != component) - { - component.AddChild(queuePermission); - } - else - { - this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component")); + var groupId = row.FieldAsString(3); + XElement group; + if (this.DecompilerHelper.TryGetIndexedElement("Group", groupId, out group) + || this.DecompilerHelper.TryGetIndexedElement("Wix4Group", groupId, out group)) + { + xmlConfig.Add(new XAttribute("Group", groupId)); + } + else + { + this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueGroupPermissionTable.Name, row.GetPrimaryKey(), "Group_", groupId, "Wix4Group")); + } } } } @@ -216,90 +331,89 @@ namespace WixToolset.Msmq /// /// The row to decompile. /// Target element. - private void DecompileMessageQueuePermissionAttributes(Row row, Msmq.MessageQueuePermission queuePermission) + private void DecompileMessageQueuePermissionAttributes(Row row, XElement element) { - int attributes = (int)row[4]; + int attributes = row.FieldAsInteger(4); if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.DeleteMessage)) { - queuePermission.DeleteMessage = Msmq.YesNoType.yes; + element.Add("DeleteMessage", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.PeekMessage)) { - queuePermission.PeekMessage = Msmq.YesNoType.yes; + element.Add("PeekMessage", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.WriteMessage)) { - queuePermission.WriteMessage = Msmq.YesNoType.yes; + element.Add("WriteMessage", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.DeleteJournalMessage)) { - queuePermission.DeleteJournalMessage = Msmq.YesNoType.yes; + element.Add("DeleteJournalMessage", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.SetQueueProperties)) { - queuePermission.SetQueueProperties = Msmq.YesNoType.yes; + element.Add("SetQueueProperties", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.GetQueueProperties)) { - queuePermission.GetQueueProperties = Msmq.YesNoType.yes; + element.Add("GetQueueProperties", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.DeleteQueue)) { - queuePermission.DeleteQueue = Msmq.YesNoType.yes; + element.Add("DeleteQueue", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.GetQueuePermissions)) { - queuePermission.GetQueuePermissions = Msmq.YesNoType.yes; + element.Add("GetQueuePermissions", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.ChangeQueuePermissions)) { - queuePermission.ChangeQueuePermissions = Msmq.YesNoType.yes; + element.Add("ChangeQueuePermissions", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.TakeQueueOwnership)) { - queuePermission.TakeQueueOwnership = Msmq.YesNoType.yes; + element.Add("TakeQueueOwnership", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.ReceiveMessage)) { - queuePermission.ReceiveMessage = Msmq.YesNoType.yes; + element.Add("ReceiveMessage", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.ReceiveJournalMessage)) { - queuePermission.ReceiveJournalMessage = Msmq.YesNoType.yes; + element.Add("ReceiveJournalMessage", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericRead)) { - queuePermission.QueueGenericRead = Msmq.YesNoType.yes; + element.Add("QueueGenericRead", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericWrite)) { - queuePermission.QueueGenericWrite = Msmq.YesNoType.yes; + element.Add("QueueGenericWrite", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericExecute)) { - queuePermission.QueueGenericExecute = Msmq.YesNoType.yes; + element.Add("QueueGenericExecute", YesNoType.Yes); } if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericAll)) { - queuePermission.QueueGenericAll = Msmq.YesNoType.yes; + element.Add("QueueGenericAll", YesNoType.Yes); } } } -#endif } -- cgit v1.2.3-55-g6feb