From 8805584cbe7233d9e469f9b52c61f8e8baf3b072 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 10 Mar 2017 11:13:26 -0700 Subject: [PATCH 01/56] updated sql code - added upgrade script to bring db version up to 2.6 - refactored db upgrade code to a new class - resolved an issue with db column naming for one of the new features - updated new sql db creation script --- .../Config/Connections/ConnectionsLoader.cs | 4 +- .../Config/Connections/ConnectionsSaver.cs | 80 +-------- .../Serializers/DataTableDeserializer.cs | 6 +- .../Config/Serializers/DataTableSerializer.cs | 30 ++-- .../Serializers/SqlDatabaseVersionVerifier.cs | 158 ++++++++++++++++++ mRemoteV1/Resources/Help/SQLScript.txt | 6 + mRemoteV1/mRemoteV1.csproj | 1 + 7 files changed, 190 insertions(+), 95 deletions(-) create mode 100644 mRemoteV1/Config/Serializers/SqlDatabaseVersionVerifier.cs diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index 11cbad67..b6923824 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -23,7 +23,9 @@ namespace mRemoteNG.Config.Connections { var connector = new SqlDatabaseConnector(); var dataProvider = new SqlDataProvider(connector); - var dataTable = dataProvider.Load(); + var databaseVersionVerifier = new SqlDatabaseVersionVerifier(connector); + databaseVersionVerifier.VerifyDatabaseVersion(); + var dataTable = dataProvider.Load(); deserializer = new DataTableDeserializer(dataTable); } else diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 0059ca1b..012ab9a9 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -85,8 +85,9 @@ namespace mRemoteNG.Config.Connections { var sqlConnector = new SqlDatabaseConnector(); sqlConnector.Connect(); + var databaseVersionVerifier = new SqlDatabaseVersionVerifier(sqlConnector); - if (!VerifyDatabaseVersion(sqlConnector)) + if (!databaseVersionVerifier.VerifyDatabaseVersion()) { Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strErrorConnectionListSaveFailed); return; @@ -102,83 +103,6 @@ namespace mRemoteNG.Config.Connections sqlConnector.Dispose(); } - private bool VerifyDatabaseVersion(SqlDatabaseConnector sqlDatabaseConnector) - { - var isVerified = false; - try - { - var databaseVersion = GetDatabaseVersion(sqlDatabaseConnector); - SqlCommand sqlCommand; - - if (databaseVersion.Equals(new Version())) - { - return true; - } - - if (databaseVersion.CompareTo(new Version(2, 2)) == 0) // 2.2 - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.3."); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, EnableDesktopComposition bit NOT NULL DEFAULT 0, InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;", sqlDatabaseConnector.SqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 3); - } - - if (databaseVersion.CompareTo(new Version(2, 3)) == 0) // 2.3 - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.4."); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD UseCredSsp bit NOT NULL DEFAULT 1, InheritUseCredSsp bit NOT NULL DEFAULT 0;", sqlDatabaseConnector.SqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 4); - } - - if (databaseVersion.CompareTo(new Version(2, 4)) == 0) // 2.4 - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.5."); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlDatabaseConnector.SqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 5); - } - - if (databaseVersion.CompareTo(new Version(2, 5)) == 0) // 2.5 - isVerified = true; - - if (isVerified == false) - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strErrorBadDatabaseVersion, databaseVersion, GeneralAppInfo.ProductName)); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, string.Format(Language.strErrorVerifyDatabaseVersionFailed, ex.Message)); - } - return isVerified; - } - - private Version GetDatabaseVersion(SqlDatabaseConnector sqlDatabaseConnector) - { - Version databaseVersion; - SqlDataReader sqlDataReader = null; - try - { - var sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlDatabaseConnector.SqlConnection); - sqlDataReader = sqlCommand.ExecuteReader(); - if (!sqlDataReader.HasRows) - return new Version(); // assume new empty database - else - sqlDataReader.Read(); - databaseVersion = new Version(Convert.ToString(sqlDataReader["confVersion"], CultureInfo.InvariantCulture)); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, $"Retrieving database version failed. {ex}"); - throw; - } - finally - { - if (sqlDataReader != null && !sqlDataReader.IsClosed) - sqlDataReader.Close(); - } - return databaseVersion; - } - private void UpdateRootNodeTable(RootNodeInfo rootTreeNode, SqlDatabaseConnector sqlDatabaseConnector) { var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); diff --git a/mRemoteV1/Config/Serializers/DataTableDeserializer.cs b/mRemoteV1/Config/Serializers/DataTableDeserializer.cs index 86098c62..5b6b4888 100644 --- a/mRemoteV1/Config/Serializers/DataTableDeserializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableDeserializer.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; +using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.Http; @@ -33,6 +34,7 @@ namespace mRemoteNG.Config.Serializers { var connectionList = CreateNodesFromTable(); var connectionTreeModel = CreateNodeHierarchy(connectionList); + Runtime.IsConnectionsFileLoaded = true; return connectionTreeModel; } @@ -155,8 +157,8 @@ namespace mRemoteNG.Config.Serializers connectionInfo.Inheritance.Username = (bool)dataRow["InheritUsername"]; connectionInfo.Inheritance.ICAEncryptionStrength = (bool)dataRow["InheritICAEncryptionStrength"]; connectionInfo.Inheritance.RDPAuthenticationLevel = (bool)dataRow["InheritRDPAuthenticationLevel"]; - connectionInfo.Inheritance.RDPAlertIdleTimeout = (bool)dataRow["RDPAlertIdleTimeout"]; - connectionInfo.Inheritance.RDPMinutesToIdleTimeout = (bool)dataRow["RDPMinutesToIdleTimeout"]; + connectionInfo.Inheritance.RDPAlertIdleTimeout = (bool)dataRow["InheritRDPAlertIdleTimeout"]; + connectionInfo.Inheritance.RDPMinutesToIdleTimeout = (bool)dataRow["InheritRDPMinutesToIdleTimeout"]; connectionInfo.Inheritance.LoadBalanceInfo = (bool)dataRow["InheritLoadBalanceInfo"]; connectionInfo.Inheritance.PreExtApp = (bool)dataRow["InheritPreExtApp"]; connectionInfo.Inheritance.PostExtApp = (bool)dataRow["InheritPostExtApp"]; diff --git a/mRemoteV1/Config/Serializers/DataTableSerializer.cs b/mRemoteV1/Config/Serializers/DataTableSerializer.cs index 0e2daefa..22a1ceb8 100644 --- a/mRemoteV1/Config/Serializers/DataTableSerializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableSerializer.cs @@ -41,6 +41,7 @@ namespace mRemoteNG.Config.Serializers private void CreateSchema() { + // Note: these columns must be defined in the same order that they exist in the DB _dataTable.Columns.Add("ID", typeof(int)); _dataTable.Columns[0].AutoIncrement = true; _dataTable.Columns.Add("ConstantID", typeof(string)); @@ -65,8 +66,6 @@ namespace mRemoteNG.Config.Serializers _dataTable.Columns.Add("RenderingEngine", typeof(string)); _dataTable.Columns.Add("ICAEncryptionStrength", typeof(string)); _dataTable.Columns.Add("RDPAuthenticationLevel", typeof(string)); - _dataTable.Columns.Add("RDPMinutesToIdleTimeout", typeof(int)); - _dataTable.Columns.Add("RDPAlertIdleTimeout", typeof(bool)); _dataTable.Columns.Add("Colors", typeof(string)); _dataTable.Columns.Add("Resolution", typeof(string)); _dataTable.Columns.Add("DisplayWallpaper", typeof(bool)); @@ -123,15 +122,12 @@ namespace mRemoteNG.Config.Serializers _dataTable.Columns.Add("InheritRedirectPrinters", typeof(bool)); _dataTable.Columns.Add("InheritRedirectSmartCards", typeof(bool)); _dataTable.Columns.Add("InheritRedirectSound", typeof(bool)); - _dataTable.Columns.Add("InheritSoundQuality", typeof(bool)); _dataTable.Columns.Add("InheritResolution", typeof(bool)); _dataTable.Columns.Add("InheritUseConsoleSession", typeof(bool)); _dataTable.Columns.Add("InheritUseCredSsp", typeof(bool)); _dataTable.Columns.Add("InheritRenderingEngine", typeof(bool)); _dataTable.Columns.Add("InheritICAEncryptionStrength", typeof(bool)); _dataTable.Columns.Add("InheritRDPAuthenticationLevel", typeof(bool)); - _dataTable.Columns.Add("InheritRDPMinutesToIdleTimeout", typeof(bool)); - _dataTable.Columns.Add("InheritRDPAlertIdleTimeout", typeof(bool)); _dataTable.Columns.Add("InheritUsername", typeof(bool)); _dataTable.Columns.Add("InheritPreExtApp", typeof(bool)); _dataTable.Columns.Add("InheritPostExtApp", typeof(bool)); @@ -159,6 +155,12 @@ namespace mRemoteNG.Config.Serializers _dataTable.Columns.Add("AutomaticResize", typeof(bool)); _dataTable.Columns.Add("InheritLoadBalanceInfo", typeof(bool)); _dataTable.Columns.Add("InheritAutomaticResize", typeof(bool)); + _dataTable.Columns.Add("RDPMinutesToIdleTimeout", typeof(int)); + _dataTable.Columns.Add("RDPAlertIdleTimeout", typeof(bool)); + _dataTable.Columns.Add("SoundQuality", typeof(string)); + _dataTable.Columns.Add("InheritRDPMinutesToIdleTimeout", typeof(bool)); + _dataTable.Columns.Add("InheritRDPAlertIdleTimeout", typeof(bool)); + _dataTable.Columns.Add("InheritSoundQuality", typeof(bool)); } private void SetPrimaryKey() @@ -204,8 +206,8 @@ namespace mRemoteNG.Config.Serializers dataRow["RenderingEngine"] = connectionInfo.RenderingEngine; dataRow["ICAEncryptionStrength"] = connectionInfo.ICAEncryptionStrength; dataRow["RDPAuthenticationLevel"] = connectionInfo.RDPAuthenticationLevel; - //dataRow["RDPMinutesToIdleTimeout"] = connectionInfo.RDPMinutesToIdleTimeout; - //dataRow["RDPAlertIdleTimeout"] = connectionInfo.RDPAlertIdleTimeout; + dataRow["RDPMinutesToIdleTimeout"] = connectionInfo.RDPMinutesToIdleTimeout; + dataRow["RDPAlertIdleTimeout"] = connectionInfo.RDPAlertIdleTimeout; dataRow["LoadBalanceInfo"] = connectionInfo.LoadBalanceInfo; dataRow["Colors"] = connectionInfo.Colors; dataRow["Resolution"] = connectionInfo.Resolution; @@ -220,7 +222,7 @@ namespace mRemoteNG.Config.Serializers dataRow["RedirectPrinters"] = connectionInfo.RedirectPrinters; dataRow["RedirectSmartCards"] = connectionInfo.RedirectSmartCards; dataRow["RedirectSound"] = connectionInfo.RedirectSound; - //dataRow["SoundQuality"] = connectionInfo.SoundQuality; + dataRow["SoundQuality"] = connectionInfo.SoundQuality; dataRow["RedirectKeys"] = connectionInfo.RedirectKeys; dataRow["Connected"] = connectionInfo.OpenConnections.Count > 0; dataRow["PreExtApp"] = connectionInfo.PreExtApp; @@ -267,7 +269,7 @@ namespace mRemoteNG.Config.Serializers dataRow["InheritRedirectPrinters"] = connectionInfo.Inheritance.RedirectPrinters; dataRow["InheritRedirectSmartCards"] = connectionInfo.Inheritance.RedirectSmartCards; dataRow["InheritRedirectSound"] = connectionInfo.Inheritance.RedirectSound; - //dataRow["InheritSoundQuality"] = connectionInfo.Inheritance.SoundQuality; + dataRow["InheritSoundQuality"] = connectionInfo.Inheritance.SoundQuality; dataRow["InheritResolution"] = connectionInfo.Inheritance.Resolution; dataRow["InheritAutomaticResize"] = connectionInfo.Inheritance.AutomaticResize; dataRow["InheritUseConsoleSession"] = connectionInfo.Inheritance.UseConsoleSession; @@ -276,8 +278,8 @@ namespace mRemoteNG.Config.Serializers dataRow["InheritUsername"] = connectionInfo.Inheritance.Username; dataRow["InheritICAEncryptionStrength"] = connectionInfo.Inheritance.ICAEncryptionStrength; dataRow["InheritRDPAuthenticationLevel"] = connectionInfo.Inheritance.RDPAuthenticationLevel; - //dataRow["InheritRDPMinutesToIdleTimeout"] = connectionInfo.Inheritance.RDPMinutesToIdleTimeout; - //dataRow["InheritRDPAlertIdleTimeout"] = connectionInfo.Inheritance.RDPAlertIdleTimeout; + dataRow["InheritRDPMinutesToIdleTimeout"] = connectionInfo.Inheritance.RDPMinutesToIdleTimeout; + dataRow["InheritRDPAlertIdleTimeout"] = connectionInfo.Inheritance.RDPAlertIdleTimeout; dataRow["InheritLoadBalanceInfo"] = connectionInfo.Inheritance.LoadBalanceInfo; dataRow["InheritPreExtApp"] = connectionInfo.Inheritance.PreExtApp; dataRow["InheritPostExtApp"] = connectionInfo.Inheritance.PostExtApp; @@ -324,7 +326,7 @@ namespace mRemoteNG.Config.Serializers dataRow["InheritRedirectPrinters"] = false; dataRow["InheritRedirectSmartCards"] = false; dataRow["InheritRedirectSound"] = false; - //dataRow["InheritSoundQuality"] = false; + dataRow["InheritSoundQuality"] = false; dataRow["InheritResolution"] = false; dataRow["InheritAutomaticResize"] = false; dataRow["InheritUseConsoleSession"] = false; @@ -333,8 +335,8 @@ namespace mRemoteNG.Config.Serializers dataRow["InheritUsername"] = false; dataRow["InheritICAEncryptionStrength"] = false; dataRow["InheritRDPAuthenticationLevel"] = false; - //dataRow["InheritRDPMinutesToIdleTimeout"] = false; - //dataRow["InheritRDPAlertIdleTimeout"] = false; + dataRow["InheritRDPMinutesToIdleTimeout"] = false; + dataRow["InheritRDPAlertIdleTimeout"] = false; dataRow["InheritLoadBalanceInfo"] = false; dataRow["InheritPreExtApp"] = false; dataRow["InheritPostExtApp"] = false; diff --git a/mRemoteV1/Config/Serializers/SqlDatabaseVersionVerifier.cs b/mRemoteV1/Config/Serializers/SqlDatabaseVersionVerifier.cs new file mode 100644 index 00000000..8decd635 --- /dev/null +++ b/mRemoteV1/Config/Serializers/SqlDatabaseVersionVerifier.cs @@ -0,0 +1,158 @@ +using System; +using System.Data.SqlClient; +using System.Globalization; +using mRemoteNG.App; +using mRemoteNG.App.Info; +using mRemoteNG.Config.DatabaseConnectors; +using mRemoteNG.Messages; + +namespace mRemoteNG.Config.Serializers +{ + public class SqlDatabaseVersionVerifier + { + private readonly SqlDatabaseConnector _sqlDatabaseConnector; + + public SqlDatabaseVersionVerifier(SqlDatabaseConnector sqlDatabaseConnector) + { + if (sqlDatabaseConnector == null) + throw new ArgumentNullException(nameof(sqlDatabaseConnector)); + + _sqlDatabaseConnector = sqlDatabaseConnector; + } + + public bool VerifyDatabaseVersion() + { + var isVerified = false; + try + { + var databaseVersion = GetDatabaseVersion(_sqlDatabaseConnector); + + if (databaseVersion.Equals(new Version())) + { + return true; + } + + if (databaseVersion.CompareTo(new Version(2, 2)) == 0) // 2.2 + { + UpgradeFrom2_2(); + databaseVersion = new Version(2, 3); + } + + if (databaseVersion.CompareTo(new Version(2, 3)) == 0) // 2.3 + { + UpgradeFrom2_3(); + databaseVersion = new Version(2, 4); + } + + if (databaseVersion.CompareTo(new Version(2, 4)) == 0) // 2.4 + { + UpgradeFrom2_4(); + databaseVersion = new Version(2, 5); + } + + if (databaseVersion.CompareTo(new Version(2, 5)) == 0) // 2.5 + { + UpgradeFrom2_5(); + databaseVersion = new Version(2, 6); + } + + if (databaseVersion.CompareTo(new Version(2, 6)) == 0) // 2.6 + isVerified = true; + + if (isVerified == false) + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, + string.Format(Language.strErrorBadDatabaseVersion, databaseVersion, GeneralAppInfo.ProductName)); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, + string.Format(Language.strErrorVerifyDatabaseVersionFailed, ex.Message)); + } + return isVerified; + } + + private Version GetDatabaseVersion(SqlDatabaseConnector sqlDatabaseConnector) + { + Version databaseVersion; + SqlDataReader sqlDataReader = null; + try + { + var sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlDatabaseConnector.SqlConnection); + if (!sqlDatabaseConnector.IsConnected) + sqlDatabaseConnector.Connect(); + sqlDataReader = sqlCommand.ExecuteReader(); + if (!sqlDataReader.HasRows) + return new Version(); // assume new empty database + else + sqlDataReader.Read(); + databaseVersion = + new Version(Convert.ToString(sqlDataReader["confVersion"], CultureInfo.InvariantCulture)); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, $"Retrieving database version failed. {ex}"); + throw; + } + finally + { + if (sqlDataReader != null && !sqlDataReader.IsClosed) + sqlDataReader.Close(); + } + return databaseVersion; + } + + private void UpgradeFrom2_2() + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Upgrading database from version 2.2 to version 2.3."); + const string sqlText = @" +ALTER TABLE tblCons +ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, + EnableDesktopComposition bit NOT NULL DEFAULT 0, + InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, + InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;"; + var sqlCommand = new SqlCommand(sqlText, _sqlDatabaseConnector.SqlConnection); + sqlCommand.ExecuteNonQuery(); + } + + private void UpgradeFrom2_3() + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Upgrading database from version 2.3 to version 2.4."); + const string sqlText = @" +ALTER TABLE tblCons +ADD UseCredSsp bit NOT NULL DEFAULT 1, + InheritUseCredSsp bit NOT NULL DEFAULT 0;"; + var sqlCommand = new SqlCommand(sqlText, _sqlDatabaseConnector.SqlConnection); + sqlCommand.ExecuteNonQuery(); + } + + private void UpgradeFrom2_4() + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Upgrading database from version 2.4 to version 2.5."); + const string sqlText = @" +ALTER TABLE tblCons +ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + AutomaticResize bit NOT NULL DEFAULT 1, + InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, + InheritAutomaticResize bit NOT NULL DEFAULT 0;"; + var sqlCommand = new SqlCommand(sqlText, _sqlDatabaseConnector.SqlConnection); + sqlCommand.ExecuteNonQuery(); + } + + private void UpgradeFrom2_5() + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Upgrading database from version 2.5 to version 2.6."); + const string sqlText = @" +ALTER TABLE tblCons +ADD RDPMinutesToIdleTimeout int NOT NULL DEFAULT 0, + RDPAlertIdleTimeout bit NOT NULL DEFAULT 0, + SoundQuality varchar (20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL DEFAULT 'Dynamic', + InheritRDPMinutesToIdleTimeout bit NOT NULL DEFAULT 0, + InheritRDPAlertIdleTimeout bit NOT NULL DEFAULT 0, + InheritSoundQuality bit NOT NULL DEFAULT 0; +UPDATE tblRoot + SET ConfVersion='2.6'"; + var sqlCommand = new SqlCommand(sqlText, _sqlDatabaseConnector.SqlConnection); + sqlCommand.ExecuteNonQuery(); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Resources/Help/SQLScript.txt b/mRemoteV1/Resources/Help/SQLScript.txt index a7059956..49ba0933 100644 --- a/mRemoteV1/Resources/Help/SQLScript.txt +++ b/mRemoteV1/Resources/Help/SQLScript.txt @@ -34,6 +34,8 @@ CREATE TABLE [dbo].[tblCons] ( [RenderingEngine] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [ICAEncryptionStrength] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [RDPAuthenticationLevel] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , + [RDPMinutesToIdleTimeout] [int] NOT NULL, + [RDPAlertIdleTimeout] [bit] NOT NULL, [Colors] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Resolution] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [DisplayWallpaper] [bit] NOT NULL , @@ -46,6 +48,7 @@ CREATE TABLE [dbo].[tblCons] ( [RedirectPrinters] [bit] NOT NULL , [RedirectSmartCards] [bit] NOT NULL , [RedirectSound] [varchar] (64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , + [SoundQuality] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [RedirectKeys] [bit] NOT NULL , [Connected] [bit] NOT NULL , [PreExtApp] [varchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , @@ -90,12 +93,15 @@ CREATE TABLE [dbo].[tblCons] ( [InheritRedirectPrinters] [bit] NOT NULL , [InheritRedirectSmartCards] [bit] NOT NULL , [InheritRedirectSound] [bit] NOT NULL , + [InheritSoundQuality] [bit] NOT NULL, [InheritResolution] [bit] NOT NULL , [InheritUseConsoleSession] [bit] NOT NULL , [InheritUseCredSsp] [bit] NOT NULL , [InheritRenderingEngine] [bit] NOT NULL , [InheritICAEncryptionStrength] [bit] NOT NULL , [InheritRDPAuthenticationLevel] [bit] NOT NULL , + [InheritRDPMinutesToIdleTimeout] [bit] NOT NULL, + [InheritRDPAlertIdleTimeout] [bit] NOT NULL, [InheritUsername] [bit] NOT NULL , [InheritPreExtApp] [bit] NOT NULL , [InheritPostExtApp] [bit] NOT NULL , diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index fb3569c3..a88dc38e 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -213,6 +213,7 @@ + From 3eb96ef7653c0960c25f8d483c0acad2bf389e50 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 10 Mar 2017 11:40:20 -0700 Subject: [PATCH 02/56] set changelog and bumped patch version --- CHANGELOG.TXT | 8 ++++++++ mRemoteV1/Properties/AssemblyInfo.cs | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index 558cb946..20e482b0 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -1,3 +1,11 @@ +1.75.7001 (2017-03-10): + +Fixes: +------ +#408: Update SQL scripts +#448: Resolved issue with SQL saving + + 1.75 hotfix 1 (2017-03-06): General Changes: diff --git a/mRemoteV1/Properties/AssemblyInfo.cs b/mRemoteV1/Properties/AssemblyInfo.cs index 78163846..7f655014 100644 --- a/mRemoteV1/Properties/AssemblyInfo.cs +++ b/mRemoteV1/Properties/AssemblyInfo.cs @@ -33,7 +33,7 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // -[assembly: AssemblyVersion("1.75.7000.*")] +[assembly: AssemblyVersion("1.75.7001.*")] [assembly:NeutralResourcesLanguageAttribute("en")] From b28775c2c6074a217a23a3303237e0d9a58b9aec Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 10 Mar 2017 14:18:55 -0700 Subject: [PATCH 03/56] made sqlbulkcopy column-position independant --- mRemoteV1/Config/DataProviders/SqlDataProvider.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs index 26d81e5e..5f6096e2 100644 --- a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs @@ -33,9 +33,13 @@ namespace mRemoteNG.Config.DataProviders { if (!SqlDatabaseConnector.IsConnected) OpenConnection(); - var sqlBulkCopy = new SqlBulkCopy(SqlDatabaseConnector.SqlConnection) {DestinationTableName = "dbo.tblCons"}; - sqlBulkCopy.WriteToServer(dataTable); - sqlBulkCopy.Close(); + using (var sqlBulkCopy = new SqlBulkCopy(SqlDatabaseConnector.SqlConnection)) + { + foreach (DataColumn col in dataTable.Columns) + sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); + sqlBulkCopy.DestinationTableName = "dbo.tblCons"; + sqlBulkCopy.WriteToServer(dataTable); + } } public void OpenConnection() From 8152a875145463565964f82d71677e039a42e2c9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 10 Mar 2017 14:20:23 -0700 Subject: [PATCH 04/56] bumped patch version --- CHANGELOG.TXT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index 20e482b0..0ba9c7b6 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -1,4 +1,4 @@ -1.75.7001 (2017-03-10): +1.75.7002 (2017-03-10): Fixes: ------ From 9e26ea186603a2b115d561060530282946a1dd47 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 10 Mar 2017 14:26:35 -0700 Subject: [PATCH 05/56] bumped assembly version --- mRemoteV1/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Properties/AssemblyInfo.cs b/mRemoteV1/Properties/AssemblyInfo.cs index 7f655014..6c920583 100644 --- a/mRemoteV1/Properties/AssemblyInfo.cs +++ b/mRemoteV1/Properties/AssemblyInfo.cs @@ -33,7 +33,7 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // -[assembly: AssemblyVersion("1.75.7001.*")] +[assembly: AssemblyVersion("1.75.7002.*")] [assembly:NeutralResourcesLanguageAttribute("en")] From 3943b8753fcd439c7c42af1df2528f0a60b6830e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 10 Mar 2017 14:41:14 -0700 Subject: [PATCH 06/56] split releases --- CHANGELOG.TXT | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index 0ba9c7b6..58ffd168 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -2,10 +2,16 @@ Fixes: ------ -#408: Update SQL scripts #448: Resolved issue with SQL saving +1.75.7001 (2017-03-10): + +Fixes: +------ +#408: Update SQL scripts + + 1.75 hotfix 1 (2017-03-06): General Changes: From ebfb3dd31e485833c808a8ac5c3baaea0892ef2a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 17 Mar 2017 16:01:50 -0600 Subject: [PATCH 07/56] added a build config for the installer --- mRemoteV1.sln | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mRemoteV1.sln b/mRemoteV1.sln index 5ebe3242..2f7df444 100644 --- a/mRemoteV1.sln +++ b/mRemoteV1.sln @@ -20,6 +20,7 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug Portable|x86 = Debug Portable|x86 Debug|x86 = Debug|x86 + Release Installer|x86 = Release Installer|x86 Release Portable|x86 = Release Portable|x86 Release|x86 = Release|x86 EndGlobalSection @@ -28,6 +29,8 @@ Global {4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x86.Build.0 = Debug Portable|x86 {4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x86.ActiveCfg = Debug|x86 {4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x86.Build.0 = Debug|x86 + {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x86.ActiveCfg = Release|x86 + {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x86.Build.0 = Release|x86 {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x86.ActiveCfg = Release Portable|x86 {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x86.Build.0 = Release Portable|x86 {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x86.ActiveCfg = Release|x86 @@ -36,6 +39,8 @@ Global {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.Build.0 = Debug Portable|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.ActiveCfg = Debug|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.Build.0 = Debug|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.ActiveCfg = Release|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.Build.0 = Release|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.ActiveCfg = Release Portable|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.Build.0 = Release Portable|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x86.ActiveCfg = Release|x86 @@ -43,11 +48,14 @@ Global {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|x86.ActiveCfg = Debug|x86 {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|x86.ActiveCfg = Debug|x86 {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|x86.Build.0 = Debug|x86 + {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x86.ActiveCfg = Release|x86 + {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x86.Build.0 = Release|x86 {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Portable|x86.ActiveCfg = Release|x86 {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|x86.ActiveCfg = Release|x86 - {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|x86.Build.0 = Release|x86 {F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|x86.ActiveCfg = Debug Portable|x86 {F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug|x86.ActiveCfg = Debug|x86 + {F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x86.ActiveCfg = Release|x86 + {F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x86.Build.0 = Release|x86 {F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Portable|x86.ActiveCfg = Release Portable|x86 {F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release|x86.ActiveCfg = Release|x86 EndGlobalSection From 0958cdaa2d86cef6b7a5cebe2afee68ff1d48db8 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 17 Mar 2017 16:13:12 -0600 Subject: [PATCH 08/56] ensure paths are quoted --- InstallerProjects/Installer/Installer.wixproj | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/InstallerProjects/Installer/Installer.wixproj b/InstallerProjects/Installer/Installer.wixproj index f5f28af7..d685da0c 100644 --- a/InstallerProjects/Installer/Installer.wixproj +++ b/InstallerProjects/Installer/Installer.wixproj @@ -114,22 +114,6 @@ HarvestPath=$(SolutionDir)mRemoteV1\bin\Release Portable;HelpFilesHarvestPath=$(SolutionDir)mRemoteV1\Resources\Help - - set /p buildenv=<buildenv.tmp - -REM Sign MSI -IF EXIST C:\mRemoteNG_code_signing_cert.pfx ( - IF %25buildenv: Portable=%25==Release ( - powershell "&""$(SolutionDir)Tools\signfiles.ps1""" %27%25cd%25%27 - ) -) - -REM Rename MSI to include version number -powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_with_version.ps1" $(SolutionDir) - -REM Copy MSI to Release folder -IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" $(TargetDir) $(SolutionDir)Release) - REM Clean the TargetDir rmdir /S /Q "$(TargetDir)" @@ -142,4 +126,20 @@ call "$(WIX)bin\heat.exe" dir "$(SolutionDir)mRemoteV1\bin\$(Configuration)" -ag REM Convert the license file "COPYING.TXT" to "License.rtf" to be shown in the installer GUI call "$(ProjectDir)Resources\Pandoc\pandoc.exe" -s -t rtf -o "$(ProjectDir)\Resources\License.rtf" "$(SolutionDir)COPYING.TXT" + + set /p buildenv=<buildenv.tmp + +REM Sign MSI +IF EXIST C:\mRemoteNG_code_signing_cert.pfx ( + IF %25buildenv: Portable=%25==Release ( + powershell -File "$(SolutionDir)Tools\signfiles.ps1" -PathToSignableFiles %27%25cd%25%27 + ) +) + +REM Rename MSI to include version number +powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_with_version.ps1" "$(SolutionDir)" + +REM Copy MSI to Release folder +IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" "$(TargetDir)" "$(SolutionDir)Release)" + \ No newline at end of file From a8cdfb56f3b69aa681a08c12f98bff64a1014c9a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 17 Mar 2017 16:18:20 -0600 Subject: [PATCH 09/56] single quote might be safer --- InstallerProjects/Installer/Installer.wixproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InstallerProjects/Installer/Installer.wixproj b/InstallerProjects/Installer/Installer.wixproj index d685da0c..9d3dec61 100644 --- a/InstallerProjects/Installer/Installer.wixproj +++ b/InstallerProjects/Installer/Installer.wixproj @@ -137,9 +137,9 @@ IF EXIST C:\mRemoteNG_code_signing_cert.pfx ( ) REM Rename MSI to include version number -powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_with_version.ps1" "$(SolutionDir)" +powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_with_version.ps1" %27$(SolutionDir)%27 REM Copy MSI to Release folder -IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" "$(TargetDir)" "$(SolutionDir)Release)" +IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" %27$(TargetDir)%27 %27$(SolutionDir)Release)%27 \ No newline at end of file From 1d993404259ce91d423cc8a9a507430dd503f4c4 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 17 Mar 2017 16:33:27 -0600 Subject: [PATCH 10/56] remove quoting --- InstallerProjects/Installer/Installer.wixproj | 6 +++--- Tools/copy_release_installer.ps1 | 21 ++++++++++++------- Tools/rename_installer_with_version.ps1 | 14 ++++++++----- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/InstallerProjects/Installer/Installer.wixproj b/InstallerProjects/Installer/Installer.wixproj index 9d3dec61..ec8ef841 100644 --- a/InstallerProjects/Installer/Installer.wixproj +++ b/InstallerProjects/Installer/Installer.wixproj @@ -132,14 +132,14 @@ call "$(ProjectDir)Resources\Pandoc\pandoc.exe" -s -t rtf -o "$(ProjectDir)\Reso REM Sign MSI IF EXIST C:\mRemoteNG_code_signing_cert.pfx ( IF %25buildenv: Portable=%25==Release ( - powershell -File "$(SolutionDir)Tools\signfiles.ps1" -PathToSignableFiles %27%25cd%25%27 + powershell -File "$(SolutionDir)Tools\signfiles.ps1" -PathToSignableFiles %25cd%25 ) ) REM Rename MSI to include version number -powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_with_version.ps1" %27$(SolutionDir)%27 +powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_with_version.ps1" -SolutionDir $(SolutionDir) REM Copy MSI to Release folder -IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" %27$(TargetDir)%27 %27$(SolutionDir)Release)%27 +IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" -SourcePath $(TargetDir) -DestinationDir $(SolutionDir)Release) \ No newline at end of file diff --git a/Tools/copy_release_installer.ps1 b/Tools/copy_release_installer.ps1 index 67797c06..c7160870 100644 --- a/Tools/copy_release_installer.ps1 +++ b/Tools/copy_release_installer.ps1 @@ -1,16 +1,21 @@ -$sourcePath = $args[0] -$destinationDir = $args[1] +param ( + [string] + $SourcePath, -Write-Host $sourcePath -Write-Host $destinationDir + [string] + $DestinationDir +) -if (!(Test-Path -Path $destinationDir)) +Write-Host $SourcePath +Write-Host $DestinationDir + +if (!(Test-Path -Path $DestinationDir)) { - New-Item -Path $destinationDir -ItemType "directory" + New-Item -Path $DestinationDir -ItemType "directory" } -$sourceFiles = Get-ChildItem -Path $sourcePath -Recurse | ?{$_.Extension -match "exe|msi"} +$sourceFiles = Get-ChildItem -Path $SourcePath -Recurse | ?{$_.Extension -match "exe|msi"} foreach ($item in $sourceFiles) { - Copy-Item -Path $item.FullName -Destination $destinationDir -Force + Copy-Item -Path $item.FullName -Destination $DestinationDir -Force } \ No newline at end of file diff --git a/Tools/rename_installer_with_version.ps1 b/Tools/rename_installer_with_version.ps1 index 795840a0..eec9fae0 100644 --- a/Tools/rename_installer_with_version.ps1 +++ b/Tools/rename_installer_with_version.ps1 @@ -1,11 +1,15 @@ -$solutionDir = $args[0] -$renameTarget = $solutionDir + "InstallerProjects\Installer\bin\Release\en-US\mRemoteNG-Installer.msi" +param ( + [string] + $SolutionDir +) -Write-Host $solutionDir +$renameTarget = $SolutionDir + "InstallerProjects\Installer\bin\Release\en-US\mRemoteNG-Installer.msi" + +Write-Host $SolutionDir Write-Host $renameTarget -$targetVersionedFile = "$solutionDir\mRemoteV1\bin\Release\mRemoteNG.exe" -$version = &"$solutionDir\Tools\sigcheck.exe" /accepteula -q -n $targetVersionedFile +$targetVersionedFile = "$SolutionDir\mRemoteV1\bin\Release\mRemoteNG.exe" +$version = &"$SolutionDir\Tools\sigcheck.exe" /accepteula -q -n $targetVersionedFile $renameTargetFileObject = Get-Item -Path $renameTarget -ErrorAction SilentlyContinue From a8a7de9ee6350bfe7585e623a7bdfda25dd7615a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 17 Mar 2017 18:01:08 -0600 Subject: [PATCH 11/56] began converting all post build actions to powershell --- Tools/postbuild_installer.ps1 | 38 ++++++++++++++++++ Tools/postbuild_mremotev1.ps1 | 72 +++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 Tools/postbuild_installer.ps1 create mode 100644 Tools/postbuild_mremotev1.ps1 diff --git a/Tools/postbuild_installer.ps1 b/Tools/postbuild_installer.ps1 new file mode 100644 index 00000000..4052fe79 --- /dev/null +++ b/Tools/postbuild_installer.ps1 @@ -0,0 +1,38 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + $SolutionDir, + + [string] + [Parameter(Mandatory=$true)] + $TargetDir, + + [string] + [Parameter(Mandatory=$true)] + $TargetFileName, + + [string] + [Parameter(Mandatory=$true)] + $ConfigurationName +) + +$certificatePath = "C:\mRemoteNG_code_signing_cert.pfx" +$path_signFilesScript = Join-Path -Path $SolutionDir -ChildPath "Tools\signfiles.ps1" +$path_installerRenameScript = Join-Path -Path $SolutionDir -ChildPath "Tools\rename_installer_with_version.ps1" +$path_copyToReleaseScript = Join-Path -Path $SolutionDir -ChildPath "Tools\copy_release_installer.ps1" + + +# Sign MSI if we are building a release version and the certificate is available +if (($ConfigurationName -match "Release") -and (Test-Path -Path $certificatePath -PathType Leaf)) { + powershell.exe -ExecutionPolicy Bypass -File $path_signFilesScript $TargetDir +} + + +# Rename MSI to include version number +powershell.exe -ExecutionPolicy Bypass -File $path_installerRenameScript -SolutionDir $SolutionDir + + +# Copy MSI to Release folder +if ($ConfigurationName -match "Release") { + powershell.exe -ExecutionPolicy Bypass -File $path_copyToReleaseScript -SourcePath $TargetDir -DestinationDir (Join-Path -Path $SolutionDir -ChildPath "Release") +} \ No newline at end of file diff --git a/Tools/postbuild_mremotev1.ps1 b/Tools/postbuild_mremotev1.ps1 new file mode 100644 index 00000000..2a7dc64c --- /dev/null +++ b/Tools/postbuild_mremotev1.ps1 @@ -0,0 +1,72 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + $SolutionDir, + + [string] + [Parameter(Mandatory=$true)] + $TargetDir, + + [string] + [Parameter(Mandatory=$true)] + $TargetFileName, + + [string] + [Parameter(Mandatory=$true)] + $ConfigurationName +) + +$certificatePath = "C:\mRemoteNG_code_signing_cert.pfx" +$path_signFilesScript = Join-Path -Path $SolutionDir -ChildPath "Tools\signfiles.ps1" +$path_packageZipScript = Join-Path -Path $SolutionDir -ChildPath "Tools\build-relport.cmd" +$path_HelpFilesDir = Join-Path -Path $TargetDir -ChildPath "Help" +$path_outputExe = Join-Path -Path $TargetDir -ChildPath $TargetFileName +$path_editBin = @((Resolve-Path -Path "C:\Program Files*\Microsoft Visual Studio*\VC\bin\editbin.exe").Path)[0] + + + +# Copy PuTTYNG +Write-Host "Copy PUTTYNG to correct directory" -ForegroundColor Green +Copy-Item -Path (Join-Path -Path $SolutionDir -ChildPath "mRemoteV1\Resources\PuTTYNG.exe") -Destination $TargetDir -Force + + + +# Move Help files +Write-Host "Move Help files to correct directory" -ForegroundColor Green +if (Test-Path -Path $path_HelpFilesDir) { + Remove-Item -Path $path_HelpFilesDir -Recurse -Force +} +Move-Item -Path (Join-Path -Path $TargetDir -ChildPath "Resources\Help") -Destination $path_HelpFilesDir -Force +Start-Sleep -Seconds 2 +Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "Resources") -Recurse -Force + + + +# Set LargeAddressAware +Write-Host "Set LargeAddressAware on binary" -ForegroundColor Green +& $path_editBin "/largeaddressaware $path_outputExe" + + + +# Remove unnecessary files from Release versions +if (($ConfigurationName -match "Release") -and (Test-Path -Path $certificatePath -PathType Leaf)) { + Write-Host "Removing unnecessary files from Release versions" -ForegroundColor Green + Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "app.publish") -Recurse -Force + Remove-Item -Path $TargetDir -Include @( + "*.pdb", + "*.publish", + "*.xml", + "*.backup", + "*.log", + "*vshost*", + "*.tmp" + ) +} + + + +# Package Zip +if ($ConfigurationName -match "Release" -and $ConfigurationName -match "Portable") { + Write-Host "Package ZIP Release Portable" -ForegroundColor Green + & $path_packageZipScript +} \ No newline at end of file From 8589778e9221eb3509a443c3d0239b651325c80d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 17 Mar 2017 23:53:59 -0600 Subject: [PATCH 12/56] split postbuild actions into powershell scripts --- Tools/copy_puttyng.ps1 | 15 +++++++ Tools/move_help_files.ps1 | 23 +++++++++++ Tools/postbuild_mremotev1.ps1 | 63 ++++++------------------------ Tools/set_LargeAddressAware.ps1 | 21 ++++++++++ Tools/sign_binaries.ps1 | 33 ++++++++++++++++ Tools/tidy_files_for_release.ps1 | 31 +++++++++++++++ Tools/verify_binary_signatures.ps1 | 36 +++++++++++++++++ Tools/zip_portable_files.ps1 | 28 +++++++++++++ mRemoteV1/mRemoteV1.csproj | 43 ++++---------------- 9 files changed, 206 insertions(+), 87 deletions(-) create mode 100644 Tools/copy_puttyng.ps1 create mode 100644 Tools/move_help_files.ps1 create mode 100644 Tools/set_LargeAddressAware.ps1 create mode 100644 Tools/sign_binaries.ps1 create mode 100644 Tools/tidy_files_for_release.ps1 create mode 100644 Tools/verify_binary_signatures.ps1 create mode 100644 Tools/zip_portable_files.ps1 diff --git a/Tools/copy_puttyng.ps1 b/Tools/copy_puttyng.ps1 new file mode 100644 index 00000000..21dc6180 --- /dev/null +++ b/Tools/copy_puttyng.ps1 @@ -0,0 +1,15 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + $SolutionDir, + + [string] + [Parameter(Mandatory=$true)] + $TargetDir +) + +Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" +Write-Output "Copying PUTTYNG to correct directory" +Copy-Item -Path (Join-Path -Path $SolutionDir -ChildPath "mRemoteV1\Resources\PuTTYNG.exe") -Destination $TargetDir -Force + +Write-Output "" \ No newline at end of file diff --git a/Tools/move_help_files.ps1 b/Tools/move_help_files.ps1 new file mode 100644 index 00000000..dc63866f --- /dev/null +++ b/Tools/move_help_files.ps1 @@ -0,0 +1,23 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + $TargetDir +) + +Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" + +$path_HelpFilesDir = Join-Path -Path $TargetDir -ChildPath "Help" + +Write-Output "Moving Help files to correct directory" + +# Remove stale Help files, if they exist +if (Test-Path -Path $path_HelpFilesDir) { + Remove-Item -Path $path_HelpFilesDir -Recurse -Force +} + +# Move Help files +Move-Item -Path (Join-Path -Path $TargetDir -ChildPath "Resources\Help") -Destination $path_HelpFilesDir -Force +Start-Sleep -Seconds 2 +Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "Resources") -Recurse -Force + +Write-Output "" \ No newline at end of file diff --git a/Tools/postbuild_mremotev1.ps1 b/Tools/postbuild_mremotev1.ps1 index 2a7dc64c..8748e7a2 100644 --- a/Tools/postbuild_mremotev1.ps1 +++ b/Tools/postbuild_mremotev1.ps1 @@ -16,57 +16,16 @@ param ( $ConfigurationName ) -$certificatePath = "C:\mRemoteNG_code_signing_cert.pfx" -$path_signFilesScript = Join-Path -Path $SolutionDir -ChildPath "Tools\signfiles.ps1" -$path_packageZipScript = Join-Path -Path $SolutionDir -ChildPath "Tools\build-relport.cmd" -$path_HelpFilesDir = Join-Path -Path $TargetDir -ChildPath "Help" -$path_outputExe = Join-Path -Path $TargetDir -ChildPath $TargetFileName -$path_editBin = @((Resolve-Path -Path "C:\Program Files*\Microsoft Visual Studio*\VC\bin\editbin.exe").Path)[0] +Write-Output "+=================================================================+" +Write-Output "| Beginning mRemoteV1 Post Build |" +Write-Output "+=================================================================+" +Write-Output ([pscustomobject]$PSBoundParameters) | Format-Table -AutoSize -Wrap - -# Copy PuTTYNG -Write-Host "Copy PUTTYNG to correct directory" -ForegroundColor Green -Copy-Item -Path (Join-Path -Path $SolutionDir -ChildPath "mRemoteV1\Resources\PuTTYNG.exe") -Destination $TargetDir -Force - - - -# Move Help files -Write-Host "Move Help files to correct directory" -ForegroundColor Green -if (Test-Path -Path $path_HelpFilesDir) { - Remove-Item -Path $path_HelpFilesDir -Recurse -Force -} -Move-Item -Path (Join-Path -Path $TargetDir -ChildPath "Resources\Help") -Destination $path_HelpFilesDir -Force -Start-Sleep -Seconds 2 -Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "Resources") -Recurse -Force - - - -# Set LargeAddressAware -Write-Host "Set LargeAddressAware on binary" -ForegroundColor Green -& $path_editBin "/largeaddressaware $path_outputExe" - - - -# Remove unnecessary files from Release versions -if (($ConfigurationName -match "Release") -and (Test-Path -Path $certificatePath -PathType Leaf)) { - Write-Host "Removing unnecessary files from Release versions" -ForegroundColor Green - Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "app.publish") -Recurse -Force - Remove-Item -Path $TargetDir -Include @( - "*.pdb", - "*.publish", - "*.xml", - "*.backup", - "*.log", - "*vshost*", - "*.tmp" - ) -} - - - -# Package Zip -if ($ConfigurationName -match "Release" -and $ConfigurationName -match "Portable") { - Write-Host "Package ZIP Release Portable" -ForegroundColor Green - & $path_packageZipScript -} \ No newline at end of file +& "$PSScriptRoot\copy_puttyng.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir +& "$PSScriptRoot\move_help_files.ps1" -TargetDir $TargetDir +& "$PSScriptRoot\set_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName +& "$PSScriptRoot\tidy_files_for_release.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName +& "$PSScriptRoot\sign_binaries.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName +& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName +& "$PSScriptRoot\zip_portable_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName \ No newline at end of file diff --git a/Tools/set_LargeAddressAware.ps1 b/Tools/set_LargeAddressAware.ps1 new file mode 100644 index 00000000..7cddeb6b --- /dev/null +++ b/Tools/set_LargeAddressAware.ps1 @@ -0,0 +1,21 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + $TargetDir, + + [string] + [Parameter(Mandatory=$true)] + $TargetFileName +) + +Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" + +$path_editBin = @((Resolve-Path -Path "C:\Program Files*\Microsoft Visual Studio*\VC\bin\editbin.exe").Path)[0] +$path_outputExe = Join-Path -Path $TargetDir -ChildPath $TargetFileName + + +# Set LargeAddressAware +Write-Output "Setting LargeAddressAware on binary" +& $path_editBin "/NOLOGO /largeaddressaware $path_outputExe" + +Write-Output "" \ No newline at end of file diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 new file mode 100644 index 00000000..9a9e3a5b --- /dev/null +++ b/Tools/sign_binaries.ps1 @@ -0,0 +1,33 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + $SolutionDir, + + [string] + [Parameter(Mandatory=$true)] + $TargetDir, + + [string] + [Parameter(Mandatory=$true)] + $ConfigurationName +) + +Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" + +$certificatePath = "C:\mRemoteNG_code_signing_cert.pfx" +$path_signFilesScript = Join-Path -Path $SolutionDir -ChildPath "Tools\signfiles.ps1" + + +# Sign MSI if we are building a release version and the certificate is available +if ($ConfigurationName -match "Release") { + if (Test-Path -Path $certificatePath -PathType Leaf) { + Write-Output "Signing Binaries" + powershell.exe -ExecutionPolicy Bypass -File $path_signFilesScript $TargetDir + } else { + Write-Output "Certificate is not present - we won't sign files." + } +} else { + Write-Output "This is not a release build - we won't sign files." +} + +Write-Output "" \ No newline at end of file diff --git a/Tools/tidy_files_for_release.ps1 b/Tools/tidy_files_for_release.ps1 new file mode 100644 index 00000000..e57b3377 --- /dev/null +++ b/Tools/tidy_files_for_release.ps1 @@ -0,0 +1,31 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + $TargetDir, + + [string] + [Parameter(Mandatory=$true)] + $ConfigurationName +) + +Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" + +# Remove unnecessary files from Release versions +if ($ConfigurationName -match "Release") { + Write-Output "Removing unnecessary files from Release versions" + Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "app.publish") -Recurse -Force + Remove-Item -Path $TargetDir -Recurse -Include @( + "*.pdb", + "*.publish", + "*.xml", + "*.backup", + "*.log", + "*vshost*", + "*.tmp" + ) +} +else { + Write-Output "We will not remove anything - this is not a release build." +} + +Write-Output "" \ No newline at end of file diff --git a/Tools/verify_binary_signatures.ps1 b/Tools/verify_binary_signatures.ps1 new file mode 100644 index 00000000..08f8fd02 --- /dev/null +++ b/Tools/verify_binary_signatures.ps1 @@ -0,0 +1,36 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + $TargetDir, + + [string] + [Parameter(Mandatory=$true)] + $ConfigurationName +) + +Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" + +# Sign MSI if we are building a release version and the certificate is available +if ($ConfigurationName -match "Release") { + Write-Output "Verifying signature of binaries" + Write-Output "Getting files from path: $TargetDir" + $signableFiles = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} + Write-Output "Signable files count: $($signableFiles.Count)" + $badSignatureFound = $false + foreach ($file in $signableFiles) { + $signature = Get-AuthenticodeSignature -FilePath $file.FullName + if ($signature.Status -ne "Valid") { + Write-Error "File $($file.FullName) does not have a valid signature." + $badSignatureFound = $true + } + } + if ($badSignatureFound) { + Write-Output "One or more files were improperly signed." + } else { + Write-Output "All files have valid signatures." + } +} else { + Write-Output "This is not a release build - we won't verify file signatures." +} + +Write-Output "" \ No newline at end of file diff --git a/Tools/zip_portable_files.ps1 b/Tools/zip_portable_files.ps1 new file mode 100644 index 00000000..97ddeebc --- /dev/null +++ b/Tools/zip_portable_files.ps1 @@ -0,0 +1,28 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + $SolutionDir, + + [string] + [Parameter(Mandatory=$true)] + $TargetDir, + + [string] + [Parameter(Mandatory=$true)] + $ConfigurationName +) + +Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" +$path_packageZipScript = Join-Path -Path $SolutionDir -ChildPath "Tools\build-relport.cmd" + + +# Package Zip +if ($ConfigurationName -match "Release" -and $ConfigurationName -match "Portable") { + Write-Output "Packaging Release Portable ZIP" + & $path_packageZipScript +} +else { + Write-Output "We will not zip anything - this isnt a portable release build." +} + +Write-Output "" \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index fb3569c3..58fb5534 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -1247,44 +1247,17 @@ - powershell -noprofile -command "sleep 2" -call "$(DevEnvDir)..\tools\vsvars32.bat" -set /p buildenv=<buildenv.tmp - -echo Copy PUTTYNG to correct directory -copy /Y "$(SolutionDir)mRemoteV1\Resources\PuTTYNG.exe" .\ - -echo Move Help files to correct directory -IF EXIST Help ( - del /s /q Help >NUL - rmdir /s /q Help >NUL -) -move /Y Resources\Help .\ + :: When passing paths to powershell scripts, check if the path ends with a backslash "\" +:: If it does, then the backslash may be interpreted as an escape character. Add another backslash to cancel the first one. powershell -noprofile -command "sleep 2" -rmdir /s /q Resources >NUL +set /p buildenv=<buildenv.tmp +set solutionDir=$(SolutionDir)\ +set targetDir=%25cd%25 +set psScriptsDir=$(SolutionDir)Tools -echo Set LargeAddressAware on binary -editbin /largeaddressaware mRemoteNG.exe - - -IF EXIST C:\mRemoteNG_code_signing_cert.pfx ( - echo Signing binaries - IF %25buildenv: Portable=%25==Release ( - powershell "&""$(SolutionDir)Tools\signfiles.ps1""" '%25cd%25' - ) -) - -IF %25buildenv: Portable=%25==Release ( - echo Remove unnecessary files from Release versions - rmdir /s /q app.publish - del /q *.pdb *.publish *.xml *.backup *.log *vshost* *.tmp -) - -IF %25buildenv: =%25==ReleasePortable ( - echo Package ZIP Release Portable - "$(SolutionDir)Tools\build-relport.cmd" -) +:: Call the post build powershell script +powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_mremotev1.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" true From 96df821eca4014886f088aa13708e978eec82f9e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 18 Mar 2017 00:23:44 -0600 Subject: [PATCH 13/56] changed signature failures from errors to warnings --- Tools/verify_binary_signatures.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/verify_binary_signatures.ps1 b/Tools/verify_binary_signatures.ps1 index 08f8fd02..7d800a85 100644 --- a/Tools/verify_binary_signatures.ps1 +++ b/Tools/verify_binary_signatures.ps1 @@ -20,7 +20,7 @@ if ($ConfigurationName -match "Release") { foreach ($file in $signableFiles) { $signature = Get-AuthenticodeSignature -FilePath $file.FullName if ($signature.Status -ne "Valid") { - Write-Error "File $($file.FullName) does not have a valid signature." + Write-Warning "File $($file.FullName) does not have a valid signature." $badSignatureFound = $true } } From 576f6a3bd68a96ad95a4c6ee1412d289b6eedf5c Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 18 Mar 2017 00:24:07 -0600 Subject: [PATCH 14/56] fixed issue with tidying release files --- Tools/tidy_files_for_release.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tools/tidy_files_for_release.ps1 b/Tools/tidy_files_for_release.ps1 index e57b3377..c02e7e48 100644 --- a/Tools/tidy_files_for_release.ps1 +++ b/Tools/tidy_files_for_release.ps1 @@ -14,7 +14,7 @@ Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" if ($ConfigurationName -match "Release") { Write-Output "Removing unnecessary files from Release versions" Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "app.publish") -Recurse -Force - Remove-Item -Path $TargetDir -Recurse -Include @( + $filesToDelete = Get-ChildItem -Path $TargetDir -Recurse -Include @( "*.pdb", "*.publish", "*.xml", @@ -23,6 +23,8 @@ if ($ConfigurationName -match "Release") { "*vshost*", "*.tmp" ) + Remove-Item -Path $filesToDelete.FullName + Write-Output $filesToDelete.FullName } else { Write-Output "We will not remove anything - this is not a release build." From 84ebb82caef0837f9fb64dc9599de7a3a8d47aab Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 18 Mar 2017 00:24:39 -0600 Subject: [PATCH 15/56] the installer project now uses a powershell script for post build actions --- InstallerProjects/Installer/Installer.wixproj | 21 +++++++-------- Tools/postbuild_installer.ps1 | 26 ++++++------------- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/InstallerProjects/Installer/Installer.wixproj b/InstallerProjects/Installer/Installer.wixproj index ec8ef841..a5f90867 100644 --- a/InstallerProjects/Installer/Installer.wixproj +++ b/InstallerProjects/Installer/Installer.wixproj @@ -127,19 +127,16 @@ REM Convert the license file "COPYING.TXT" to "License.rtf" to be shown in the i call "$(ProjectDir)Resources\Pandoc\pandoc.exe" -s -t rtf -o "$(ProjectDir)\Resources\License.rtf" "$(SolutionDir)COPYING.TXT" - set /p buildenv=<buildenv.tmp + :: When passing paths to powershell scripts, check if the path ends with a backslash "\" +:: If it does, then the backslash may be interpreted as an escape character. Add another backslash to cancel the first one. -REM Sign MSI -IF EXIST C:\mRemoteNG_code_signing_cert.pfx ( - IF %25buildenv: Portable=%25==Release ( - powershell -File "$(SolutionDir)Tools\signfiles.ps1" -PathToSignableFiles %25cd%25 - ) -) +powershell -noprofile -command "sleep 2" +set /p buildenv=<buildenv.tmp +set solutionDir=$(SolutionDir)\ +set targetDir=%25cd%25 +set psScriptsDir=$(SolutionDir)Tools -REM Rename MSI to include version number -powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_with_version.ps1" -SolutionDir $(SolutionDir) - -REM Copy MSI to Release folder -IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" -SourcePath $(TargetDir) -DestinationDir $(SolutionDir)Release) +:: Call the post build powershell script +powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_installer.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" \ No newline at end of file diff --git a/Tools/postbuild_installer.ps1 b/Tools/postbuild_installer.ps1 index 4052fe79..2f16ce96 100644 --- a/Tools/postbuild_installer.ps1 +++ b/Tools/postbuild_installer.ps1 @@ -16,23 +16,13 @@ param ( $ConfigurationName ) -$certificatePath = "C:\mRemoteNG_code_signing_cert.pfx" -$path_signFilesScript = Join-Path -Path $SolutionDir -ChildPath "Tools\signfiles.ps1" -$path_installerRenameScript = Join-Path -Path $SolutionDir -ChildPath "Tools\rename_installer_with_version.ps1" -$path_copyToReleaseScript = Join-Path -Path $SolutionDir -ChildPath "Tools\copy_release_installer.ps1" +Write-Output "+=================================================================+" +Write-Output "| Beginning mRemoteNG Installer Post Build |" +Write-Output "+=================================================================+" +Write-Output ([pscustomobject]$PSBoundParameters) | Format-Table -AutoSize -Wrap -# Sign MSI if we are building a release version and the certificate is available -if (($ConfigurationName -match "Release") -and (Test-Path -Path $certificatePath -PathType Leaf)) { - powershell.exe -ExecutionPolicy Bypass -File $path_signFilesScript $TargetDir -} - - -# Rename MSI to include version number -powershell.exe -ExecutionPolicy Bypass -File $path_installerRenameScript -SolutionDir $SolutionDir - - -# Copy MSI to Release folder -if ($ConfigurationName -match "Release") { - powershell.exe -ExecutionPolicy Bypass -File $path_copyToReleaseScript -SourcePath $TargetDir -DestinationDir (Join-Path -Path $SolutionDir -ChildPath "Release") -} \ No newline at end of file +& "$PSScriptRoot\sign_binaries.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName +& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName +& "$PSScriptRoot\rename_installer_with_version.ps1" -SolutionDir $SolutionDir +& "$PSScriptRoot\copy_release_installer.ps1" -SourcePath $TargetDir -DestinationDir (Join-Path -Path $SolutionDir -ChildPath "Release") \ No newline at end of file From 45645c439f8fb9a9df732099aecd31f16f072ff9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 18 Mar 2017 15:13:23 -0600 Subject: [PATCH 16/56] test of msbuild param passing --- mRemoteV1/mRemoteV1.csproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 58fb5534..ee74ff66 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -1256,6 +1256,10 @@ set solutionDir=$(SolutionDir)\ set targetDir=%25cd%25 set psScriptsDir=$(SolutionDir)Tools +echo Testing params: +echo $(CertPath) +echo $(CertPassword) + :: Call the post build powershell script powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_mremotev1.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" From 512d7322b2709126efb77500aa2d4f361c439352 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 18 Mar 2017 16:13:20 -0600 Subject: [PATCH 17/56] request cert path and password as script parameters --- Tools/postbuild_mremotev1.ps1 | 10 +++++-- Tools/sign_binaries.ps1 | 53 +++++++++++++++++++++++++++-------- Tools/signfiles.ps1 | 13 --------- mRemoteV1/mRemoteV1.csproj | 8 ++---- 4 files changed, 52 insertions(+), 32 deletions(-) delete mode 100644 Tools/signfiles.ps1 diff --git a/Tools/postbuild_mremotev1.ps1 b/Tools/postbuild_mremotev1.ps1 index 8748e7a2..1481b7ce 100644 --- a/Tools/postbuild_mremotev1.ps1 +++ b/Tools/postbuild_mremotev1.ps1 @@ -13,7 +13,13 @@ param ( [string] [Parameter(Mandatory=$true)] - $ConfigurationName + $ConfigurationName, + + [string] + $CertificatePath, + + [string] + $CertificatePassword ) Write-Output "+=================================================================+" @@ -26,6 +32,6 @@ Write-Output ([pscustomobject]$PSBoundParameters) | Format-Table -AutoSize -Wrap & "$PSScriptRoot\move_help_files.ps1" -TargetDir $TargetDir & "$PSScriptRoot\set_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName & "$PSScriptRoot\tidy_files_for_release.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -& "$PSScriptRoot\sign_binaries.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName +& "$PSScriptRoot\sign_binaries.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName & "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName & "$PSScriptRoot\zip_portable_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName \ No newline at end of file diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index 9a9e3a5b..3ed54bdb 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -9,25 +9,54 @@ param ( [string] [Parameter(Mandatory=$true)] - $ConfigurationName + $ConfigurationName, + + [string] + # The code signing certificate to use when signing the files. + $CertificatePath, + + [string] + # Password to unlock the code signing certificate. + $CertificatePassword ) Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" -$certificatePath = "C:\mRemoteNG_code_signing_cert.pfx" -$path_signFilesScript = Join-Path -Path $SolutionDir -ChildPath "Tools\signfiles.ps1" + +$timeserver = "http://timestamp.verisign.com/scripts/timstamp.dll" -# Sign MSI if we are building a release version and the certificate is available -if ($ConfigurationName -match "Release") { - if (Test-Path -Path $certificatePath -PathType Leaf) { - Write-Output "Signing Binaries" - powershell.exe -ExecutionPolicy Bypass -File $path_signFilesScript $TargetDir - } else { - Write-Output "Certificate is not present - we won't sign files." - } -} else { +if ($ConfigurationName -notmatch "Release") { Write-Output "This is not a release build - we won't sign files." + return } +if ($CertificatePath -eq "" -or !(Test-Path -Path $CertificatePath -PathType Leaf)) { + Write-Output "Certificate is not present - we won't sign files." + return +} + +if ($CertificatePassword -eq "") { + Write-Output "No certificate password was provided - we won't sign files." + return +} + +try { + $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, (ConvertTo-SecureString -String $CertificatePassword -AsPlainText -Force)) -ErrorAction Stop +} catch { + Write-Output "Certificate password was not correct - we won't sign files." + return +} + +# Sign MSI if we are building a release version and the certificate is available +Write-Output "Signing Binaries" +Write-Output "Getting files from path: $TargetDir" +$signableFiles = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -notcontains $_.Name} +Write-Output "Signable files count: $($signableFiles.Count)" + +foreach ($file in $signableFiles) { + Set-AuthenticodeSignature -Certificate $cert -TimestampServer $timeserver -IncludeChain all -FilePath $file.FullName +} + + Write-Output "" \ No newline at end of file diff --git a/Tools/signfiles.ps1 b/Tools/signfiles.ps1 deleted file mode 100644 index 49c60c72..00000000 --- a/Tools/signfiles.ps1 +++ /dev/null @@ -1,13 +0,0 @@ -$timeserver = "http://timestamp.verisign.com/scripts/timstamp.dll" -$certPath = "C:\mRemoteNG_code_signing_cert.pfx" -$certPassword = (Get-Credential -Message "Enter the password for the certificate" -UserName "USERNAME NOT NEEDED").Password -$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($certPath, $certPassword) -$targetPath = $args[0] - - -Write-Output "Getting files from path: $targetPath" -$signableFiles = Get-ChildItem -Path $targetPath -Recurse | ?{$_.Extension -match "dll|exe|msi"} -Write-Output "Signable files count: $($signableFiles.Count)" -foreach ($file in $signableFiles) { - Set-AuthenticodeSignature -Certificate $cert -TimestampServer $timeserver -IncludeChain all -FilePath $file.FullName -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index ee74ff66..86c0fac4 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -1255,13 +1255,11 @@ set /p buildenv=<buildenv.tmp set solutionDir=$(SolutionDir)\ set targetDir=%25cd%25 set psScriptsDir=$(SolutionDir)Tools - -echo Testing params: -echo $(CertPath) -echo $(CertPassword) +set certPath=$(CertPath) +set certPassword=$(CertPassword) :: Call the post build powershell script -powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_mremotev1.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" +powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_mremotev1.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" -CertificatePath "%25certPath%25" -CertificatePassword "%25certPassword%25" true From 92bd0d3ea02ac2e246b1bfd1ab7cdbaeefe5f1b2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 18 Mar 2017 16:29:44 -0600 Subject: [PATCH 18/56] do not echo sensitive params --- Tools/postbuild_mremotev1.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/postbuild_mremotev1.ps1 b/Tools/postbuild_mremotev1.ps1 index 1481b7ce..897a886b 100644 --- a/Tools/postbuild_mremotev1.ps1 +++ b/Tools/postbuild_mremotev1.ps1 @@ -25,7 +25,7 @@ param ( Write-Output "+=================================================================+" Write-Output "| Beginning mRemoteV1 Post Build |" Write-Output "+=================================================================+" -Write-Output ([pscustomobject]$PSBoundParameters) | Format-Table -AutoSize -Wrap +Write-Output ([pscustomobject]$PSBoundParameters) | ?{$_.Key -notmatch "Certificate"} | Format-Table -AutoSize -Wrap & "$PSScriptRoot\copy_puttyng.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir From a9442ea06ecef2dd4f981633b14c55d19db7fc0c Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 18 Mar 2017 16:30:03 -0600 Subject: [PATCH 19/56] added some error output for cert loading action --- Tools/sign_binaries.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index 3ed54bdb..f3975e80 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -44,7 +44,8 @@ if ($CertificatePassword -eq "") { try { $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, (ConvertTo-SecureString -String $CertificatePassword -AsPlainText -Force)) -ErrorAction Stop } catch { - Write-Output "Certificate password was not correct - we won't sign files." + Write-Output "Error loading certificate file - we won't sign files." + Write-Output $Error[0] return } From 8db76f53240c6ee683d776688874466f955f7625 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 18 Mar 2017 17:25:30 -0600 Subject: [PATCH 20/56] actually fix the sensitive param leakage --- Tools/postbuild_mremotev1.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Tools/postbuild_mremotev1.ps1 b/Tools/postbuild_mremotev1.ps1 index 897a886b..3b2b5bd8 100644 --- a/Tools/postbuild_mremotev1.ps1 +++ b/Tools/postbuild_mremotev1.ps1 @@ -25,7 +25,13 @@ param ( Write-Output "+=================================================================+" Write-Output "| Beginning mRemoteV1 Post Build |" Write-Output "+=================================================================+" -Write-Output ([pscustomobject]$PSBoundParameters) | ?{$_.Key -notmatch "Certificate"} | Format-Table -AutoSize -Wrap +Format-Table -AutoSize -Wrap -InputObject @{ + "SolutionDir" = $SolutionDir + "TargetDir" = $TargetDir + "TargetFileName" = $TargetFileName + "ConfigurationName" = $ConfigurationName +} + & "$PSScriptRoot\copy_puttyng.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir From 56ff81a0ed83639d1f8e209ff03e6739aa432897 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 10:10:48 -0600 Subject: [PATCH 21/56] removed unnecessary build configs for the unit tests project im not even sure we need to distinguish between debug and portable builds, but ill leave it like this for now --- mRemoteNGTests/mRemoteNGTests.csproj | 18 ------------------ mRemoteV1.sln | 10 +++++----- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index b1d9ac8a..cb24e911 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -35,24 +35,6 @@ prompt MinimumRecommendedRules.ruleset - - true - bin\x86\Debug Portable\ - TRACE;DEBUG;PORTABLE - full - x86 - prompt - MinimumRecommendedRules.ruleset - - - bin\x86\Release Portable\ - TRACE;PORTABLE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - ..\packages\BouncyCastle.1.8.1\lib\BouncyCastle.Crypto.dll diff --git a/mRemoteV1.sln b/mRemoteV1.sln index 2f7df444..446c92e2 100644 --- a/mRemoteV1.sln +++ b/mRemoteV1.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteV1", "mRemoteV1\mRemoteV1.csproj", "{4934A491-40BC-4E5B-9166-EA1169A220F6}" EndProject @@ -35,14 +35,14 @@ Global {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x86.Build.0 = Release Portable|x86 {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x86.ActiveCfg = Release|x86 {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x86.Build.0 = Release|x86 - {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.ActiveCfg = Debug Portable|x86 - {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.Build.0 = Debug Portable|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.ActiveCfg = Debug|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.Build.0 = Debug|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.ActiveCfg = Debug|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.Build.0 = Debug|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.ActiveCfg = Release|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.Build.0 = Release|x86 - {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.ActiveCfg = Release Portable|x86 - {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.Build.0 = Release Portable|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.ActiveCfg = Release|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.Build.0 = Release|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x86.ActiveCfg = Release|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x86.Build.0 = Release|x86 {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|x86.ActiveCfg = Debug|x86 From d47ccd75d5b9cf3b20c4a3d022db136c3fb5ecbe Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 10:20:20 -0600 Subject: [PATCH 22/56] Revert "removed unnecessary build configs for the unit tests project" This reverts commit 56ff81a0ed83639d1f8e209ff03e6739aa432897. --- mRemoteNGTests/mRemoteNGTests.csproj | 18 ++++++++++++++++++ mRemoteV1.sln | 10 +++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index cb24e911..b1d9ac8a 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -35,6 +35,24 @@ prompt MinimumRecommendedRules.ruleset + + true + bin\x86\Debug Portable\ + TRACE;DEBUG;PORTABLE + full + x86 + prompt + MinimumRecommendedRules.ruleset + + + bin\x86\Release Portable\ + TRACE;PORTABLE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + ..\packages\BouncyCastle.1.8.1\lib\BouncyCastle.Crypto.dll diff --git a/mRemoteV1.sln b/mRemoteV1.sln index 446c92e2..2f7df444 100644 --- a/mRemoteV1.sln +++ b/mRemoteV1.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteV1", "mRemoteV1\mRemoteV1.csproj", "{4934A491-40BC-4E5B-9166-EA1169A220F6}" EndProject @@ -35,14 +35,14 @@ Global {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x86.Build.0 = Release Portable|x86 {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x86.ActiveCfg = Release|x86 {4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x86.Build.0 = Release|x86 - {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.ActiveCfg = Debug|x86 - {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.Build.0 = Debug|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.ActiveCfg = Debug Portable|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.Build.0 = Debug Portable|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.ActiveCfg = Debug|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.Build.0 = Debug|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.ActiveCfg = Release|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.Build.0 = Release|x86 - {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.ActiveCfg = Release|x86 - {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.Build.0 = Release|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.ActiveCfg = Release Portable|x86 + {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.Build.0 = Release Portable|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x86.ActiveCfg = Release|x86 {1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x86.Build.0 = Release|x86 {5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|x86.ActiveCfg = Debug|x86 From 7520b20cf9ca8b5cc26915e5765db1e166517e43 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 10:28:49 -0600 Subject: [PATCH 23/56] fixed bug in setting largeaddressaware --- Tools/set_LargeAddressAware.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/set_LargeAddressAware.ps1 b/Tools/set_LargeAddressAware.ps1 index 7cddeb6b..e2f44683 100644 --- a/Tools/set_LargeAddressAware.ps1 +++ b/Tools/set_LargeAddressAware.ps1 @@ -16,6 +16,6 @@ $path_outputExe = Join-Path -Path $TargetDir -ChildPath $TargetFileName # Set LargeAddressAware Write-Output "Setting LargeAddressAware on binary" -& $path_editBin "/NOLOGO /largeaddressaware $path_outputExe" +& $path_editBin "/largeaddressaware" "$path_outputExe" Write-Output "" \ No newline at end of file From 7a036956b75517fa57fb323f8d1d5ee419ff6aeb Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 10:29:48 -0600 Subject: [PATCH 24/56] added some certificate checks to be more sure that the editbin we're using is legit --- Tools/set_LargeAddressAware.ps1 | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Tools/set_LargeAddressAware.ps1 b/Tools/set_LargeAddressAware.ps1 index e2f44683..ba785aea 100644 --- a/Tools/set_LargeAddressAware.ps1 +++ b/Tools/set_LargeAddressAware.ps1 @@ -10,12 +10,21 @@ param ( Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) =====" +# Find editbin.exe $path_editBin = @((Resolve-Path -Path "C:\Program Files*\Microsoft Visual Studio*\VC\bin\editbin.exe").Path)[0] + +# Verify editbin certificate +$microsoft_cert_thumbprint = "3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" +$editbin_signature = Get-AuthenticodeSignature -FilePath $path_editBin +if (($editbin_signature.Status -ne "Valid") -or ($editbin_signature.SignerCertificate.Thumbprint -ne $microsoft_cert_thumbprint)) { + Write-Error "Could not validate the signature of editbin.exe - we can not set LargeAddressAware" -ErrorAction Stop +} + + $path_outputExe = Join-Path -Path $TargetDir -ChildPath $TargetFileName - # Set LargeAddressAware -Write-Output "Setting LargeAddressAware on binary" +Write-Output "Setting LargeAddressAware on binary file `"$path_outputExe`"" & $path_editBin "/largeaddressaware" "$path_outputExe" Write-Output "" \ No newline at end of file From 882e59a26032ac497eda1f78f3ac0a6740b5b37c Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 10:55:18 -0600 Subject: [PATCH 25/56] normalized the unit test output folder for the portable builds --- mRemoteNGTests/mRemoteNGTests.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index b1d9ac8a..7c231035 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -37,7 +37,7 @@ true - bin\x86\Debug Portable\ + bin\Debug Portable\ TRACE;DEBUG;PORTABLE full x86 @@ -45,7 +45,7 @@ MinimumRecommendedRules.ruleset - bin\x86\Release Portable\ + bin\Release Portable\ TRACE;PORTABLE true pdbonly From 482c9c1574ce6149ab65b84b0649e06bc8c152e7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 11:10:33 -0600 Subject: [PATCH 26/56] added some temp debugging code --- Tools/sign_binaries.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index f3975e80..b630a25c 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -42,9 +42,11 @@ if ($CertificatePassword -eq "") { } try { - $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, (ConvertTo-SecureString -String $CertificatePassword -AsPlainText -Force)) -ErrorAction Stop + $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword) -ErrorAction Stop } catch { Write-Output "Error loading certificate file - we won't sign files." + Write-Output "Path: $CertificatePath" + Write-Output "Pass: $CertificatePassword" Write-Output $Error[0] return } From 2cf38d6b7ce79adbd719dd48722142b634a336fe Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 11:15:16 -0600 Subject: [PATCH 27/56] removed some debug code --- Tools/sign_binaries.ps1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index b630a25c..b4a006e1 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -45,8 +45,6 @@ try { $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword) -ErrorAction Stop } catch { Write-Output "Error loading certificate file - we won't sign files." - Write-Output "Path: $CertificatePath" - Write-Output "Pass: $CertificatePassword" Write-Output $Error[0] return } From 75c60a1cc41f9cbf8f05175b689f0c8f4735e9a6 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 11:16:05 -0600 Subject: [PATCH 28/56] release certificate resources after we've used them --- Tools/sign_binaries.ps1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index b4a006e1..ce9247d2 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -60,4 +60,9 @@ foreach ($file in $signableFiles) { } +# Release certificate +if ($cert -ne $null) { + $cert.Dispose() +} + Write-Output "" \ No newline at end of file From f80c39077a1a98afad33424855aee18324317c95 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 11:19:09 -0600 Subject: [PATCH 29/56] Added ability to exclude items from signing --- Tools/sign_binaries.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index ce9247d2..1c872cd3 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -11,6 +11,10 @@ param ( [Parameter(Mandatory=$true)] $ConfigurationName, + [string[]] + # File names to exclude from signing + $Exclude, + [string] # The code signing certificate to use when signing the files. $CertificatePath, From 7f222898899381683afcdadcf1b477cfb829fd10 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 11:21:12 -0600 Subject: [PATCH 30/56] add previously signed puttyng binary --- mRemoteV1/Resources/PuTTYNG.exe | Bin 641024 -> 649728 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mRemoteV1/Resources/PuTTYNG.exe b/mRemoteV1/Resources/PuTTYNG.exe index b686b1d7df1709d1c378712e85f324d2754f6491..5749a78b606da63abfb698938631659ee2ec6791 100644 GIT binary patch delta 8837 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 GANfC<;M+O? delta 61 zcmZp;qTVn;eM15xGXn#|i8}nv8yMR+FoG}>5HkZY3lOscF&hxG12M<;4UC)t F#{gC}6K4Pb From f5a30ecb337094cec688be72f29cd739be9ef050 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 11:42:50 -0600 Subject: [PATCH 31/56] added some more support for excluding files from signing --- Tools/postbuild_mremotev1.ps1 | 7 +++++-- Tools/sign_binaries.ps1 | 6 ++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Tools/postbuild_mremotev1.ps1 b/Tools/postbuild_mremotev1.ps1 index 3b2b5bd8..5fdf5064 100644 --- a/Tools/postbuild_mremotev1.ps1 +++ b/Tools/postbuild_mremotev1.ps1 @@ -19,7 +19,10 @@ param ( $CertificatePath, [string] - $CertificatePassword + $CertificatePassword, + + [string[]] + $ExcludeFromSigning ) Write-Output "+=================================================================+" @@ -38,6 +41,6 @@ Format-Table -AutoSize -Wrap -InputObject @{ & "$PSScriptRoot\move_help_files.ps1" -TargetDir $TargetDir & "$PSScriptRoot\set_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName & "$PSScriptRoot\tidy_files_for_release.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -& "$PSScriptRoot\sign_binaries.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName +& "$PSScriptRoot\sign_binaries.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning & "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName & "$PSScriptRoot\zip_portable_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName \ No newline at end of file diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index 1c872cd3..ac2ec112 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -57,8 +57,14 @@ try { Write-Output "Signing Binaries" Write-Output "Getting files from path: $TargetDir" $signableFiles = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -notcontains $_.Name} + +$excluded_files = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -contains $_.Name} +Write-Output "The following files were excluded from signing due to being on the exclusion list:" +$excluded_files | %{Write-Output $_.FullName} + Write-Output "Signable files count: $($signableFiles.Count)" + foreach ($file in $signableFiles) { Set-AuthenticodeSignature -Certificate $cert -TimestampServer $timeserver -IncludeChain all -FilePath $file.FullName } From fa7231d77b86be2a0ee9eb8195d53192bf5536ca Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 11:52:52 -0600 Subject: [PATCH 32/56] added puttyng.exe to the sign files exclusion list --- Tools/postbuild_mremotev1.ps1 | 1 + Tools/sign_binaries.ps1 | 5 +++-- mRemoteV1/mRemoteV1.csproj | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Tools/postbuild_mremotev1.ps1 b/Tools/postbuild_mremotev1.ps1 index 5fdf5064..3e1d9d09 100644 --- a/Tools/postbuild_mremotev1.ps1 +++ b/Tools/postbuild_mremotev1.ps1 @@ -33,6 +33,7 @@ Format-Table -AutoSize -Wrap -InputObject @{ "TargetDir" = $TargetDir "TargetFileName" = $TargetFileName "ConfigurationName" = $ConfigurationName + "ExcludeFromSigning" = $ExcludeFromSigning } diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index ac2ec112..36870f46 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -59,8 +59,9 @@ Write-Output "Getting files from path: $TargetDir" $signableFiles = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -notcontains $_.Name} $excluded_files = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -contains $_.Name} -Write-Output "The following files were excluded from signing due to being on the exclusion list:" -$excluded_files | %{Write-Output $_.FullName} +$excluded_files | ForEach-Object ` + -Begin { Write-Output "The following files were excluded from signing due to being on the exclusion list:" } ` + -Process { Write-Output "-- $($_.FullName)" } Write-Output "Signable files count: $($signableFiles.Count)" diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 86c0fac4..3afd351c 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -1259,7 +1259,7 @@ set certPath=$(CertPath) set certPassword=$(CertPassword) :: Call the post build powershell script -powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_mremotev1.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" -CertificatePath "%25certPath%25" -CertificatePassword "%25certPassword%25" +powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_mremotev1.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" -CertificatePath "%25certPath%25" -CertificatePassword "%25certPassword%25" -ExcludeFromSigning @("PuTTYNG.exe") true From b27e5754e83e32a9737e9aadd66905e81195bb04 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 12:07:49 -0600 Subject: [PATCH 33/56] fix arg passing --- mRemoteV1/mRemoteV1.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 3afd351c..81e46c61 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -1259,7 +1259,7 @@ set certPath=$(CertPath) set certPassword=$(CertPassword) :: Call the post build powershell script -powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_mremotev1.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" -CertificatePath "%25certPath%25" -CertificatePassword "%25certPassword%25" -ExcludeFromSigning @("PuTTYNG.exe") +powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_mremotev1.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" -CertificatePath "%25certPath%25" -CertificatePassword "%25certPassword%25" -ExcludeFromSigning "PuTTYNG.exe" true From 513fe402afa44a7578a14dcd291568c12e3195ec Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 21 Mar 2017 12:47:47 -0600 Subject: [PATCH 34/56] signed the firefox binaries --- mRemoteV1/Firefox/AccessibleMarshal.dll | Bin 14416 -> 20992 bytes mRemoteV1/Firefox/breakpadinjector.dll | Bin 104528 -> 111104 bytes mRemoteV1/Firefox/freebl3.dll | Bin 324688 -> 331264 bytes mRemoteV1/Firefox/icudt56.dll | Bin 10432080 -> 10438656 bytes mRemoteV1/Firefox/icuin56.dll | Bin 1394256 -> 1400832 bytes mRemoteV1/Firefox/icuuc56.dll | Bin 930384 -> 936960 bytes mRemoteV1/Firefox/lgpllibs.dll | Bin 57936 -> 64512 bytes mRemoteV1/Firefox/libEGL.dll | Bin 101968 -> 108544 bytes mRemoteV1/Firefox/libGLESv2.dll | Bin 1203280 -> 1209856 bytes mRemoteV1/Firefox/mozglue.dll | Bin 95824 -> 102400 bytes mRemoteV1/Firefox/nss3.dll | Bin 1603152 -> 1609728 bytes mRemoteV1/Firefox/nssckbi.dll | Bin 410192 -> 416768 bytes mRemoteV1/Firefox/nssdbm3.dll | Bin 87632 -> 94208 bytes mRemoteV1/Firefox/plugin-container.exe | Bin 278608 -> 285184 bytes mRemoteV1/Firefox/plugin-hang-ui.exe | Bin 166992 -> 173568 bytes mRemoteV1/Firefox/sandboxbroker.dll | Bin 213072 -> 219648 bytes mRemoteV1/Firefox/softokn3.dll | Bin 147536 -> 154112 bytes mRemoteV1/Firefox/xul.dll | Bin 38634064 -> 38640640 bytes 18 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mRemoteV1/Firefox/AccessibleMarshal.dll b/mRemoteV1/Firefox/AccessibleMarshal.dll index c4486e87ae37b30ccc4d4b852f4851224a8d0106..b541db4c252fc2834796124baf2dfb6d51bb4655 100644 GIT binary patch delta 8561 zcmcIq2{@Ep`!{3k`x4p5z6|4;v1dyoODOxk4F)6Y%-FI#Od*jLrKl`f3KeB3C6dsB zyp%{%k)#bTFQxcDV=476-+O)6|8re)xz6*P`<#1@`}ezl_kHw)CzZge17Yy2{Olmu zHaMMB%_W#ET7piBj*bovrvs>x(~K-isb;D3955z$Ayx7f^yqoE1P~93N&!^*kI=`d zkRA?$!?_c)-z~Juc6K%x-+iN1IWF)S1#0f^CF)AI?ey|yQYK-=I$!ik{)NSqNMF35qwVz5{Y zu=3+7$bkhgSTz8vrlF&u;|h3g@YcZ&v$h>8AHQ8}2tJeo5`2-kFj9CJX>~sUK(Fp6 zzxp0}P1_M^x4xwvffPmbC6J-Lkt#@2EI@@xZ9F0v106jT#s!@@j1^9W!RRhus4=&< zI3dc*Iv^W+M9N7i?AbNBJ2>+0+s$ZeS8$R4c2pJ)CX1^rdbNFa;%ZzgrBmuj?J+v| zyw!*1+N;JgySu!$>;7ikjpHQ?QZtCPs0X>?7f2#E$+ho7{>g!3EjGG=k#Zl-u6?ckY7s zborm&N}iJ7pgcb+Re67YkrFRIKEFc*JlC49a_PWi*?5J#KmvaLWCTy+E9)YQ*B)P9 zbDmQ!s30Kw2686u#+U9iGhP;YWz2Mx?MdLiB#)pNzwKS#CW-bfeDQ6u)Aw2;;Pfy$ zSaI?fAbEb}uPMff5J2#I<;{hXiyhptg_xDiBDagl|z*4f7?3qbV!#gZ2#zSqU^TJ{W8n!3;1$zu+)Bz!3T?ib)`}0Zl-? z5L*bOqSuUlNx>UzRl(J;+89+hBQ!K=C91__5$pi#x(oEo04Hr(F4|TI2rZ0&0&UEL zkOU-3pvb}q0fMX1!%bUoC1zBxfV#E{W@CszD56hJrlV&$bto461iAnfp91T?jIxN` z*hOXZ(DEv?Ef6?3DSDK}ICL)LopU@e@tJr~n#{%vN@q09a=$qC7H8~CWi-|48@|&)06}lJ z!ZKE89m_udjOAY(P=|tPg*s6G0A+9m%XY+oPy&gDXZ8Px=d-?SI>y&-NS`w{zrnd& zG=*oi%dS2-bWxdWM_cG}s-B$#*QRcSA?jOsPR?KxK9lZi+spB7Sqi`(+ z1A(r1EpvDoToNn!*)6qUD{s)f1)JbW$|*@_px9))~(tz*Y*4v1#3>h zk2ynl-R(AF4|yHgj+%b0y!3~^zUhT<(wn1iyt=p>?(FqDCUjFa>E%SPRB6w3_@1KZ zY&SydM?p%XQL552X3NZ@nMYLeqm3m3`_EINhdAA^8IBohHwS&eyXI%Mw6#sDvGqR`E=QIYDP-2e8v1 zu!24~KnDoWMzS=3`~z^9k^u4=s6ZOf0{{Y`w2m?e=;CWwrI1xtupUiDlULZ9;JX5N zt?zT;si+@w@kBiOm#L~0GFinJuM&Vo`w~ci9?d%mga)7nUyl4|5tb{DV0} z3I7)D*bOvi(oQVq+`%vY*z&2Zub`o)W+TTqAVKp(8nGD=0F%~;@E0EZIq5m;x0POWxO+7Afn*@#(|T-eNb{_+ zoUhuLxnBs!cxwRXJVS{_aD2Kz``arcSKbaI+atKTj)RnE_3qDaYDwT?#$)Qb6cEVb zifM~G`xTFHCjG|qb=W;BbeAXRb`zsej_OJ6yvtjjvP5uy6^*S;in~CZ{dT&ZT>v!= zy0Pe=a(g9kpD#It4z0~`Uh$Cf%PX_4<*=$vrrC)1P z6sv|p$2B|ykt}=>?}CKf9!``3PRi-#h7AwFd(8$?fxdQmH;I%BZDM-h(HE_aq63IX zfXXlc@zt$0z6#duO&r!cmVZ1;p}eNUsc<7-u|Y~DVFO*5TVezNe(2aC?ZE*NGl_x= z3qe{^KtD7F1t`*9u<=RR5qu*_1f(%BfJngyZ;&F80Dve0k{lRCK%O?4o{uI8R#*8+ zu^^2iDS=@mA|-Z3nrJ}cL=&Ki6Aeh3Kw`#)Vfgj;Kf2A!|nHlSSky-9ma&$wW(BLMN z*k4j1k1p5^i zZd}6`^fLAMa{{JFR5)CGiOeDzp2z? zfREB$$~o75+b?c(!FlU(v{hX5FqQ7Pxx+a%>G7w#K6@8uJ49e)a*~dx%iT@bxnJdd zk&cW|Q=S|qT`wkYe{W2g4%R%8@HC$ucct!Ye!lEh-9hT#tvOZ1l{vr+N|5Am}5)i~U zP=EpQg|daxsgfI12$>c?AekIY<1|&WKiL<*B0T)p*$rYwSHKyNSsz2pxOvTfg%(#9 zShEL!@3Y{kGHbJFgt&2%D#U>lvg*n{lvR!bSG1UcPj=pu4xx_*hs?QC95x|GkL?rP zKvGHkJJ~)7muz(_6(pts_tgV&Jw}&iRy7uKRbw$C9K?`xfbtI>hrxG#zq^vrv@ZkP<%ypEYU$PpM1#_l}Oj#SgaqNMpgq$+j@!}|~~;9~Te zcpcpI0sis5(UgYdEtRG{+@1c^XPMg+ctXf*V{aU8&e+-1wvT_IlH-moQEpaCiRPdR zl)2NRN((o|Gxcvy_?SywnCxIHxaGv|B&lWVeThStvuw*=?h5mvQwEz%{n9@=oR_I1 zf|X~`2j{##**7lflrCURF3cpDKj!6GAjA_G{4KlnPn=y!Jhhzm+|v1)wNBg9Ggme* z2Z*U#)Qqu6CQfx(u{>x?W|x-ctP43T%`Oye7}a>^(UZ$JshLhb>ScY;s=puu_JbzN zJT)Ud4#SPY)2DVw022ZEOuNq74X{4t6z&Ii!JL}g-ZgzYeW1CdSKLjKh^tLcd!JkP zCg4n1)5zFSJ-M2ZNj-PlYgQ7OrfnZegdZY|IldL8+x^yiSn{Sqh}s_hmwTRb+weP^ zFx7;5;XMVg!G6{yg}I8=CYN;T7fmFnePIQsqbD-XSD_f-vwRm^ZMEAI+c6(*%n2DXym=GF8Agx!^^z7`$_$ZiNB9O8-VK9%|GFUlGv;+`1#f4=h+zI#%izfr2! zcj$zR^MvjI=9a@U#`@X=qZengSy?#!RmY`Ysra@L2bSw!pH3Y_l%&`_S0$Jbpbl1 z$3C<_?r}Y5D&n%NM(#geWyHGu!+u!x&DhTT3fqRWowpo5Ewy#L%eiy({8Ig(oQz{g zbmuhUkKqYXW@bk8!6RV7M5UIak~})bx*VCI=&%4XCV)<%1jE(L3FGnwK!XO^Vc zjz)D3bExz1Pvok0I6vsSb-~Vw_3AFUCS_Z@#1Y{#4>025bxcR*^9I$y{XGq)(e`Iv zRZ``KCk@}!;pTE5bucN7dUfFRE5Ka^XyyV_YVW*W&r8`*UOM!1 zUV=pRU*;tmGQ{{0G;vOArK}d;2VYikWp@6CW$iBes!^RNwS2cA;wQrYb4CE6ln}C> zWT4c92fY4eYWgd={x_*;TLFW=6( z!E4^L_;bm&JVdbVH=)w01HTt=4Lo>jfixTxvWi(yj_mdu7()y*{H`APO z^k81lBS(1)=}*doyd0HaM<4EJp1ywnXToFU@v(~f<>qcR1LCvO!Bth7FJ9OB^<3m_ znQRjBpRI;n$haZt<)NaRPV7rw%mJuO_aI8Yyh`UV*hc=Qbrk=NPWMBD|4W??(Y6jo z3!|g1sisNO=^KY@{(%s8Lmkh5(CPoHI)VzPbr`cHFv4KV{vnpeV3YWmg5z;@YKLb? zKK(74NGTc5?zho1IM%a_ekGk*nhV-!m-U88#VMjiefqU(s6N%IrO9d|mw@^^ zj0vpyl$8Eh%OtHmBRUMWF7vY@Cb*K`l$74qh~Fc9)UPWa0L2e|{Gi^$(~;9X$kJQIbaVeLauy`!D4(gf*kwVM7#t*`*J4h5NaNWA3X+Fr5Hk zDx}yiCjER$=Nrl@_nM2np7}I92Fu#addSyKAjPMgQ)o+PoqyTw-4v!V)XOM?+K_=i zj9-#{By{gI71}w<2HUXAS5)3_j`|jI>i084&HDb0?4V;s)k(ACTP#M-Ia?2EN0z%y z;@IKKx$h=|t-{?D38#lEJUXjjnD^}OdJj%ao{k$2otO7#7dCqmx^2|(xuikdOOEhG z--`3W!uGZ9vU~2Gy_X?Sc0)N)(38Q+Ih0on_K}yHqa6!wUj91!r7QHvgr<3uuo*Gq zc8--W?-e2_*ur|a|4XctS@ZQc;zD@Gmpxho1020kyPTE}UmZQtJN)Uk_tk(c!%G#X zryga1B&qK9f)n)%RR;>W&krtcZm+L%x7ACp7g8d_Sh?tHc)e%#s3s2;hc3$jC+0GS z)1B%s>ep1E+O9^yr%L-#d8zzLq(4U0GCf!<_(pDIf)qYmi?tj8w*{#1oonqE1Oq@1 zHC+HU8mDosG$$`@p!>g+?|!T7>H)X`%7sdW3aN7I@t9l(OOweJZfYste#g_y^ zwF=Y+K^6Wb7ymkYbuty^u}ZX5m_3xWtf7zP29ky7fC|$ERM%-1Vp-|G^#fd`S#-Fc zKcKO}Lh)}ch@sGxLTtzMXL@(D{K7(%2F{E(JJybm!LD)E((Bm&+KNeLt%$xv|(U05KMEC~V75|%`0 z>dKV@SqT~DzcOWg)eU_Gn#K2q0n&PmfVvrWmVf8PFYLThlnDgq&ib>f&w)KD zo(Zh)pK|Zi7WEt{lVz|tf^C`5oz@>VW^rROKcM))AAa?6-n{Hd7QHNym&2NAD2p3` zeLDX7g>oG;I!DB8DyeaakGoyRUeP;+6HhRI_H-^|9m!6?Y`Nmzg)97{p$cint%rr5YnSVR7jRa7+q;Jq%H3zkafk)MiOS2rquu>N$(Sv? z*BWbh#u5%C+vMpUOrN#N_K(w}|In8wmiIfsdakf1vOu+JYLbdOxj;Of9(xCuWkMSD z)8wt1mlfAeKOCLdx;v<$^?|X)g_y$`Z#tC4EqILYs@uwUv3eAww4^^4j+r^m4ccLc zllJ*X4%P)KEaK5k`_60M%H>Th6%X*c$cR=g4^QdH;fhZu%w^&1IV*=tlXQ-G-%`Jq z6Rup$J11clcT+TR_ti6pXQgy6EqqnF|AlH>_^HamA^TlR-IP?u1@)bBQi!57<;WdZ zUnlTAxyJ5yOSAW$YASE0G)s#JRhJB!7Y8||9edp$)0T_#9kqH9t@4tPOClnKOuL=t0djzmIG_0dHdwVSeVI^(uK$Yah-B zdH;>01z~b2xJ4#grbzuA!*ZU~rBexp(*zsVG9ajCcE4y6$5+yUiM^f}D#I4&wtzts z0t1kozS6z=Z>z5Vw&-%i8Ns>#R1UH*GN3r=;ld1bg)zWpM%EPpN7aJE*fFdCb0Iv5 zt_b=7Lf`K(S?DqB8>S($yEKf!4INjgA%>vB=?>6^i*7q}POtQ}eXqOx(CwsT_om0k z_Cz-gV;rM1i>jXOSF=#fR2^7Im^-!jmEq#9s1r}b(NhAAC#FoLq&Yt>?tm5YfO9E_ zTbf^3@9ou08L<$38#x)qpLA`HaIom1Lr{LbZ_f%Y??V*ez!9(Gb<&BNc-g?FV57sM zB0LNjGnIt--UvsyTh=j;A(hUL?4)}KPV!NXn!PnBw7{}kdAXG~cC&@&pH_W6f3bg3 z&E-Q|eT0W`q-Yf0q>5So7#q)(kCyD}#EFjwh@@(sp0MPXpFHfW^V>TZW41h{R~q$c z^JSZLcahB0cmgVxAsdT|akY&pQ>iRImXe8nArI|R{Ix$1d`_8GuN>bzz4hddWacEB zed>MR=$rQm31_;<>dVhZ?EH5A>~eX0>&(e*<(Xd9qe>uEyFM~#s?D%HPt!+JgT>28aRyJPe$p0x?gY(Zq5(X452G95KcTaHPw zfVrr>0!&?RR?v%co!xeb^wz(|?oGv$d|x-4ZI`L;az~dC0oT;ZESs1EbnLWASv8eq zSF~G%1xiV-o_g-uml08^oN(mB^o2(;UwC?DWNj0lo;(m%KEBw{?XdHe+vnK3-rYp^ zOttfE#+jm%pm^G+99X2c?!Y?_TVIyJKk`+6i^|O?qQcprJj?VWb{H{K*aDQZW@$Je z{l8s`fooUVzuqsyx&L%6w;|p=pm<-u*oUH;?fZZU28eziurOe_pyq@YpoYa@v>}bF z;R=;V-|Y|>=sFg3VXGe+=_k(}xbM29UWu)!v5$N2#$2!h3K(51s{2*UhiC)zyExLA zq+_n=)0YvKO&nm8qOuM%jR2)b1@yyq`-S=`KO}F yAN0|tykZV+Eg71oDmv8JG>wdfwlq4K`Xi2G-|kkPjXTm89HuqLo(}y_#s2{cP?vxJ delta 1931 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 Lnm2&{uj2mzV$i00 delta 1940 zcmaLXc{r4d9tZGw-(eUGA$w-XAnUxt5K8u?kad)One2wij4YiD!@;@M5R+Yq$}W+m zET@P{7m+0t5++d{OUpPt&$;(L=iWc=pTF<(`~LTRKJm+l7fpyJI{;L%&vgKdK|Aim ze4sra0D?0ycHA%+3dBc#%uiRgrx8ikl0_{L;uxvv@?Mi1#;y8hW>=bTe_X8o=cEfiR%MH zM^*yUN2R}#WZl&+`VpsD%GW2I@ziOI$mtQFPz)Naswhx>cvsp6A`CwS8WoD5Qy({ykzm!Pyaz_KzcO}CDhIM-EXcvgKXvcr=(N7-BshW9V~#juiQv;zzg zN>*NU@~~RI4m+9C5%0Xr|Fi?pJRvsn>`Dp6#_xPd5}%*2SJr+ALqoX8)+a(qu@)&G zmH5Cc+sn~+%sg_nCf10k6>S~#kf!7{*)d4c;c1|2nS%m{|pb#00Ef)8Eupc$*GFp ze;f-{CmoXqVprLAQ2h72tTNoE@M?@%lj!}3G|yKx*2^oM1|bnvHQZZ^?N7x!gn3(` z)(LuE%85P3><6JYP7A{m@m#$1>y$jB78=V<_{##%=w|#J{dX9mm%Wf5R;FsQ^voaZ^a@(Uur(l<{1b80r`+I7o&> z5Z-0XNO=0vFH+qKS@`>)R%PU!$#8?=tx8r5x`wsVvZDOqAN@s+JIzT^X`O`280})( ziHJf`|5<op7R{?OUB@5BHF@zF4 z@|lSd9r-xc#)Xrw*t3nYxb&0 zX5GX?03my$Kaf+gPrvWtyZd{N{)p;rNo0=vv^rAmYwtb!yY^>tJPfP@?1xPV?o{DrJ8C@M;6b8=t$T8Pl9ER&t$vccLa*NBG**kYA_o`EhNwU{T zl6pU>iJwS@Q_=Fz2|aZgdK(`BteFTk)7Gl%W>>0}P%Q6rJOkYSY1AJe06>cWkE6dM zhD30x@WVk#PFQ(DZNZg#04?=z1(BS1fuC+^L)wroUI$Om(r_(c)&r(=Wdx530^k4` z$3cJ(e*}`O5RVrPq|qpPI9yazlsfq@{nSa}!#)M4_P6M5;|Kd zBlS|>A}(0w1`ByLWWsQ=wJ)S-rCD2RB^4?%Zfg4H;jNo?B)AI;bd2 zS8Ny$DjBGcK|Qu<)lJCB@=1w}J8WFlhip)qUreP)RkJ-WkcZea?GAdnh4l+k&CVV} z5;vc;n%%-OF|uPQ3#1TNKc&{vI8XLRQCeJa%={h|PF-m5dHuXF+9eljta!Uc1XD4e z+a>;xLEW_rX0GzmvnOf(y`BQ^EM@2`UE{0Y?%1tZcUJ23zC4-rMV$Ge;p^D>Xf}>& zpK}CW(n6>f^FYlvN_p2Mh3)N!y|uXGvcJ1@%CUz>rVP%*HHr`R4a*4OdPKxw#XHa= zDmrJkR8{`iYS7A+3nc63UTdK28SV`B>N#MSWqT#N=oe8h1*$!-w93uFyvOLC&I$1u zZTU3uE%}hSneCUb5%WTnZm>`jzq7mcn>DFUK{Er^apKHssq*6f$*0u`FE&L9E(CLq zGTEK<;ggj7_M_{Sh)!c^a^Rr-Y#QlUfP@uLW{kAGylr1Lrr54(+9T_-ohR1f>%d>n zPuw@x-y)-kl{Vk?@UPpnDojp~@tScZ#U^!G^QE^=%yNg#k1fB?ftI@1a*39_>ELAl lTK+LkSln8vV5~w@=t#9TP3>yora)y%G&?)|Q0;*v>`!s^OiKU& diff --git a/mRemoteV1/Firefox/freebl3.dll b/mRemoteV1/Firefox/freebl3.dll index cd0554d6450842380485334d1a47b84d2dc2e082..baaf9b10b22e69c3dd54cfe59bb69123d9226b91 100644 GIT binary patch delta 8582 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 SJcjTO<>#J@K7~WStN1_i&ZW)( delta 1952 zcmaLXc{tRI8VB(C{btEvgs~T+7$VGXG-J&{C~KxOgF>XS@0mf!jE1O)PL{F9DWR)q zL#Rk7OB@^;oQBgVF=Xk;Qk?E{?!C{s_mBI>_mB5|-tT|!^GPa}8JNM=9S1<~&}?_$ z5J(Y8E(Ov`fqw@49(Y43fH*yiqlmy@Fc5@691$xNT07M?^$P~r0hVz@NZ(fw7birV zV&?-1rc_kb7@1}PC0AUPD=1pyb|=@bzk6dLNIde|q# zPu0p2Qjy0H$&j%=nMi{4NhEi9%mFfFK-B-&2<;*&Lh^rgCI72SrC326uG&`wj{Qm~ zR=Sj_mrYWgX0?H#J=1|1{mL8kJ)XK}{9JfK?Sc_kB7=vMwd(;2<)QwY z345sL3)eLA(gIwHPnFG57)Z9u!`lbugYgytdiIOeFrFf0=DS0@e`2_ncMQ2a^P65& z`m;wt#TVQAi&1smr=aMo?{4X~C#$GCZyK8#eKC8nn7{9~yErw}q^6vt7TyTX|9@~~^KTa-S5uC?^}@t3x1;$nh|r8c>|FOF^=q3o z8MdpZ8E2_3D_ht7E=kv{Rdy}r7;ZbZG(>F+9c)T79Fr8?ny*_N)fd?9Oatj^%x(&;$FKFWSG5G{JrWL$z-4 z^MYK_9?YtHxzo9KN;k7=MXFkk#LyZK_j$z4BH){~Xq7AOS7}@ohNy=|$`b>{{#sS9 zS;d!)gWT;@NEUVKdVVxKLh12(^wdXHCFQTsA zONmWyA|>DqikYTSg>wGm{_HOug}%ZNU4;PFQR?33v23*1OBGp-|lRHs+etsT^)NC_rJM;eW8r2_Fv805)hUe*_)izq|+3y?r)I>Sz zKf=B_g%EzIXfM~y*kj2*eITuN*7}k)+eX#c=rjfg=X^p;v=oOE+Vmx& zB(r~_rCFtVAEfI&r`Jiiguxjq_}8Q-HCIgLJ^|`BvW!e;hvr+&7agSI#az5>7=i=BsCfrj zZ;$k5`Cy3?LSi_zaO3jajo@g)ruVH6n;(+^b&uwzt@vmgywSYf*-+BdXFtI4w!le} z*j@k3#qa>SlwFwCb#WQqiaR`Wu2C&HplIhrOiym%ooM)jvX2)CmWd41`P5J@e_>F0dBV>3M*LlW{;?{B#F!UK!SIzHLivw|xt4}$gcp%#1Th17*bBoo zV2C9NQlfJNp1Jie>gp(7O6-y#fe4=yRm|o!_B5Vh)7;c8nzk^_1a%xs^7WlHPs)%? zZ2dLpl53~*>9V+T=5D~4wd=Um&}y!T-=Z< z=wz}-G4;}Bq3)EcV%)d5D4bw6n@v{dNm35Yyddpjls$Y8ywCX+^S>mcr z{c;A5x9Ej8&E320;khb}PWfYf%{u;)N7pBBx%R?&TTa`K>JFk?Z|}BNho4=$u)csN zms<4-Z)dXm?p>(_OZn{So)6Eg6^kp9rPZETbv%A~xkM%@M??D9uZ%;knm!|MS{O8K wUOV diff --git a/mRemoteV1/Firefox/icudt56.dll b/mRemoteV1/Firefox/icudt56.dll index 103de2c513538d1b50d39b940326e51ce93f64eb..cb842d86052a5408d605591125edcbdcab3a2ca0 100644 GIT binary patch delta 9210 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 UZF)^@mm9R$qhRHtx?KhH4`d!%DF6Tf diff --git a/mRemoteV1/Firefox/icuin56.dll b/mRemoteV1/Firefox/icuin56.dll index 7cef9187749245f8f224cc3d4d8bc35e1029e4b9..b219d9880c7371c52a9d32ab40e72dd7ad15f949 100644 GIT binary patch delta 8651 zcmcIq2{@E%`!{3k`<{J_-7wx6d$yd>V#}5&OAQ7iTQg(J@-merQc*;*WGPEgp_DB` zWjPKdva};@5^*U0?^w#|EZ@1l>;H9K_to{h@3Y)q_wRTA?)%Y`>=4uBQ0W9?T(%ZY zbB39~8Bm9FVDULHy1^l1gbV>06J*Sgu|UQO85?Bmka0l92^kk;+>r4=#tRuAWc-i` zKqh!22PWihAkBbcU|@j5833BhCuTO4xE*nGTrd`R9!=&2^k_6g+DIr8lt2MA#t)D= z<}t!ya5!&t+S|p*ww-$>EwVx%GJn+vxW2E2F)=X!u}N4CfQ^~a0l_Q)-)n*u0tDy- zRsl{&B85sM2O#l;AR<-};HN)k5#TTlCc6^?LP&moL@W=q8}yW2fO(e>A(TqQf|7tZ z{RxMF;OY}3o=B#Wyht7dDk(4kD-B4}Uo#2_uf5(y@`sKg_y>^!ypeblKuUxQi^Jk@ zSYYMfUJ))FfW>J5I1Md5Exo;f+XinP?6GUdu?q;=hx-!(s36e;i4PQfiFx19R1Y=@gq``Qgj}Bvp(_k=$tL4|t zc3EUd@Usudho3?@sss+-RJe<$9B6LD*z5%t1)D=s@GyCNRsM^uGZQx=TBx0<$5p2p z;B!{*8>?=Z${pz1w^jc)({4OJMTC|_szP^UN|lqv6|4?QU&W3r+7jUQ#ig@ms!U;9 zi_{al$1}&5l3zF)8@8nmo6kpRyb5PuoC;1b$zE<{w9PDi?3bHHiYF=`KH9ur@a{eE zzP{j-rr0TIF6wA1s_ensA~jNRY|dO9yx5YXcIDV)@mQ&%a1>$g>_NV|7dH78uU!{j zb6-@=EhQrR2GS?)MHcPcVY)2(!jvVI70nFA84C=CPyplr z)cP2J#R>aRsX?37)dM{!K^W>v{9rr+{Z|4_QUC^9Mz8|R(0_0k17HmO7A2(-x_~yI znTN{*;xKEAJ;;6=)~bW6VYM-;@Fo~&(n?fI$|E=d_H`E+SpjbPwmkHs5D;3J0VVpF z4VB&Yuaajrnf8h3#D|&qMDp$`{inXM?-ILC6 zxtr7KS`W6E)kWpd*B6H*9W5^rH@ykp;x3;a(B7`&dsv1w#bk11(9u{j)GS^_nAxpZ z*B8ZKU@Lk!x(1*j3P1??No&aG{&hz8-cqAh0Aj%RthkuXPd@)ADE(JR0yjcw70Uot z_YYXc>8)eg{hzV?lLMMiFs)Dr`X8VSu3*`o#O!UgVh%)gRQ2!E_1)n)N~#N&}jBF?$eEpzXs^GY_{ zA|KL+2>M%XC4c4L&5^qOYuS}AUWVJtgUI8lo7gf}A3w|g+ zG|idV@yk~ZPb8G9Q21oCw z0`ZxohQaHON&2IRi-%CxDwU$Pg7r`ehO)xeM2{7~ z>wKRJk3;{MOCS+2KTTDqQYdO31T}9Q#)C)(4CvlTBeVbw0Gp?trxu3>e=Mgn!#^yC zDB<6t9k+qzwzZK8xXlHn9$7xI^AIt1)2`zh1ElGG$RaiY!eGoA5&p!3e@wbiMu9Pe z=~tanVX&M!;ST786&z7y3EXsTRDL+`;c3RwxSjI3Sz8z-M!H{ycgXlKKdHf0`8Up} zDtKtTGV}E38f)?9o?|N1@{3FqZhLd>>9sc_$hLz#U1vb*aE;4oy^b_KY%Hw0O9_E2 zDE(w{H$nLncg$~mUq@U*0<7J*w{9~D;HsR|&APhz3EM&5uM*)^F%jjYnQz%OoWkf& zpfj7{Ip-I`4+LWU88EtBmy}PaKEF1zw**!pl&z|6CO(9^-Le#R+O{R`DlNfv%CO2d zKU@QiiKrb0k!%77-};I=|2k0wII1R^8Q1;_-fuKQ`FPl8)sv{@t&#>{>a&(Qi2+0~ zKw}z!_^N4*ul)3Tqel!*=bTAVD!Jb7n75IyI3T4GwSg|oEV06XAoSTG?ZE{RGntAH z^ha7!K~D@84JgxJa0sC6i5|gZBGQ!PO`;O~Hb@aj06-K0Ne-+sph%z0C_tA4tGoO` zu^>%?sXl>Z5;c59nrK1dL>r)s6D>%ZKwQC6 z;4c}jq+e`n_KbKr@3iF%#wwz5gvKyx=5SF%cI=7u@B0hV91ddT(qqmfD%^|OnV|MA zUr$c7Axi<9Xb_f_&>L2)hck;NKFMLkU#tF_lY8S#(9B|Kvlm)qtGihE+_dGL!Kb@q z9~x2j#Dlig(d0u*!m&jYN~gI-_aI%j<7&RfuT$J!=wt2vQ`V;o-k+oa<6o)}dIEy@ z1`04hF;6~EHcn=P3Zc;B2c%H^=$xib@uGMTR)mMwI=ey4xEF8&AJmb!1i_6^l>hqNHBcou{NZJ4h}6V@IFqtT@2obcm|hb z)F$ZRKOGYsI~+=_jonsw;+dUIMI9!se zCV^$=F~?{3ecV;Iq*pYL+g3guW%h`lZ=M)QWb(4?Hq5xN6n$+Grj1_flk?X$ zEqhC9T3mm{CKEl?WyRLf8p|mw%U$h%QkGLR)HtN>?!(7d>uJf3?wZAY!<7q2?*wq$ zGT-&5Jq{yvVxP{LO9K<$IV{!}><8GNaEtYW)-cD$*0&AcvX37;>+-Aya$^#`$^L6y{|rS8ltaSF^ZHn${PXn;kllbg2T(1fLNo-)pDa7Ttz@e>(@Y zkOtN%qkmbzVr!Q#VVjdwe44a;-vAKL4@2Vg?i$bY9*HrKq>N2>HH7n?Xgc@&XP&3? z=zmM2;D%!J2X+5D9;M4wZK%M|z-nu1Y3V}z4k_0kLtw`Szo62S58$D5Gb<-6KF|-U zH$4NPa#(()9%kWWHYEmx5XtM+G$SXcDItX9iL?(Qkcs4sO~yhpVC%(&0ye|k?aWS{ z5$!z|A8YpV4}ZfHurfY0uFMouRMxlEbN!_B?AC7ceYw|oG(K->F7rwsf3;My*?k9( z*{r-Zi!m2sanfBo+ZS$d|KP-s zV!~KgGn3gA-laX%zO4XMuB%l4k|(7Rtwz|}-{M}D!}+YZPCDYTvDfc+pTG}H8Vc5- zdOe0R_Bc)G4`7=dma#TBJ4~LPPh)4}_EH~{eWB*jN*Y+Md7T|MayD*a%eRV0yQZQ^ z?sIMy{_KUC8jk~rVWa^{+VKRI0_wee)@m}WLkcpmgSnT*_Oye>pmF@$#vH*@@0S#3 zU6m~EJ~zsu{R)pd_SW!v!4ck2-J7F1mgAB)+~c{P-Qnn-6Wl@Y8RDH5vD%s)zrWgB zujusqwnsgCFK!p#v#desKT~1CzV&?qtg=45GpE$9_CjZq!^fr8_P6PGQ!g#m3@XU& z_7Cm+g!nQtA;HSZj5&S^%$+FH*{!083A3q<5;K|}Ha@xueV)B;7h0c+GpdiJy3Ov0 zQEtPaJ4d)Q`2;62)!Usq`kKn^9ocVKD>SIu*+)MWD|Q7BUcQBGPadsRA57?}-5$E@ z{EIT0!pNlYcr|`D^I;PDqnZ08s+U-Y5`$I;9bh}_FDY8LxNjhfB@hZjK{o;knC(pAD%6AZRwVyH; z?y9+w)3854{M@UP`$8C$yBoK*i7)4Plg&CE_I*8I!xSm}UR_*DZ^v>bcy`=)ob{<} z^&@0qSZ~xjdxAbZmuFO~nf9#Yawx9eOH;q5L$qbTZs%4FvDq^NUYUiDo;kc4(=w0Q zRuNggZ_cgY_rhPY5Po*wM2n`5ea__>=y+p+G#(VS3Y%9A?)H4eXI}lX>s)5A&2#&2 z+tY(EgIT^0cPm=RepDUg=PCo+`|zn*hKBvW6CbILy(+C)ZtT`DA`NHzRa9s{dtK$( zbD96nWP_;JOeL&5>9)*1S2g`aQeW(1IzVH&4{`d{RX&HoHWE0!rTA}zx+ezwUkY`I zxAm|(SUpW`4Q;wm-#A?J4}{1YYI**HQ2$>Q5;Qoy#h4*&EF=crNf=_Q^V=2~mU||m zTI1w2*}eacHWDT0*8L`Q8qa=#*|V@SMSEU%Om-^3|Ej?Vx!|ZoexG5L2D(qZVrjC{ zWRG{vUFInE9O}{jaLX8-Lr?XX?Dovfh;PFe_8vXj+j8)8u)F3h)nlO4i4X5Jd-&SZ zyX*{aY4nd+jdJLlgBH2X3hE2h!V+Yy&<6&tV-KDyB#CK*ELyd-Bb)4Yt(u%V?&TO`LdeO;d zP&c^5c@obFU(S3x;b#@(tW3-vDRu3vfMMTpzU@6eF_|4P7BHvi#VNMqalkJxjYnmS zBA#;vEqat*@)O%t@3!j0Nf6s!FR4T zU=U0IBh+>QIOwFtv(lctvVrgaQowtz(yJ@r45;R*5lMl{Yv{@XsbWd= zhPJRIK~q;Q6(}mmK(Cc4>$`5~EYMecZy6wMRth5|A%sBkBe?q!kpwF84?h`5FB;cB z^M-H1$IP}rZU-!G{ud}SL%nGR7C`sMBQ6A5So!?o8-^G8{2wb7nC+rrhBLzi~BdPW~*LL5leE z5$$-i#ciKHJukyNh4yK^Qgk-B66M45*92b%D8-w$oD>_?EinMg@m8K&yGN8tT&5`zh}LL(b=Ub`MV*MX&C)-fIAfLO6=A^mzAsBM>od`2Hm@f*SG{6tl7>G!Ps&aV zzl%@VMtuDM6=Bt8-g zn?Az}+T%uIj(7zRR{JO|5-<%%F6lO9^2ZfPd3#=F#;BJB9c@qNiA*HUrr>vRmyHy~ z=$+o*q*PX?ugU$DWF+_uVeh_*ZpCwnRt(vR?kA!o)a_4 zB!t*@wlN;qZn;J2M(*$uCrs^KHdyqTTmB5pM%O0IdG!W*(6f#2f*Uj7t!(0~!wxzx zVi$Fe;N6iA#&=r~Czt&0$fe2UYrbV#&O%)|7iIj3Xv>N(nFlj?z0AdqY`d9yL-Syv=UAyrnaNa)^glx=AXl_Qh7!yNY7_f<%eMQ01bl@;f zEIYuO2ajRMhYS$?ev`?@h~?Zc4Uy4>7cvDmG+m*d7=i|8*h!MS*li%RY+L2zcmIIh zR7p=&YQ&CPH=D;=-45q!9`)>VIng`3TUY4g#KD5>pb70Mo3sUC6T8g|KJ4FYWPUT~ zN6kh*>hC$`o$!Inyp7i&tA6kVGa7I%a=M*Wr-Yo773 z{(X~@<<~b-g}f06{H2k}OP^2rg5j3`cT7X5)a0=BP9Golj5GJ1mpIjIwbe$o zBoH@qfHgTwm!q{S<)(Yt{n#r#YF2|SqdG07H{4HWhCG|(IatBNd?m^s`#Ns^yco|e1X!f_gM&SH^_54sDpXxLAY>eN4kFjg`AN#l{t#r(=lsxn1{0qcDXj^ z*W4j^-=O^Ef}s5PW7LXR$NW91YALr>>`9Kxqc*0`Q0MRcc6_2S_=!xdh;z7$aCb=R zVt<7Q+b8FH#>1gXfv1`K@Y0JZ62)>7Gf~@iA*r41z&mQHjG>?PNom$@#9N zHhjt`S2QbDr`2Us&@cL7RTyK(KX3aGG2eM{4&k04WD7?Kz~rR0MT=s3X=~v~6iW;l?rANGplsWO#Xe zTz9(T_LqR)mzx**vhVM;VCA^=SSB&;mvf0<2x9r|r{o`EM@BK}4awfgoBagmyF0Yr z$z4!Cmm|@qdjE~^RngRYYUGTU$E{TqP6xHrHF4;e1ZpX|mj<-g`KpqnJr#ew-LDA! HUB&+a)rP!U delta 2021 zcmaLXX*iU7AHeas?^(<+mP})3rtDzmj@@6M!Gy93CepTryn zU<0~fPZa}c#lXLSFeD5GL&GpIF&GwxgNef=V0f4$ObR9qlYy;+$-)S*_4UO7(Qhls z1&cr+Ko9|Ov9=hTUh1yYACiC=c$tf(!Cw%cw2gR@gQ|nLs2Ye1UIcN7Z_$gYmSf!` zkmP^o0SPn$QlctAau_5Xg~Urcg`WsMa>SRs(>K(gY-&g0%>V4Vy4XTozWQDwiStqd{&b;8@8bLYRJM>r+}!~b$U|LMOZl4~*Qz>!_(rMSX;IHtw0C2_h^xGAHq$UN zw;FE4bh~)p+0n}k28H~D_k{`ZO#d~4!aJ<9cA(Ag%(xA%Nd*g9d1-<4qC=M_T-az1 zz4pfD$q-HJK#If6b%an6vOFw?@A~+zO85(U?#pkK$c)Ez!A0p$x{5H>?T4V~bDypm zJUOMN;k;~SVfw@J=}f-P4G+BQ5%XK6H1)6saB}3_*-sHM%{d_=_f71jtXZSNm$WBy zT3(y9WO|uBQph(TEdXTYfnn*pvI=!Mjak_}vu(yE9L>*FWO>6Iu{pK* z&Ytq1Ptw3t#C-BE1KyG`QESnIF{mS%L4>dEbs86zZ)NV9_hTP(rGHy3@joqlYoVfT zhPP#HPg8y5n#j?vICD>;;(^8z>%ElT=mzinj}cR&A;{KI|Kp zx)Q7gNe2^nLqV5`U&HV7B^|;21LP?H;qCij_}EmvquBfjWSN8RbuaNtaqG)pB+8xd z$M&(JdNwW8JX$Acv487Zwb<*z*>Y;;AczDI!2cZ{k_!Te00$GvgG{%pQUPx@pz>rL zP2j}%stc6(lb2m$I2T?{va6PR5Siiqp<>VI*h8z(NXH87%uxL+g$9DeJ?P#$4lm7O zf!jYRJM1>t{w`5W;`T%Y&*pBFh(Y*1DBd-d_>uDzfoWMC%nRO+V?|`9DKp~f_aB62g&bjf`*y0SW|Rr|~p(Q&m3(b(NFy~#7Jg|728$*~y^X>lZzq9}{V0=a-mkRSYeqYtQgCUFqVDH^*%)_rQB-g2Y%O}Zo zO!w5`NBeCIw}s(q1#H6Ae$#il{B@2Og`D_e@p!KDY zpb{E!IjNE#&mgKP|EGdDG*uezmI-76nNdyQewldi^BKe)96gMa0o zr3#61K~Yf==7xr`v9T1^U-hFf!&!g7RRE1ZaY2NV^33hPM?Qflo43~A&PSH{l(`pG z;9QbfJ@;8I6HRxY{;}49?BwMhMb^x@RO6lpC$|1Nv{VqU5_z>ey|Im8#hGE*FMIDj zt|d_4vco)0V7M!%CnYFf0!e6oHD!$`yJ_J0fm1_i^=rJF!BD{b{D!RC-8OGm+i+kd zNwA%sroManidUXIQQWZ4LojmF!$XC)VIpCjWEs5)#VI?IhLHPea41{Ps{x#9er&43t2b%&B#G* zXQQn=Gn=EJL9P~K+s61ouPsZ8@t-56BIp-s3MTt&_igWA7b+`!d=}x?IEW$Zi-u?4 zlv78r7Nha0#-Ae{9a6eIQ$uX%LuWOzvcq&{=0j2vMEGK>3c=%HPFMG_;OlcT8CKJG zgho*Zo|S1c%#z8KXD%$=vVSvRtQ50!$viH}A*-oF=a8rQQ(n6C5Bu#oHQ#&T?yHZN zZa3OTRSRj3R*D;YCf(P#WMgH4Vr}xj?U3fwde6(U$5Z7D+YYa~&%Lv&gjs1GLKhC@ zMy2e0tYbN(_`Q;}Xd5$y>G7kP*6dpl}f;hRmAq3#;+MEnULPGEfi diff --git a/mRemoteV1/Firefox/icuuc56.dll b/mRemoteV1/Firefox/icuuc56.dll index 4d9a4d56bed400dbda5278b3722b71708ff67170..724e483fb69f8fb9d85a82e645305745b7ea56ec 100644 GIT binary patch delta 8622 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 W=4jL!(zYYl$)4ZZC=diDA^rp|cV77b diff --git a/mRemoteV1/Firefox/lgpllibs.dll b/mRemoteV1/Firefox/lgpllibs.dll index e0f7787d400b867ba309f5b529c300e14821d1e7..994ddf41931e8d42df96ede95399f984f9fbe76a 100644 GIT binary patch delta 8563 zcmcI~2{@E(`@R`t?7PU8G4^ddGxltGN0yL1O4JyGk*%4rFApOm?MhKuB4r6>DP>8v zvh;ejk&p<{Dk2sCXDsFIUB2)5j{nbb%;C77=f3Xyn%i}r*LhvH?q=q=dFFCo7_(aq zENvgm1kQx6D1|xnN-?3Cn3&*jCV(#e5y`HcWRWz-4P%Ap(4}8Oj|S7Eo<)NaXn@ZA z4*Iy{FvDSRIA3hq)Ys_N?K>x}GQ%Drzv%0Djkb>}CCfE&t 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 diff --git a/mRemoteV1/Firefox/libEGL.dll b/mRemoteV1/Firefox/libEGL.dll index 85df9561d72fa9b1d456f96c61b9e02cc36ca56a..463bcf451e93f0c957e5df0d8a24e8047b317869 100644 GIT binary patch delta 8570 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 I`oD_*13B25O#lD@ delta 1940 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 GRs0_icCbqT delta 1924 zcmaLXX*iS%9|rJwo-vOZW=Qsmne4k~n3=L2gd{{+vW{i!TaF=83}Y)MD#HlbvZX9p z%2rugN#wXNQCg@DlO^ZKQoLQ)yIkizAI``Bef{rm_w`FEgGP9$CT{?oiOTf_4uSUQ zlxpB^H2}DU;qB1~1OfyRFcWPCVbs!(q<_N!{9qXqP5K$Z9DD?Dj=|RkGx=`AOzMJmVQpuw*4$E0;u=OY8;1 z2IqoU!!nz+{T`aX`a5xXYFEddiF7Vr+-eXgl!S*X%Q+ekT4iiOY?qK#M)cz!%2w#l z0{dRv*Hh5ZH-7g78nLG~m`~7xK`tk8yeKh&=D#BQ_|53ya)C;n8`dFA|5iCkKB67`^8V7r50R(u=Z5fHH0Ybz zD>_BbNc~@xJT;VdP0&V#kS{?}02rPRMw~yAU8KtB%B~LBD;_r+;>cEAc|xWz6hAf+ zB(>{eb6X4SJS0J{C6y6s~ODVjWrYrN=oqt!|h4 zU)X(Xz2?a>`@oJ(_uZ%+p0z~@%O*+sWLK%lF|CQ1c515VX)4e`m+0-)en4Sg#XODZ`^65MDB2)H3|47 z9Tt83V<791-A2~Q#cr~PYLK}63e<08<5i;NWKzy8ko#j>tpO7K1b`FGIZ)@qQ=G`Y z)dIZ4;L>Otc6Q2C`^)@zd2T{FxYa#QRn*ZyQ@F3cArn`$Hw0qUrVzNcST#K7e@u z1hB+?@Sbw1BneKr0wBTo>ox%tf{zIzRLAK^3Aw`bB8j*W-_`mHc`Aw?=uOLyA6EAc zi@#p5e8iS{{lxT!NcFo6>97{wyC%;A`6G?3-PO&u5pi2V#YxwW1wN)n)zQ!^o^ns% zk`t#xqn5nfgL1d~)9Y-_Lee30GAi?pok7X5 zw40d_dCi9PxJ9whF!KsMzo8>iXKFyI(rb5mNCWMtRQ^(@)OR8rqeP$1OQ5QJb!|0| zjqXY@%1pg%pq}%{wnA@$)?|3D(Q6pp4}#7y{_x_zFh@>=_nkyMx*w;BYm0mle*VEru+lKOGz_ z#!ouwZPe$yoU4#BMI~2=j(ev@`==i&YnlreqdE#x7s|C?w-n{1Yc#G!QGEO+mqe-! z>pxZ3?!*fcCv#mjZ`Kz&^YosDwBuG8WBG@;iuMcocS1c6WV)u-9B1Y7Hv={@+If5M zqxUuwes2mddq8Iwww2rr_1&#OD20Z?T%W3ZH*e1qOe-6W=tI`;sE!16qqmNvCB7Me z(kx_Lf)dmQjKvHEA3qRzSu|J}RxeZEp=PzZGnQBP9$U$@DisoOkC@}>JPd=R8m=Fo a4sjjIRyj3g^IW$h+~s54c7DWL#J>Q8nM6bY diff --git a/mRemoteV1/Firefox/nss3.dll b/mRemoteV1/Firefox/nss3.dll index 91747c48b29f5687fcd34350e107b00253b522cc..639efe057d569c439e41559306762ce23e6a9437 100644 GIT binary patch delta 8663 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 K&e71{Rs0_@vB2s8 delta 2020 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 AKL7v# diff --git a/mRemoteV1/Firefox/nssdbm3.dll b/mRemoteV1/Firefox/nssdbm3.dll index 2dc2d2a8c69a08d7707c5f173d62339785370c32..3bd8b976eb72a980f720680e4d85b12a31c685f6 100644 GIT binary patch delta 8570 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 QeCubV)X;Ms`d!8U0STm_hX4Qo delta 1953 zcmaLXYdDmP76J-^=I?q1mJp1eq`@{dkTF?4_ThEVEyXh%sQP9NO*jiG+fC^C>P6zgAm;Ynf%RplIe!Rrd};LT#bVN2~+ z7f7;E%8?h{^~W$kQU5Iyfuk;sjOV$*Byn7$9uq6QJ27HB3CJiRR1@@c~2Dw~I?AxlhO)AGLiAwKtA1hNKYBATkpQ%Z84hb-0+T$8NlMi>WLZ zHyh%SrMJ{gF=K1J5vVB`--*qv&2c@b0Qo1qUWoXTviG$g{zUY8%)|*~XnL^he9wK& zE2|ah4qpzl;@s(<)(Qj9$y6+tbuVUZUw3Y*i&_`cb`_*Ma|rtz3#ogEBQf=UIpYxv zvmuD~*}!;l%1g5#Dq4@`&kpM`$~Iq1MY)qaXQle;K~qbG-u~115iWrT@>3)OW&JZ& zj&V(7b6o?X^mNLxTCvG}2Zd)QeFqb*Cse%>vnGR!eu$ciUGYKVfs}V~+ggG0e-b=pn=9>W7=!TJ4_)2v$bi*xQpAy&wb#fPZ;B z1Q!AUrjr@oi{WuoiuqgS?$~>oDUXSsVa^6zr6?lH=3cbeNA~lC#NYyFoc#zu zx2{cOAN9ogM3+}zox56Du$m#jlsDO*@TlM2?-MUVB31=hl?&dNJoqXs2_Nm0hh~I9 zftsI)@VI`6zn%)qp$`@2#30gVPANBOXOJ2o%8i)2FT$;R7H^2-Rm#M3_vZB9pKs4~ z|5BY2oA!X5plX&EZ5ef4o;k*3f9ZPS=&R{R>T$gL=Vo8cXO7D`)=#BAr?+%-QyNP5)=K z>{}2TxtD={F#j08Y0IY^Rr%fzL-!?T$83yu9>>NXRHO?d*5-8nniMB}rRgrD8>nd~kGh#13QQ*w|QN*dO{48R21n{#6hKAh{6W zlJL{H##2(VGBF)c;9L^VVSJr@AUEkYYqgVLhyQh@`^=MPse6QsO1pZxNJjL{ZE?Kl zf!tKn=Vm2Cx?;Gv8H3(|OVu`Wg6QtbF7w_SpP5(%-T8w= zUWt7-51K85GC7VC74(8aALo8S>XhCmALUSLpHpVSXp4nQPVoLrUe(4uY0UFckNmDA zif>+)@{iw|??^}{k0+cRQ3T%o4%n-w;1gmE4~*k4Tcy$1D+njFpY^0*YM*XzBqBY3 zH0s=Mr!dmDe}%oNm~%M8hV$DsncoL2LiZ8EpSR=s>@2BHac;Je�Z-UK#MQI;Y_~ zJ*DyI)zeAK)1=#{XLc9F*G#_%r}QV)y&ZZLHz^UgDm9an!FB9viHf*u(6YZo(^oNt z^&$;Ns~&A+=K^*Ba(EVL>QO@@PE$seYm8s!Ql48E46wx3@DiYxf;csQc%t_p~j5WRYt#(E)>kI0sjK$#7MLN diff --git a/mRemoteV1/Firefox/plugin-hang-ui.exe b/mRemoteV1/Firefox/plugin-hang-ui.exe index 62061d088ddb20522511e5866d93ec8e923ea831..664d25ea0a2bf3f7e0ab54bca34ec5949d6e44eb 100644 GIT binary patch delta 8574 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 K$19-!tN4Gtzn}jA delta 1944 zcmaLXX*iS%9|rJwo?*<4Ehc*zyX?;}#@2)^VRSelA|{P3yRnsynQ4eR){bFlgy|4D zgd#-NR@<~FgpegiL$pW~Z`XC+_r1>hemEch_w~QO-PeyXfPPYlt~UihWObf7a1eAw zrqF#SV(E|h!X<0j`gwSz zd0ICZ-aj9b$=kb0Q9iC06X-F<*DiW_6c;;&m2&I{F3Ui?axPo9vvKcXP^3-FF+J|V zcTGp+B6`nIhnbq8x#i45#1mJ)8@3~qQ{Whz_L4(OrUdR_WQUP1n!(n8QqC&7ox8lD zQIH<&QGB9o$u(Ax?$KCnv>d8#6|C>HdL1?<2N45=M0gX!bz?sZepsB;r)G3EohrW2 z%PU6I_nm;^b7!yV^`t(5ExMaMqY5p=4jE|vabaxNS&Swb!Ta~}LbFWvT*HeFf?I)TLw-Y~=AP}Azf_c~1r1slZO{T;8$=K6w z9v`<$120O}Y*ap6Wtr?aw>MLF_$0fMOlO9iXIrV&Px>SAEq;X)(JOPI@SeHAGyK$7 zgkUR#7Ku!c=+i4O-A)s9!yTOy8)yNHEM)ozldnV{4)nT`DiVkx=X?!g8e%vu{!}f^ zDwKL+%E0ll^V7aOn&lMs7>zX@QYQ5->NZ=H1Ri~@v;x5V{6}X_uQZc{)|22@owTm| zqOY9YUGaz^eQ6x|DkAQg?nc91iSDjL&;9GZj=0iIQdWsr%G{q_^9y5aSywr_|s>R0YZ<;Wt|8JU4&GGK@;9M6OOZ56HG) zgl|E&hUu(yiw)-ZvgC~WRNpW|NVs+>nq_@6j_-r{G==7^Fed2tV2G~mse)5SQ9f~1 z4f*r=wIy3Qb;zprLkaFJ_JclWmIUBibtuIw?_77bVl3K6BlRvpj#sDTwa2 z3B_?1)XUOA<3aQ<_b&(V!}Mf>X+OEC^d!hs4vy%!6MMv5Wi;%R593<5o9H zJvxA4k9qLDFXO(;*9^~( z6}?=|Ol9k-lSb)vOSTtn>2^wHrYA+QaOQh~iT2`1gKizxZbgm{jrD57b64Ia_jH>y z@_veb52aqrBLW_)s6K?hTa#t}?meJpCl#CRLTbC#c7Y_BBs_#;f?t0a^%(>JNb{dK z`a5DMgrJTX9F!M?m7S|%Cv!nXh5sms62yuBaEkyDATyjP&e+Jvn_b8SZRy$wv+cJ{dnlBUWwDXH^>#D&g@h*2mvvuAJ>_%qR7=MM*$~^W>PsFTWz$aRc{@q9 z5gxO>$x(v`H|1=G-q-SV1C}$-vaSdC$eD0vFJ`cr!xO6NAD%Z~wMFevJI^ zx#THRQ2OR6qrm&YBFTnizqJ@TH@>={p@^-j72j)CR35tIGZZ3tX|SScMcP?c{Dyj{hZ>Ps$5M>Ewb2Xch}*%zJPtZ9eshk|CT=q p=*(5Y?7JAdb8B|l*0?0AHE(y~rJy}c;&Ifn^VSWcXY(du{{kL8Qtbc$ diff --git a/mRemoteV1/Firefox/sandboxbroker.dll b/mRemoteV1/Firefox/sandboxbroker.dll index ef4ebde2f59fba611d27975b8da1603f91956edb..201dccf0f9bd8d9c6ffff465537e10f7142d142c 100644 GIT binary patch delta 8578 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 PBrxuLW87KL?<)Qu&pxw5 delta 1948 zcmaLXc{tRI8VB(C{bpe>qG{|gVmP*$-!LY0MOjjIV;>H<&sPHJmB7CTY^ns{K2!}iNf-h&YkfSdnq+hN90P{>Pu$xlAZ2oYnIh9q5e!}h#q zoYAD6ySk#2pB_dp3M`#-i$k*LjWUe|)G`=#Km}`%hwQ z=5Ke87G3P>FGAJz214NTef_-RPfUc9~s&)i<@N>t>ew$hc}nA zreYEv@KW4-^gSNN5%ikCF90zAppn-n7n&R; zzMY2uazL-fPpbILwu;9o3RlJ?N28c83|H#!%L_X84F=V&4!f~-o?kiy!T}iYr{clc zAOH(JK*bzlc$UkC4r)UcsXq~b)9*Ijpp@_2oNJ^{(G?nYbqX!9nf@bHPSZ23R*|ue zRgz1un);NQvC?;-J3}mP`mPoB*oUpJJtupIQY55r&Bbu{G%!WJ*e{b({R=7MtcNgE z$L3`IQ7^PFv${TSChu0sdQPomb^E>q&u05)zNh98@by}>dX~>+Po8?5l&?&e;b8; z2Y|y3IjGk8#~69F&jlI^PZwX@m6;yfL)v{D-6)8|mXDbY>G9+p3x%xSZvyMQ_Nso) zGao`n8R?y?-3T8)XXCd8rTI%|I8s+&DLC=AWrY@ss`#ja{+S>oqP5mK?y=rBJ=2n6 zYkR;poFhrQE4s>bIhuPWkC>#_&e>kFW!d4)&5mF+;Os@jcze-tlE8qwO`Y$X%pF}h zD3^Q1GuKE&ZI#23LO= z^%VpFNcXQe`Xgd!6w*Kz4yqtwrRS=7XX$Wt)&DApMv}MuaEl62A#<`B+0?|;hgU#{ z+p_dgQU)jh0kC(1fDBm;QYlkPQ3z);V=PFd#Kc5m)bIKc8PQRH>?(kSA=n_SCs;Pd zx#itbw1IAO_djg%jgXzitpZM`go9UCS$Q;{8{QyJP)o0UF_ovH>dnj~P6haV9Sb6@ zx90Z6M6`Z!VGTeM12uaQE^XY7z~X&4%^X-#wNOA_Sw4fq15wSf;xC55h*?doZr-y2 zt)QGx32_Ov=xA^8^XUbl`aWQ$dCQPe3Jkb3!+M#Z*4cDMdHqz))U%Pk) z>x$TMd(%6;SGkP{v+y?&Pf2IZ_HgoU1Tt}SZIYU1;f}AP%C!XCJ?ebXgE6@Da~%s$W@KeA&oo?!J9F!Ty=%LY?YVn5{Hs4#&}BDV z#aQ{%O;_47Jm6m2OuzT9+gFCPs%Gx)E1I+GJrK8ZIZLU|y=boXk&~?hvVo92lA)Je zz_S@NOizt?znH*unkdRFzV3ow<*&DPxGiVcjC*z2hIg9mXax4T1+5LrEgB~T*8$?R w-ugR_l4x`B4;D8Kjc9J&W40?zV&#d{8biECNP}FMQ>Z20z+vL--C5Yb08YtNqW}N^ diff --git a/mRemoteV1/Firefox/softokn3.dll b/mRemoteV1/Firefox/softokn3.dll index a125f8e6e8b6a195e5642fb0169a2ba8cb31ff78..f194b3421b9f07e113b9f68747e61de61dcd0a27 100644 GIT binary patch delta 8575 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 KCLf^xtN4GtA(@;2 delta 1945 zcmaLXXH-)O8V2BdZ$e0bU_l6?CPbQuBsY}M1qP)U5EzI`3t*&IDaHax2n?toU4uka zkfsY#28J#K#u2HGq7Xnqr6@)O3sMx;b7ptX?EcuF-+R9I-+LZz9p(`iQ|$vH(hHy* zCTIycp%Y8Nlu{6EC7_M^Dckht<`GsT7@mo$wCIb{O|pck_RBU7W079$&>4B5)pxrLQlh zlXCQwr`bX%w0Al%ZE)8rljx~^(vL0@@4fo$2qjuXkhkjv^KtNCaUp+Sd)+PvNTx;B zE+yuV?;3XKH&QzX?is1-7@NO*fO_P_xO-rj83c*=>}LXYJkxJOPH_nBs1acKmU)io zl90cwekCPK-3BHuH6Zyb`LhoN?UV0sQ z>RwK;_}ISa)$~Oj!9%^SkLq6g)He?^AIl>Cg!KHOuq#mbdE0b>CZ{F6)PINk>8W7X zT+PJ?`c#hEOqDW@e20}&m*?n-gS-=7%ttOIIlo|FPsMD+PMku9rUlBq>#0}GUaLs6 zT{<3p+J*jU{f6I#trg2<4;FF_Htbs)qBg{|gV)pSx!aGn+^{%I8jfvb+O#(h;;BfR*)p)C+D5962jAw z6FB-tX=;>X)L4mqo}ynSy$0Fl69hMQ?quLi`F9b&@v$`M$P49p5McO@ygWVMK$BcL zizqszdD}~>;M}&7ZmvSs7||n*Vi(t(B-W*r(7GY`#sLgArWg;82lyoOjkZWTFOH`sg1gQuu7RR zx4paZF@GZ&mPh&A$csg!y^h<_s-8hm-yJhF6Jc2^+hsX6YQ)8Co{o$B8VYFQFnBkBne+%uZh|{wqw7A?_Hkj7$ zuGUdVo^?DpB2b>Q^4f$V7Ig+nXb8=OCuf?LUHnlci%OVmH4zD;vfA+*XQrWFMT)2T zGw|IZguK6`t5742XgP6QH>GOsz=Z>xgUUvR$FT$i?*nqY^;$StsFk}7FYsXJjxHbF zoRj66VwLP|$|Q9%t7Yk7h-kdpfL>e0CF6G=K-Git(dmw~meQ8l(Q8^XSk4 z&R&$1779dyJOc=nq3nc}3Kh8ufiW?W#$+;!#Uh3Mr5}kI5%%}3f)W6d2LZMQt|!>t zC3&vJQLOkmf2}sNPu#im2|DT6`|HHj9(tiQHiP z{0#lv$>&`*Y0ZOPl?L+gNl0$PbiYybcN diff --git a/mRemoteV1/Firefox/xul.dll b/mRemoteV1/Firefox/xul.dll index 7dc254e24d49958fdbb5c444b014a369f43af318..5fb67afdeb9b54d193c99082a5830c1a6ca73cc2 100644 GIT binary patch delta 11123 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 Va-Mj-nX=!jd=8Bv2l!ta{s%RT_+9`2 delta 4630 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 Date: Wed, 22 Mar 2017 08:45:25 -0600 Subject: [PATCH 35/56] enable code signing for installer --- InstallerProjects/Installer/Installer.wixproj | 4 +++- Tools/postbuild_installer.ps1 | 21 ++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/InstallerProjects/Installer/Installer.wixproj b/InstallerProjects/Installer/Installer.wixproj index a5f90867..347d57ed 100644 --- a/InstallerProjects/Installer/Installer.wixproj +++ b/InstallerProjects/Installer/Installer.wixproj @@ -135,8 +135,10 @@ set /p buildenv=<buildenv.tmp set solutionDir=$(SolutionDir)\ set targetDir=%25cd%25 set psScriptsDir=$(SolutionDir)Tools +set certPath=$(CertPath) +set certPassword=$(CertPassword) :: Call the post build powershell script -powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_installer.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" +powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_installer.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" -CertificatePath "%25certPath%25" -CertificatePassword "%25certPassword%25" \ No newline at end of file diff --git a/Tools/postbuild_installer.ps1 b/Tools/postbuild_installer.ps1 index 2f16ce96..ac33ccf7 100644 --- a/Tools/postbuild_installer.ps1 +++ b/Tools/postbuild_installer.ps1 @@ -13,16 +13,31 @@ param ( [string] [Parameter(Mandatory=$true)] - $ConfigurationName + $ConfigurationName, + + [string] + $CertificatePath, + + [string] + $CertificatePassword, + + [string[]] + $ExcludeFromSigning ) Write-Output "+=================================================================+" Write-Output "| Beginning mRemoteNG Installer Post Build |" Write-Output "+=================================================================+" -Write-Output ([pscustomobject]$PSBoundParameters) | Format-Table -AutoSize -Wrap +Format-Table -AutoSize -Wrap -InputObject @{ + "SolutionDir" = $SolutionDir + "TargetDir" = $TargetDir + "TargetFileName" = $TargetFileName + "ConfigurationName" = $ConfigurationName + "ExcludeFromSigning" = $ExcludeFromSigning +} -& "$PSScriptRoot\sign_binaries.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName +& "$PSScriptRoot\sign_binaries.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning & "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName & "$PSScriptRoot\rename_installer_with_version.ps1" -SolutionDir $SolutionDir & "$PSScriptRoot\copy_release_installer.ps1" -SourcePath $TargetDir -DestinationDir (Join-Path -Path $SolutionDir -ChildPath "Release") \ No newline at end of file From 695ae9d970572b453dbf5aa5fd46f3c927fb2e1e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 22 Mar 2017 14:41:35 -0600 Subject: [PATCH 36/56] added script for publishing a release to github --- Tools/publish_to_github.ps1 | 159 ++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 Tools/publish_to_github.ps1 diff --git a/Tools/publish_to_github.ps1 b/Tools/publish_to_github.ps1 new file mode 100644 index 00000000..470658cb --- /dev/null +++ b/Tools/publish_to_github.ps1 @@ -0,0 +1,159 @@ +param ( + [string] + [Parameter(Mandatory=$true)] + # + $Owner, + + [string] + [Parameter(Mandatory=$true)] + # + $Repository, + + [string] + [Parameter(Mandatory=$true)] + # + $ReleaseTitle, + + [string] + [Parameter(Mandatory=$true)] + # + $TagName, + + [string] + [Parameter(Mandatory=$true)] + # Either the SHA of the commit to target or the branch name. + $TargetCommitish, + + [string] + [Parameter(Mandatory=$true)] + # + $Description, + + [bool] + [Parameter(Mandatory=$true)] + # + $IsDraft, + + [bool] + [Parameter(Mandatory=$true)] + # + $IsPrerelease, + + [string] + [Parameter(Mandatory=$true)] + # Path to the zip file to upload with the release + $ZipFilePath, + + [string] + [Parameter(Mandatory=$true)] + #Path to the msi file to upload with the release + $MsiFilePath, + + [string] + [Parameter(Mandatory=$true)] + # The OAuth2 token to use for authentication. + $AuthToken +) + + +$githubUrl = 'https://api.github.com' + + +function Publish-Release { + param ( + [string] + [Parameter(Mandatory=$true)] + # + $Owner, + + [string] + [Parameter(Mandatory=$true)] + # + $Repository, + + [string] + [Parameter(Mandatory=$true)] + # + $ReleaseTitle, + + [string] + [Parameter(Mandatory=$true)] + # + $TagName, + + [string] + [Parameter(Mandatory=$true)] + # Either the SHA of the commit to target or the branch name. + $TargetCommitish, + + [string] + [Parameter(Mandatory=$true)] + # + $Description, + + [bool] + [Parameter(Mandatory=$true)] + # + $IsDraft, + + [bool] + [Parameter(Mandatory=$true)] + # + $IsPrerelease, + + [string] + [Parameter(Mandatory=$true)] + # The OAuth2 token to use for authentication. + $AuthToken + ) + + $body_publishRelease = @{ + "tag_name" = $TagName + "target_commitish" = $TargetCommitish + "name" = $ReleaseTitle + "body" = $Description + "draft" = $IsDraft + "prerelease" = $IsPrerelease + } + + $req_publishRelease = Invoke-WebRequest -Uri "$githubUrl/repos/$Owner/$Repository/releases" -Method Post -Headers @{"Authorization"="token $AuthToken"} -Body (ConvertTo-Json -InputObject $body_publishRelease -Compress) -ErrorAction Stop + $response_publishRelease = ConvertFrom-Json -InputObject $req_publishRelease.Content + + Write-Output $response_publishRelease +} + + +function Upload-ReleaseAsset { + param ( + [string] + [Parameter(Mandatory=$true)] + $UploadUri, + + [string] + [Parameter(Mandatory=$true)] + # Path to the file to upload with the release + $FilePath, + + [string] + [Parameter(Mandatory=$true)] + # Content type of the file + $ContentType, + + [string] + [Parameter(Mandatory=$true)] + # The OAuth2 token to use for authentication. + $AuthToken + ) + + $UploadUri = $UploadUri -replace "(\{[\w,\?]*\})$" + $fileName = Split-Path -Path $FilePath -Leaf + + $req_uploadZipAsset = Invoke-WebRequest -Uri "$($UploadUri)?name=$fileName" -Method Post -Headers @{"Authorization"="token $AuthToken"} -ContentType $ContentType -InFile $FilePath -ErrorAction Stop +} + + + +$release = Publish-Release -Owner $Owner -Repository $Repository -ReleaseTitle $ReleaseTitle -TagName $TagName -TargetCommitish $TargetCommitish -Description $Description -IsDraft $IsDraft -IsPrerelease $IsPrerelease -AuthToken $AuthToken +$zipUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $ZipFilePath -ContentType "application/zip" -AuthToken $AuthToken +$msiUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $MsiFilePath -ContentType "binary/octetstream" -AuthToken $AuthToken +Write-Output $release \ No newline at end of file From 45099bfa079c02d03d38ee0acea3d0d21de5fb4d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 22 Mar 2017 16:22:53 -0600 Subject: [PATCH 37/56] try to get around weird type casting issue --- Tools/publish_to_github.ps1 | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Tools/publish_to_github.ps1 b/Tools/publish_to_github.ps1 index 470658cb..7df25e44 100644 --- a/Tools/publish_to_github.ps1 +++ b/Tools/publish_to_github.ps1 @@ -29,18 +29,20 @@ param ( # $Description, - [bool] + [string] [Parameter(Mandatory=$true)] - # + # true/false $IsDraft, - [bool] + [string] [Parameter(Mandatory=$true)] - # + [ValidateSet("true","false")] + # true/false $IsPrerelease, [string] [Parameter(Mandatory=$true)] + [ValidateSet("true","false")] # Path to the zip file to upload with the release $ZipFilePath, From c0f2d2aa84fe87f0e7d2d208e24594af137eb48d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 22 Mar 2017 16:27:28 -0600 Subject: [PATCH 38/56] fixed bug --- Tools/publish_to_github.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/publish_to_github.ps1 b/Tools/publish_to_github.ps1 index 7df25e44..17c2d0ff 100644 --- a/Tools/publish_to_github.ps1 +++ b/Tools/publish_to_github.ps1 @@ -31,6 +31,7 @@ param ( [string] [Parameter(Mandatory=$true)] + [ValidateSet("true","false")] # true/false $IsDraft, @@ -42,7 +43,6 @@ param ( [string] [Parameter(Mandatory=$true)] - [ValidateSet("true","false")] # Path to the zip file to upload with the release $ZipFilePath, From 039d4d11aae67a509ac162bcb103b102ad9987fa Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 22 Mar 2017 16:33:12 -0600 Subject: [PATCH 39/56] add a cast to help aleviate bat file issues --- Tools/publish_to_github.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/publish_to_github.ps1 b/Tools/publish_to_github.ps1 index 17c2d0ff..cc54719f 100644 --- a/Tools/publish_to_github.ps1 +++ b/Tools/publish_to_github.ps1 @@ -155,7 +155,7 @@ function Upload-ReleaseAsset { -$release = Publish-Release -Owner $Owner -Repository $Repository -ReleaseTitle $ReleaseTitle -TagName $TagName -TargetCommitish $TargetCommitish -Description $Description -IsDraft $IsDraft -IsPrerelease $IsPrerelease -AuthToken $AuthToken +$release = Publish-Release -Owner $Owner -Repository $Repository -ReleaseTitle $ReleaseTitle -TagName $TagName -TargetCommitish $TargetCommitish -Description $Description -IsDraft ([bool]::Parse($IsDraft)) -IsPrerelease ([bool]::Parse($IsPrerelease)) -AuthToken $AuthToken $zipUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $ZipFilePath -ContentType "application/zip" -AuthToken $AuthToken $msiUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $MsiFilePath -ContentType "binary/octetstream" -AuthToken $AuthToken Write-Output $release \ No newline at end of file From 5c9933791c900f82562d6076ff3a88eafd2e7bd2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 22 Mar 2017 16:39:47 -0600 Subject: [PATCH 40/56] do base64 decoding in the script --- Tools/publish_to_github.ps1 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Tools/publish_to_github.ps1 b/Tools/publish_to_github.ps1 index cc54719f..91e36190 100644 --- a/Tools/publish_to_github.ps1 +++ b/Tools/publish_to_github.ps1 @@ -54,11 +54,18 @@ param ( [string] [Parameter(Mandatory=$true)] # The OAuth2 token to use for authentication. - $AuthToken + $AuthToken, + + [switch] + # Enable this switch to treat $Description as a Base64 encoded string. It will be decoded before being used elsewhere in the script. + $DescriptionIsBase64Encoded ) $githubUrl = 'https://api.github.com' +if ($DescriptionIsBase64Encoded) { + $Description = ([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Description))) +} function Publish-Release { From 311bf1b6411f25afd030d1c5389f2a0ae5730711 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 22 Mar 2017 16:48:38 -0600 Subject: [PATCH 41/56] fix issue with retrieving fuzzy file name --- Tools/publish_to_github.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/publish_to_github.ps1 b/Tools/publish_to_github.ps1 index 91e36190..46be056d 100644 --- a/Tools/publish_to_github.ps1 +++ b/Tools/publish_to_github.ps1 @@ -155,9 +155,9 @@ function Upload-ReleaseAsset { ) $UploadUri = $UploadUri -replace "(\{[\w,\?]*\})$" - $fileName = Split-Path -Path $FilePath -Leaf + $file = Get-Item -Path $FilePath - $req_uploadZipAsset = Invoke-WebRequest -Uri "$($UploadUri)?name=$fileName" -Method Post -Headers @{"Authorization"="token $AuthToken"} -ContentType $ContentType -InFile $FilePath -ErrorAction Stop + $req_uploadZipAsset = Invoke-WebRequest -Uri "$($UploadUri)?name=$($file.Name)" -Method Post -Headers @{"Authorization"="token $AuthToken"} -ContentType $ContentType -InFile $file.FullName -ErrorAction Stop } From 6e5e78df3b5433b017a7900c8fdf34b47c5886a3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 22 Mar 2017 17:03:38 -0600 Subject: [PATCH 42/56] investigating certificate unlock issues --- Tools/sign_binaries.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index 36870f46..02a303c8 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -46,6 +46,7 @@ if ($CertificatePassword -eq "") { } try { + Write-Output "Trying to unlock cert with pass: $($CertificatePassword)" $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword) -ErrorAction Stop } catch { Write-Output "Error loading certificate file - we won't sign files." From c3837368343785a1d942916b9d86d2c84ec96e3b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 22 Mar 2017 17:06:30 -0600 Subject: [PATCH 43/56] more debug code --- Tools/sign_binaries.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index 02a303c8..b1aa4d6c 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -46,6 +46,7 @@ if ($CertificatePassword -eq "") { } try { + Write-Output "Trying to open cert: $($CertificatePath)" Write-Output "Trying to unlock cert with pass: $($CertificatePassword)" $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword) -ErrorAction Stop } catch { From 7a6a99e2b6abf7f962afebbfa1c27000fe4cd7de Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 23 Mar 2017 08:08:29 -0600 Subject: [PATCH 44/56] attempting to use the publishing jenkinsfile from scm --- Jenkinsfile_publish.groovy | 62 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Jenkinsfile_publish.groovy diff --git a/Jenkinsfile_publish.groovy b/Jenkinsfile_publish.groovy new file mode 100644 index 00000000..49d20ff4 --- /dev/null +++ b/Jenkinsfile_publish.groovy @@ -0,0 +1,62 @@ +node('windows') { + def jobDir = pwd() + def solutionFilePath = "\"${jobDir}\\mRemoteV1.sln\"" + def vsToolsDir = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools" + def vsExtensionsDir = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\CommonExtensions\\Microsoft\\TestWindow" + def nunitTestAdapterPath = "C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\VisualStudio\\14.0\\Extensions" + + + stage ('Clean output dir') { + bat script: "rmdir /S /Q \"${jobDir}\\Release\" 2>nul", returnStatus: true + } + + stage ('Checkout Branch') { + checkout([ + $class: 'GitSCM', + branches: [[name: '*/pipeline_tests']], + doGenerateSubmoduleConfigurations: false, + extensions: [], + submoduleCfg: [], + userRemoteConfigs: [[ + credentialsId: '9c3fbff4-5b90-402f-a298-00e607fcec87', + url: 'https://github.com/mRemoteNG/mRemoteNG.git' + ]] + ]) + } + + stage ('Restore NuGet Packages') { + def nugetPath = "C:\\nuget.exe" + bat "${nugetPath} restore ${solutionFilePath}" + } + + withCredentials([file(credentialsId: '9b674d57-6792-48e3-984a-4d1bab2abb64', variable: 'CODE_SIGNING_CERT')]) { + stage ('Build mRemoteNG (Normal - MSI)') { + bat "echo ${env.CODE_SIGNING_CERT} > C:\\myfile.txt" + bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Release Installer\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\"" + archiveArtifacts artifacts: "Release\\*.msi", caseSensitive: false, onlyIfSuccessful: true + } + + stage ('Build mRemoteNG (Portable)') { + bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Release Portable\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\"" + archiveArtifacts artifacts: "Release\\*.zip", caseSensitive: false, onlyIfSuccessful: true + } + } + + stage ('Run Unit Tests (Normal - MSI)') { + bat "\"${vsToolsDir}\\VsDevCmd.bat\" && VSTest.Console.exe /TestAdapterPath:${nunitTestAdapterPath} \"${jobDir}\\mRemoteNGTests\\bin\\Release\\mRemoteNGTests.dll\"" + } + + stage ('Run Unit Tests (Portable)') { + bat "\"${vsToolsDir}\\VsDevCmd.bat\" && VSTest.Console.exe /TestAdapterPath:${nunitTestAdapterPath} \"${jobDir}\\mRemoteNGTests\\bin\\Release Portable\\mRemoteNGTests.dll\"" + } + + stage ('Publish to GitHub') { + withCredentials([string(credentialsId: '5443a369-dbe8-42d3-b4e8-04d0b4e9039a', variable: 'GH_AUTH_TOKEN')]) { + def zipPath = "${jobDir}\\Release\\*.msi" + def msiPath = "${jobDir}\\Release\\*.zip" + // because batch files suck at handling newline characters, we have to convert to base64 in groovy and back to text in powershell + def base64Description = env.ReleaseDescription.bytes.encodeBase64().toString() + bat "powershell -ExecutionPolicy Bypass -File \"${jobDir}\\Tools\\publish_to_github.ps1\" -Owner \"mRemoteNG\" -Repository \"mRemoteNG\" -ReleaseTitle \"${env.ReleaseTitle}\" -TagName \"${env.TagName}\" -TargetCommitish \"${env.TargetCommit}\" -Description \"${base64Description}\" -IsDraft ${env.IsDraft} -IsPrerelease ${env.IsPreRelease} -ZipFilePath \"${zipPath}\" -MsiFilePath \"${msiPath}\" -AuthToken \"${env.GH_AUTH_TOKEN}\" -DescriptionIsBase64Encoded" + } + } +} \ No newline at end of file From 82388dcbc35210bba86fa00ff91b7e17e6744105 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 23 Mar 2017 08:26:18 -0600 Subject: [PATCH 45/56] added finger-printing to artifacting step --- Jenkinsfile_publish.groovy | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile_publish.groovy b/Jenkinsfile_publish.groovy index 49d20ff4..a22abb21 100644 --- a/Jenkinsfile_publish.groovy +++ b/Jenkinsfile_publish.groovy @@ -31,14 +31,13 @@ node('windows') { withCredentials([file(credentialsId: '9b674d57-6792-48e3-984a-4d1bab2abb64', variable: 'CODE_SIGNING_CERT')]) { stage ('Build mRemoteNG (Normal - MSI)') { - bat "echo ${env.CODE_SIGNING_CERT} > C:\\myfile.txt" bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Release Installer\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\"" - archiveArtifacts artifacts: "Release\\*.msi", caseSensitive: false, onlyIfSuccessful: true + archiveArtifacts artifacts: "Release\\*.msi", caseSensitive: false, onlyIfSuccessful: true, fingerprint: true } stage ('Build mRemoteNG (Portable)') { bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Release Portable\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\"" - archiveArtifacts artifacts: "Release\\*.zip", caseSensitive: false, onlyIfSuccessful: true + archiveArtifacts artifacts: "Release\\*.zip", caseSensitive: false, onlyIfSuccessful: true, fingerprint: true } } From cf374c6b8b243543635e70f265d342daeee3f514 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 23 Mar 2017 08:29:47 -0600 Subject: [PATCH 46/56] added cert password as an auto-injected resource --- Jenkinsfile_publish.groovy | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Jenkinsfile_publish.groovy b/Jenkinsfile_publish.groovy index a22abb21..1eef2592 100644 --- a/Jenkinsfile_publish.groovy +++ b/Jenkinsfile_publish.groovy @@ -30,14 +30,16 @@ node('windows') { } withCredentials([file(credentialsId: '9b674d57-6792-48e3-984a-4d1bab2abb64', variable: 'CODE_SIGNING_CERT')]) { - stage ('Build mRemoteNG (Normal - MSI)') { - bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Release Installer\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\"" - archiveArtifacts artifacts: "Release\\*.msi", caseSensitive: false, onlyIfSuccessful: true, fingerprint: true - } - - stage ('Build mRemoteNG (Portable)') { - bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Release Portable\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\"" - archiveArtifacts artifacts: "Release\\*.zip", caseSensitive: false, onlyIfSuccessful: true, fingerprint: true + withCredentials([usernamePassword(credentialsId: '05b7449b-05c0-490f-8661-236242526e62', passwordVariable: 'MRNG_CERT_PASSWORD', usernameVariable: '')]) { + stage ('Build mRemoteNG (Normal - MSI)') { + bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Release Installer\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\"" + archiveArtifacts artifacts: "Release\\*.msi", caseSensitive: false, onlyIfSuccessful: true, fingerprint: true + } + + stage ('Build mRemoteNG (Portable)') { + bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Release Portable\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\"" + archiveArtifacts artifacts: "Release\\*.zip", caseSensitive: false, onlyIfSuccessful: true, fingerprint: true + } } } From 9188d4316e522b36ce104c083b8edb06f8278577 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 23 Mar 2017 08:52:24 -0600 Subject: [PATCH 47/56] fix variable issue --- Jenkinsfile_publish.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile_publish.groovy b/Jenkinsfile_publish.groovy index 1eef2592..25810cae 100644 --- a/Jenkinsfile_publish.groovy +++ b/Jenkinsfile_publish.groovy @@ -30,7 +30,7 @@ node('windows') { } withCredentials([file(credentialsId: '9b674d57-6792-48e3-984a-4d1bab2abb64', variable: 'CODE_SIGNING_CERT')]) { - withCredentials([usernamePassword(credentialsId: '05b7449b-05c0-490f-8661-236242526e62', passwordVariable: 'MRNG_CERT_PASSWORD', usernameVariable: '')]) { + withCredentials([usernamePassword(credentialsId: '05b7449b-05c0-490f-8661-236242526e62', passwordVariable: 'MRNG_CERT_PASSWORD', usernameVariable: 'NO_USERNAME')]) { stage ('Build mRemoteNG (Normal - MSI)') { bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Release Installer\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\"" archiveArtifacts artifacts: "Release\\*.msi", caseSensitive: false, onlyIfSuccessful: true, fingerprint: true From ed38b39fec4019564c2cf179855d87dbe35948a3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 23 Mar 2017 08:59:09 -0600 Subject: [PATCH 48/56] attempting to resolve bug with accessing correct key store --- Tools/sign_binaries.ps1 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Tools/sign_binaries.ps1 b/Tools/sign_binaries.ps1 index b1aa4d6c..f8285dce 100644 --- a/Tools/sign_binaries.ps1 +++ b/Tools/sign_binaries.ps1 @@ -46,9 +46,8 @@ if ($CertificatePassword -eq "") { } try { - Write-Output "Trying to open cert: $($CertificatePath)" - Write-Output "Trying to unlock cert with pass: $($CertificatePassword)" - $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword) -ErrorAction Stop + $certKeyStore = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet + $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword, $certKeyStore) -ErrorAction Stop } catch { Write-Output "Error loading certificate file - we won't sign files." Write-Output $Error[0] From 77264066746d3ef859aec2a46a3acc8d2a36afd0 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 23 Mar 2017 09:40:31 -0600 Subject: [PATCH 49/56] added loggers to the test runners --- Jenkinsfile_publish.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile_publish.groovy b/Jenkinsfile_publish.groovy index 25810cae..9d716f5c 100644 --- a/Jenkinsfile_publish.groovy +++ b/Jenkinsfile_publish.groovy @@ -44,11 +44,11 @@ node('windows') { } stage ('Run Unit Tests (Normal - MSI)') { - bat "\"${vsToolsDir}\\VsDevCmd.bat\" && VSTest.Console.exe /TestAdapterPath:${nunitTestAdapterPath} \"${jobDir}\\mRemoteNGTests\\bin\\Release\\mRemoteNGTests.dll\"" + bat "\"${vsToolsDir}\\VsDevCmd.bat\" && VSTest.Console.exe /logger:trx /TestAdapterPath:${nunitTestAdapterPath} \"${jobDir}\\mRemoteNGTests\\bin\\Release\\mRemoteNGTests.dll\"" } stage ('Run Unit Tests (Portable)') { - bat "\"${vsToolsDir}\\VsDevCmd.bat\" && VSTest.Console.exe /TestAdapterPath:${nunitTestAdapterPath} \"${jobDir}\\mRemoteNGTests\\bin\\Release Portable\\mRemoteNGTests.dll\"" + bat "\"${vsToolsDir}\\VsDevCmd.bat\" && VSTest.Console.exe /logger:trx /TestAdapterPath:${nunitTestAdapterPath} \"${jobDir}\\mRemoteNGTests\\bin\\Release Portable\\mRemoteNGTests.dll\"" } stage ('Publish to GitHub') { From d49d58f7f85afcc2642f07ce4e16fdc2abf73ce1 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 24 Mar 2017 11:40:28 -0600 Subject: [PATCH 50/56] fixed parent reference update issue in mRemoteNGImporter --- CHANGELOG.TXT | 7 +++++++ mRemoteV1/Config/Import/mRemoteNGImporter.cs | 2 +- mRemoteV1/Properties/AssemblyInfo.cs | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index 58ffd168..74951f68 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -1,3 +1,10 @@ +1.75.7003 (2017-03-24): + +Fixes: +------ +#464: Resolved issue when importing a connections file while using SQL server feature + + 1.75.7002 (2017-03-10): Fixes: diff --git a/mRemoteV1/Config/Import/mRemoteNGImporter.cs b/mRemoteV1/Config/Import/mRemoteNGImporter.cs index ef8fb7d3..18439781 100644 --- a/mRemoteV1/Config/Import/mRemoteNGImporter.cs +++ b/mRemoteV1/Config/Import/mRemoteNGImporter.cs @@ -35,7 +35,7 @@ namespace mRemoteNG.Config.Import var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(true); var rootImportContainer = new ContainerInfo { Name = Path.GetFileNameWithoutExtension(fileName) }; - rootImportContainer.Children.AddRange(connectionTreeModel.RootNodes.First().Children); + rootImportContainer.AddChildRange(connectionTreeModel.RootNodes.First().Children.ToArray()); destinationContainer.AddChild(rootImportContainer); } } diff --git a/mRemoteV1/Properties/AssemblyInfo.cs b/mRemoteV1/Properties/AssemblyInfo.cs index 6c920583..47f6b26c 100644 --- a/mRemoteV1/Properties/AssemblyInfo.cs +++ b/mRemoteV1/Properties/AssemblyInfo.cs @@ -33,7 +33,7 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // -[assembly: AssemblyVersion("1.75.7002.*")] +[assembly: AssemblyVersion("1.75.7003.*")] [assembly:NeutralResourcesLanguageAttribute("en")] From fe26a6033749a5912c2b0eb4683894c1ba9f5c97 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 24 Mar 2017 12:04:52 -0600 Subject: [PATCH 51/56] fixed hard coded branch names in jenkinsfile_publish --- Jenkinsfile_publish.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile_publish.groovy b/Jenkinsfile_publish.groovy index 9d716f5c..5a8868b3 100644 --- a/Jenkinsfile_publish.groovy +++ b/Jenkinsfile_publish.groovy @@ -13,7 +13,7 @@ node('windows') { stage ('Checkout Branch') { checkout([ $class: 'GitSCM', - branches: [[name: '*/pipeline_tests']], + branches: [[name: '*/${env.TargetBranch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], @@ -57,7 +57,7 @@ node('windows') { def msiPath = "${jobDir}\\Release\\*.zip" // because batch files suck at handling newline characters, we have to convert to base64 in groovy and back to text in powershell def base64Description = env.ReleaseDescription.bytes.encodeBase64().toString() - bat "powershell -ExecutionPolicy Bypass -File \"${jobDir}\\Tools\\publish_to_github.ps1\" -Owner \"mRemoteNG\" -Repository \"mRemoteNG\" -ReleaseTitle \"${env.ReleaseTitle}\" -TagName \"${env.TagName}\" -TargetCommitish \"${env.TargetCommit}\" -Description \"${base64Description}\" -IsDraft ${env.IsDraft} -IsPrerelease ${env.IsPreRelease} -ZipFilePath \"${zipPath}\" -MsiFilePath \"${msiPath}\" -AuthToken \"${env.GH_AUTH_TOKEN}\" -DescriptionIsBase64Encoded" + bat "powershell -ExecutionPolicy Bypass -File \"${jobDir}\\Tools\\publish_to_github.ps1\" -Owner \"mRemoteNG\" -Repository \"mRemoteNG\" -ReleaseTitle \"${env.ReleaseTitle}\" -TagName \"${env.TagName}\" -TargetCommitish \"${env.TargetBranch}\" -Description \"${base64Description}\" -IsDraft ${env.IsDraft} -IsPrerelease ${env.IsPreRelease} -ZipFilePath \"${zipPath}\" -MsiFilePath \"${msiPath}\" -AuthToken \"${env.GH_AUTH_TOKEN}\" -DescriptionIsBase64Encoded" } } } \ No newline at end of file From c77c323f7359a49dcc29a72b1bffb865d49656ad Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 24 Mar 2017 14:22:17 -0600 Subject: [PATCH 52/56] fix jenkinsfile variable --- Jenkinsfile_publish.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile_publish.groovy b/Jenkinsfile_publish.groovy index 5a8868b3..b9f76451 100644 --- a/Jenkinsfile_publish.groovy +++ b/Jenkinsfile_publish.groovy @@ -13,7 +13,7 @@ node('windows') { stage ('Checkout Branch') { checkout([ $class: 'GitSCM', - branches: [[name: '*/${env.TargetBranch}']], + branches: [[name: '*/${TargetBranch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], From 8f171cddd9d859eb99a47a6039d5be525c2b18e3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 24 Mar 2017 14:23:38 -0600 Subject: [PATCH 53/56] fix content type of msi upload to github --- Tools/publish_to_github.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/publish_to_github.ps1 b/Tools/publish_to_github.ps1 index 46be056d..a1e65141 100644 --- a/Tools/publish_to_github.ps1 +++ b/Tools/publish_to_github.ps1 @@ -164,5 +164,5 @@ function Upload-ReleaseAsset { $release = Publish-Release -Owner $Owner -Repository $Repository -ReleaseTitle $ReleaseTitle -TagName $TagName -TargetCommitish $TargetCommitish -Description $Description -IsDraft ([bool]::Parse($IsDraft)) -IsPrerelease ([bool]::Parse($IsPrerelease)) -AuthToken $AuthToken $zipUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $ZipFilePath -ContentType "application/zip" -AuthToken $AuthToken -$msiUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $MsiFilePath -ContentType "binary/octetstream" -AuthToken $AuthToken +$msiUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $MsiFilePath -ContentType "application/octet-stream" -AuthToken $AuthToken Write-Output $release \ No newline at end of file From 0f6f8d43bd7a82e8f66982daa25b5a798e624a82 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 24 Mar 2017 14:28:18 -0600 Subject: [PATCH 54/56] added cmdlet for retrieving a github release --- Tools/publish_to_github.ps1 | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/Tools/publish_to_github.ps1 b/Tools/publish_to_github.ps1 index a1e65141..5ece9404 100644 --- a/Tools/publish_to_github.ps1 +++ b/Tools/publish_to_github.ps1 @@ -132,6 +132,31 @@ function Publish-Release { } +function Get-GitHubRelease { + param ( + [string] + [Parameter(Mandatory=$true)] + # + $Owner, + + [string] + [Parameter(Mandatory=$true)] + # + $Repository, + + [string] + [Parameter(Mandatory=$true)] + # + $ReleaseId + ) + + $req_getRelease = Invoke-WebRequest -Uri "$githubUrl/repos/$Owner/$Repository/releases/$ReleaseId" -Method Get -ErrorAction Stop + $response_getRelease = ConvertFrom-Json -InputObject $req_publishRelease.Content + + Write-Output $response_getRelease +} + + function Upload-ReleaseAsset { param ( [string] @@ -165,4 +190,4 @@ function Upload-ReleaseAsset { $release = Publish-Release -Owner $Owner -Repository $Repository -ReleaseTitle $ReleaseTitle -TagName $TagName -TargetCommitish $TargetCommitish -Description $Description -IsDraft ([bool]::Parse($IsDraft)) -IsPrerelease ([bool]::Parse($IsPrerelease)) -AuthToken $AuthToken $zipUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $ZipFilePath -ContentType "application/zip" -AuthToken $AuthToken $msiUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $MsiFilePath -ContentType "application/octet-stream" -AuthToken $AuthToken -Write-Output $release \ No newline at end of file +Write-Output (Get-GitHubRelease -Owner $Owner -Repository $Repository -ReleaseId $release.id) \ No newline at end of file From 8b201d22cbc57ecf7a7b57b63033e506da098cd8 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 24 Mar 2017 15:07:31 -0600 Subject: [PATCH 55/56] added authkey requirement to get-githubrelease in order to show drafts --- Tools/publish_to_github.ps1 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Tools/publish_to_github.ps1 b/Tools/publish_to_github.ps1 index 5ece9404..6a834432 100644 --- a/Tools/publish_to_github.ps1 +++ b/Tools/publish_to_github.ps1 @@ -147,11 +147,16 @@ function Get-GitHubRelease { [string] [Parameter(Mandatory=$true)] # - $ReleaseId + $ReleaseId, + + [string] + [Parameter(Mandatory=$true)] + # The OAuth2 token to use for authentication. + $AuthToken ) - $req_getRelease = Invoke-WebRequest -Uri "$githubUrl/repos/$Owner/$Repository/releases/$ReleaseId" -Method Get -ErrorAction Stop - $response_getRelease = ConvertFrom-Json -InputObject $req_publishRelease.Content + $req_getRelease = Invoke-WebRequest -Uri "$githubUrl/repos/$Owner/$Repository/releases/$ReleaseId" -Method Get -Headers @{"Authorization"="token $AuthToken"} -ErrorAction Stop + $response_getRelease = ConvertFrom-Json -InputObject $req_getRelease.Content Write-Output $response_getRelease } @@ -190,4 +195,4 @@ function Upload-ReleaseAsset { $release = Publish-Release -Owner $Owner -Repository $Repository -ReleaseTitle $ReleaseTitle -TagName $TagName -TargetCommitish $TargetCommitish -Description $Description -IsDraft ([bool]::Parse($IsDraft)) -IsPrerelease ([bool]::Parse($IsPrerelease)) -AuthToken $AuthToken $zipUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $ZipFilePath -ContentType "application/zip" -AuthToken $AuthToken $msiUpload = Upload-ReleaseAsset -UploadUri $release.upload_url -FilePath $MsiFilePath -ContentType "application/octet-stream" -AuthToken $AuthToken -Write-Output (Get-GitHubRelease -Owner $Owner -Repository $Repository -ReleaseId $release.id) \ No newline at end of file +Write-Output (Get-GitHubRelease -Owner $Owner -Repository $Repository -ReleaseId $release.id -AuthToken $AuthToken) \ No newline at end of file From e16d31d605fde6285a98ac92b91254e196c59444 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 24 Mar 2017 15:14:57 -0600 Subject: [PATCH 56/56] fixed stupid transposition typo --- Jenkinsfile_publish.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile_publish.groovy b/Jenkinsfile_publish.groovy index b9f76451..12640d98 100644 --- a/Jenkinsfile_publish.groovy +++ b/Jenkinsfile_publish.groovy @@ -53,8 +53,8 @@ node('windows') { stage ('Publish to GitHub') { withCredentials([string(credentialsId: '5443a369-dbe8-42d3-b4e8-04d0b4e9039a', variable: 'GH_AUTH_TOKEN')]) { - def zipPath = "${jobDir}\\Release\\*.msi" - def msiPath = "${jobDir}\\Release\\*.zip" + def zipPath = "${jobDir}\\Release\\*.zip" + def msiPath = "${jobDir}\\Release\\*.msi" // because batch files suck at handling newline characters, we have to convert to base64 in groovy and back to text in powershell def base64Description = env.ReleaseDescription.bytes.encodeBase64().toString() bat "powershell -ExecutionPolicy Bypass -File \"${jobDir}\\Tools\\publish_to_github.ps1\" -Owner \"mRemoteNG\" -Repository \"mRemoteNG\" -ReleaseTitle \"${env.ReleaseTitle}\" -TagName \"${env.TagName}\" -TargetCommitish \"${env.TargetBranch}\" -Description \"${base64Description}\" -IsDraft ${env.IsDraft} -IsPrerelease ${env.IsPreRelease} -ZipFilePath \"${zipPath}\" -MsiFilePath \"${msiPath}\" -AuthToken \"${env.GH_AUTH_TOKEN}\" -DescriptionIsBase64Encoded"