Skip to content

Commit 6461401

Browse files
committed
SEBWIN-1017: Implemented quit password requirement.
1 parent 5c444a3 commit 6461401

10 files changed

Lines changed: 47 additions & 24 deletions

File tree

SafeExamBrowser.Client/ClientContext.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ internal class ClientContext
8282
/// </summary>
8383
internal IProctoringController Proctoring { get; set; }
8484

85+
/// <summary>
86+
/// Indicates that the user already provided the correct quit password.
87+
/// </summary>
88+
internal bool QuitPasswordValidated { get; set; }
89+
8590
/// <summary>
8691
/// The client responsibilities.
8792
/// </summary>

SafeExamBrowser.Client/Responsibilities/ClientResponsibility.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ protected bool IsValidQuitPassword(string password)
4646
var expected = Settings.Security.QuitPasswordHash;
4747
var valid = expected.Equals(actual, StringComparison.OrdinalIgnoreCase);
4848

49+
if (valid)
50+
{
51+
Context.QuitPasswordValidated = true;
52+
}
53+
4954
return valid;
5055
}
5156

SafeExamBrowser.Client/Responsibilities/ProctoringResponsibility.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ private void FinalizeProctoring()
4949
{
5050
if (Proctoring != default && Proctoring.HasRemainingWork())
5151
{
52-
var dialog = uiFactory.CreateProctoringFinalizationDialog();
52+
var dialog = uiFactory.CreateProctoringFinalizationDialog(!Context.QuitPasswordValidated);
5353
var handler = new RemainingWorkUpdatedEventHandler((args) => Proctoring_RemainingWorkUpdated(dialog, args));
5454

5555
dialog.CancellationRequested += new CancellationRequestedEventHandler(() => Dialog_CancellationRequested(dialog));
@@ -67,10 +67,12 @@ private void FinalizeProctoring()
6767

6868
private void Dialog_CancellationRequested(IProctoringFinalizationDialog dialog)
6969
{
70-
if (IsValidQuitPassword(dialog.QuitPassword))
70+
var alreadyValidated = Context.QuitPasswordValidated;
71+
72+
if (alreadyValidated || IsValidQuitPassword(dialog.QuitPassword))
7173
{
7274
cancel = true;
73-
Logger.Info("The user entered the correct quit password, cancelling remaining work...");
75+
Logger.Info($"The user {(alreadyValidated ? "already " : "")}entered the correct quit password, cancelling remaining work...");
7476
}
7577
else
7678
{

SafeExamBrowser.UserInterface.Contracts/IUserInterfaceFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public interface IUserInterfaceFactory
112112
/// <summary>
113113
/// Creates a new dialog to display the status of the proctoring finalization.
114114
/// </summary>
115-
IProctoringFinalizationDialog CreateProctoringFinalizationDialog();
115+
IProctoringFinalizationDialog CreateProctoringFinalizationDialog(bool requiresPassword);
116116

117117
/// <summary>
118118
/// Creates a new proctoring window loaded with the given proctoring control.

SafeExamBrowser.UserInterface.Desktop/UserInterfaceFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ public ISystemControl CreatePowerSupplyControl(IPowerSupply powerSupply, Locatio
125125
return controlFactory.CreatePowerSupplyControl(powerSupply, location);
126126
}
127127

128-
public IProctoringFinalizationDialog CreateProctoringFinalizationDialog()
128+
public IProctoringFinalizationDialog CreateProctoringFinalizationDialog(bool requiresPassword)
129129
{
130-
return windowFactory.CreateProctoringFinalizationDialog();
130+
return windowFactory.CreateProctoringFinalizationDialog(requiresPassword);
131131
}
132132

133133
public IProctoringWindow CreateProctoringWindow(IProctoringControl control)

SafeExamBrowser.UserInterface.Desktop/WindowFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ internal IPasswordDialog CreatePasswordDialog(TextKey message, TextKey title)
100100
return Application.Current.Dispatcher.Invoke(() => Guard(new PasswordDialog(text.Get(message), text.Get(title), text)));
101101
}
102102

103-
internal IProctoringFinalizationDialog CreateProctoringFinalizationDialog()
103+
internal IProctoringFinalizationDialog CreateProctoringFinalizationDialog(bool requiresPassword)
104104
{
105-
return Application.Current.Dispatcher.Invoke(() => Guard(new ProctoringFinalizationDialog(text)));
105+
return Application.Current.Dispatcher.Invoke(() => Guard(new ProctoringFinalizationDialog(requiresPassword, text)));
106106
}
107107

108108
internal IProctoringWindow CreateProctoringWindow(IProctoringControl control)

SafeExamBrowser.UserInterface.Desktop/Windows/ProctoringFinalizationDialog.xaml.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ namespace SafeExamBrowser.UserInterface.Desktop.Windows
2020
{
2121
public partial class ProctoringFinalizationDialog : Window, IProctoringFinalizationDialog
2222
{
23+
private readonly bool requiresPassword;
2324
private readonly IText text;
2425

2526
private WindowClosedEventHandler closed;
@@ -42,8 +43,9 @@ event WindowClosingEventHandler IWindow.Closing
4243
remove { closing -= value; }
4344
}
4445

45-
public ProctoringFinalizationDialog(IText text)
46+
public ProctoringFinalizationDialog(bool requiresPassword, IText text)
4647
{
48+
this.requiresPassword = requiresPassword;
4749
this.text = text;
4850

4951
InitializeComponent();
@@ -84,12 +86,15 @@ private void InitializeCancellation()
8486
Button.Click += Button_Click;
8587
Button.Content = text.Get(TextKey.ProctoringFinalizationDialog_Abort);
8688

87-
PasswordPanel.Visibility = Visibility.Visible;
88-
PasswordLabel.Text = text.Get(TextKey.ProctoringFinalizationDialog_PasswordMessage);
89-
Password.KeyDown += Password_KeyDown;
90-
Password.Focus();
89+
if (requiresPassword)
90+
{
91+
PasswordPanel.Visibility = Visibility.Visible;
92+
PasswordLabel.Text = text.Get(TextKey.ProctoringFinalizationDialog_PasswordMessage);
93+
Password.KeyDown += Password_KeyDown;
94+
Password.Focus();
9195

92-
Height += PasswordPanel.ActualHeight + PasswordPanel.Margin.Top + PasswordPanel.Margin.Bottom;
96+
Height += PasswordPanel.ActualHeight + PasswordPanel.Margin.Top + PasswordPanel.Margin.Bottom;
97+
}
9398
initialized = true;
9499
}
95100

SafeExamBrowser.UserInterface.Mobile/UserInterfaceFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ public ISystemControl CreatePowerSupplyControl(IPowerSupply powerSupply, Locatio
125125
return controlFactory.CreatePowerSupplyControl(powerSupply, location);
126126
}
127127

128-
public IProctoringFinalizationDialog CreateProctoringFinalizationDialog()
128+
public IProctoringFinalizationDialog CreateProctoringFinalizationDialog(bool requiresPassword)
129129
{
130-
return windowFactory.CreateProctoringFinalizationDialog();
130+
return windowFactory.CreateProctoringFinalizationDialog(requiresPassword);
131131
}
132132

133133
public IProctoringWindow CreateProctoringWindow(IProctoringControl control)

SafeExamBrowser.UserInterface.Mobile/WindowFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ internal IPasswordDialog CreatePasswordDialog(TextKey message, TextKey title)
100100
return Application.Current.Dispatcher.Invoke(() => Guard(new PasswordDialog(text.Get(message), text.Get(title), text)));
101101
}
102102

103-
internal IProctoringFinalizationDialog CreateProctoringFinalizationDialog()
103+
internal IProctoringFinalizationDialog CreateProctoringFinalizationDialog(bool requiresPassword)
104104
{
105-
return Application.Current.Dispatcher.Invoke(() => Guard(new ProctoringFinalizationDialog(text)));
105+
return Application.Current.Dispatcher.Invoke(() => Guard(new ProctoringFinalizationDialog(requiresPassword, text)));
106106
}
107107

108108
internal IProctoringWindow CreateProctoringWindow(IProctoringControl control)

SafeExamBrowser.UserInterface.Mobile/Windows/ProctoringFinalizationDialog.xaml.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ namespace SafeExamBrowser.UserInterface.Mobile.Windows
2020
{
2121
public partial class ProctoringFinalizationDialog : Window, IProctoringFinalizationDialog
2222
{
23+
private readonly bool requiresPassword;
2324
private readonly IText text;
2425

2526
private WindowClosedEventHandler closed;
@@ -42,8 +43,9 @@ event WindowClosingEventHandler IWindow.Closing
4243
remove { closing -= value; }
4344
}
4445

45-
public ProctoringFinalizationDialog(IText text)
46+
public ProctoringFinalizationDialog(bool requiresPassword, IText text)
4647
{
48+
this.requiresPassword = requiresPassword;
4749
this.text = text;
4850

4951
InitializeComponent();
@@ -96,12 +98,16 @@ private void InitializeCancellation()
9698
Button.Click += Button_Click;
9799
Button.Content = text.Get(TextKey.ProctoringFinalizationDialog_Abort);
98100

99-
PasswordPanel.Visibility = Visibility.Visible;
100-
PasswordLabel.Text = text.Get(TextKey.ProctoringFinalizationDialog_PasswordMessage);
101-
Password.KeyDown += Password_KeyDown;
102-
Password.Focus();
101+
if (requiresPassword)
102+
{
103+
PasswordPanel.Visibility = Visibility.Visible;
104+
PasswordLabel.Text = text.Get(TextKey.ProctoringFinalizationDialog_PasswordMessage);
105+
Password.KeyDown += Password_KeyDown;
106+
Password.Focus();
107+
108+
Height += PasswordPanel.ActualHeight + PasswordPanel.Margin.Top + PasswordPanel.Margin.Bottom;
109+
}
103110

104-
Height += PasswordPanel.ActualHeight + PasswordPanel.Margin.Top + PasswordPanel.Margin.Bottom;
105111
initialized = true;
106112
}
107113

0 commit comments

Comments
 (0)