From 5f92ee3f3783c42749baf26bd6992fa4374971c3 Mon Sep 17 00:00:00 2001 From: cedrozor Date: Wed, 27 Nov 2019 17:16:59 +0100 Subject: [PATCH] * HOTFIX * fixed a potential crash of myrtille services when sending a disconnect notification (https://github.com/cedrozor/myrtille/issues/187, thanks gtmsew) the automatic application pool recycling is now disabled by default, and is not applicable if using the enterprise mode (this prevents enterprise sessions to be dropped unexpectedly!) if recycling is enabled, a new http session is now acquired on disconnect; this prevents a subsequent login failure (due to the old http session being invalid) without any error message --- CHANGELOG | 7 +- .../Properties/AssemblyInfo.cs | 4 +- Myrtille.Admin.Web/Properties/AssemblyInfo.cs | 4 +- Myrtille.Common/Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- Myrtille.Printer/Properties/AssemblyInfo.cs | 4 +- Myrtille.SSH/Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- Myrtille.Services/Properties/AssemblyInfo.cs | 4 +- Myrtille.Services/RemoteSessionProcess.cs | 51 +- Myrtille.Setup/Myrtille.Setup.vdproj | 544 +++++++++--------- Myrtille.Web/Default.aspx.cs | 6 +- Myrtille.Web/Properties/AssemblyInfo.cs | 4 +- Myrtille.Web/Web.Base.config | 6 +- .../src/Clients/RemoteSessionProcessClient.cs | 227 ++++---- README.md | 2 +- 17 files changed, 467 insertions(+), 416 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c679f80..bf2e25c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,9 @@ -2019-11-19 Version 2.7.0 (stable) +2019-11-27 Version 2.7.1 (stable) + * HOTFIX * fixed a potential crash of myrtille services when sending a disconnect notification (https://github.com/cedrozor/myrtille/issues/187, thanks gtmsew) + the automatic application pool recycling is now disabled by default, and is not applicable if using the enterprise mode (this prevents enterprise sessions to be dropped unexpectedly!) + if recycling is enabled, a new http session is now acquired on disconnect; this prevents a subsequent login failure (due to the old http session being invalid) without any error message + +2019-11-19 Version 2.7.0 (stable) * HOTFIX * fixed a critical issue with FreeRDP (exit code 131085) when using an RD license server configured in "per device" mode, past the 120 days of the RDS grace period updated readme and documentation about the RDS role the browser "heartbeat" (used to detect if the browser window/tab was closed) is now on a different timer than the periodical fullscreen update (config.js; default 10 secs) diff --git a/Myrtille.Admin.Services/Properties/AssemblyInfo.cs b/Myrtille.Admin.Services/Properties/AssemblyInfo.cs index 6ad51db..8617b33 100644 --- a/Myrtille.Admin.Services/Properties/AssemblyInfo.cs +++ b/Myrtille.Admin.Services/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.Admin.Web/Properties/AssemblyInfo.cs b/Myrtille.Admin.Web/Properties/AssemblyInfo.cs index ad762b5..4b1de02 100644 --- a/Myrtille.Admin.Web/Properties/AssemblyInfo.cs +++ b/Myrtille.Admin.Web/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.Common/Properties/AssemblyInfo.cs b/Myrtille.Common/Properties/AssemblyInfo.cs index da43a97..631e4f4 100644 --- a/Myrtille.Common/Properties/AssemblyInfo.cs +++ b/Myrtille.Common/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // // Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de révision et de build par défaut // en utilisant '*', comme indiqué ci-dessous : -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.Enterprise/Properties/AssemblyInfo.cs b/Myrtille.Enterprise/Properties/AssemblyInfo.cs index fa061a1..51d164c 100644 --- a/Myrtille.Enterprise/Properties/AssemblyInfo.cs +++ b/Myrtille.Enterprise/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.MFAProviders/Properties/AssemblyInfo.cs b/Myrtille.MFAProviders/Properties/AssemblyInfo.cs index 980b558..0855d3e 100644 --- a/Myrtille.MFAProviders/Properties/AssemblyInfo.cs +++ b/Myrtille.MFAProviders/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.Printer/Properties/AssemblyInfo.cs b/Myrtille.Printer/Properties/AssemblyInfo.cs index cf2467b..8aa6d99 100644 --- a/Myrtille.Printer/Properties/AssemblyInfo.cs +++ b/Myrtille.Printer/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.SSH/Properties/AssemblyInfo.cs b/Myrtille.SSH/Properties/AssemblyInfo.cs index 3222939..49ef7ce 100644 --- a/Myrtille.SSH/Properties/AssemblyInfo.cs +++ b/Myrtille.SSH/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.Services.Contracts/Properties/AssemblyInfo.cs b/Myrtille.Services.Contracts/Properties/AssemblyInfo.cs index d88d105..ffb2171 100644 --- a/Myrtille.Services.Contracts/Properties/AssemblyInfo.cs +++ b/Myrtille.Services.Contracts/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut // en utilisant '*', comme indiqué ci-dessous : // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.Services/Properties/AssemblyInfo.cs b/Myrtille.Services/Properties/AssemblyInfo.cs index b020a03..ad9b729 100644 --- a/Myrtille.Services/Properties/AssemblyInfo.cs +++ b/Myrtille.Services/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut // en utilisant '*', comme indiqué ci-dessous : // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.Services/RemoteSessionProcess.cs b/Myrtille.Services/RemoteSessionProcess.cs index 7019dea..310204f 100644 --- a/Myrtille.Services/RemoteSessionProcess.cs +++ b/Myrtille.Services/RemoteSessionProcess.cs @@ -452,27 +452,40 @@ private void ProcessExited( { Trace.TraceInformation("Disconnected remote session {0}, exit code {1}", _remoteSessionId, _process.ExitCode); - // invoke the callback asynchronously and possibly in a separate thread to avoid any deadlock - Task.Factory.StartNew(() => + try { - try - { - // notify the remote session manager of the process exit - _callback.ProcessExited(_process.ExitCode); - } - catch (Exception exc) + // invoke the callback asynchronously and possibly in a separate thread to avoid any deadlock + Task.Factory.StartNew(() => { - Trace.TraceError("Failed to notify the host client process exit (MyrtilleAppPool down?), remote session {0} ({1})", _remoteSessionId, exc); - } - finally - { - if (_process != null) - { - _process.Dispose(); - _process = null; - } - } - }); + ProcessExitedCallback(); + }); + } + catch (Exception exc) + { + Trace.TraceError("Failed to invoke the process exited callback asynchronously, trying synchronously, remote session {0} ({1})", _remoteSessionId, exc); + ProcessExitedCallback(); + } + } + } + + private void ProcessExitedCallback() + { + try + { + // notify the remote session manager of the process exit + _callback.ProcessExited(_process.ExitCode); + } + catch (Exception exc) + { + Trace.TraceError("Failed to notify the host client process exit (MyrtilleAppPool down?), remote session {0} ({1})", _remoteSessionId, exc); + } + finally + { + if (_process != null) + { + _process.Dispose(); + _process = null; + } } } diff --git a/Myrtille.Setup/Myrtille.Setup.vdproj b/Myrtille.Setup/Myrtille.Setup.vdproj index ab68f75..23de149 100644 --- a/Myrtille.Setup/Myrtille.Setup.vdproj +++ b/Myrtille.Setup/Myrtille.Setup.vdproj @@ -99,12 +99,6 @@ } "Entry" { - "MsmKey" = "8:_35221A90623266B7A9FDC425BE944432" - "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_45CB0595F5A7C6F661B3AE7E03FF554B" "OwnerKey" = "8:_AA7B9254EDD24A378250099DC28F1BC1" "MsmSig" = "8:_UNDEFINED" @@ -129,6 +123,12 @@ } "Entry" { + "MsmKey" = "8:_51E1684E0AC9A2E6C91C688F2C9DD4B1" + "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_5B485B9AA1224F56A609636F984E70EC" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -381,68 +381,68 @@ } "Entry" { - "MsmKey" = "8:_A17DBF12B6A6522264FE8C544BE7637C" - "OwnerKey" = "8:_BCACB0C36170310E57FF172BDA1E5104" + "MsmKey" = "8:_990AC498687A0E2ED129023E9CC2D5B5" + "OwnerKey" = "8:_0A74AD687EED42B790D48F7F5F3AB404" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A17DBF12B6A6522264FE8C544BE7637C" - "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" + "MsmKey" = "8:_990AC498687A0E2ED129023E9CC2D5B5" + "OwnerKey" = "8:_EF7BA948A8A34B5CB515E968F9EFD966" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A45F72E723FA6DFC7CAFF899597494CE" - "OwnerKey" = "8:_AA7B9254EDD24A378250099DC28F1BC1" + "MsmKey" = "8:_990AC498687A0E2ED129023E9CC2D5B5" + "OwnerKey" = "8:_E64EE02B3449434592136B3C178CD9B2" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A45F72E723FA6DFC7CAFF899597494CE" - "OwnerKey" = "8:_1EE5D98F80FD1E8988C38C20595D35F2" + "MsmKey" = "8:_990AC498687A0E2ED129023E9CC2D5B5" + "OwnerKey" = "8:_AA7B9254EDD24A378250099DC28F1BC1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A490591BEB0F433F8F7017269A180690" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_990AC498687A0E2ED129023E9CC2D5B5" + "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A497E76C0ED62169D5B933879BC5A73F" - "OwnerKey" = "8:_0A74AD687EED42B790D48F7F5F3AB404" + "MsmKey" = "8:_990AC498687A0E2ED129023E9CC2D5B5" + "OwnerKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A497E76C0ED62169D5B933879BC5A73F" - "OwnerKey" = "8:_EF7BA948A8A34B5CB515E968F9EFD966" + "MsmKey" = "8:_A17DBF12B6A6522264FE8C544BE7637C" + "OwnerKey" = "8:_E76FFE893BD37BAA153E3EFB44999C4E" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A497E76C0ED62169D5B933879BC5A73F" - "OwnerKey" = "8:_E64EE02B3449434592136B3C178CD9B2" + "MsmKey" = "8:_A17DBF12B6A6522264FE8C544BE7637C" + "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A497E76C0ED62169D5B933879BC5A73F" + "MsmKey" = "8:_A45F72E723FA6DFC7CAFF899597494CE" "OwnerKey" = "8:_AA7B9254EDD24A378250099DC28F1BC1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A497E76C0ED62169D5B933879BC5A73F" - "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" + "MsmKey" = "8:_A45F72E723FA6DFC7CAFF899597494CE" + "OwnerKey" = "8:_1EE5D98F80FD1E8988C38C20595D35F2" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A497E76C0ED62169D5B933879BC5A73F" - "OwnerKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" + "MsmKey" = "8:_A490591BEB0F433F8F7017269A180690" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -465,12 +465,6 @@ } "Entry" { - "MsmKey" = "8:_BCACB0C36170310E57FF172BDA1E5104" - "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_BF505211616D4E9191B1B102DE7C37D9" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -490,7 +484,7 @@ "Entry" { "MsmKey" = "8:_C86279E0F97A6677B41B24460FBAF2B5" - "OwnerKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" + "OwnerKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -549,92 +543,128 @@ } "Entry" { - "MsmKey" = "8:_DB3716D500DD1600AC6CD10FDF44E26E" + "MsmKey" = "8:_DBCE7EA11E8AD9C53593890EDB116972" + "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DDE9D93C9EF647B5A91B2AABE63BB660" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" "OwnerKey" = "8:_0A74AD687EED42B790D48F7F5F3AB404" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DB3716D500DD1600AC6CD10FDF44E26E" + "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" "OwnerKey" = "8:_EF7BA948A8A34B5CB515E968F9EFD966" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DB3716D500DD1600AC6CD10FDF44E26E" + "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" + "OwnerKey" = "8:_E64EE02B3449434592136B3C178CD9B2" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" "OwnerKey" = "8:_AA7B9254EDD24A378250099DC28F1BC1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DB3716D500DD1600AC6CD10FDF44E26E" + "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DB3716D500DD1600AC6CD10FDF44E26E" - "OwnerKey" = "8:_BCACB0C36170310E57FF172BDA1E5104" + "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" + "OwnerKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DB3716D500DD1600AC6CD10FDF44E26E" - "OwnerKey" = "8:_35221A90623266B7A9FDC425BE944432" + "MsmKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" + "OwnerKey" = "8:_0A74AD687EED42B790D48F7F5F3AB404" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DBCE7EA11E8AD9C53593890EDB116972" - "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" + "MsmKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" + "OwnerKey" = "8:_EF7BA948A8A34B5CB515E968F9EFD966" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DDE9D93C9EF647B5A91B2AABE63BB660" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" + "OwnerKey" = "8:_E64EE02B3449434592136B3C178CD9B2" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" - "OwnerKey" = "8:_0A74AD687EED42B790D48F7F5F3AB404" + "MsmKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" + "OwnerKey" = "8:_AA7B9254EDD24A378250099DC28F1BC1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" - "OwnerKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" + "MsmKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" + "OwnerKey" = "8:_51E1684E0AC9A2E6C91C688F2C9DD4B1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" + "MsmKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" + "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DFAAA3E9F9E1FFD9EFA43D8352F1F668" "OwnerKey" = "8:_EF7BA948A8A34B5CB515E968F9EFD966" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" - "OwnerKey" = "8:_E64EE02B3449434592136B3C178CD9B2" + "MsmKey" = "8:_E385E6F4F7BC7295F537EC6B3C8250D3" + "OwnerKey" = "8:_0A74AD687EED42B790D48F7F5F3AB404" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" + "MsmKey" = "8:_E385E6F4F7BC7295F537EC6B3C8250D3" + "OwnerKey" = "8:_EF7BA948A8A34B5CB515E968F9EFD966" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E385E6F4F7BC7295F537EC6B3C8250D3" "OwnerKey" = "8:_AA7B9254EDD24A378250099DC28F1BC1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DF0572015795804F70A9AA695417FBAB" + "MsmKey" = "8:_E385E6F4F7BC7295F537EC6B3C8250D3" "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DFAAA3E9F9E1FFD9EFA43D8352F1F668" - "OwnerKey" = "8:_EF7BA948A8A34B5CB515E968F9EFD966" + "MsmKey" = "8:_E385E6F4F7BC7295F537EC6B3C8250D3" + "OwnerKey" = "8:_E76FFE893BD37BAA153E3EFB44999C4E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E385E6F4F7BC7295F537EC6B3C8250D3" + "OwnerKey" = "8:_51E1684E0AC9A2E6C91C688F2C9DD4B1" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -651,6 +681,12 @@ } "Entry" { + "MsmKey" = "8:_E76FFE893BD37BAA153E3EFB44999C4E" + "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_E873CD23DD2246C7A8E17E123C84C035" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -658,7 +694,7 @@ "Entry" { "MsmKey" = "8:_E876AC56ADF9739D1A83816510312CE7" - "OwnerKey" = "8:_A497E76C0ED62169D5B933879BC5A73F" + "OwnerKey" = "8:_990AC498687A0E2ED129023E9CC2D5B5" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -694,7 +730,7 @@ "Entry" { "MsmKey" = "8:_F2FF150F59BF51862493844900AF6E49" - "OwnerKey" = "8:_35221A90623266B7A9FDC425BE944432" + "OwnerKey" = "8:_51E1684E0AC9A2E6C91C688F2C9DD4B1" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -747,42 +783,6 @@ } "Entry" { - "MsmKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" - "OwnerKey" = "8:_0A74AD687EED42B790D48F7F5F3AB404" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" - "OwnerKey" = "8:_EF7BA948A8A34B5CB515E968F9EFD966" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" - "OwnerKey" = "8:_E64EE02B3449434592136B3C178CD9B2" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" - "OwnerKey" = "8:_AA7B9254EDD24A378250099DC28F1BC1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" - "OwnerKey" = "8:_35221A90623266B7A9FDC425BE944432" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" - "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_6A00A4B5E0C64F48AF08EC529C41D062" "MsmSig" = "8:_UNDEFINED" @@ -790,36 +790,6 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_BCACB0C36170310E57FF172BDA1E5104" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_35221A90623266B7A9FDC425BE944432" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_DB3716D500DD1600AC6CD10FDF44E26E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_FC34657BE58E0A644718274D2D0E6F7F" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_A497E76C0ED62169D5B933879BC5A73F" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_EF7BA948A8A34B5CB515E968F9EFD966" "MsmSig" = "8:_UNDEFINED" } @@ -964,12 +934,24 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_E76FFE893BD37BAA153E3EFB44999C4E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_A17DBF12B6A6522264FE8C544BE7637C" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_51E1684E0AC9A2E6C91C688F2C9DD4B1" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_F2FF150F59BF51862493844900AF6E49" "MsmSig" = "8:_UNDEFINED" } @@ -988,6 +970,18 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_E385E6F4F7BC7295F537EC6B3C8250D3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_DF64623992E0504E6E44F78E0DACDA36" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_C86279E0F97A6677B41B24460FBAF2B5" "MsmSig" = "8:_UNDEFINED" } @@ -1000,6 +994,12 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_990AC498687A0E2ED129023E9CC2D5B5" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_83A15477F512314BC17E6D4FAEDDDF13" "MsmSig" = "8:_UNDEFINED" } @@ -1461,37 +1461,6 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_35221A90623266B7A9FDC425BE944432" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Myrtille.Enterprise, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_35221A90623266B7A9FDC425BE944432" - { - "Name" = "8:Myrtille.Enterprise.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Myrtille.Enterprise.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_45CB0595F5A7C6F661B3AE7E03FF554B" { "AssemblyRegister" = "3:1" @@ -1594,6 +1563,37 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_51E1684E0AC9A2E6C91C688F2C9DD4B1" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Myrtille.Enterprise, Version=2.7.1.0, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_51E1684E0AC9A2E6C91C688F2C9DD4B1" + { + "Name" = "8:Myrtille.Enterprise.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Myrtille.Enterprise.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5B485B9AA1224F56A609636F984E70EC" { "SourcePath" = "8:..\\CHANGELOG" @@ -2153,20 +2153,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A17DBF12B6A6522264FE8C544BE7637C" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_990AC498687A0E2ED129023E9CC2D5B5" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:OASIS.Integration, Version=1.7.0.0, Culture=neutral, PublicKeyToken=bf7fa19775bc8b36, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:CertEnroll_Interop, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" "ScatterAssemblies" { - "_A17DBF12B6A6522264FE8C544BE7637C" + "_990AC498687A0E2ED129023E9CC2D5B5" { - "Name" = "8:OASIS.Integration.dll" + "Name" = "8:CertEnroll_Interop.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:OASIS.Integration.dll" + "SourcePath" = "8:CertEnroll_Interop.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" @@ -2184,20 +2184,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A45F72E723FA6DFC7CAFF899597494CE" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A17DBF12B6A6522264FE8C544BE7637C" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Antlr3.Runtime, Version=3.4.1.9004, Culture=neutral, PublicKeyToken=eb42632606e9261f, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:OASIS.Integration, Version=1.7.0.0, Culture=neutral, PublicKeyToken=bf7fa19775bc8b36, processorArchitecture=MSIL" "ScatterAssemblies" { - "_A45F72E723FA6DFC7CAFF899597494CE" + "_A17DBF12B6A6522264FE8C544BE7637C" { - "Name" = "8:Antlr3.Runtime.dll" + "Name" = "8:OASIS.Integration.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Antlr3.Runtime.dll" + "SourcePath" = "8:OASIS.Integration.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" @@ -2215,40 +2215,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A490591BEB0F433F8F7017269A180690" - { - "SourcePath" = "8:..\\packages\\openssl-vc141-static-x86_64.1.1.0\\build\\native\\lib\\Win32\\dynamic\\msvcr120.dll" - "TargetName" = "8:msvcr120.dll" - "Tag" = "8:" - "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A497E76C0ED62169D5B933879BC5A73F" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A45F72E723FA6DFC7CAFF899597494CE" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:CertEnroll_Interop, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Antlr3.Runtime, Version=3.4.1.9004, Culture=neutral, PublicKeyToken=eb42632606e9261f, processorArchitecture=MSIL" "ScatterAssemblies" { - "_A497E76C0ED62169D5B933879BC5A73F" + "_A45F72E723FA6DFC7CAFF899597494CE" { - "Name" = "8:CertEnroll_Interop.dll" + "Name" = "8:Antlr3.Runtime.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:CertEnroll_Interop.dll" + "SourcePath" = "8:Antlr3.Runtime.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" @@ -2266,12 +2246,12 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_ABE4E421EB25401FA22DB71407D36135" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A490591BEB0F433F8F7017269A180690" { - "SourcePath" = "8:..\\packages\\Microsoft.SqlServer.Compact.4.0.8876.1\\NativeBinaries\\x86\\sqlcese40.dll" - "TargetName" = "8:sqlcese40.dll" + "SourcePath" = "8:..\\packages\\openssl-vc141-static-x86_64.1.1.0\\build\\native\\lib\\Win32\\dynamic\\msvcr120.dll" + "TargetName" = "8:msvcr120.dll" "Tag" = "8:" - "Folder" = "8:_3610012282CA47DDAC6B705C3FA844DB" + "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -2286,12 +2266,12 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_AE0BA4806C1E4C3DB030DA3E5F6380E1" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_ABE4E421EB25401FA22DB71407D36135" { - "SourcePath" = "8:..\\packages\\Microsoft.SqlServer.Compact.4.0.8876.1\\NativeBinaries\\amd64\\Microsoft.VC90.CRT\\README_ENU.txt" - "TargetName" = "8:README_ENU.txt" + "SourcePath" = "8:..\\packages\\Microsoft.SqlServer.Compact.4.0.8876.1\\NativeBinaries\\x86\\sqlcese40.dll" + "TargetName" = "8:sqlcese40.dll" "Tag" = "8:" - "Folder" = "8:_889006B3BB5F432D87C15DA9EF3ABE1D" + "Folder" = "8:_3610012282CA47DDAC6B705C3FA844DB" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -2306,23 +2286,12 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BCACB0C36170310E57FF172BDA1E5104" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_AE0BA4806C1E4C3DB030DA3E5F6380E1" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Myrtille.MFAProviders, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_BCACB0C36170310E57FF172BDA1E5104" - { - "Name" = "8:Myrtille.MFAProviders.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Myrtille.MFAProviders.dll" - "TargetName" = "8:" + "SourcePath" = "8:..\\packages\\Microsoft.SqlServer.Compact.4.0.8876.1\\NativeBinaries\\amd64\\Microsoft.VC90.CRT\\README_ENU.txt" + "TargetName" = "8:README_ENU.txt" "Tag" = "8:" - "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" + "Folder" = "8:_889006B3BB5F432D87C15DA9EF3ABE1D" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -2334,7 +2303,7 @@ "PackageAs" = "3:1" "Register" = "3:1" "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_BF505211616D4E9191B1B102DE7C37D9" @@ -2490,20 +2459,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DB3716D500DD1600AC6CD10FDF44E26E" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DBCE7EA11E8AD9C53593890EDB116972" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Myrtille.Services.Contracts, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Cassia, Version=2.0.0.60, Culture=neutral, processorArchitecture=MSIL" "ScatterAssemblies" { - "_DB3716D500DD1600AC6CD10FDF44E26E" + "_DBCE7EA11E8AD9C53593890EDB116972" { - "Name" = "8:Myrtille.Services.Contracts.dll" + "Name" = "8:Cassia.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Myrtille.Services.Contracts.dll" + "SourcePath" = "8:Cassia.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" @@ -2521,20 +2490,40 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DBCE7EA11E8AD9C53593890EDB116972" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DDE9D93C9EF647B5A91B2AABE63BB660" + { + "SourcePath" = "8:..\\packages\\NAudio.Lame.1.0.9\\build\\libmp3lame.32.dll" + "TargetName" = "8:libmp3lame.32.dll" + "Tag" = "8:" + "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DF0572015795804F70A9AA695417FBAB" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Cassia, Version=2.0.0.60, Culture=neutral, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Microsoft.Web.Administration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" "ScatterAssemblies" { - "_DBCE7EA11E8AD9C53593890EDB116972" + "_DF0572015795804F70A9AA695417FBAB" { - "Name" = "8:Cassia.dll" + "Name" = "8:Microsoft.Web.Administration.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Cassia.dll" + "SourcePath" = "8:Microsoft.Web.Administration.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" @@ -2552,10 +2541,21 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DDE9D93C9EF647B5A91B2AABE63BB660" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DF64623992E0504E6E44F78E0DACDA36" { - "SourcePath" = "8:..\\packages\\NAudio.Lame.1.0.9\\build\\libmp3lame.32.dll" - "TargetName" = "8:libmp3lame.32.dll" + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Myrtille.Common, Version=2.7.1.0, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_DF64623992E0504E6E44F78E0DACDA36" + { + "Name" = "8:Myrtille.Common.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Myrtille.Common.dll" + "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" "Condition" = "8:" @@ -2569,23 +2569,23 @@ "PackageAs" = "3:1" "Register" = "3:1" "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" + "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DF0572015795804F70A9AA695417FBAB" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DFAAA3E9F9E1FFD9EFA43D8352F1F668" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.Web.Administration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Microsoft.Owin.Hosting, Version=4.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" "ScatterAssemblies" { - "_DF0572015795804F70A9AA695417FBAB" + "_DFAAA3E9F9E1FFD9EFA43D8352F1F668" { - "Name" = "8:Microsoft.Web.Administration.dll" + "Name" = "8:Microsoft.Owin.Hosting.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.Web.Administration.dll" + "SourcePath" = "8:Microsoft.Owin.Hosting.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" @@ -2603,20 +2603,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DFAAA3E9F9E1FFD9EFA43D8352F1F668" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E385E6F4F7BC7295F537EC6B3C8250D3" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.Owin.Hosting, Version=4.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Myrtille.Services.Contracts, Version=2.7.1.0, Culture=neutral, processorArchitecture=MSIL" "ScatterAssemblies" { - "_DFAAA3E9F9E1FFD9EFA43D8352F1F668" + "_E385E6F4F7BC7295F537EC6B3C8250D3" { - "Name" = "8:Microsoft.Owin.Hosting.dll" + "Name" = "8:Myrtille.Services.Contracts.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.Owin.Hosting.dll" + "SourcePath" = "8:Myrtille.Services.Contracts.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" @@ -2654,6 +2654,37 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E76FFE893BD37BAA153E3EFB44999C4E" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Myrtille.MFAProviders, Version=2.7.1.0, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_E76FFE893BD37BAA153E3EFB44999C4E" + { + "Name" = "8:Myrtille.MFAProviders.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Myrtille.MFAProviders.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E873CD23DD2246C7A8E17E123C84C035" { "SourcePath" = "8:..\\packages\\NAudio.Lame.1.0.9\\build\\libmp3lame.64.dll" @@ -2807,37 +2838,6 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FC34657BE58E0A644718274D2D0E6F7F" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Myrtille.Common, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_FC34657BE58E0A644718274D2D0E6F7F" - { - "Name" = "8:Myrtille.Common.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Myrtille.Common.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_FA146EB9AE2B44E2AB4B01E26999CAB2" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } } "FileType" { @@ -2961,14 +2961,14 @@ "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Myrtille" "ProductCode" = "8:{B00BCC6F-3958-4726-9D99-DBAC78513C26}" - "PackageCode" = "8:{91D6BEE8-F3D7-4EF2-9557-E323446C2ED4}" + "PackageCode" = "8:{482A6AF5-61F8-4238-83D9-9EC7CE0B09EF}" "UpgradeCode" = "8:{86A6145E-11DB-4EE7-9CE0-53F997050716}" "AspNetVersion" = "8:4.0.30319.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:2.7.0" + "ProductVersion" = "8:2.7.1" "Manufacturer" = "8:Cedric Coste" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:http://cedrozor.github.io/myrtille" diff --git a/Myrtille.Web/Default.aspx.cs b/Myrtille.Web/Default.aspx.cs index 665bd08..5932d35 100644 --- a/Myrtille.Web/Default.aspx.cs +++ b/Myrtille.Web/Default.aspx.cs @@ -225,7 +225,7 @@ protected void Page_Load( if (RemoteSession.State == RemoteSessionState.Disconnected) { - // if connecting from login page or url, show any connection failure into a dialog box + // if connecting from a login page or url, show any connection failure into a dialog box // otherwise, this is delegated to the connection API used and its related UI if (_loginEnabled) { @@ -242,10 +242,10 @@ protected void Page_Load( } // cleanup - Session.Remove(HttpSessionStateVariables.RemoteSession.ToString()); + Session[HttpSessionStateVariables.RemoteSession.ToString()] = null; if (Session[HttpSessionStateVariables.GuestInfo.ToString()] != null) { - Session.Remove(HttpSessionStateVariables.GuestInfo.ToString()); + Session[HttpSessionStateVariables.GuestInfo.ToString()] = null; } RemoteSession = null; } diff --git a/Myrtille.Web/Properties/AssemblyInfo.cs b/Myrtille.Web/Properties/AssemblyInfo.cs index acf197b..24b1729 100644 --- a/Myrtille.Web/Properties/AssemblyInfo.cs +++ b/Myrtille.Web/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.7.0.0")] -[assembly: AssemblyFileVersion("2.7.0.0")] +[assembly: AssemblyVersion("2.7.1.0")] +[assembly: AssemblyFileVersion("2.7.1.0")] diff --git a/Myrtille.Web/Web.Base.config b/Myrtille.Web/Web.Base.config index 9636f41..8732551 100644 --- a/Myrtille.Web/Web.Base.config +++ b/Myrtille.Web/Web.Base.config @@ -189,10 +189,10 @@ - + - - + + \ No newline at end of file diff --git a/Myrtille.Web/src/Clients/RemoteSessionProcessClient.cs b/Myrtille.Web/src/Clients/RemoteSessionProcessClient.cs index 5c78403..320223f 100644 --- a/Myrtille.Web/src/Clients/RemoteSessionProcessClient.cs +++ b/Myrtille.Web/src/Clients/RemoteSessionProcessClient.cs @@ -138,6 +138,7 @@ public string GetProcessIdentity() public class RemoteSessionProcessClientCallback : IRemoteSessionProcessCallback { private ConnectionClient _connectionClient = new ConnectionClient(Settings.Default.ConnectionServiceUrl); + private EnterpriseClient _enterpriseClient = new EnterpriseClient(); private ApplicationPoolClient _applicationPoolClient = new ApplicationPoolClient(); private RemoteSessionManager _remoteSessionManager; @@ -185,13 +186,18 @@ public void ProcessExited(int exitCode) _remoteSessionManager.ClientIdleTimeout = new CancellationTokenSource(); } _remoteSessionManager.RemoteSession.State = RemoteSessionState.Connecting; + _remoteSessionManager.SendMessage(new RemoteSessionMessage { Type = MessageType.Disconnected, Prefix = "disconnected" }); } - - // send a disconnect notification to the browser - _remoteSessionManager.SendMessage(new RemoteSessionMessage { Type = MessageType.Disconnected, Prefix = "disconnected" }); - - if (_remoteSessionManager.RemoteSession.State == RemoteSessionState.Disconnected) + // otherwise, redirect to the login page (or the hosts dashboard in enterprise mode) + else { + // CAUTION! exit code list is not exhaustive (that's why RemoteSession.ExitCode is an int) + RemoteSessionExitCode _exitCode; + if (!Enum.TryParse(_remoteSessionManager.RemoteSession.ExitCode.ToString(), out _exitCode)) + { + _exitCode = RemoteSessionExitCode.Unknown; + } + // if using a connection service, send the connection state and exit code if (_remoteSessionManager.RemoteSession.ConnectionService) { @@ -201,13 +207,6 @@ public void ProcessExited(int exitCode) GuidHelper.ConvertFromString(_remoteSessionManager.RemoteSession.VMGuid), _remoteSessionManager.RemoteSession.State); - // CAUTION! exit code list is not exhaustive (that's why RemoteSession.ExitCode is an int) - RemoteSessionExitCode _exitCode; - if (!Enum.TryParse(_remoteSessionManager.RemoteSession.ExitCode.ToString(), out _exitCode)) - { - _exitCode = RemoteSessionExitCode.Unknown; - } - _connectionClient.SetConnectionExitCode( _remoteSessionManager.RemoteSession.Id, string.IsNullOrEmpty(_remoteSessionManager.RemoteSession.VMAddress) ? _remoteSessionManager.RemoteSession.ServerAddress : _remoteSessionManager.RemoteSession.VMAddress, @@ -215,104 +214,138 @@ public void ProcessExited(int exitCode) _exitCode); } - // cleanup - try + CleanupDisconnectedSession(_exitCode); + } + } + catch (Exception exc) + { + Trace.TraceError("Failed to handle session disconnect, remote session {0} ({1})", _remoteSessionManager.RemoteSession.Id, exc); + throw; + } + } + + private void CleanupDisconnectedSession(RemoteSessionExitCode exitCode) + { + try + { + _application.Lock(); + + #region session + + // unregister the remote session at the application level + var remoteSessions = (IDictionary)_application[HttpApplicationStateVariables.RemoteSessions.ToString()]; + if (remoteSessions.ContainsKey(_remoteSessionManager.RemoteSession.Id)) + { + remoteSessions.Remove(_remoteSessionManager.RemoteSession.Id); + } + + #endregion + + #region session sharing + + // remove the remote session guest(s) + var guests = new List(); + var sharedSessions = (IDictionary)_application[HttpApplicationStateVariables.SharedRemoteSessions.ToString()]; + foreach (var sharingInfo in sharedSessions.Values) + { + if (sharingInfo.RemoteSession.Id.Equals(_remoteSessionManager.RemoteSession.Id)) { - _application.Lock(); - - // unregister the remote session at the application level - var remoteSessions = (IDictionary)_application[HttpApplicationStateVariables.RemoteSessions.ToString()]; - - if (remoteSessions.ContainsKey(_remoteSessionManager.RemoteSession.Id)) - { - remoteSessions.Remove(_remoteSessionManager.RemoteSession.Id); - } - - // retrieve the remote session guest(s) - var guests = new List(); - var sharedSessions = (IDictionary)_application[HttpApplicationStateVariables.SharedRemoteSessions.ToString()]; - foreach (var sharingInfo in sharedSessions.Values) - { - if (sharingInfo.RemoteSession.Id.Equals(_remoteSessionManager.RemoteSession.Id)) - { - guests.Add(sharingInfo); - } - } - - // remove them - foreach (var guest in guests) - { - if (guest.GuestInfo.Active && guest.HttpSession != null) - { - if (guest.HttpSession[HttpSessionStateVariables.RemoteSession.ToString()] != null) - { - guest.HttpSession.Remove(HttpSessionStateVariables.RemoteSession.ToString()); - } - - if (guest.HttpSession[HttpSessionStateVariables.GuestInfo.ToString()] != null) - { - guest.HttpSession.Remove(HttpSessionStateVariables.GuestInfo.ToString()); - } - - if (guest.RemoteSession.ActiveGuests > 0) - { - guest.RemoteSession.ActiveGuests--; - } - } - sharedSessions.Remove(guest.GuestInfo.Id); - } - - // recycle the application pool when there is no active remote session - bool idleAppPoolRecycling; - if (!bool.TryParse(ConfigurationManager.AppSettings["IdleAppPoolRecycling"], out idleAppPoolRecycling)) - { - idleAppPoolRecycling = true; - } - - /* - - it may seem a bit extreme, but the garbage collector doesn't return the freed memory to the operating system - instead, it makes it available to the memory workspace of the application pool process, which in turn uses it for faster memory allocation later - while this is fine for most usage, this becomes critical when the OS is under memory pressure - if that occurs, the process is meant to return its unused memory to the OS - in reality, this is not always true; so the system becomes slow (hdd swap) and unstable - - memory usage of a process under Windows: https://dzone.com/articles/windows-process-memory-usage-demystified - tool: https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx - garbage collector: https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - reallocation of freed memory: https://stackoverflow.com/questions/28614210/why-doesnt-net-release-unused-memory-back-to-os-when-physical-95 - - */ - - if (idleAppPoolRecycling && remoteSessions.Count == 0) - { - // give time for the browser to receive the disconnect notification and get back to the login page - // the browser window/tab may also be closed, but there is no way to know it at this step - Thread.Sleep(2000); - - // the gateway doesn't have enough rights to recycle the application pool, this is delegated to the myrtille services - _applicationPoolClient.RecycleApplicationPool(Environment.UserName); - } + guests.Add(sharingInfo); } - catch (Exception exc) + } + + foreach (var guest in guests) + { + sharedSessions.Remove(guest.GuestInfo.Id); + } + + #endregion + + #region application pool recycling + + /* + application pool recycling may seem a bit extreme, but the garbage collector doesn't return the freed memory to the operating system + instead, it makes it available to the memory workspace of the application pool process, which in turn uses it for faster memory allocation later + while this is fine for most usage, this becomes critical when the OS is under memory pressure + if that occurs, the process is meant to return its unused memory to the OS + in reality, this is not always true; so the system becomes slow (hdd swap) and unstable + + memory usage of a process under Windows: https://dzone.com/articles/windows-process-memory-usage-demystified + tool: https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx + garbage collector: https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals + reallocation of freed memory: https://stackoverflow.com/questions/28614210/why-doesnt-net-release-unused-memory-back-to-os-when-physical-95 + */ + bool idleAppPoolRecycling; + if (!bool.TryParse(ConfigurationManager.AppSettings["IdleAppPoolRecycling"], out idleAppPoolRecycling)) + { + idleAppPoolRecycling = false; + } + + // connect from a login page or url + bool loginEnabled; + if (!bool.TryParse(ConfigurationManager.AppSettings["LoginEnabled"], out loginEnabled)) + { + loginEnabled = true; + } + + // if enabled, url of the login page + var loginUrl = string.Empty; + if (loginEnabled) + { + loginUrl = ConfigurationManager.AppSettings["LoginUrl"]; + } + + // recycle only if enabled and when there is no active remote session + // don't recycle if using the enterprise mode (if there are enterprise sessions, they musn't be dropped!) + // don't recycle in case of connection failure, so that the page can handle it (show the related error dialog) + if (idleAppPoolRecycling && + remoteSessions.Count == 0 && + !_enterpriseClient.GetState() && + (exitCode == RemoteSessionExitCode.Success || exitCode == RemoteSessionExitCode.SessionDisconnectFromMenu || exitCode == RemoteSessionExitCode.SessionLogoutFromMenu)) + { + // if using a custom login page, the application pool must be recycled after the redirect + if (!string.IsNullOrEmpty(loginUrl)) { - Trace.TraceError("Failed to delete remote session ({0})", exc); + // redirect to the custom login page + _remoteSessionManager.SendMessage(new RemoteSessionMessage { Type = MessageType.Disconnected, Prefix = "disconnected" }); + + // give some time for the redirection + Thread.Sleep(2000); + + // the gateway doesn't have enough rights to recycle the application pool, this is delegated to the myrtille services + _applicationPoolClient.RecycleApplicationPool(Environment.UserName); } - finally + // otherwise, the application pool must be recycled before the redirect + // the browser will acquire a new http session + else { - _application.UnLock(); - } + // the gateway doesn't have enough rights to recycle the application pool, this is delegated to the myrtille services + _applicationPoolClient.RecycleApplicationPool(Environment.UserName); + + // give some time for the recycling + Thread.Sleep(2000); - // the remote session is still bound to an http session - // if the related page is still active, the page will end the cleanup (unbind the remote session from the http session) - // otherwise (the browser window/tab was closed), the cleanup will be done automatically when the http session expires + // redirect to the default login page (empty if login is not enabled) + _remoteSessionManager.SendMessage(new RemoteSessionMessage { Type = MessageType.Disconnected, Prefix = "disconnected" }); + } + } + else + { + // redirect to the login page (or the hosts dashboard in enterprise mode) + _remoteSessionManager.SendMessage(new RemoteSessionMessage { Type = MessageType.Disconnected, Prefix = "disconnected" }); } + + #endregion } catch (Exception exc) { Trace.TraceError("Failed to cleanup disconnected session, remote session {0} ({1})", _remoteSessionManager.RemoteSession.Id, exc); throw; } + finally + { + _application.UnLock(); + } } } } \ No newline at end of file diff --git a/README.md b/README.md index f94cf4a..8fa458b 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ More information in the DOCUMENTATION.md file. - SSH server: any SSH server (tests were made using the built-in Windows 10 OpenSSH server) ## Resources -Myrtille does support multiple connections/tabs in cookieless session mode. From version 1.9.0, this mode is disabled by default (OWASP recommendation) but can still be enabled, if required (into web.config, carefully read comments there). +Myrtille does support multiple connections/tabs (can be disabled into web.config, read comments there). There is no limitation about the maximal number of concurrent users beside what the rdp (or ssh) server(s) can handle (number of CALs, CPU, RAM?).