SEBWIN-447: Implemented missing remote session check during session initialization.

This commit is contained in:
Damian Büchel 2020-12-04 15:21:51 +01:00
parent d2407afebf
commit ba523d4381
14 changed files with 181 additions and 3 deletions

View file

@ -108,6 +108,8 @@ namespace SafeExamBrowser.I18n.Contracts
MessageBox_ReconfigurationErrorTitle,
MessageBox_ReloadConfirmation,
MessageBox_ReloadConfirmationTitle,
MessageBox_RemoteSessionNotAllowed,
MessageBox_RemoteSessionNotAllowedTitle,
MessageBox_ServiceUnavailableError,
MessageBox_ServiceUnavailableErrorTitle,
MessageBox_ServiceUnavailableWarning,
@ -155,6 +157,7 @@ namespace SafeExamBrowser.I18n.Contracts
OperationStatus_StopMouseInterception,
OperationStatus_TerminateBrowser,
OperationStatus_TerminateShell,
OperationStatus_ValidateRemoteSessionPolicy,
OperationStatus_ValidateVirtualMachinePolicy,
OperationStatus_WaitExplorerStartup,
OperationStatus_WaitExplorerTermination,

View file

@ -246,6 +246,12 @@
<Entry key="MessageBox_ReloadConfirmationTitle">
刷新?
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowed">
系统似乎正在远程会话中运行。所选的配置不允许SEB在远程会话中运行。
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowedTitle">
检测到远程会话
</Entry>
<Entry key="MessageBox_ServiceUnavailableError">
防作弊考试专用浏览器服务初始化失败。防作弊考试专用浏览器现将终止,因为该服务被配置为强制项。
</Entry>
@ -375,6 +381,9 @@
<Entry key="OperationStatus_TerminateShell">
终止用户界面
</Entry>
<Entry key="OperationStatus_ValidateRemoteSessionPolicy">
验证远程会话策略
</Entry>
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
验证虚拟机策略
</Entry>

View file

@ -282,6 +282,12 @@
<Entry key="MessageBox_ReloadConfirmationTitle">
Neu laden?
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowed">
Das System scheint in einer Remote-Sitzung zu laufen. Die ausgewählte Konfiguration erlaubt es nicht, SEB in einer Remote-Sitzung auszuführen.
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowedTitle">
Remote-Sitzung erkannt
</Entry>
<Entry key="MessageBox_ServiceUnavailableError">
Fehler beim Initialisieren des SEB-Service! SEB wird sich nun beenden da der Service als obligatorisch konfiguriert ist.
</Entry>
@ -423,6 +429,9 @@
<Entry key="OperationStatus_TerminateShell">
Beende Benutzeroberfläche
</Entry>
<Entry key="OperationStatus_ValidateRemoteSessionPolicy">
Validiere Richtlinie für Remote-Sitzungen
</Entry>
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
Validiere Richtlinie für virtuelle Maschinen
</Entry>

View file

@ -282,6 +282,12 @@
<Entry key="MessageBox_ReloadConfirmationTitle">
Reload?
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowed">
The system appears to be running in a remote session. The selected configuration does not allow SEB to be run in a remote session.
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowedTitle">
Remote Session Detected
</Entry>
<Entry key="MessageBox_ServiceUnavailableError">
Failed to initialize the SEB service! SEB will now terminate since the service is configured to be mandatory.
</Entry>
@ -423,6 +429,9 @@
<Entry key="OperationStatus_TerminateShell">
Terminating user interface
</Entry>
<Entry key="OperationStatus_ValidateRemoteSessionPolicy">
Validating remote session policy
</Entry>
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
Validating virtual machine policy
</Entry>

View file

@ -282,6 +282,12 @@
<Entry key="MessageBox_ReloadConfirmationTitle">
Recharger ?
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowed">
Le système semble s'exécuter dans une session à distance. La configuration sélectionnée ne permet pas l'exécution de SEB dans une session à distance.
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowedTitle">
Session distante détectée
</Entry>
<Entry key="MessageBox_ServiceUnavailableError">
Le service SEB n'a pas été initialisé ! Le service SEB va maintenant se terminer puisque le service obligatoire.
</Entry>
@ -423,6 +429,9 @@
<Entry key="OperationStatus_TerminateShell">
Arrêt de linterface utilisateur
</Entry>
<Entry key="OperationStatus_ValidateRemoteSessionPolicy">
Validation de la directive sur la session à distance
</Entry>
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
Validation de la directive sur les machines virtuelles
</Entry>

View file

@ -282,6 +282,12 @@
<Entry key="MessageBox_ReloadConfirmationTitle">
Ricaricare?
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowed">
Il sistema sembra essere in esecuzione in una sessione remota. La configurazione selezionata non consente l'esecuzione di SEB in una sessione remota.
</Entry>
<Entry key="MessageBox_RemoteSessionNotAllowedTitle">
Sessione remota rilevata
</Entry>
<Entry key="MessageBox_ServiceUnavailableError">
Impossibile inizializzare il servizio SEB! SEB verrà ora terminato poiché il servizio è configurato per essere obbligatorio.
</Entry>
@ -423,6 +429,9 @@
<Entry key="OperationStatus_TerminateShell">
Chiusura dell'interfaccia utente
</Entry>
<Entry key="OperationStatus_ValidateRemoteSessionPolicy">
Convalida dei criteri della sessione remota
</Entry>
<Entry key="OperationStatus_ValidateVirtualMachinePolicy">
Convalida dei criteri della macchina virtuale
</Entry>

View file

@ -66,6 +66,7 @@ namespace SafeExamBrowser.Runtime
var fileSystem = new FileSystem();
var processFactory = new ProcessFactory(ModuleLogger(nameof(ProcessFactory)));
var proxyFactory = new ProxyFactory(new ProxyObjectFactory(), ModuleLogger(nameof(ProxyFactory)));
var remoteSessionDetector = new RemoteSessionDetector(ModuleLogger(nameof(RemoteSessionDetector)));
var runtimeHost = new RuntimeHost(appConfig.RuntimeAddress, new HostObjectFactory(), ModuleLogger(nameof(RuntimeHost)), FIVE_SECONDS);
var runtimeWindow = uiFactory.CreateRuntimeWindow(appConfig);
var server = new ServerProxy(appConfig, ModuleLogger(nameof(ServerProxy)));
@ -84,6 +85,7 @@ namespace SafeExamBrowser.Runtime
sessionOperations.Enqueue(new SessionInitializationOperation(configuration, fileSystem, logger, runtimeHost, sessionContext));
sessionOperations.Enqueue(new ConfigurationOperation(args, configuration, new FileSystem(), new HashAlgorithm(), logger, sessionContext));
sessionOperations.Enqueue(new ServerOperation(args, configuration, fileSystem, logger, sessionContext, server));
sessionOperations.Enqueue(new RemoteSessionOperation(remoteSessionDetector, logger, sessionContext));
sessionOperations.Enqueue(new VirtualMachineOperation(vmDetector, logger, sessionContext));
sessionOperations.Enqueue(new ServiceOperation(logger, runtimeHost, serviceProxy, sessionContext, THIRTY_SECONDS, userInfo));
sessionOperations.Enqueue(new ClientTerminationOperation(logger, processFactory, proxyFactory, runtimeHost, sessionContext, THIRTY_SECONDS));

View file

@ -0,0 +1,71 @@
/*
* Copyright (c) 2020 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.Core.Contracts.OperationModel;
using SafeExamBrowser.Core.Contracts.OperationModel.Events;
using SafeExamBrowser.I18n.Contracts;
using SafeExamBrowser.Logging.Contracts;
using SafeExamBrowser.Runtime.Operations.Events;
using SafeExamBrowser.SystemComponents.Contracts;
using SafeExamBrowser.UserInterface.Contracts.MessageBox;
namespace SafeExamBrowser.Runtime.Operations
{
internal class RemoteSessionOperation : SessionOperation
{
private readonly IRemoteSessionDetector detector;
private readonly ILogger logger;
public override event ActionRequiredEventHandler ActionRequired;
public override event StatusChangedEventHandler StatusChanged;
public RemoteSessionOperation(IRemoteSessionDetector detector, ILogger logger, SessionContext context) : base(context)
{
this.detector = detector;
this.logger = logger;
}
public override OperationResult Perform()
{
return ValidatePolicy();
}
public override OperationResult Repeat()
{
return ValidatePolicy();
}
public override OperationResult Revert()
{
return OperationResult.Success;
}
private OperationResult ValidatePolicy()
{
logger.Info($"Validating remote session policy...");
StatusChanged?.Invoke(TextKey.OperationStatus_ValidateRemoteSessionPolicy);
if (Context.Next.Settings.Service.DisableRemoteConnections && detector.IsRemoteSession())
{
var args = new MessageEventArgs
{
Icon = MessageBoxIcon.Error,
Message = TextKey.MessageBox_RemoteSessionNotAllowed,
Title = TextKey.MessageBox_RemoteSessionNotAllowedTitle
};
logger.Error("Detected remote session while SEB is not allowed to be run in a remote session! Aborting...");
ActionRequired?.Invoke(args);
return OperationResult.Aborted;
}
return OperationResult.Success;
}
}
}

View file

@ -22,15 +22,15 @@ namespace SafeExamBrowser.Runtime.Operations
private IVirtualMachineDetector detector;
private ILogger logger;
public override event ActionRequiredEventHandler ActionRequired;
public override event StatusChangedEventHandler StatusChanged;
public VirtualMachineOperation(IVirtualMachineDetector detector, ILogger logger, SessionContext context) : base(context)
{
this.detector = detector;
this.logger = logger;
}
public override event ActionRequiredEventHandler ActionRequired;
public override event StatusChangedEventHandler StatusChanged;
public override OperationResult Perform()
{
return ValidatePolicy();

View file

@ -103,6 +103,7 @@
<Compile Include="Operations\Events\ServerFailureEventArgs.cs" />
<Compile Include="Operations\Events\UnexpectedErrorMessageArgs.cs" />
<Compile Include="Operations\KioskModeOperation.cs" />
<Compile Include="Operations\RemoteSessionOperation.cs" />
<Compile Include="Operations\ServerOperation.cs" />
<Compile Include="Operations\ServiceOperation.cs" />
<Compile Include="Operations\SessionActivationOperation.cs" />

View file

@ -0,0 +1,21 @@
/*
* Copyright (c) 2020 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.SystemComponents.Contracts
{
/// <summary>
/// Provides functionality related to remote session detection.
/// </summary>
public interface IRemoteSessionDetector
{
/// <summary>
/// Indicates whether the system is currently running in a remote session.
/// </summary>
bool IsRemoteSession();
}
}

View file

@ -57,6 +57,7 @@
<Compile Include="Audio\Events\VolumeChangedEventHandler.cs" />
<Compile Include="Audio\IAudio.cs" />
<Compile Include="IFileSystem.cs" />
<Compile Include="IRemoteSessionDetector.cs" />
<Compile Include="IVirtualMachineDetector.cs" />
<Compile Include="PowerSupply\Events\StatusChangedEventHandler.cs" />
<Compile Include="PowerSupply\IPowerSupply.cs" />

View file

@ -0,0 +1,33 @@
/*
* Copyright (c) 2020 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.Windows.Forms;
using SafeExamBrowser.Logging.Contracts;
using SafeExamBrowser.SystemComponents.Contracts;
namespace SafeExamBrowser.SystemComponents
{
public class RemoteSessionDetector : IRemoteSessionDetector
{
private readonly ILogger logger;
public RemoteSessionDetector(ILogger logger)
{
this.logger = logger;
}
public bool IsRemoteSession()
{
var isRemoteSession = SystemInformation.TerminalServerSession;
logger.Debug($"System appears {(isRemoteSession ? "" : "not ")}to be running in a remote session.");
return isRemoteSession;
}
}
}

View file

@ -70,6 +70,7 @@
<Compile Include="PowerSupply\PowerSupply.cs" />
<Compile Include="PowerSupply\PowerSupplyStatus.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RemoteSessionDetector.cs" />
<Compile Include="SystemInfo.cs" />
<Compile Include="UserInfo.cs" />
<Compile Include="VirtualMachineDetector.cs" />