SEBWIN-510: Implemented functionality.
This commit is contained in:
parent
bd5f7d4293
commit
2fdacfc1b0
17 changed files with 309 additions and 38 deletions
|
@ -21,6 +21,7 @@ using SafeExamBrowser.Communication.Contracts.Hosts;
|
||||||
using SafeExamBrowser.Communication.Contracts.Proxies;
|
using SafeExamBrowser.Communication.Contracts.Proxies;
|
||||||
using SafeExamBrowser.Configuration.Contracts;
|
using SafeExamBrowser.Configuration.Contracts;
|
||||||
using SafeExamBrowser.Configuration.Contracts.Cryptography;
|
using SafeExamBrowser.Configuration.Contracts.Cryptography;
|
||||||
|
using SafeExamBrowser.Configuration.Contracts.Integrity;
|
||||||
using SafeExamBrowser.Core.Contracts.OperationModel;
|
using SafeExamBrowser.Core.Contracts.OperationModel;
|
||||||
using SafeExamBrowser.Core.Contracts.OperationModel.Events;
|
using SafeExamBrowser.Core.Contracts.OperationModel.Events;
|
||||||
using SafeExamBrowser.I18n.Contracts;
|
using SafeExamBrowser.I18n.Contracts;
|
||||||
|
@ -55,6 +56,7 @@ namespace SafeExamBrowser.Client.UnitTests
|
||||||
private Mock<IExplorerShell> explorerShell;
|
private Mock<IExplorerShell> explorerShell;
|
||||||
private Mock<IFileSystemDialog> fileSystemDialog;
|
private Mock<IFileSystemDialog> fileSystemDialog;
|
||||||
private Mock<IHashAlgorithm> hashAlgorithm;
|
private Mock<IHashAlgorithm> hashAlgorithm;
|
||||||
|
private Mock<IIntegrityModule> integrityModule;
|
||||||
private Mock<ILogger> logger;
|
private Mock<ILogger> logger;
|
||||||
private Mock<IMessageBox> messageBox;
|
private Mock<IMessageBox> messageBox;
|
||||||
private Mock<IOperationSequence> operationSequence;
|
private Mock<IOperationSequence> operationSequence;
|
||||||
|
@ -84,6 +86,7 @@ namespace SafeExamBrowser.Client.UnitTests
|
||||||
explorerShell = new Mock<IExplorerShell>();
|
explorerShell = new Mock<IExplorerShell>();
|
||||||
fileSystemDialog = new Mock<IFileSystemDialog>();
|
fileSystemDialog = new Mock<IFileSystemDialog>();
|
||||||
hashAlgorithm = new Mock<IHashAlgorithm>();
|
hashAlgorithm = new Mock<IHashAlgorithm>();
|
||||||
|
integrityModule = new Mock<IIntegrityModule>();
|
||||||
logger = new Mock<ILogger>();
|
logger = new Mock<ILogger>();
|
||||||
messageBox = new Mock<IMessageBox>();
|
messageBox = new Mock<IMessageBox>();
|
||||||
operationSequence = new Mock<IOperationSequence>();
|
operationSequence = new Mock<IOperationSequence>();
|
||||||
|
@ -110,6 +113,7 @@ namespace SafeExamBrowser.Client.UnitTests
|
||||||
explorerShell.Object,
|
explorerShell.Object,
|
||||||
fileSystemDialog.Object,
|
fileSystemDialog.Object,
|
||||||
hashAlgorithm.Object,
|
hashAlgorithm.Object,
|
||||||
|
integrityModule.Object,
|
||||||
logger.Object,
|
logger.Object,
|
||||||
messageBox.Object,
|
messageBox.Object,
|
||||||
operationSequence.Object,
|
operationSequence.Object,
|
||||||
|
@ -371,7 +375,7 @@ namespace SafeExamBrowser.Client.UnitTests
|
||||||
};
|
};
|
||||||
|
|
||||||
messageBox.Setup(m => m.Show(
|
messageBox.Setup(m => m.Show(
|
||||||
It.Is<string>(s => s == args.Message),
|
It.Is<string>(s => s == args.Message),
|
||||||
It.Is<string>(s => s == args.Title),
|
It.Is<string>(s => s == args.Title),
|
||||||
It.Is<MessageBoxAction>(a => a == (MessageBoxAction) args.Action),
|
It.Is<MessageBoxAction>(a => a == (MessageBoxAction) args.Action),
|
||||||
It.Is<MessageBoxIcon>(i => i == (MessageBoxIcon) args.Icon),
|
It.Is<MessageBoxIcon>(i => i == (MessageBoxIcon) args.Icon),
|
||||||
|
|
|
@ -21,6 +21,7 @@ using SafeExamBrowser.Communication.Contracts.Events;
|
||||||
using SafeExamBrowser.Communication.Contracts.Hosts;
|
using SafeExamBrowser.Communication.Contracts.Hosts;
|
||||||
using SafeExamBrowser.Communication.Contracts.Proxies;
|
using SafeExamBrowser.Communication.Contracts.Proxies;
|
||||||
using SafeExamBrowser.Configuration.Contracts.Cryptography;
|
using SafeExamBrowser.Configuration.Contracts.Cryptography;
|
||||||
|
using SafeExamBrowser.Configuration.Contracts.Integrity;
|
||||||
using SafeExamBrowser.Core.Contracts.OperationModel;
|
using SafeExamBrowser.Core.Contracts.OperationModel;
|
||||||
using SafeExamBrowser.Core.Contracts.OperationModel.Events;
|
using SafeExamBrowser.Core.Contracts.OperationModel.Events;
|
||||||
using SafeExamBrowser.I18n.Contracts;
|
using SafeExamBrowser.I18n.Contracts;
|
||||||
|
@ -43,30 +44,32 @@ namespace SafeExamBrowser.Client
|
||||||
{
|
{
|
||||||
internal class ClientController
|
internal class ClientController
|
||||||
{
|
{
|
||||||
private IActionCenter actionCenter;
|
private readonly IActionCenter actionCenter;
|
||||||
private IApplicationMonitor applicationMonitor;
|
private readonly IApplicationMonitor applicationMonitor;
|
||||||
private ClientContext context;
|
private readonly ClientContext context;
|
||||||
private IDisplayMonitor displayMonitor;
|
private readonly IDisplayMonitor displayMonitor;
|
||||||
private IExplorerShell explorerShell;
|
private readonly IExplorerShell explorerShell;
|
||||||
private IFileSystemDialog fileSystemDialog;
|
private readonly IFileSystemDialog fileSystemDialog;
|
||||||
private IHashAlgorithm hashAlgorithm;
|
private readonly IHashAlgorithm hashAlgorithm;
|
||||||
private ILogger logger;
|
private readonly IIntegrityModule integrityModule;
|
||||||
private IMessageBox messageBox;
|
private readonly ILogger logger;
|
||||||
private IOperationSequence operations;
|
private readonly IMessageBox messageBox;
|
||||||
private IRuntimeProxy runtime;
|
private readonly IOperationSequence operations;
|
||||||
private bool sessionLocked;
|
private readonly IRuntimeProxy runtime;
|
||||||
private Action shutdown;
|
private readonly Action shutdown;
|
||||||
private ISplashScreen splashScreen;
|
private readonly ISplashScreen splashScreen;
|
||||||
private ISystemMonitor systemMonitor;
|
private readonly ISystemMonitor systemMonitor;
|
||||||
private ITaskbar taskbar;
|
private readonly ITaskbar taskbar;
|
||||||
private IText text;
|
private readonly IText text;
|
||||||
private IUserInterfaceFactory uiFactory;
|
private readonly IUserInterfaceFactory uiFactory;
|
||||||
|
|
||||||
private IBrowserApplication Browser => context.Browser;
|
private IBrowserApplication Browser => context.Browser;
|
||||||
private IClientHost ClientHost => context.ClientHost;
|
private IClientHost ClientHost => context.ClientHost;
|
||||||
private IServerProxy Server => context.Server;
|
private IServerProxy Server => context.Server;
|
||||||
private AppSettings Settings => context.Settings;
|
private AppSettings Settings => context.Settings;
|
||||||
|
|
||||||
|
private bool sessionLocked;
|
||||||
|
|
||||||
internal ClientController(
|
internal ClientController(
|
||||||
IActionCenter actionCenter,
|
IActionCenter actionCenter,
|
||||||
IApplicationMonitor applicationMonitor,
|
IApplicationMonitor applicationMonitor,
|
||||||
|
@ -75,6 +78,7 @@ namespace SafeExamBrowser.Client
|
||||||
IExplorerShell explorerShell,
|
IExplorerShell explorerShell,
|
||||||
IFileSystemDialog fileSystemDialog,
|
IFileSystemDialog fileSystemDialog,
|
||||||
IHashAlgorithm hashAlgorithm,
|
IHashAlgorithm hashAlgorithm,
|
||||||
|
IIntegrityModule integrityModule,
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
IMessageBox messageBox,
|
IMessageBox messageBox,
|
||||||
IOperationSequence operations,
|
IOperationSequence operations,
|
||||||
|
@ -93,6 +97,7 @@ namespace SafeExamBrowser.Client
|
||||||
this.explorerShell = explorerShell;
|
this.explorerShell = explorerShell;
|
||||||
this.fileSystemDialog = fileSystemDialog;
|
this.fileSystemDialog = fileSystemDialog;
|
||||||
this.hashAlgorithm = hashAlgorithm;
|
this.hashAlgorithm = hashAlgorithm;
|
||||||
|
this.integrityModule = integrityModule;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.messageBox = messageBox;
|
this.messageBox = messageBox;
|
||||||
this.operations = operations;
|
this.operations = operations;
|
||||||
|
@ -123,6 +128,7 @@ namespace SafeExamBrowser.Client
|
||||||
RegisterEvents();
|
RegisterEvents();
|
||||||
ShowShell();
|
ShowShell();
|
||||||
AutoStartApplications();
|
AutoStartApplications();
|
||||||
|
ScheduleIntegrityVerification();
|
||||||
|
|
||||||
var communication = runtime.InformClientReady();
|
var communication = runtime.InformClientReady();
|
||||||
|
|
||||||
|
@ -215,12 +221,12 @@ namespace SafeExamBrowser.Client
|
||||||
|
|
||||||
private void Taskbar_LoseFocusRequested(bool forward)
|
private void Taskbar_LoseFocusRequested(bool forward)
|
||||||
{
|
{
|
||||||
this.Browser.Focus(forward);
|
Browser.Focus(forward);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Browser_LoseFocusRequested(bool forward)
|
private void Browser_LoseFocusRequested(bool forward)
|
||||||
{
|
{
|
||||||
this.taskbar.Focus(forward);
|
taskbar.Focus(forward);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeregisterEvents()
|
private void DeregisterEvents()
|
||||||
|
@ -307,6 +313,39 @@ namespace SafeExamBrowser.Client
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ScheduleIntegrityVerification()
|
||||||
|
{
|
||||||
|
const int FIVE_MINUTES = 300000;
|
||||||
|
const int TEN_MINUTES = 600000;
|
||||||
|
|
||||||
|
var timer = new System.Timers.Timer();
|
||||||
|
|
||||||
|
timer.AutoReset = false;
|
||||||
|
timer.Elapsed += (o, args) =>
|
||||||
|
{
|
||||||
|
logger.Info($"Attempting to verify application integrity...");
|
||||||
|
|
||||||
|
if (integrityModule.TryVerifyCodeSignature(out var isValid))
|
||||||
|
{
|
||||||
|
if (isValid)
|
||||||
|
{
|
||||||
|
logger.Info("Application integrity successfully verified.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Warn("Application integrity is compromised!");
|
||||||
|
ShowLockScreen(text.Get(TextKey.LockScreen_IntegrityMessage), text.Get(TextKey.LockScreen_Title), Enumerable.Empty<LockScreenOption>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Warn("Failed to verify application integrity!");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
timer.Interval = TEN_MINUTES + (new Random().NextDouble() * FIVE_MINUTES);
|
||||||
|
timer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
private void ApplicationMonitor_ExplorerStarted()
|
private void ApplicationMonitor_ExplorerStarted()
|
||||||
{
|
{
|
||||||
logger.Info("Trying to terminate Windows explorer...");
|
logger.Info("Trying to terminate Windows explorer...");
|
||||||
|
@ -798,7 +837,7 @@ namespace SafeExamBrowser.Client
|
||||||
{
|
{
|
||||||
var result = messageBox.Show(TextKey.MessageBox_Quit, TextKey.MessageBox_QuitTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question);
|
var result = messageBox.Show(TextKey.MessageBox_Quit, TextKey.MessageBox_QuitTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question);
|
||||||
var quit = result == MessageBoxResult.Yes;
|
var quit = result == MessageBoxResult.Yes;
|
||||||
|
|
||||||
if (quit)
|
if (quit)
|
||||||
{
|
{
|
||||||
logger.Info("The user chose to terminate the application.");
|
logger.Info("The user chose to terminate the application.");
|
||||||
|
|
|
@ -18,7 +18,9 @@ using SafeExamBrowser.Communication.Contracts;
|
||||||
using SafeExamBrowser.Communication.Contracts.Proxies;
|
using SafeExamBrowser.Communication.Contracts.Proxies;
|
||||||
using SafeExamBrowser.Communication.Hosts;
|
using SafeExamBrowser.Communication.Hosts;
|
||||||
using SafeExamBrowser.Communication.Proxies;
|
using SafeExamBrowser.Communication.Proxies;
|
||||||
|
using SafeExamBrowser.Configuration.Contracts.Integrity;
|
||||||
using SafeExamBrowser.Configuration.Cryptography;
|
using SafeExamBrowser.Configuration.Cryptography;
|
||||||
|
using SafeExamBrowser.Configuration.Integrity;
|
||||||
using SafeExamBrowser.Core.Contracts.OperationModel;
|
using SafeExamBrowser.Core.Contracts.OperationModel;
|
||||||
using SafeExamBrowser.Core.OperationModel;
|
using SafeExamBrowser.Core.OperationModel;
|
||||||
using SafeExamBrowser.Core.Operations;
|
using SafeExamBrowser.Core.Operations;
|
||||||
|
@ -68,6 +70,7 @@ namespace SafeExamBrowser.Client
|
||||||
private UserInterfaceMode uiMode;
|
private UserInterfaceMode uiMode;
|
||||||
|
|
||||||
private IActionCenter actionCenter;
|
private IActionCenter actionCenter;
|
||||||
|
private IIntegrityModule integrityModule;
|
||||||
private ILogger logger;
|
private ILogger logger;
|
||||||
private IMessageBox messageBox;
|
private IMessageBox messageBox;
|
||||||
private INativeMethods nativeMethods;
|
private INativeMethods nativeMethods;
|
||||||
|
@ -94,6 +97,7 @@ namespace SafeExamBrowser.Client
|
||||||
|
|
||||||
actionCenter = uiFactory.CreateActionCenter();
|
actionCenter = uiFactory.CreateActionCenter();
|
||||||
context = new ClientContext();
|
context = new ClientContext();
|
||||||
|
integrityModule = new IntegrityModule(ModuleLogger(nameof(IntegrityModule)));
|
||||||
messageBox = BuildMessageBox();
|
messageBox = BuildMessageBox();
|
||||||
nativeMethods = new NativeMethods();
|
nativeMethods = new NativeMethods();
|
||||||
networkAdapter = new NetworkAdapter(ModuleLogger(nameof(NetworkAdapter)), nativeMethods);
|
networkAdapter = new NetworkAdapter(ModuleLogger(nameof(NetworkAdapter)), nativeMethods);
|
||||||
|
@ -143,6 +147,7 @@ namespace SafeExamBrowser.Client
|
||||||
explorerShell,
|
explorerShell,
|
||||||
fileSystemDialog,
|
fileSystemDialog,
|
||||||
hashAlgorithm,
|
hashAlgorithm,
|
||||||
|
integrityModule,
|
||||||
logger,
|
logger,
|
||||||
messageBox,
|
messageBox,
|
||||||
sequence,
|
sequence,
|
||||||
|
@ -212,7 +217,7 @@ namespace SafeExamBrowser.Client
|
||||||
private IOperation BuildBrowserOperation()
|
private IOperation BuildBrowserOperation()
|
||||||
{
|
{
|
||||||
var fileSystemDialog = BuildFileSystemDialog();
|
var fileSystemDialog = BuildFileSystemDialog();
|
||||||
var keyGenerator = new KeyGenerator(context.AppConfig, ModuleLogger(nameof(KeyGenerator)), context.Settings);
|
var keyGenerator = new KeyGenerator(context.AppConfig, integrityModule, ModuleLogger(nameof(KeyGenerator)), context.Settings);
|
||||||
var moduleLogger = ModuleLogger(nameof(BrowserApplication));
|
var moduleLogger = ModuleLogger(nameof(BrowserApplication));
|
||||||
var browser = new BrowserApplication(
|
var browser = new BrowserApplication(
|
||||||
context.AppConfig,
|
context.AppConfig,
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.Configuration.Contracts.Integrity
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides functionality related to application integrity.
|
||||||
|
/// </summary>
|
||||||
|
public interface IIntegrityModule
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to calculate the browser exam key.
|
||||||
|
/// </summary>
|
||||||
|
bool TryCalculateBrowserExamKey(string configurationKey, string salt, out string browserExamKey);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to verify the code signature.
|
||||||
|
/// </summary>
|
||||||
|
bool TryVerifyCodeSignature(out bool isValid);
|
||||||
|
}
|
||||||
|
}
|
|
@ -59,6 +59,7 @@
|
||||||
<Compile Include="Cryptography\EncryptionParameters.cs" />
|
<Compile Include="Cryptography\EncryptionParameters.cs" />
|
||||||
<Compile Include="Cryptography\ICertificateStore.cs" />
|
<Compile Include="Cryptography\ICertificateStore.cs" />
|
||||||
<Compile Include="Cryptography\IHashAlgorithm.cs" />
|
<Compile Include="Cryptography\IHashAlgorithm.cs" />
|
||||||
|
<Compile Include="Integrity\IIntegrityModule.cs" />
|
||||||
<Compile Include="Cryptography\IKeyGenerator.cs" />
|
<Compile Include="Cryptography\IKeyGenerator.cs" />
|
||||||
<Compile Include="Cryptography\IPasswordEncryption.cs" />
|
<Compile Include="Cryptography\IPasswordEncryption.cs" />
|
||||||
<Compile Include="Cryptography\IPublicKeyEncryption.cs" />
|
<Compile Include="Cryptography\IPublicKeyEncryption.cs" />
|
||||||
|
|
|
@ -11,6 +11,7 @@ using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using SafeExamBrowser.Configuration.Contracts;
|
using SafeExamBrowser.Configuration.Contracts;
|
||||||
using SafeExamBrowser.Configuration.Contracts.Cryptography;
|
using SafeExamBrowser.Configuration.Contracts.Cryptography;
|
||||||
|
using SafeExamBrowser.Configuration.Contracts.Integrity;
|
||||||
using SafeExamBrowser.Logging.Contracts;
|
using SafeExamBrowser.Logging.Contracts;
|
||||||
using SafeExamBrowser.Settings;
|
using SafeExamBrowser.Settings;
|
||||||
|
|
||||||
|
@ -20,15 +21,17 @@ namespace SafeExamBrowser.Configuration.Cryptography
|
||||||
{
|
{
|
||||||
private readonly SHA256Managed algorithm;
|
private readonly SHA256Managed algorithm;
|
||||||
private readonly AppConfig appConfig;
|
private readonly AppConfig appConfig;
|
||||||
|
private readonly IIntegrityModule integrityModule;
|
||||||
private readonly ILogger logger;
|
private readonly ILogger logger;
|
||||||
private readonly AppSettings settings;
|
private readonly AppSettings settings;
|
||||||
|
|
||||||
private string browserExamKey;
|
private string browserExamKey;
|
||||||
|
|
||||||
public KeyGenerator(AppConfig appConfig, ILogger logger, AppSettings settings)
|
public KeyGenerator(AppConfig appConfig, IIntegrityModule integrityModule, ILogger logger, AppSettings settings)
|
||||||
{
|
{
|
||||||
this.algorithm = new SHA256Managed();
|
this.algorithm = new SHA256Managed();
|
||||||
this.appConfig = appConfig;
|
this.appConfig = appConfig;
|
||||||
|
this.integrityModule = integrityModule;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +40,7 @@ namespace SafeExamBrowser.Configuration.Cryptography
|
||||||
{
|
{
|
||||||
var urlWithoutFragment = url.Split('#')[0];
|
var urlWithoutFragment = url.Split('#')[0];
|
||||||
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(urlWithoutFragment + (browserExamKey ?? ComputeBrowserExamKey())));
|
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(urlWithoutFragment + (browserExamKey ?? ComputeBrowserExamKey())));
|
||||||
var key = BitConverter.ToString(hash).ToLower().Replace("-", string.Empty);
|
var key = ToString(hash);
|
||||||
|
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
@ -46,7 +49,7 @@ namespace SafeExamBrowser.Configuration.Cryptography
|
||||||
{
|
{
|
||||||
var urlWithoutFragment = url.Split('#')[0];
|
var urlWithoutFragment = url.Split('#')[0];
|
||||||
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(urlWithoutFragment + settings.Browser.ConfigurationKey));
|
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(urlWithoutFragment + settings.Browser.ConfigurationKey));
|
||||||
var key = BitConverter.ToString(hash).ToLower().Replace("-", string.Empty);
|
var key = ToString(hash);
|
||||||
|
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
@ -55,21 +58,35 @@ namespace SafeExamBrowser.Configuration.Cryptography
|
||||||
{
|
{
|
||||||
var salt = settings.Browser.BrowserExamKeySalt;
|
var salt = settings.Browser.BrowserExamKeySalt;
|
||||||
|
|
||||||
if (salt == default(byte[]))
|
if (salt == default || salt.Length == 0)
|
||||||
{
|
{
|
||||||
salt = new byte[0];
|
salt = new byte[0];
|
||||||
logger.Warn("The current configuration does not contain a salt value for the browser exam key!");
|
logger.Warn("The current configuration does not contain a salt value for the browser exam key!");
|
||||||
}
|
}
|
||||||
|
|
||||||
using (var algorithm = new HMACSHA256(salt))
|
if (integrityModule.TryCalculateBrowserExamKey(settings.Browser.ConfigurationKey, ToString(salt), out browserExamKey))
|
||||||
{
|
{
|
||||||
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(appConfig.CodeSignatureHash + appConfig.ProgramBuildVersion + settings.Browser.ConfigurationKey));
|
logger.Debug("Successfully calculated BEK using integrity module.");
|
||||||
var key = BitConverter.ToString(hash).ToLower().Replace("-", string.Empty);
|
|
||||||
|
|
||||||
browserExamKey = key;
|
|
||||||
|
|
||||||
return browserExamKey;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Warn("Failed to calculate BEK using integrity module! Falling back to simplified calculation...");
|
||||||
|
|
||||||
|
using (var algorithm = new HMACSHA256(salt))
|
||||||
|
{
|
||||||
|
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(appConfig.CodeSignatureHash + appConfig.ProgramBuildVersion + settings.Browser.ConfigurationKey));
|
||||||
|
var key = ToString(hash);
|
||||||
|
|
||||||
|
browserExamKey = key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return browserExamKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string ToString(byte[] bytes)
|
||||||
|
{
|
||||||
|
return BitConverter.ToString(bytes).ToLower().Replace("-", string.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
82
SafeExamBrowser.Configuration/Integrity/IntegrityModule.cs
Normal file
82
SafeExamBrowser.Configuration/Integrity/IntegrityModule.cs
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using SafeExamBrowser.Configuration.Contracts.Integrity;
|
||||||
|
using SafeExamBrowser.Logging.Contracts;
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.Configuration.Integrity
|
||||||
|
{
|
||||||
|
public class IntegrityModule : IIntegrityModule
|
||||||
|
{
|
||||||
|
const string DLL_NAME =
|
||||||
|
#if X86
|
||||||
|
"seb_x86.dll";
|
||||||
|
#else
|
||||||
|
"seb_x64.dll";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private readonly ILogger logger;
|
||||||
|
|
||||||
|
public IntegrityModule(ILogger logger)
|
||||||
|
{
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryCalculateBrowserExamKey(string configurationKey, string salt, out string browserExamKey)
|
||||||
|
{
|
||||||
|
browserExamKey = default;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
browserExamKey = CalculateBrowserExamKey(configurationKey, salt);
|
||||||
|
}
|
||||||
|
catch (DllNotFoundException)
|
||||||
|
{
|
||||||
|
logger.Warn("Integrity module is not present!");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
logger.Error("Unexpected error while attempting to calculate browser exam key!", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return browserExamKey != default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryVerifyCodeSignature(out bool isValid)
|
||||||
|
{
|
||||||
|
var success = false;
|
||||||
|
|
||||||
|
isValid = default;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
isValid = VerifyCodeSignature();
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
catch (DllNotFoundException)
|
||||||
|
{
|
||||||
|
logger.Warn("Integrity module is not present!");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
logger.Error("Unexpected error while attempting to verify code signature!", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
[return: MarshalAs(UnmanagedType.BStr)]
|
||||||
|
private static extern string CalculateBrowserExamKey(string configurationKey, string salt);
|
||||||
|
|
||||||
|
[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
private static extern bool VerifyCodeSignature();
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,7 +16,7 @@
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>TRACE;DEBUG;X86</DefineConstants>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||||
<OutputPath>bin\x86\Release\</OutputPath>
|
<OutputPath>bin\x86\Release\</OutputPath>
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<DefineConstants>TRACE;X86</DefineConstants>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
@ -74,6 +74,7 @@
|
||||||
<Compile Include="ConfigurationData\Keys.cs" />
|
<Compile Include="ConfigurationData\Keys.cs" />
|
||||||
<Compile Include="ConfigurationData\DataValues.cs" />
|
<Compile Include="ConfigurationData\DataValues.cs" />
|
||||||
<Compile Include="Cryptography\CertificateStore.cs" />
|
<Compile Include="Cryptography\CertificateStore.cs" />
|
||||||
|
<Compile Include="Integrity\IntegrityModule.cs" />
|
||||||
<Compile Include="Cryptography\KeyGenerator.cs" />
|
<Compile Include="Cryptography\KeyGenerator.cs" />
|
||||||
<Compile Include="DataCompression\GZipCompressor.cs" />
|
<Compile Include="DataCompression\GZipCompressor.cs" />
|
||||||
<Compile Include="Cryptography\PasswordEncryption.cs" />
|
<Compile Include="Cryptography\PasswordEncryption.cs" />
|
||||||
|
|
|
@ -65,11 +65,12 @@ namespace SafeExamBrowser.I18n.Contracts
|
||||||
LockScreen_DisplayConfigurationContinueOption,
|
LockScreen_DisplayConfigurationContinueOption,
|
||||||
LockScreen_DisplayConfigurationTerminateOption,
|
LockScreen_DisplayConfigurationTerminateOption,
|
||||||
LockScreen_DisplayConfigurationMessage,
|
LockScreen_DisplayConfigurationMessage,
|
||||||
|
LockScreen_IntegrityMessage,
|
||||||
|
LockScreen_Title,
|
||||||
|
LockScreen_UnlockButton,
|
||||||
LockScreen_UserSessionContinueOption,
|
LockScreen_UserSessionContinueOption,
|
||||||
LockScreen_UserSessionMessage,
|
LockScreen_UserSessionMessage,
|
||||||
LockScreen_UserSessionTerminateOption,
|
LockScreen_UserSessionTerminateOption,
|
||||||
LockScreen_Title,
|
|
||||||
LockScreen_UnlockButton,
|
|
||||||
LogWindow_AlwaysOnTop,
|
LogWindow_AlwaysOnTop,
|
||||||
LogWindow_AutoScroll,
|
LogWindow_AutoScroll,
|
||||||
LogWindow_Title,
|
LogWindow_Title,
|
||||||
|
@ -193,6 +194,7 @@ namespace SafeExamBrowser.I18n.Contracts
|
||||||
OperationStatus_ValidateDisplayConfiguration,
|
OperationStatus_ValidateDisplayConfiguration,
|
||||||
OperationStatus_ValidateRemoteSessionPolicy,
|
OperationStatus_ValidateRemoteSessionPolicy,
|
||||||
OperationStatus_ValidateVirtualMachinePolicy,
|
OperationStatus_ValidateVirtualMachinePolicy,
|
||||||
|
OperationStatus_VerifyApplicationIntegrity,
|
||||||
OperationStatus_WaitDisclaimerConfirmation,
|
OperationStatus_WaitDisclaimerConfirmation,
|
||||||
OperationStatus_WaitExplorerStartup,
|
OperationStatus_WaitExplorerStartup,
|
||||||
OperationStatus_WaitExplorerTermination,
|
OperationStatus_WaitExplorerTermination,
|
||||||
|
|
|
@ -153,6 +153,9 @@
|
||||||
<Entry key="LockScreen_DisplayConfigurationMessage">
|
<Entry key="LockScreen_DisplayConfigurationMessage">
|
||||||
Eine verbotene Bildschirm-Konfiguration wurde detektiert. Bitte wählen Sie eine der verfügbaren Optionen aus und geben Sie das korrekte Passwort ein, um SEB zu entsperren.
|
Eine verbotene Bildschirm-Konfiguration wurde detektiert. Bitte wählen Sie eine der verfügbaren Optionen aus und geben Sie das korrekte Passwort ein, um SEB zu entsperren.
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="LockScreen_IntegrityMessage">
|
||||||
|
Sie verwenden eine inoffizielle SEB-Version! Bitte stellen Sie sicher, dass Sie einen offiziellen Safe Exam Browser verwenden. Geben Sie bitte das korrekte Passwort ein, um SEB zu entsperren.
|
||||||
|
</Entry>
|
||||||
<Entry key="LockScreen_Title">
|
<Entry key="LockScreen_Title">
|
||||||
SEB GESPERRT
|
SEB GESPERRT
|
||||||
</Entry>
|
</Entry>
|
||||||
|
@ -537,6 +540,9 @@
|
||||||
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
||||||
Validiere Richtlinie für virtuelle Maschinen
|
Validiere Richtlinie für virtuelle Maschinen
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="OperationStatus_VerifyApplicationIntegrity">
|
||||||
|
Überprüfe Integrität
|
||||||
|
</Entry>
|
||||||
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
||||||
Warte auf die Bestätigung des Hinweises zur Fernüberwachung
|
Warte auf die Bestätigung des Hinweises zur Fernüberwachung
|
||||||
</Entry>
|
</Entry>
|
||||||
|
|
|
@ -153,6 +153,9 @@
|
||||||
<Entry key="LockScreen_DisplayConfigurationMessage">
|
<Entry key="LockScreen_DisplayConfigurationMessage">
|
||||||
A prohibited display configuration has been detected. In order to unlock SEB, please select one of the available options and enter the correct unlock password.
|
A prohibited display configuration has been detected. In order to unlock SEB, please select one of the available options and enter the correct unlock password.
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="LockScreen_IntegrityMessage">
|
||||||
|
You are using an unofficial SEB version! Please make sure to use an official Safe Exam Browser. In order to unlock SEB, please enter the correct unlock password.
|
||||||
|
</Entry>
|
||||||
<Entry key="LockScreen_Title">
|
<Entry key="LockScreen_Title">
|
||||||
SEB LOCKED
|
SEB LOCKED
|
||||||
</Entry>
|
</Entry>
|
||||||
|
@ -537,6 +540,9 @@
|
||||||
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
||||||
Validating virtual machine policy
|
Validating virtual machine policy
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="OperationStatus_VerifyApplicationIntegrity">
|
||||||
|
Verifying integrity
|
||||||
|
</Entry>
|
||||||
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
||||||
Waiting for confirmation of the disclaimer
|
Waiting for confirmation of the disclaimer
|
||||||
</Entry>
|
</Entry>
|
||||||
|
|
|
@ -153,6 +153,9 @@
|
||||||
<Entry key="LockScreen_DisplayConfigurationMessage">
|
<Entry key="LockScreen_DisplayConfigurationMessage">
|
||||||
Une configuration d'affichage interdite a été détectée. Pour déverrouiller SEB, veuillez sélectionner l'une des options disponibles et saisir le mot de passe de déverrouillage correct.
|
Une configuration d'affichage interdite a été détectée. Pour déverrouiller SEB, veuillez sélectionner l'une des options disponibles et saisir le mot de passe de déverrouillage correct.
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="LockScreen_IntegrityMessage">
|
||||||
|
Vous utilisez une version non officielle de SEB! Assurez-vous d'utiliser un Safe Exam Browser officiel. Afin de déverrouiller SEB, veuillez entrer le mot de passe de déverrouillage correct.
|
||||||
|
</Entry>
|
||||||
<Entry key="LockScreen_Title">
|
<Entry key="LockScreen_Title">
|
||||||
SEB VEROUILLE
|
SEB VEROUILLE
|
||||||
</Entry>
|
</Entry>
|
||||||
|
@ -537,6 +540,9 @@
|
||||||
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
||||||
Validation de la directive sur les machines virtuelles
|
Validation de la directive sur les machines virtuelles
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="OperationStatus_VerifyApplicationIntegrity">
|
||||||
|
Vérification de l'intégrité
|
||||||
|
</Entry>
|
||||||
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
||||||
En attente de confirmation de la clause de non-responsabilité
|
En attente de confirmation de la clause de non-responsabilité
|
||||||
</Entry>
|
</Entry>
|
||||||
|
|
|
@ -153,6 +153,9 @@
|
||||||
<Entry key="LockScreen_DisplayConfigurationMessage">
|
<Entry key="LockScreen_DisplayConfigurationMessage">
|
||||||
È stata rilevata una configurazione di visualizzazione vietata. Per sbloccare SEB, seleziona una delle opzioni disponibili e inserisci la password di sblocco corretta.
|
È stata rilevata una configurazione di visualizzazione vietata. Per sbloccare SEB, seleziona una delle opzioni disponibili e inserisci la password di sblocco corretta.
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="LockScreen_IntegrityMessage">
|
||||||
|
Stai usando una versione SEB non ufficiale! Assicurati di utilizzare un Safe Exam Browser ufficiale. Per sbloccare SEB, inserisci la password di sblocco corretta.
|
||||||
|
</Entry>
|
||||||
<Entry key="LockScreen_Title">
|
<Entry key="LockScreen_Title">
|
||||||
SEB BLOCCATO
|
SEB BLOCCATO
|
||||||
</Entry>
|
</Entry>
|
||||||
|
@ -537,6 +540,9 @@
|
||||||
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
||||||
Convalida dei criteri della macchina virtuale
|
Convalida dei criteri della macchina virtuale
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="OperationStatus_VerifyApplicationIntegrity">
|
||||||
|
Verifica dell'integrità
|
||||||
|
</Entry>
|
||||||
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
||||||
In attesa di conferma del disclaimer
|
In attesa di conferma del disclaimer
|
||||||
</Entry>
|
</Entry>
|
||||||
|
|
|
@ -138,6 +138,9 @@
|
||||||
<Entry key="LockScreen_DisplayConfigurationMessage">
|
<Entry key="LockScreen_DisplayConfigurationMessage">
|
||||||
检测到禁止的显示配置。 要解锁 SEB,请选择可用选项之一并输入正确的解锁密码。
|
检测到禁止的显示配置。 要解锁 SEB,请选择可用选项之一并输入正确的解锁密码。
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="LockScreen_IntegrityMessage">
|
||||||
|
您使用的是非官方 SEB 版本! 请确保使用官方的安全考试浏览器。 要解锁 SEB,请输入正确的解锁密码。
|
||||||
|
</Entry>
|
||||||
<Entry key="LockScreen_Title">
|
<Entry key="LockScreen_Title">
|
||||||
防作弊考试专用浏览器已锁定
|
防作弊考试专用浏览器已锁定
|
||||||
</Entry>
|
</Entry>
|
||||||
|
@ -492,6 +495,9 @@
|
||||||
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
|
||||||
验证虚拟机策略
|
验证虚拟机策略
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="OperationStatus_VerifyApplicationIntegrity">
|
||||||
|
验证完整性
|
||||||
|
</Entry>
|
||||||
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
<Entry key="OperationStatus_WaitDisclaimerConfirmation">
|
||||||
等待确认免责声明
|
等待确认免责声明
|
||||||
</Entry>
|
</Entry>
|
||||||
|
|
|
@ -17,6 +17,7 @@ using SafeExamBrowser.Configuration.Cryptography;
|
||||||
using SafeExamBrowser.Configuration.DataCompression;
|
using SafeExamBrowser.Configuration.DataCompression;
|
||||||
using SafeExamBrowser.Configuration.DataFormats;
|
using SafeExamBrowser.Configuration.DataFormats;
|
||||||
using SafeExamBrowser.Configuration.DataResources;
|
using SafeExamBrowser.Configuration.DataResources;
|
||||||
|
using SafeExamBrowser.Configuration.Integrity;
|
||||||
using SafeExamBrowser.Core.Contracts.OperationModel;
|
using SafeExamBrowser.Core.Contracts.OperationModel;
|
||||||
using SafeExamBrowser.Core.OperationModel;
|
using SafeExamBrowser.Core.OperationModel;
|
||||||
using SafeExamBrowser.Core.Operations;
|
using SafeExamBrowser.Core.Operations;
|
||||||
|
@ -63,6 +64,7 @@ namespace SafeExamBrowser.Runtime
|
||||||
var userInfo = new UserInfo(ModuleLogger(nameof(UserInfo)));
|
var userInfo = new UserInfo(ModuleLogger(nameof(UserInfo)));
|
||||||
|
|
||||||
var args = Environment.GetCommandLineArgs();
|
var args = Environment.GetCommandLineArgs();
|
||||||
|
var integrityModule = new IntegrityModule(ModuleLogger(nameof(IntegrityModule)));
|
||||||
var desktopFactory = new DesktopFactory(ModuleLogger(nameof(DesktopFactory)));
|
var desktopFactory = new DesktopFactory(ModuleLogger(nameof(DesktopFactory)));
|
||||||
var desktopMonitor = new DesktopMonitor(ModuleLogger(nameof(DesktopMonitor)));
|
var desktopMonitor = new DesktopMonitor(ModuleLogger(nameof(DesktopMonitor)));
|
||||||
var displayMonitor = new DisplayMonitor(ModuleLogger(nameof(DisplayMonitor)), nativeMethods, systemInfo);
|
var displayMonitor = new DisplayMonitor(ModuleLogger(nameof(DisplayMonitor)), nativeMethods, systemInfo);
|
||||||
|
@ -85,6 +87,7 @@ namespace SafeExamBrowser.Runtime
|
||||||
|
|
||||||
bootstrapOperations.Enqueue(new I18nOperation(logger, text));
|
bootstrapOperations.Enqueue(new I18nOperation(logger, text));
|
||||||
bootstrapOperations.Enqueue(new CommunicationHostOperation(runtimeHost, logger));
|
bootstrapOperations.Enqueue(new CommunicationHostOperation(runtimeHost, logger));
|
||||||
|
bootstrapOperations.Enqueue(new IntegrityOperation(integrityModule, logger));
|
||||||
|
|
||||||
sessionOperations.Enqueue(new SessionInitializationOperation(configuration, fileSystem, logger, runtimeHost, sessionContext));
|
sessionOperations.Enqueue(new SessionInitializationOperation(configuration, fileSystem, logger, runtimeHost, sessionContext));
|
||||||
sessionOperations.Enqueue(new ConfigurationOperation(args, configuration, new FileSystem(), new HashAlgorithm(), logger, sessionContext));
|
sessionOperations.Enqueue(new ConfigurationOperation(args, configuration, new FileSystem(), new HashAlgorithm(), logger, sessionContext));
|
||||||
|
|
60
SafeExamBrowser.Runtime/Operations/IntegrityOperation.cs
Normal file
60
SafeExamBrowser.Runtime/Operations/IntegrityOperation.cs
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using SafeExamBrowser.Configuration.Contracts.Integrity;
|
||||||
|
using SafeExamBrowser.Core.Contracts.OperationModel;
|
||||||
|
using SafeExamBrowser.Core.Contracts.OperationModel.Events;
|
||||||
|
using SafeExamBrowser.I18n.Contracts;
|
||||||
|
using SafeExamBrowser.Logging.Contracts;
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.Runtime.Operations
|
||||||
|
{
|
||||||
|
internal class IntegrityOperation : IOperation
|
||||||
|
{
|
||||||
|
private readonly IIntegrityModule module;
|
||||||
|
private readonly ILogger logger;
|
||||||
|
|
||||||
|
public event ActionRequiredEventHandler ActionRequired { add { } remove { } }
|
||||||
|
public event StatusChangedEventHandler StatusChanged;
|
||||||
|
|
||||||
|
public IntegrityOperation(IIntegrityModule module, ILogger logger)
|
||||||
|
{
|
||||||
|
this.module = module;
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperationResult Perform()
|
||||||
|
{
|
||||||
|
logger.Info($"Attempting to verify application integrity...");
|
||||||
|
StatusChanged?.Invoke(TextKey.OperationStatus_VerifyApplicationIntegrity);
|
||||||
|
|
||||||
|
if (module.TryVerifyCodeSignature(out var isValid))
|
||||||
|
{
|
||||||
|
if (isValid)
|
||||||
|
{
|
||||||
|
logger.Info("Application integrity successfully verified.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Warn("Application integrity is compromised!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Warn("Failed to verify application integrity!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return OperationResult.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperationResult Revert()
|
||||||
|
{
|
||||||
|
return OperationResult.Success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -106,6 +106,7 @@
|
||||||
<Compile Include="Operations\Events\PasswordRequiredEventArgs.cs" />
|
<Compile Include="Operations\Events\PasswordRequiredEventArgs.cs" />
|
||||||
<Compile Include="Operations\Events\ServerFailureEventArgs.cs" />
|
<Compile Include="Operations\Events\ServerFailureEventArgs.cs" />
|
||||||
<Compile Include="Operations\Events\UnexpectedErrorMessageArgs.cs" />
|
<Compile Include="Operations\Events\UnexpectedErrorMessageArgs.cs" />
|
||||||
|
<Compile Include="Operations\IntegrityOperation.cs" />
|
||||||
<Compile Include="Operations\KioskModeOperation.cs" />
|
<Compile Include="Operations\KioskModeOperation.cs" />
|
||||||
<Compile Include="Operations\ProctoringWorkaroundOperation.cs" />
|
<Compile Include="Operations\ProctoringWorkaroundOperation.cs" />
|
||||||
<Compile Include="Operations\RemoteSessionOperation.cs" />
|
<Compile Include="Operations\RemoteSessionOperation.cs" />
|
||||||
|
|
Loading…
Add table
Reference in a new issue