diff options
| author | Rob Mensching <rob@firegiant.com> | 2020-07-05 23:08:20 -0700 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2020-07-08 15:18:09 -0700 |
| commit | 7b583330fd42356930bdc5a28820e546f6ca45a4 (patch) | |
| tree | 3166934d86ed47519bbee32bfa26529400e74ee7 /src/WixToolset.Core.WindowsInstaller/Bind | |
| parent | e4d3a0d14dec69fd110394b361274de86f61afa2 (diff) | |
| download | wix-7b583330fd42356930bdc5a28820e546f6ca45a4.tar.gz wix-7b583330fd42356930bdc5a28820e546f6ca45a4.tar.bz2 wix-7b583330fd42356930bdc5a28820e546f6ca45a4.zip | |
Move short filename generation to the WindowsInstallerBackend
Diffstat (limited to 'src/WixToolset.Core.WindowsInstaller/Bind')
| -rw-r--r-- | src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs | 143 |
1 files changed, 137 insertions, 6 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs index 5b838af8..663931b9 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs | |||
| @@ -5,7 +5,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 5 | using System; | 5 | using System; |
| 6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
| 7 | using System.Globalization; | 7 | using System.Globalization; |
| 8 | using System.IO; | ||
| 8 | using System.Linq; | 9 | using System.Linq; |
| 10 | using System.Security.Cryptography; | ||
| 11 | using System.Text; | ||
| 9 | using WixToolset.Data; | 12 | using WixToolset.Data; |
| 10 | using WixToolset.Data.Symbols; | 13 | using WixToolset.Data.Symbols; |
| 11 | using WixToolset.Data.WindowsInstaller; | 14 | using WixToolset.Data.WindowsInstaller; |
| @@ -97,6 +100,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 97 | this.AddDirectorySymbol((DirectorySymbol)symbol); | 100 | this.AddDirectorySymbol((DirectorySymbol)symbol); |
| 98 | break; | 101 | break; |
| 99 | 102 | ||
| 103 | case SymbolDefinitionType.DuplicateFile: | ||
| 104 | this.AddDuplicateFileSymbol((DuplicateFileSymbol)symbol); | ||
| 105 | break; | ||
| 106 | |||
| 100 | case SymbolDefinitionType.Environment: | 107 | case SymbolDefinitionType.Environment: |
| 101 | this.AddEnvironmentSymbol((EnvironmentSymbol)symbol); | 108 | this.AddEnvironmentSymbol((EnvironmentSymbol)symbol); |
| 102 | break; | 109 | break; |
| @@ -117,6 +124,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 117 | this.AddIniFileSymbol((IniFileSymbol)symbol); | 124 | this.AddIniFileSymbol((IniFileSymbol)symbol); |
| 118 | break; | 125 | break; |
| 119 | 126 | ||
| 127 | case SymbolDefinitionType.IniLocator: | ||
| 128 | this.AddIniLocatorSymbol((IniLocatorSymbol)symbol); | ||
| 129 | break; | ||
| 130 | |||
| 120 | case SymbolDefinitionType.Media: | 131 | case SymbolDefinitionType.Media: |
| 121 | this.AddMediaSymbol((MediaSymbol)symbol); | 132 | this.AddMediaSymbol((MediaSymbol)symbol); |
| 122 | break; | 133 | break; |
| @@ -444,6 +455,16 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 444 | 455 | ||
| 445 | private void AddDirectorySymbol(DirectorySymbol symbol) | 456 | private void AddDirectorySymbol(DirectorySymbol symbol) |
| 446 | { | 457 | { |
| 458 | if (String.IsNullOrEmpty(symbol.ShortName) && !symbol.Name.Equals(".") && !symbol.Name.Equals("SourceDir") && !Common.IsValidShortFilename(symbol.Name, false)) | ||
| 459 | { | ||
| 460 | symbol.ShortName = CreateShortName(symbol.Name, false, false, "Directory", symbol.ParentDirectoryRef); | ||
| 461 | } | ||
| 462 | |||
| 463 | if (String.IsNullOrEmpty(symbol.SourceShortName) && !String.IsNullOrEmpty(symbol.SourceName) && !Common.IsValidShortFilename(symbol.SourceName, false)) | ||
| 464 | { | ||
| 465 | symbol.SourceShortName = CreateShortName(symbol.SourceName, false, false, "Directory", symbol.ParentDirectoryRef); | ||
| 466 | } | ||
| 467 | |||
| 447 | var sourceName = GetMsiFilenameValue(symbol.SourceShortName, symbol.SourceName); | 468 | var sourceName = GetMsiFilenameValue(symbol.SourceShortName, symbol.SourceName); |
| 448 | var targetName = GetMsiFilenameValue(symbol.ShortName, symbol.Name); | 469 | var targetName = GetMsiFilenameValue(symbol.ShortName, symbol.Name); |
| 449 | 470 | ||
| @@ -460,6 +481,22 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 460 | row[2] = defaultDir; | 481 | row[2] = defaultDir; |
| 461 | } | 482 | } |
| 462 | 483 | ||
| 484 | private void AddDuplicateFileSymbol(DuplicateFileSymbol symbol) | ||
| 485 | { | ||
| 486 | var name = symbol.DestinationName; | ||
| 487 | if (null == symbol.DestinationShortName && null != name && !Common.IsValidShortFilename(name, false)) | ||
| 488 | { | ||
| 489 | symbol.DestinationShortName = CreateShortName(name, true, false, "CopyFile", symbol.ComponentRef, symbol.FileRef); | ||
| 490 | } | ||
| 491 | |||
| 492 | var row = this.CreateRow(symbol, "DuplicateFile"); | ||
| 493 | row[0] = symbol.Id.Id; | ||
| 494 | row[1] = symbol.ComponentRef; | ||
| 495 | row[2] = symbol.FileRef; | ||
| 496 | row[3] = GetMsiFilenameValue(symbol.DestinationShortName, symbol.DestinationName); | ||
| 497 | row[4] = symbol.DestinationFolder; | ||
| 498 | } | ||
| 499 | |||
| 463 | private void AddEnvironmentSymbol(EnvironmentSymbol symbol) | 500 | private void AddEnvironmentSymbol(EnvironmentSymbol symbol) |
| 464 | { | 501 | { |
| 465 | var action = String.Empty; | 502 | var action = String.Empty; |
| @@ -525,10 +562,16 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 525 | 562 | ||
| 526 | private void AddFileSymbol(FileSymbol symbol) | 563 | private void AddFileSymbol(FileSymbol symbol) |
| 527 | { | 564 | { |
| 565 | var name = symbol.Name; | ||
| 566 | if (null == symbol.ShortName && null != name && !Common.IsValidShortFilename(name, false)) | ||
| 567 | { | ||
| 568 | symbol.ShortName = CreateShortName(name, true, false, "File", symbol.DirectoryRef); | ||
| 569 | } | ||
| 570 | |||
| 528 | var row = (FileRow)this.CreateRow(symbol, "File"); | 571 | var row = (FileRow)this.CreateRow(symbol, "File"); |
| 529 | row.File = symbol.Id.Id; | 572 | row.File = symbol.Id.Id; |
| 530 | row.Component = symbol.ComponentRef; | 573 | row.Component = symbol.ComponentRef; |
| 531 | row.FileName = GetMsiFilenameValue(symbol.ShortName, symbol.Name); | 574 | row.FileName = GetMsiFilenameValue(symbol.ShortName, name); |
| 532 | row.FileSize = symbol.FileSize; | 575 | row.FileSize = symbol.FileSize; |
| 533 | row.Version = symbol.Version; | 576 | row.Version = symbol.Version; |
| 534 | row.Language = symbol.Language; | 577 | row.Language = symbol.Language; |
| @@ -564,9 +607,15 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 564 | { | 607 | { |
| 565 | var tableName = (InifFileActionType.AddLine == symbol.Action || InifFileActionType.AddTag == symbol.Action || InifFileActionType.CreateLine == symbol.Action) ? "IniFile" : "RemoveIniFile"; | 608 | var tableName = (InifFileActionType.AddLine == symbol.Action || InifFileActionType.AddTag == symbol.Action || InifFileActionType.CreateLine == symbol.Action) ? "IniFile" : "RemoveIniFile"; |
| 566 | 609 | ||
| 610 | var name = symbol.FileName; | ||
| 611 | if (null == symbol.ShortFileName && null != name && !Common.IsValidShortFilename(name, false)) | ||
| 612 | { | ||
| 613 | symbol.ShortFileName = CreateShortName(name, true, false, "IniFile", symbol.ComponentRef); | ||
| 614 | } | ||
| 615 | |||
| 567 | var row = this.CreateRow(symbol, tableName); | 616 | var row = this.CreateRow(symbol, tableName); |
| 568 | row[0] = symbol.Id.Id; | 617 | row[0] = symbol.Id.Id; |
| 569 | row[1] = symbol.FileName; | 618 | row[1] = GetMsiFilenameValue(symbol.ShortFileName, name); |
| 570 | row[2] = symbol.DirProperty; | 619 | row[2] = symbol.DirProperty; |
| 571 | row[3] = symbol.Section; | 620 | row[3] = symbol.Section; |
| 572 | row[4] = symbol.Key; | 621 | row[4] = symbol.Key; |
| @@ -575,6 +624,23 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 575 | row[7] = symbol.ComponentRef; | 624 | row[7] = symbol.ComponentRef; |
| 576 | } | 625 | } |
| 577 | 626 | ||
| 627 | private void AddIniLocatorSymbol(IniLocatorSymbol symbol) | ||
| 628 | { | ||
| 629 | var name = symbol.FileName; | ||
| 630 | if (null == symbol.ShortFileName && null != name && !Common.IsValidShortFilename(name, false)) | ||
| 631 | { | ||
| 632 | symbol.ShortFileName = CreateShortName(name, true, false, "IniFileSearch"); | ||
| 633 | } | ||
| 634 | |||
| 635 | var row = this.CreateRow(symbol, "IniLocator"); | ||
| 636 | row[0] = symbol.Id.Id; | ||
| 637 | row[1] = GetMsiFilenameValue(symbol.ShortFileName, name); | ||
| 638 | row[2] = symbol.Section; | ||
| 639 | row[3] = symbol.Key; | ||
| 640 | row[4] = symbol.Field; | ||
| 641 | row[5] = symbol.Type; | ||
| 642 | } | ||
| 643 | |||
| 578 | private void AddMediaSymbol(MediaSymbol symbol) | 644 | private void AddMediaSymbol(MediaSymbol symbol) |
| 579 | { | 645 | { |
| 580 | if (this.Section.Type != SectionType.Module) | 646 | if (this.Section.Type != SectionType.Module) |
| @@ -653,11 +719,17 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 653 | 719 | ||
| 654 | private void AddMoveFileSymbol(MoveFileSymbol symbol) | 720 | private void AddMoveFileSymbol(MoveFileSymbol symbol) |
| 655 | { | 721 | { |
| 722 | var name = symbol.DestinationName; | ||
| 723 | if (null == symbol.DestinationShortName && null != name && !Common.IsValidShortFilename(name, false)) | ||
| 724 | { | ||
| 725 | symbol.DestinationShortName = CreateShortName(name, true, false, "MoveFile", symbol.ComponentRef); | ||
| 726 | } | ||
| 727 | |||
| 656 | var row = this.CreateRow(symbol, "MoveFile"); | 728 | var row = this.CreateRow(symbol, "MoveFile"); |
| 657 | row[0] = symbol.Id.Id; | 729 | row[0] = symbol.Id.Id; |
| 658 | row[1] = symbol.ComponentRef; | 730 | row[1] = symbol.ComponentRef; |
| 659 | row[2] = symbol.SourceName; | 731 | row[2] = symbol.SourceName; |
| 660 | row[3] = symbol.DestName; | 732 | row[3] = GetMsiFilenameValue(symbol.DestinationShortName, symbol.DestinationName); |
| 661 | row[4] = symbol.SourceFolder; | 733 | row[4] = symbol.SourceFolder; |
| 662 | row[5] = symbol.DestFolder; | 734 | row[5] = symbol.DestFolder; |
| 663 | row[6] = symbol.Delete ? WindowsInstallerConstants.MsidbMoveFileOptionsMove : 0; | 735 | row[6] = symbol.Delete ? WindowsInstallerConstants.MsidbMoveFileOptionsMove : 0; |
| @@ -677,14 +749,20 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 677 | 749 | ||
| 678 | private void AddRemoveFileSymbol(RemoveFileSymbol symbol) | 750 | private void AddRemoveFileSymbol(RemoveFileSymbol symbol) |
| 679 | { | 751 | { |
| 752 | var name = symbol.FileName; | ||
| 753 | if (null == symbol.ShortFileName && null != name && !Common.IsValidShortFilename(name, false)) | ||
| 754 | { | ||
| 755 | symbol.ShortFileName = CreateShortName(name, true, false, "RemoveFile", symbol.ComponentRef); | ||
| 756 | } | ||
| 757 | |||
| 680 | var installMode = symbol.OnInstall == true ? WindowsInstallerConstants.MsidbRemoveFileInstallModeOnInstall : 0; | 758 | var installMode = symbol.OnInstall == true ? WindowsInstallerConstants.MsidbRemoveFileInstallModeOnInstall : 0; |
| 681 | installMode |= symbol.OnUninstall == true ? WindowsInstallerConstants.MsidbRemoveFileInstallModeOnRemove : 0; | 759 | installMode |= symbol.OnUninstall == true ? WindowsInstallerConstants.MsidbRemoveFileInstallModeOnRemove : 0; |
| 682 | 760 | ||
| 683 | var row = this.CreateRow(symbol, "RemoveFile"); | 761 | var row = this.CreateRow(symbol, "RemoveFile"); |
| 684 | row[0] = symbol.Id.Id; | 762 | row[0] = symbol.Id.Id; |
| 685 | row[1] = symbol.ComponentRef; | 763 | row[1] = symbol.ComponentRef; |
| 686 | row[2] = symbol.FileName; | 764 | row[2] = GetMsiFilenameValue(symbol.ShortFileName, symbol.FileName); |
| 687 | row[3] = symbol.DirProperty; | 765 | row[3] = symbol.DirPropertyRef; |
| 688 | row[4] = installMode; | 766 | row[4] = installMode; |
| 689 | } | 767 | } |
| 690 | 768 | ||
| @@ -821,10 +899,16 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 821 | 899 | ||
| 822 | private void AddShortcutSymbol(ShortcutSymbol symbol) | 900 | private void AddShortcutSymbol(ShortcutSymbol symbol) |
| 823 | { | 901 | { |
| 902 | var name = symbol.Name; | ||
| 903 | if (null == symbol.ShortName && null != name && !Common.IsValidShortFilename(name, false)) | ||
| 904 | { | ||
| 905 | symbol.ShortName = CreateShortName(name, true, false, "Shortcut", symbol.ComponentRef, symbol.DirectoryRef); | ||
| 906 | } | ||
| 907 | |||
| 824 | var row = this.CreateRow(symbol, "Shortcut"); | 908 | var row = this.CreateRow(symbol, "Shortcut"); |
| 825 | row[0] = symbol.Id.Id; | 909 | row[0] = symbol.Id.Id; |
| 826 | row[1] = symbol.DirectoryRef; | 910 | row[1] = symbol.DirectoryRef; |
| 827 | row[2] = GetMsiFilenameValue(symbol.ShortName, symbol.Name); | 911 | row[2] = GetMsiFilenameValue(symbol.ShortName, name); |
| 828 | row[3] = symbol.ComponentRef; | 912 | row[3] = symbol.ComponentRef; |
| 829 | row[4] = symbol.Target; | 913 | row[4] = symbol.Target; |
| 830 | row[5] = symbol.Arguments; | 914 | row[5] = symbol.Arguments; |
| @@ -1117,5 +1201,52 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 1117 | return shortName + "|" + longName; | 1201 | return shortName + "|" + longName; |
| 1118 | } | 1202 | } |
| 1119 | } | 1203 | } |
| 1204 | |||
| 1205 | private static string CreateShortName(string longName, bool keepExtension, bool allowWildcards, params string[] args) | ||
| 1206 | { | ||
| 1207 | longName = longName.ToLowerInvariant(); | ||
| 1208 | |||
| 1209 | // collect all the data | ||
| 1210 | var strings = new List<string>(1 + args.Length); | ||
| 1211 | strings.Add(longName); | ||
| 1212 | strings.AddRange(args); | ||
| 1213 | |||
| 1214 | // prepare for hashing | ||
| 1215 | var stringData = String.Join("|", strings); | ||
| 1216 | var data = Encoding.UTF8.GetBytes(stringData); | ||
| 1217 | |||
| 1218 | // hash the data | ||
| 1219 | byte[] hash; | ||
| 1220 | using (var sha1 = new SHA1CryptoServiceProvider()) | ||
| 1221 | { | ||
| 1222 | hash = sha1.ComputeHash(data); | ||
| 1223 | } | ||
| 1224 | |||
| 1225 | // generate the short file/directory name without an extension | ||
| 1226 | var shortName = new StringBuilder(Convert.ToBase64String(hash)); | ||
| 1227 | shortName.Length = 8; | ||
| 1228 | shortName.Replace('+', '-').Replace('/', '_'); | ||
| 1229 | |||
| 1230 | if (keepExtension) | ||
| 1231 | { | ||
| 1232 | var extension = Path.GetExtension(longName); | ||
| 1233 | |||
| 1234 | if (4 < extension.Length) | ||
| 1235 | { | ||
| 1236 | extension = extension.Substring(0, 4); | ||
| 1237 | } | ||
| 1238 | |||
| 1239 | shortName.Append(extension); | ||
| 1240 | |||
| 1241 | // check the generated short name to ensure its still legal (the extension may not be legal) | ||
| 1242 | if (!Common.IsValidShortFilename(shortName.ToString(), allowWildcards)) | ||
| 1243 | { | ||
| 1244 | // remove the extension (by truncating the generated file name back to the generated characters) | ||
| 1245 | shortName.Length -= extension.Length; | ||
| 1246 | } | ||
| 1247 | } | ||
| 1248 | |||
| 1249 | return shortName.ToString().ToLowerInvariant(); | ||
| 1250 | } | ||
| 1120 | } | 1251 | } |
| 1121 | } | 1252 | } |
