SEBWIN-396: Implemented configuration value "allowQuit" to control the termination of SEB by user action.

This commit is contained in:
Damian Büchel 2020-05-04 12:37:54 +02:00
parent 631fb583d7
commit b5876eb61a
14 changed files with 104 additions and 4 deletions

View file

@ -104,6 +104,7 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
context.Activators.Add(terminationActivator.Object);
context.Settings.ActionCenter.EnableActionCenter = true;
context.Settings.Keyboard.AllowAltTab = true;
context.Settings.Security.AllowTermination = true;
sut.Perform();
@ -218,6 +219,32 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
taskbar.VerifySet(t => t.ShowClock = false, Times.Once);
}
[TestMethod]
public void Perform_MustInitializeQuitButton()
{
context.Settings.ActionCenter.EnableActionCenter = true;
context.Settings.Taskbar.EnableTaskbar = true;
context.Settings.Security.AllowTermination = false;
sut.Perform();
actionCenter.VerifySet(a => a.ShowQuitButton = false, Times.Once);
taskbar.VerifySet(t => t.ShowQuitButton = false, Times.Once);
actionCenter.VerifySet(a => a.ShowQuitButton = true, Times.Never);
taskbar.VerifySet(t => t.ShowQuitButton = true, Times.Never);
actionCenter.Reset();
taskbar.Reset();
context.Settings.Security.AllowTermination = true;
sut.Perform();
actionCenter.VerifySet(a => a.ShowQuitButton = false, Times.Never);
taskbar.VerifySet(t => t.ShowQuitButton = false, Times.Never);
actionCenter.VerifySet(a => a.ShowQuitButton = true, Times.Once);
taskbar.VerifySet(t => t.ShowQuitButton = true, Times.Once);
}
[TestMethod]
public void Perform_MustInitializeNotifications()
{
@ -346,6 +373,19 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
taskbar.VerifyNoOtherCalls();
}
[TestMethod]
public void Perform_MustNotInitializeTerminationActivatorIfNotEnabled()
{
var terminationActivator = new Mock<ITerminationActivator>();
context.Activators.Add(terminationActivator.Object);
context.Settings.Security.AllowTermination = false;
sut.Perform();
terminationActivator.Verify(a => a.Start(), Times.Never);
}
[TestMethod]
public void Revert_MustTerminateActivators()
{

View file

@ -120,7 +120,7 @@ namespace SafeExamBrowser.Client.Operations
taskViewActivator.Start();
}
if (activator is ITerminationActivator terminationActivator)
if (Context.Settings.Security.AllowTermination && activator is ITerminationActivator terminationActivator)
{
terminationActivator.Start();
}
@ -142,6 +142,7 @@ namespace SafeExamBrowser.Client.Operations
InitializeKeyboardLayoutForActionCenter();
InitializeWirelessNetworkForActionCenter();
InitializePowerSupplyForActionCenter();
InitializeQuitButtonForActionCenter();
}
else
{
@ -164,6 +165,7 @@ namespace SafeExamBrowser.Client.Operations
InitializeAudioForTaskbar();
InitializeKeyboardLayoutForTaskbar();
InitializeClockForTaskbar();
InitializeQuitButtonForTaskbar();
}
else
{
@ -302,6 +304,16 @@ namespace SafeExamBrowser.Client.Operations
}
}
private void InitializeQuitButtonForActionCenter()
{
actionCenter.ShowQuitButton = Context.Settings.Security.AllowTermination;
}
private void InitializeQuitButtonForTaskbar()
{
taskbar.ShowQuitButton = Context.Settings.Security.AllowTermination;
}
private void InitializeWirelessNetworkForActionCenter()
{
if (Context.Settings.ActionCenter.ShowWirelessNetwork)

View file

@ -22,6 +22,9 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
case Keys.ConfigurationFile.AdminPasswordHash:
MapAdminPasswordHash(settings, value);
break;
case Keys.Security.AllowTermination:
MapAllowTermination(settings, value);
break;
case Keys.Security.AllowVirtualMachine:
MapVirtualMachinePolicy(settings, value);
break;
@ -48,6 +51,14 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
}
}
private void MapAllowTermination(AppSettings settings, object value)
{
if (value is bool allow)
{
settings.Security.AllowTermination = allow;
}
}
private void MapApplicationLogAccess(IDictionary<string, object> rawData, AppSettings settings)
{
var hasValue = rawData.TryGetValue(Keys.Security.AllowApplicationLog, out var value);
@ -112,7 +123,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
{
if (value is bool allow)
{
settings.Security.VirtualMachinePolicy = allow ? VirtualMachinePolicy.Allow : VirtualMachinePolicy.Deny ;
settings.Security.VirtualMachinePolicy = allow ? VirtualMachinePolicy.Allow : VirtualMachinePolicy.Deny;
}
}
}

View file

@ -167,6 +167,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
settings.Mouse.AllowRightButton = true;
settings.Security.AllowApplicationLogAccess = false;
settings.Security.AllowTermination = true;
settings.Security.AllowReconfiguration = false;
settings.Security.KioskMode = KioskMode.CreateNewDesktop;
settings.Security.VirtualMachinePolicy = VirtualMachinePolicy.Deny;

View file

@ -207,6 +207,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
internal static class Security
{
internal const string AllowApplicationLog = "allowApplicationLog";
internal const string AllowTermination = "allowQuit";
internal const string AllowVirtualMachine = "allowVirtualMachine";
internal const string KioskModeCreateNewDesktop = "createNewDesktop";
internal const string KioskModeDisableExplorerShell = "killExplorerShell";

View file

@ -26,6 +26,11 @@ namespace SafeExamBrowser.Settings.Security
/// </summary>
public bool AllowApplicationLogAccess { get; set; }
/// <summary>
/// Determines whether the user may initiate the termination of SEB. This setting does not affect automated mechanisms like a quit URL.
/// </summary>
public bool AllowTermination { get; set; }
/// <summary>
/// Determines whether the user may reconfigure the application.
/// </summary>

View file

@ -21,6 +21,11 @@ namespace SafeExamBrowser.UserInterface.Contracts.Shell
/// </summary>
bool ShowClock { set; }
/// <summary>
/// Controls the visibility of the quit button.
/// </summary>
bool ShowQuitButton { set; }
/// <summary>
/// Event fired when the user clicked the quit button.
/// </summary>

View file

@ -21,6 +21,11 @@ namespace SafeExamBrowser.UserInterface.Contracts.Shell
/// </summary>
bool ShowClock { set; }
/// <summary>
/// Controls the visibility of the quit button.
/// </summary>
bool ShowQuitButton { set; }
/// <summary>
/// Event fired when the user clicked the quit button in the taskbar.
/// </summary>

View file

@ -24,6 +24,11 @@ namespace SafeExamBrowser.UserInterface.Desktop.Windows
set { Dispatcher.Invoke(() => Clock.Visibility = value ? Visibility.Visible : Visibility.Collapsed); }
}
public bool ShowQuitButton
{
set { Dispatcher.Invoke(() => QuitButton.Visibility = value ? Visibility.Visible : Visibility.Collapsed); }
}
public event QuitButtonClickedEventHandler QuitButtonClicked;
internal ActionCenter()

View file

@ -21,7 +21,7 @@
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="40" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" Template="{StaticResource SmallBarScrollViewer}">
<StackPanel x:Name="ApplicationStackPanel" Orientation="Horizontal" />

View file

@ -26,6 +26,11 @@ namespace SafeExamBrowser.UserInterface.Desktop.Windows
set { Dispatcher.Invoke(() => Clock.Visibility = value ? Visibility.Visible : Visibility.Collapsed); }
}
public bool ShowQuitButton
{
set { Dispatcher.Invoke(() => QuitButton.Visibility = value ? Visibility.Visible : Visibility.Collapsed); }
}
public event QuitButtonClickedEventHandler QuitButtonClicked;
internal Taskbar(ILogger logger)

View file

@ -24,6 +24,11 @@ namespace SafeExamBrowser.UserInterface.Mobile.Windows
set { Dispatcher.Invoke(() => Clock.Visibility = value ? Visibility.Visible : Visibility.Collapsed); }
}
public bool ShowQuitButton
{
set { Dispatcher.Invoke(() => QuitButton.Visibility = value ? Visibility.Visible : Visibility.Collapsed); }
}
public event QuitButtonClickedEventHandler QuitButtonClicked;
internal ActionCenter()

View file

@ -21,7 +21,7 @@
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="60" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" Template="{StaticResource SmallBarScrollViewer}">
<StackPanel x:Name="ApplicationStackPanel" Orientation="Horizontal" />

View file

@ -26,6 +26,11 @@ namespace SafeExamBrowser.UserInterface.Mobile.Windows
set { Dispatcher.Invoke(() => Clock.Visibility = value ? Visibility.Visible : Visibility.Collapsed); }
}
public bool ShowQuitButton
{
set { Dispatcher.Invoke(() => QuitButton.Visibility = value ? Visibility.Visible : Visibility.Collapsed); }
}
public event QuitButtonClickedEventHandler QuitButtonClicked;
internal Taskbar(ILogger logger)