aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-05-23 15:55:58 +1000
committerSean Hall <r.sean.hall@gmail.com>2020-05-23 16:00:11 +1000
commit6fbe9b0b7e98e63daa89c1347e5388dec9fdc57f (patch)
tree98c04dcb4cfdd19aca0d292b97810cac00aa6adb /src
parent242d5201cb75c686f4cb86e521ed0d8c025c563b (diff)
downloadwix-6fbe9b0b7e98e63daa89c1347e5388dec9fdc57f.tar.gz
wix-6fbe9b0b7e98e63daa89c1347e5388dec9fdc57f.tar.bz2
wix-6fbe9b0b7e98e63daa89c1347e5388dec9fdc57f.zip
WIXFEAT:2006,2580,2751 Add Inheritable attribute to PermissionEx.
Diffstat (limited to 'src')
-rw-r--r--src/ca/secureobj.cpp25
-rw-r--r--src/test/WixToolsetTest.Util/UtilExtensionFixture.cs2
-rw-r--r--src/wixext/Tuples/SecureObjectsTuple.cs8
-rw-r--r--src/wixext/UtilCompiler.cs13
-rw-r--r--src/wixext/UtilTableDefinitions.cs1
-rw-r--r--src/wixext/util.xsd5
6 files changed, 47 insertions, 7 deletions
diff --git a/src/ca/secureobj.cpp b/src/ca/secureobj.cpp
index 392945d9..72842eb5 100644
--- a/src/ca/secureobj.cpp
+++ b/src/ca/secureobj.cpp
@@ -3,10 +3,10 @@
3#include "precomp.h" 3#include "precomp.h"
4 4
5// structs 5// structs
6LPCWSTR wzQUERY_SECUREOBJECTS = L"SELECT `Wix4SecureObject`.`Wix4SecureObject`, `Wix4SecureObject`.`Table`, `Wix4SecureObject`.`Domain`, `Wix4SecureObject`.`User`, " 6LPCWSTR wzQUERY_SECUREOBJECTS = L"SELECT `Wix4SecureObject`.`Wix4SecureObject`, `Wix4SecureObject`.`Table`, `Wix4SecureObject`.`Domain`, `Wix4SecureObject`.`User`, `Wix4SecureObject`.`Attributes`, "
7 L"`Wix4SecureObject`.`Permission`, `Wix4SecureObject`.`Component_`, `Component`.`Attributes` FROM `Wix4SecureObject`,`Component` WHERE " 7 L"`Wix4SecureObject`.`Permission`, `Wix4SecureObject`.`Component_`, `Component`.`Attributes` FROM `Wix4SecureObject`,`Component` WHERE "
8 L"`Wix4SecureObject`.`Component_`=`Component`.`Component`"; 8 L"`Wix4SecureObject`.`Component_`=`Component`.`Component`";
9enum eQUERY_SECUREOBJECTS { QSO_SECUREOBJECT = 1, QSO_TABLE, QSO_DOMAIN, QSO_USER, QSO_PERMISSION, QSO_COMPONENT, QSO_COMPATTRIBUTES }; 9enum eQUERY_SECUREOBJECTS { QSO_SECUREOBJECT = 1, QSO_TABLE, QSO_DOMAIN, QSO_USER, QSO_ATTRIBUTES, QSO_PERMISSION, QSO_COMPONENT, QSO_COMPATTRIBUTES };
10 10
11LPCWSTR wzQUERY_REGISTRY = L"SELECT `Registry`.`Registry`, `Registry`.`Root`, `Registry`.`Key` FROM `Registry` WHERE `Registry`.`Registry`=?"; 11LPCWSTR wzQUERY_REGISTRY = L"SELECT `Registry`.`Registry`, `Registry`.`Root`, `Registry`.`Key` FROM `Registry` WHERE `Registry`.`Registry`=?";
12enum eQUERY_OBJECTCOMPONENT { QSOC_REGISTRY = 1, QSOC_REGROOT, QSOC_REGKEY }; 12enum eQUERY_OBJECTCOMPONENT { QSOC_REGISTRY = 1, QSOC_REGROOT, QSOC_REGKEY };
@@ -16,6 +16,11 @@ enum eQUERY_SECURESERVICEINSTALL { QSSI_NAME = 1 };
16 16
17enum eOBJECTTYPE { OT_UNKNOWN, OT_SERVICE, OT_FOLDER, OT_FILE, OT_REGISTRY }; 17enum eOBJECTTYPE { OT_UNKNOWN, OT_SERVICE, OT_FOLDER, OT_FILE, OT_REGISTRY };
18 18
19enum eSECURE_OBJECT_ATTRIBUTE
20{
21 SECURE_OBJECT_ATTRIBUTE_INHERITABLE = 0x1,
22};
23
19static eOBJECTTYPE EObjectTypeFromString( 24static eOBJECTTYPE EObjectTypeFromString(
20 __in LPCWSTR pwzTable 25 __in LPCWSTR pwzTable
21 ) 26 )
@@ -335,6 +340,7 @@ extern "C" UINT __stdcall SchedSecureObjects(
335 340
336 DWORD cObjects = 0; 341 DWORD cObjects = 0;
337 eOBJECTTYPE eType = OT_UNKNOWN; 342 eOBJECTTYPE eType = OT_UNKNOWN;
343 DWORD dwAttributes = 0;
338 344
339 // 345 //
340 // initialize 346 // initialize
@@ -409,7 +415,6 @@ extern "C" UINT __stdcall SchedSecureObjects(
409 // add the data to the CustomActionData 415 // add the data to the CustomActionData
410 hr = WcaGetRecordString(hRec, QSO_SECUREOBJECT, &pwzData); 416 hr = WcaGetRecordString(hRec, QSO_SECUREOBJECT, &pwzData);
411 ExitOnFailure(hr, "failed to get name of object"); 417 ExitOnFailure(hr, "failed to get name of object");
412
413 hr = WcaWriteStringToCaData(pwzTable, &pwzCustomActionData); 418 hr = WcaWriteStringToCaData(pwzTable, &pwzCustomActionData);
414 ExitOnFailure(hr, "failed to add data to CustomActionData"); 419 ExitOnFailure(hr, "failed to add data to CustomActionData");
415 420
@@ -423,6 +428,11 @@ extern "C" UINT __stdcall SchedSecureObjects(
423 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData); 428 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
424 ExitOnFailure(hr, "failed to add data to CustomActionData"); 429 ExitOnFailure(hr, "failed to add data to CustomActionData");
425 430
431 hr = WcaGetRecordInteger(hRec, QSO_ATTRIBUTES, reinterpret_cast<int*>(&dwAttributes));
432 ExitOnFailure(hr, "failed to get attributes to configure object");
433 hr = WcaWriteIntegerToCaData(dwAttributes, &pwzCustomActionData);
434 ExitOnFailure(hr, "failed to add data to CustomActionData");
435
426 hr = WcaGetRecordString(hRec, QSO_PERMISSION, &pwzData); 436 hr = WcaGetRecordString(hRec, QSO_PERMISSION, &pwzData);
427 ExitOnFailure(hr, "failed to get permission to configure object"); 437 ExitOnFailure(hr, "failed to get permission to configure object");
428 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData); 438 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
@@ -568,7 +578,7 @@ LExit:
568 called as Type 1025 CustomAction (deferred binary DLL) 578 called as Type 1025 CustomAction (deferred binary DLL)
569 579
570 NOTE: deferred CustomAction since it modifies the machine 580 NOTE: deferred CustomAction since it modifies the machine
571 NOTE: CustomActionData == wzObject\twzTable\twzDomain\twzUser\tdwPermissions\twzObject\t... 581 NOTE: CustomActionData == wzObject\twzTable\twzDomain\twzUser\tdwAttributes\tdwPermissions\t...
572******************************************************************/ 582******************************************************************/
573extern "C" UINT __stdcall ExecSecureObjects( 583extern "C" UINT __stdcall ExecSecureObjects(
574 __in MSIHANDLE hInstall 584 __in MSIHANDLE hInstall
@@ -586,6 +596,7 @@ extern "C" UINT __stdcall ExecSecureObjects(
586 DWORD dwRevision = 0; 596 DWORD dwRevision = 0;
587 LPWSTR pwzUser = NULL; 597 LPWSTR pwzUser = NULL;
588 DWORD dwPermissions = 0; 598 DWORD dwPermissions = 0;
599 DWORD dwAttributes = 0;
589 LPWSTR pwzAccount = NULL; 600 LPWSTR pwzAccount = NULL;
590 PSID psid = NULL; 601 PSID psid = NULL;
591 602
@@ -626,8 +637,10 @@ extern "C" UINT __stdcall ExecSecureObjects(
626 ExitOnFailure(hr, "failed to process CustomActionData"); 637 ExitOnFailure(hr, "failed to process CustomActionData");
627 hr = WcaReadStringFromCaData(&pwz, &pwzUser); 638 hr = WcaReadStringFromCaData(&pwz, &pwzUser);
628 ExitOnFailure(hr, "failed to process CustomActionData"); 639 ExitOnFailure(hr, "failed to process CustomActionData");
640 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwAttributes));
641 ExitOnFailure(hr, "failed to process CustomActionData");
629 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwPermissions)); 642 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwPermissions));
630 ExitOnFailure(hr, "failed to processCustomActionData"); 643 ExitOnFailure(hr, "failed to process CustomActionData");
631 644
632 WcaLog(LOGMSG_VERBOSE, "Securing Object: %ls Type: %ls User: %ls", pwzObject, pwzTable, pwzUser); 645 WcaLog(LOGMSG_VERBOSE, "Securing Object: %ls Type: %ls User: %ls", pwzObject, pwzTable, pwzUser);
633 646
@@ -690,7 +703,7 @@ extern "C" UINT __stdcall ExecSecureObjects(
690 // 703 //
691 ea.grfAccessMode = SET_ACCESS; 704 ea.grfAccessMode = SET_ACCESS;
692 705
693 if (0 == lstrcmpW(L"CreateFolder", pwzTable)) 706 if (dwAttributes & SECURE_OBJECT_ATTRIBUTE_INHERITABLE)
694 { 707 {
695 ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; 708 ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
696 } 709 }
diff --git a/src/test/WixToolsetTest.Util/UtilExtensionFixture.cs b/src/test/WixToolsetTest.Util/UtilExtensionFixture.cs
index c8ad24ad..fabef160 100644
--- a/src/test/WixToolsetTest.Util/UtilExtensionFixture.cs
+++ b/src/test/WixToolsetTest.Util/UtilExtensionFixture.cs
@@ -105,7 +105,7 @@ namespace WixToolsetTest.Util
105 "CustomAction:Wix4ExecSecureObjectsRollback_X64\t11521\tWix4UtilCA_X64\tExecSecureObjectsRollback\t", 105 "CustomAction:Wix4ExecSecureObjectsRollback_X64\t11521\tWix4UtilCA_X64\tExecSecureObjectsRollback\t",
106 "CustomAction:Wix4SchedSecureObjects_X64\t1\tWix4UtilCA_X64\tSchedSecureObjects\t", 106 "CustomAction:Wix4SchedSecureObjects_X64\t1\tWix4UtilCA_X64\tSchedSecureObjects\t",
107 "CustomAction:Wix4SchedSecureObjectsRollback_X64\t1\tWix4UtilCA_X64\tSchedSecureObjectsRollback\t", 107 "CustomAction:Wix4SchedSecureObjectsRollback_X64\t1\tWix4UtilCA_X64\tSchedSecureObjectsRollback\t",
108 "Wix4SecureObject:INSTALLFOLDER\tCreateFolder\t\tEveryone\t268435456\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo", 108 "Wix4SecureObject:INSTALLFOLDER\tCreateFolder\t\tEveryone\t1\t268435456\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo",
109 }, results.OrderBy(s => s).ToArray()); 109 }, results.OrderBy(s => s).ToArray());
110 } 110 }
111 111
diff --git a/src/wixext/Tuples/SecureObjectsTuple.cs b/src/wixext/Tuples/SecureObjectsTuple.cs
index 3602a5ea..95c24979 100644
--- a/src/wixext/Tuples/SecureObjectsTuple.cs
+++ b/src/wixext/Tuples/SecureObjectsTuple.cs
@@ -15,6 +15,7 @@ namespace WixToolset.Util
15 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.Table), IntermediateFieldType.String), 15 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.Table), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.Domain), IntermediateFieldType.String), 16 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.Domain), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.User), IntermediateFieldType.String), 17 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.User), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.Attributes), IntermediateFieldType.Number),
18 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.Permission), IntermediateFieldType.Number), 19 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.Permission), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.ComponentRef), IntermediateFieldType.String), 20 new IntermediateFieldDefinition(nameof(SecureObjectsTupleFields.ComponentRef), IntermediateFieldType.String),
20 }, 21 },
@@ -32,6 +33,7 @@ namespace WixToolset.Util.Tuples
32 Table, 33 Table,
33 Domain, 34 Domain,
34 User, 35 User,
36 Attributes,
35 Permission, 37 Permission,
36 ComponentRef, 38 ComponentRef,
37 } 39 }
@@ -72,6 +74,12 @@ namespace WixToolset.Util.Tuples
72 set => this.Set((int)SecureObjectsTupleFields.User, value); 74 set => this.Set((int)SecureObjectsTupleFields.User, value);
73 } 75 }
74 76
77 public int Attributes
78 {
79 get => this.Fields[(int)SecureObjectsTupleFields.Attributes].AsNumber();
80 set => this.Set((int)SecureObjectsTupleFields.Attributes, value);
81 }
82
75 public int? Permission 83 public int? Permission
76 { 84 {
77 get => this.Fields[(int)SecureObjectsTupleFields.Permission].AsNullableNumber(); 85 get => this.Fields[(int)SecureObjectsTupleFields.Permission].AsNullableNumber();
diff --git a/src/wixext/UtilCompiler.cs b/src/wixext/UtilCompiler.cs
index 65ca406d..672c3f68 100644
--- a/src/wixext/UtilCompiler.cs
+++ b/src/wixext/UtilCompiler.cs
@@ -49,6 +49,11 @@ namespace WixToolset.Util
49 TypeMask = 0xf, 49 TypeMask = 0xf,
50 } 50 }
51 51
52 internal enum WixPermissionExAttributes
53 {
54 Inheritable = 0x01
55 }
56
52 internal enum WixRemoveFolderExOn 57 internal enum WixRemoveFolderExOn
53 { 58 {
54 Install = 1, 59 Install = 1,
@@ -2367,6 +2372,8 @@ namespace WixToolset.Util
2367 string domain = null; 2372 string domain = null;
2368 string[] specialPermissions = null; 2373 string[] specialPermissions = null;
2369 string user = null; 2374 string user = null;
2375 var inheritable = YesNoType.NotSet;
2376 int attributes = 0;
2370 2377
2371 var permissionType = PermissionType.SecureObjects; 2378 var permissionType = PermissionType.SecureObjects;
2372 2379
@@ -2407,6 +2414,9 @@ namespace WixToolset.Util
2407 } 2414 }
2408 domain = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 2415 domain = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2409 break; 2416 break;
2417 case "Inheritable":
2418 inheritable = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2419 break;
2410 case "User": 2420 case "User":
2411 user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 2421 user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2412 break; 2422 break;
@@ -2444,6 +2454,8 @@ namespace WixToolset.Util
2444 this.Messaging.Write(ErrorMessages.GenericReadNotAllowed(sourceLineNumbers)); 2454 this.Messaging.Write(ErrorMessages.GenericReadNotAllowed(sourceLineNumbers));
2445 } 2455 }
2446 2456
2457 attributes |= inheritable == YesNoType.No ? 0 : (int)WixPermissionExAttributes.Inheritable; // default to inheritable.
2458
2447 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); 2459 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2448 2460
2449 if (!this.Messaging.EncounteredError) 2461 if (!this.Messaging.EncounteredError)
@@ -2457,6 +2469,7 @@ namespace WixToolset.Util
2457 Table = tableName, 2469 Table = tableName,
2458 Domain = domain, 2470 Domain = domain,
2459 User = user, 2471 User = user,
2472 Attributes = attributes,
2460 Permission = permission, 2473 Permission = permission,
2461 ComponentRef = componentId, 2474 ComponentRef = componentId,
2462 }); 2475 });
diff --git a/src/wixext/UtilTableDefinitions.cs b/src/wixext/UtilTableDefinitions.cs
index 5e227a05..4dfeb4bd 100644
--- a/src/wixext/UtilTableDefinitions.cs
+++ b/src/wixext/UtilTableDefinitions.cs
@@ -164,6 +164,7 @@ namespace WixToolset.Util
164 new ColumnDefinition("Table", ColumnType.String, 32, primaryKey: true, nullable: false, ColumnCategory.Text, description: "Table SecureObject should be securing"), 164 new ColumnDefinition("Table", ColumnType.String, 32, primaryKey: true, nullable: false, ColumnCategory.Text, description: "Table SecureObject should be securing"),
165 new ColumnDefinition("Domain", ColumnType.String, 255, primaryKey: true, nullable: true, ColumnCategory.Text, description: "Domain half of user account to secure", modularizeType: ColumnModularizeType.Property), 165 new ColumnDefinition("Domain", ColumnType.String, 255, primaryKey: true, nullable: true, ColumnCategory.Text, description: "Domain half of user account to secure", modularizeType: ColumnModularizeType.Property),
166 new ColumnDefinition("User", ColumnType.String, 255, primaryKey: true, nullable: false, ColumnCategory.Text, description: "User name half of user account to secure", modularizeType: ColumnModularizeType.Property), 166 new ColumnDefinition("User", ColumnType.String, 255, primaryKey: true, nullable: false, ColumnCategory.Text, description: "User name half of user account to secure", modularizeType: ColumnModularizeType.Property),
167 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Integer, minValue: 0, maxValue: 2147483647, description: "A 32-bit word that specifies the attribute flags to be applied."),
167 new ColumnDefinition("Permission", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: -2147483647, maxValue: 2147483647, description: "Permissions to grant to User"), 168 new ColumnDefinition("Permission", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: -2147483647, maxValue: 2147483647, description: "Permissions to grant to User"),
168 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table used to determine install state", modularizeType: ColumnModularizeType.Column), 169 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table used to determine install state", modularizeType: ColumnModularizeType.Column),
169 }, 170 },
diff --git a/src/wixext/util.xsd b/src/wixext/util.xsd
index a8c3d208..93cdd4ba 100644
--- a/src/wixext/util.xsd
+++ b/src/wixext/util.xsd
@@ -775,6 +775,11 @@
775 <xs:complexType> 775 <xs:complexType>
776 <xs:attribute name="Domain" type="xs:string"></xs:attribute> 776 <xs:attribute name="Domain" type="xs:string"></xs:attribute>
777 <xs:attribute name="User" use="required" type="xs:string"></xs:attribute> 777 <xs:attribute name="User" use="required" type="xs:string"></xs:attribute>
778 <xs:attribute name="Inheritable" type="xs:YesNoType">
779 <xs:annotation>
780 <xs:documentation>Whether the permissions are inheritable. The default is "yes".</xs:documentation>
781 </xs:annotation>
782 </xs:attribute>
778 <!-- Common ACLs --> 783 <!-- Common ACLs -->
779 <xs:attribute name="Read" type="YesNoType"></xs:attribute> 784 <xs:attribute name="Read" type="YesNoType"></xs:attribute>
780 <xs:attribute name="Delete" type="YesNoType"></xs:attribute> 785 <xs:attribute name="Delete" type="YesNoType"></xs:attribute>