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.Activators.Add(terminationActivator.Object);
context.Settings.ActionCenter.EnableActionCenter = true; context.Settings.ActionCenter.EnableActionCenter = true;
context.Settings.Keyboard.AllowAltTab = true; context.Settings.Keyboard.AllowAltTab = true;
context.Settings.Security.AllowTermination = true;
sut.Perform(); sut.Perform();
@ -218,6 +219,32 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
taskbar.VerifySet(t => t.ShowClock = false, Times.Once); 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] [TestMethod]
public void Perform_MustInitializeNotifications() public void Perform_MustInitializeNotifications()
{ {
@ -346,6 +373,19 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
taskbar.VerifyNoOtherCalls(); 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] [TestMethod]
public void Revert_MustTerminateActivators() public void Revert_MustTerminateActivators()
{ {

View file

@ -120,7 +120,7 @@ namespace SafeExamBrowser.Client.Operations
taskViewActivator.Start(); taskViewActivator.Start();
} }
if (activator is ITerminationActivator terminationActivator) if (Context.Settings.Security.AllowTermination && activator is ITerminationActivator terminationActivator)
{ {
terminationActivator.Start(); terminationActivator.Start();
} }
@ -142,6 +142,7 @@ namespace SafeExamBrowser.Client.Operations
InitializeKeyboardLayoutForActionCenter(); InitializeKeyboardLayoutForActionCenter();
InitializeWirelessNetworkForActionCenter(); InitializeWirelessNetworkForActionCenter();
InitializePowerSupplyForActionCenter(); InitializePowerSupplyForActionCenter();
InitializeQuitButtonForActionCenter();
} }
else else
{ {
@ -164,6 +165,7 @@ namespace SafeExamBrowser.Client.Operations
InitializeAudioForTaskbar(); InitializeAudioForTaskbar();
InitializeKeyboardLayoutForTaskbar(); InitializeKeyboardLayoutForTaskbar();
InitializeClockForTaskbar(); InitializeClockForTaskbar();
InitializeQuitButtonForTaskbar();
} }
else 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() private void InitializeWirelessNetworkForActionCenter()
{ {
if (Context.Settings.ActionCenter.ShowWirelessNetwork) if (Context.Settings.ActionCenter.ShowWirelessNetwork)

View file

@ -22,6 +22,9 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
case Keys.ConfigurationFile.AdminPasswordHash: case Keys.ConfigurationFile.AdminPasswordHash:
MapAdminPasswordHash(settings, value); MapAdminPasswordHash(settings, value);
break; break;
case Keys.Security.AllowTermination:
MapAllowTermination(settings, value);
break;
case Keys.Security.AllowVirtualMachine: case Keys.Security.AllowVirtualMachine:
MapVirtualMachinePolicy(settings, value); MapVirtualMachinePolicy(settings, value);
break; 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) private void MapApplicationLogAccess(IDictionary<string, object> rawData, AppSettings settings)
{ {
var hasValue = rawData.TryGetValue(Keys.Security.AllowApplicationLog, out var value); var hasValue = rawData.TryGetValue(Keys.Security.AllowApplicationLog, out var value);
@ -112,7 +123,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
{ {
if (value is bool allow) 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.Mouse.AllowRightButton = true;
settings.Security.AllowApplicationLogAccess = false; settings.Security.AllowApplicationLogAccess = false;
settings.Security.AllowTermination = true;
settings.Security.AllowReconfiguration = false; settings.Security.AllowReconfiguration = false;
settings.Security.KioskMode = KioskMode.CreateNewDesktop; settings.Security.KioskMode = KioskMode.CreateNewDesktop;
settings.Security.VirtualMachinePolicy = VirtualMachinePolicy.Deny; settings.Security.VirtualMachinePolicy = VirtualMachinePolicy.Deny;

View file

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

View file

@ -26,6 +26,11 @@ namespace SafeExamBrowser.Settings.Security
/// </summary> /// </summary>
public bool AllowApplicationLogAccess { get; set; } 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> /// <summary>
/// Determines whether the user may reconfigure the application. /// Determines whether the user may reconfigure the application.
/// </summary> /// </summary>

View file

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

View file

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

View file

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

View file

@ -21,7 +21,7 @@
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="40" /> <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" Template="{StaticResource SmallBarScrollViewer}"> <ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" Template="{StaticResource SmallBarScrollViewer}">
<StackPanel x:Name="ApplicationStackPanel" Orientation="Horizontal" /> <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); } 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; public event QuitButtonClickedEventHandler QuitButtonClicked;
internal Taskbar(ILogger logger) 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); } 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; public event QuitButtonClickedEventHandler QuitButtonClicked;
internal ActionCenter() internal ActionCenter()

View file

@ -21,7 +21,7 @@
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="60" /> <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" Template="{StaticResource SmallBarScrollViewer}"> <ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" Template="{StaticResource SmallBarScrollViewer}">
<StackPanel x:Name="ApplicationStackPanel" Orientation="Horizontal" /> <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); } 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; public event QuitButtonClickedEventHandler QuitButtonClicked;
internal Taskbar(ILogger logger) internal Taskbar(ILogger logger)