SEBWIN-396: Implemented configuration value "allowQuit" to control the termination of SEB by user action.
This commit is contained in:
parent
631fb583d7
commit
b5876eb61a
14 changed files with 104 additions and 4 deletions
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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" />
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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" />
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue