aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.WindowsInstaller/Bind
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2020-07-05 23:08:20 -0700
committerRob Mensching <rob@firegiant.com>2020-07-08 15:18:09 -0700
commit7b583330fd42356930bdc5a28820e546f6ca45a4 (patch)
tree3166934d86ed47519bbee32bfa26529400e74ee7 /src/WixToolset.Core.WindowsInstaller/Bind
parente4d3a0d14dec69fd110394b361274de86f61afa2 (diff)
downloadwix-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.cs143
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}