SEBWIN-821: Implemented configuration value for lock screen on user session change.
This commit is contained in:
parent
79dedf12b5
commit
27155a057d
11 changed files with 44 additions and 22 deletions
|
@ -1228,7 +1228,7 @@ namespace SafeExamBrowser.Client.UnitTests
|
|||
uiFactory.Setup(f => f.CreateLockScreen(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<IEnumerable<LockScreenOption>>())).Returns(lockScreen.Object);
|
||||
|
||||
sut.TryStart();
|
||||
systemMonitor.Raise(m => m.SessionSwitched += null);
|
||||
systemMonitor.Raise(m => m.SessionChanged += null);
|
||||
|
||||
lockScreen.Verify(l => l.Show(), Times.Once);
|
||||
}
|
||||
|
@ -1248,7 +1248,7 @@ namespace SafeExamBrowser.Client.UnitTests
|
|||
.Returns(lockScreen.Object);
|
||||
|
||||
sut.TryStart();
|
||||
systemMonitor.Raise(m => m.SessionSwitched += null);
|
||||
systemMonitor.Raise(m => m.SessionChanged += null);
|
||||
|
||||
lockScreen.Verify(l => l.Show(), Times.Once);
|
||||
runtimeProxy.Verify(p => p.RequestShutdown(), Times.Once);
|
||||
|
@ -1266,7 +1266,7 @@ namespace SafeExamBrowser.Client.UnitTests
|
|||
uiFactory.Setup(f => f.CreateLockScreen(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<IEnumerable<LockScreenOption>>())).Returns(lockScreen.Object);
|
||||
|
||||
sut.TryStart();
|
||||
systemMonitor.Raise(m => m.SessionSwitched += null);
|
||||
systemMonitor.Raise(m => m.SessionChanged += null);
|
||||
|
||||
lockScreen.Verify(l => l.Show(), Times.Never);
|
||||
}
|
||||
|
|
|
@ -213,7 +213,7 @@ namespace SafeExamBrowser.Client
|
|||
displayMonitor.DisplayChanged += DisplayMonitor_DisplaySettingsChanged;
|
||||
registry.ValueChanged += Registry_ValueChanged;
|
||||
runtime.ConnectionLost += Runtime_ConnectionLost;
|
||||
systemMonitor.SessionSwitched += SystemMonitor_SessionSwitched;
|
||||
systemMonitor.SessionChanged += SystemMonitor_SessionChanged;
|
||||
taskbar.LoseFocusRequested += Taskbar_LoseFocusRequested;
|
||||
taskbar.QuitButtonClicked += Shell_QuitButtonClicked;
|
||||
|
||||
|
@ -248,7 +248,7 @@ namespace SafeExamBrowser.Client
|
|||
displayMonitor.DisplayChanged -= DisplayMonitor_DisplaySettingsChanged;
|
||||
registry.ValueChanged -= Registry_ValueChanged;
|
||||
runtime.ConnectionLost -= Runtime_ConnectionLost;
|
||||
systemMonitor.SessionSwitched -= SystemMonitor_SessionSwitched;
|
||||
systemMonitor.SessionChanged -= SystemMonitor_SessionChanged;
|
||||
taskbar.QuitButtonClicked -= Shell_QuitButtonClicked;
|
||||
|
||||
if (Browser != null)
|
||||
|
@ -838,21 +838,22 @@ namespace SafeExamBrowser.Client
|
|||
ResumeActivators();
|
||||
}
|
||||
|
||||
private void SystemMonitor_SessionSwitched()
|
||||
private void SystemMonitor_SessionChanged()
|
||||
{
|
||||
var allow = !Settings.Service.IgnoreService && (!Settings.Service.DisableUserLock || !Settings.Service.DisableUserSwitch);
|
||||
var disable = Settings.Security.DisableSessionChangeLockScreen;
|
||||
var message = text.Get(TextKey.LockScreen_UserSessionMessage);
|
||||
var title = text.Get(TextKey.LockScreen_Title);
|
||||
var continueOption = new LockScreenOption { Text = text.Get(TextKey.LockScreen_UserSessionContinueOption) };
|
||||
var terminateOption = new LockScreenOption { Text = text.Get(TextKey.LockScreen_UserSessionTerminateOption) };
|
||||
|
||||
if (allow)
|
||||
if (allow || disable)
|
||||
{
|
||||
logger.Info("Detected user session switch, but user lock and/or user switch are allowed.");
|
||||
logger.Info($"Detected user session change, but {(allow ? "session locking and/or switching is allowed" : "lock screen is deactivated")}.");
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.Warn("Detected user session switch!");
|
||||
logger.Warn("Detected user session change!");
|
||||
|
||||
if (!sessionLocked)
|
||||
{
|
||||
|
|
|
@ -35,6 +35,9 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
|
|||
case Keys.Security.ClipboardPolicy:
|
||||
MapClipboardPolicy(settings, value);
|
||||
break;
|
||||
case Keys.Security.DisableSessionChangeLockScreen:
|
||||
MapDisableSessionChangeLockScreen(settings, value);
|
||||
break;
|
||||
case Keys.Security.QuitPasswordHash:
|
||||
MapQuitPasswordHash(settings, value);
|
||||
break;
|
||||
|
@ -137,6 +140,14 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
|
|||
}
|
||||
}
|
||||
|
||||
private void MapDisableSessionChangeLockScreen(AppSettings settings, object value)
|
||||
{
|
||||
if (value is bool disable)
|
||||
{
|
||||
settings.Security.DisableSessionChangeLockScreen = disable;
|
||||
}
|
||||
}
|
||||
|
||||
private void MapVirtualMachinePolicy(AppSettings settings, object value)
|
||||
{
|
||||
if (value is bool allow)
|
||||
|
|
|
@ -272,6 +272,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
|
|||
settings.Security.AllowTermination = true;
|
||||
settings.Security.AllowReconfiguration = false;
|
||||
settings.Security.ClipboardPolicy = ClipboardPolicy.Isolated;
|
||||
settings.Security.DisableSessionChangeLockScreen = false;
|
||||
settings.Security.KioskMode = KioskMode.CreateNewDesktop;
|
||||
settings.Security.VirtualMachinePolicy = VirtualMachinePolicy.Deny;
|
||||
|
||||
|
|
|
@ -283,6 +283,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
|
|||
internal const string AllowTermination = "allowQuit";
|
||||
internal const string AllowVirtualMachine = "allowVirtualMachine";
|
||||
internal const string ClipboardPolicy = "clipboardPolicy";
|
||||
internal const string DisableSessionChangeLockScreen = "disableSessionChangeLockScreen";
|
||||
internal const string KioskModeCreateNewDesktop = "createNewDesktop";
|
||||
internal const string KioskModeDisableExplorerShell = "killExplorerShell";
|
||||
internal const string QuitPasswordHash = "hashedQuitPassword";
|
||||
|
|
|
@ -68,7 +68,7 @@
|
|||
<Compile Include="Applications\InitializationResult.cs" />
|
||||
<Compile Include="Applications\IApplicationMonitor.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="System\Events\SessionSwitchedEventHandler.cs" />
|
||||
<Compile Include="System\Events\SessionChangedEventHandler.cs" />
|
||||
<Compile Include="System\ISystemMonitor.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
|
@ -11,5 +11,5 @@ namespace SafeExamBrowser.Monitoring.Contracts.System.Events
|
|||
/// <summary>
|
||||
/// Indicates that the active user session of the operating system has changed.
|
||||
/// </summary>
|
||||
public delegate void SessionSwitchedEventHandler();
|
||||
public delegate void SessionChangedEventHandler();
|
||||
}
|
|
@ -18,7 +18,7 @@ namespace SafeExamBrowser.Monitoring.Contracts.System
|
|||
/// <summary>
|
||||
/// Event fired when the active user session has changed.
|
||||
/// </summary>
|
||||
event SessionSwitchedEventHandler SessionSwitched;
|
||||
event SessionChangedEventHandler SessionChanged;
|
||||
|
||||
/// <summary>
|
||||
/// Starts the monitoring.
|
||||
|
|
|
@ -19,7 +19,7 @@ namespace SafeExamBrowser.Monitoring.System
|
|||
{
|
||||
private readonly ILogger logger;
|
||||
|
||||
public event SessionSwitchedEventHandler SessionSwitched;
|
||||
public event SessionChangedEventHandler SessionChanged;
|
||||
|
||||
public SystemMonitor(ILogger logger)
|
||||
{
|
||||
|
@ -33,7 +33,7 @@ namespace SafeExamBrowser.Monitoring.System
|
|||
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
|
||||
SystemEvents.SessionEnded += SystemEvents_SessionEnded;
|
||||
SystemEvents.SessionEnding += SystemEvents_SessionEnding;
|
||||
SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
|
||||
SystemEvents.SessionSwitch += SystemEvents_SessionChanged;
|
||||
SystemEvents.TimeChanged += SystemEvents_TimeChanged;
|
||||
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
|
||||
logger.Info("Started monitoring the operating system.");
|
||||
|
@ -46,7 +46,7 @@ namespace SafeExamBrowser.Monitoring.System
|
|||
SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
|
||||
SystemEvents.SessionEnded -= SystemEvents_SessionEnded;
|
||||
SystemEvents.SessionEnding -= SystemEvents_SessionEnding;
|
||||
SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch;
|
||||
SystemEvents.SessionSwitch -= SystemEvents_SessionChanged;
|
||||
SystemEvents.TimeChanged -= SystemEvents_TimeChanged;
|
||||
SystemEvents.UserPreferenceChanged -= SystemEvents_UserPreferenceChanged;
|
||||
logger.Info("Stopped monitoring the operating system.");
|
||||
|
@ -64,23 +64,23 @@ namespace SafeExamBrowser.Monitoring.System
|
|||
|
||||
private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
|
||||
{
|
||||
logger.Info($"Power mode changed: {e.Mode}");
|
||||
logger.Info($"Power mode changed: {e.Mode}.");
|
||||
}
|
||||
|
||||
private void SystemEvents_SessionEnded(object sender, SessionEndedEventArgs e)
|
||||
{
|
||||
logger.Warn($"User session ended! Reason: {e.Reason}");
|
||||
logger.Warn($"User session ended! Reason: {e.Reason}.");
|
||||
}
|
||||
|
||||
private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
|
||||
{
|
||||
logger.Warn($"User session is ending! Reason: {e.Reason}");
|
||||
logger.Warn($"User session is ending! Reason: {e.Reason}.");
|
||||
}
|
||||
|
||||
private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
|
||||
private void SystemEvents_SessionChanged(object sender, SessionSwitchEventArgs e)
|
||||
{
|
||||
logger.Info($"User session switch detected! Reason: {e.Reason}");
|
||||
Task.Run(() => SessionSwitched?.Invoke());
|
||||
logger.Info($"User session change detected: {e.Reason}.");
|
||||
Task.Run(() => SessionChanged?.Invoke());
|
||||
}
|
||||
|
||||
private void SystemEvents_TimeChanged(object sender, EventArgs e)
|
||||
|
@ -90,7 +90,7 @@ namespace SafeExamBrowser.Monitoring.System
|
|||
|
||||
private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
|
||||
{
|
||||
logger.Info($"User preference changed. Category: {e.Category}");
|
||||
logger.Info($"User preference changed. Category: {e.Category}.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,12 @@ namespace SafeExamBrowser.Settings.Security
|
|||
/// </summary>
|
||||
public ClipboardPolicy ClipboardPolicy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the lock screen is disabled in case of a user session change. This setting overrides the activation based on
|
||||
/// <see cref="Service.ServiceSettings.IgnoreService"/> and <see cref="Service.ServiceSettings.DisableUserLock"/> or <see cref="Service.ServiceSettings.DisableUserSwitch"/>.
|
||||
/// </summary>
|
||||
public bool DisableSessionChangeLockScreen { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The kiosk mode which determines how the computer is locked down.
|
||||
/// </summary>
|
||||
|
|
|
@ -379,6 +379,7 @@ namespace SebWindowsConfig
|
|||
public const String KeyAllowWindowsUpdate = "enableWindowsUpdate";
|
||||
public const String KeyVersionRestrictions = "sebAllowedVersions";
|
||||
public const String KeyClipboardPolicy = "clipboardPolicy";
|
||||
public const String KeyDisableSessionChangeLockScreen = "disableSessionChangeLockScreen";
|
||||
|
||||
// Group "macOS specific settings"
|
||||
public const String KeyMinMacOSVersion = "minMacOSVersion";
|
||||
|
@ -1013,6 +1014,7 @@ namespace SebWindowsConfig
|
|||
SEBSettings.settingsDefault.Add(SEBSettings.KeyAllowChromeNotifications, false);
|
||||
SEBSettings.settingsDefault.Add(SEBSettings.KeyAllowWindowsUpdate, false);
|
||||
SEBSettings.settingsDefault.Add(SEBSettings.KeyClipboardPolicy, 2);
|
||||
SEBSettings.settingsDefault.Add(SEBSettings.KeyDisableSessionChangeLockScreen, false);
|
||||
|
||||
// Default selected index and string in combo box for minMacOSVersion
|
||||
SEBSettings.intArrayDefault[SEBSettings.ValMinMacOSVersion] = 4;
|
||||
|
|
Loading…
Reference in a new issue