diff --git a/SafeExamBrowser.Browser/BrowserApplication.cs b/SafeExamBrowser.Browser/BrowserApplication.cs
index c773e4f4..97d4f14c 100644
--- a/SafeExamBrowser.Browser/BrowserApplication.cs
+++ b/SafeExamBrowser.Browser/BrowserApplication.cs
@@ -78,6 +78,8 @@ namespace SafeExamBrowser.Browser
public void Initialize()
{
+ logger.Info("Starting initialization...");
+
var cefSettings = InitializeCefSettings();
var success = Cef.Initialize(cefSettings, true, default(IApp));
@@ -85,6 +87,11 @@ namespace SafeExamBrowser.Browser
if (success)
{
+ if (settings.DeleteCookiesOnStartup)
+ {
+ DeleteCookies();
+ }
+
logger.Info("Initialized browser.");
}
else
@@ -100,6 +107,8 @@ namespace SafeExamBrowser.Browser
public void Terminate()
{
+ logger.Info("Initiating termination...");
+
foreach (var instance in instances)
{
instance.Terminated -= Instance_Terminated;
@@ -107,19 +116,15 @@ namespace SafeExamBrowser.Browser
logger.Info($"Terminated browser instance {instance.Id}.");
}
+ if (settings.DeleteCookiesOnShutdown)
+ {
+ DeleteCookies();
+ }
+
Cef.Shutdown();
logger.Info("Terminated browser.");
}
- private void InitializeApplicationInfo()
- {
- AutoStart = true;
- Icon = new BrowserIconResource();
- Id = Guid.NewGuid();
- Name = text.Get(TextKey.Browser_Name);
- Tooltip = text.Get(TextKey.Browser_Tooltip);
- }
-
private void CreateNewInstance(string url = null)
{
var id = ++instanceIdCounter;
@@ -140,6 +145,41 @@ namespace SafeExamBrowser.Browser
WindowsChanged?.Invoke();
}
+ private void DeleteCookies()
+ {
+ var callback = new TaskDeleteCookiesCallback();
+
+ callback.Task.ContinueWith(task =>
+ {
+ if (!task.IsCompleted || task.Result == TaskDeleteCookiesCallback.InvalidNoOfCookiesDeleted)
+ {
+ logger.Warn("Failed to delete cookies!");
+ }
+ else
+ {
+ logger.Debug($"Deleted {task.Result} cookies.");
+ }
+ });
+
+ if (Cef.GetGlobalCookieManager().DeleteCookies(callback: callback))
+ {
+ logger.Debug("Successfully initiated cookie deletion.");
+ }
+ else
+ {
+ logger.Warn("Failed to initiate cookie deletion!");
+ }
+ }
+
+ private void InitializeApplicationInfo()
+ {
+ AutoStart = true;
+ Icon = new BrowserIconResource();
+ Id = Guid.NewGuid();
+ Name = text.Get(TextKey.Browser_Name);
+ Tooltip = text.Get(TextKey.Browser_Tooltip);
+ }
+
private CefSettings InitializeCefSettings()
{
var warning = logger.LogLevel == LogLevel.Warning;
@@ -149,6 +189,7 @@ namespace SafeExamBrowser.Browser
CachePath = appConfig.BrowserCachePath,
LogFile = appConfig.BrowserLogFilePath,
LogSeverity = error ? LogSeverity.Error : (warning ? LogSeverity.Warning : LogSeverity.Info),
+ PersistSessionCookies = !settings.DeleteCookiesOnShutdown,
UserAgent = InitializeUserAgent()
};
@@ -161,11 +202,12 @@ namespace SafeExamBrowser.Browser
cefSettings.CefCommandLineArgs.Add("disable-pdf-extension", "");
}
- logger.Debug($"Cache path: {cefSettings.CachePath}");
- logger.Debug($"Engine version: Chromium {Cef.ChromiumVersion}, CEF {Cef.CefVersion}, CefSharp {Cef.CefSharpVersion}");
- logger.Debug($"Log file: {cefSettings.LogFile}");
- logger.Debug($"Log severity: {cefSettings.LogSeverity}");
- logger.Debug($"PDF reader: {(settings.AllowPdfReader ? "Enabled" : "Disabled")}");
+ logger.Debug($"Cache Path: {cefSettings.CachePath}");
+ logger.Debug($"Engine Version: Chromium {Cef.ChromiumVersion}, CEF {Cef.CefVersion}, CefSharp {Cef.CefSharpVersion}");
+ logger.Debug($"Log File: {cefSettings.LogFile}");
+ logger.Debug($"Log Severity: {cefSettings.LogSeverity}.");
+ logger.Debug($"PDF Reader: {(settings.AllowPdfReader ? "Enabled" : "Disabled")}.");
+ logger.Debug($"Session Persistence: {(cefSettings.PersistSessionCookies ? "Enabled" : "Disabled")}.");
return cefSettings;
}
@@ -203,6 +245,25 @@ namespace SafeExamBrowser.Browser
}
}
+ ///
+ /// TODO: Workaround to correctly set the user agent due to missing support for request interception for requests made by service workers.
+ /// Remove once CEF fully supports service workers and reactivate the functionality in !
+ ///
+ private string InitializeUserAgent()
+ {
+ var osVersion = $"{Environment.OSVersion.Version.Major}.{Environment.OSVersion.Version.Minor}";
+ var sebVersion = $"SEB/{appConfig.ProgramInformationalVersion}";
+
+ if (settings.UseCustomUserAgent)
+ {
+ return $"{settings.CustomUserAgent} {sebVersion}";
+ }
+ else
+ {
+ return $"Mozilla/5.0 (Windows NT {osVersion}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{Cef.ChromiumVersion} {sebVersion}";
+ }
+ }
+
private string ToScheme(ProxyProtocol protocol)
{
switch (protocol)
@@ -231,24 +292,5 @@ namespace SafeExamBrowser.Browser
instances.Remove(instances.First(i => i.Id == id));
WindowsChanged?.Invoke();
}
-
- ///
- /// TODO: Workaround to correctly set the user agent due to missing support for request interception for requests made by service workers.
- /// Remove once CEF fully supports service workers and reactivate the functionality in !
- ///
- private string InitializeUserAgent()
- {
- var osVersion = $"{Environment.OSVersion.Version.Major}.{Environment.OSVersion.Version.Minor}";
- var sebVersion = $"SEB/{appConfig.ProgramInformationalVersion}";
-
- if (settings.UseCustomUserAgent)
- {
- return $"{settings.CustomUserAgent} {sebVersion}";
- }
- else
- {
- return $"Mozilla/5.0 (Windows NT {osVersion}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{Cef.ChromiumVersion} {sebVersion}";
- }
- }
}
}
diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/BrowserDataMapper.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/BrowserDataMapper.cs
index 24b3fc79..0681b1e6 100644
--- a/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/BrowserDataMapper.cs
+++ b/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/BrowserDataMapper.cs
@@ -61,6 +61,12 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
case Keys.Browser.AdditionalWindow.WindowWidth:
MapWindowWidthAdditionalWindow(settings, value);
break;
+ case Keys.Browser.DeleteCookiesOnShutdown:
+ MapDeleteCookiesOnShutdown(settings, value);
+ break;
+ case Keys.Browser.DeleteCookiesOnStartup:
+ MapDeleteCookiesOnStartup(settings, value);
+ break;
case Keys.Browser.DownloadDirectory:
MapDownloadDirectory(settings, value);
break;
@@ -231,6 +237,22 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
}
}
+ private void MapDeleteCookiesOnShutdown(AppSettings settings, object value)
+ {
+ if (value is bool delete)
+ {
+ settings.Browser.DeleteCookiesOnShutdown = delete;
+ }
+ }
+
+ private void MapDeleteCookiesOnStartup(AppSettings settings, object value)
+ {
+ if (value is bool delete)
+ {
+ settings.Browser.DeleteCookiesOnStartup = delete;
+ }
+ }
+
private void MapDownloadDirectory(AppSettings settings, object value)
{
if (value is string directory)
diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs
index b971500c..70a17fb7 100644
--- a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs
+++ b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs
@@ -120,6 +120,8 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
settings.Browser.AllowPdfReader = true;
settings.Browser.AllowPdfReaderToolbar = false;
settings.Browser.AllowUploads = true;
+ settings.Browser.DeleteCookiesOnShutdown = true;
+ settings.Browser.DeleteCookiesOnStartup = true;
settings.Browser.EnableBrowser = true;
settings.Browser.MainWindow.AllowAddressBar = false;
settings.Browser.MainWindow.AllowBackwardNavigation = false;
diff --git a/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs b/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs
index 2607beeb..c6ed1034 100644
--- a/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs
+++ b/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs
@@ -49,6 +49,8 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
internal const string AllowPdfReaderToolbar = "allowPDFReaderToolbar";
internal const string CustomUserAgentDesktop = "browserUserAgentWinDesktopModeCustom";
internal const string CustomUserAgentMobile = "browserUserAgentWinTouchModeCustom";
+ internal const string DeleteCookiesOnShutdown = "examSessionClearCookiesOnEnd";
+ internal const string DeleteCookiesOnStartup = "examSessionClearCookiesOnStart";
internal const string DownloadDirectory = "downloadDirectoryWin";
internal const string DownloadPdfFiles = "downloadPDFFiles";
internal const string EnableBrowser = "enableSebBrowser";
diff --git a/SafeExamBrowser.Settings/Browser/BrowserSettings.cs b/SafeExamBrowser.Settings/Browser/BrowserSettings.cs
index 440d083c..c79b2e09 100644
--- a/SafeExamBrowser.Settings/Browser/BrowserSettings.cs
+++ b/SafeExamBrowser.Settings/Browser/BrowserSettings.cs
@@ -71,6 +71,16 @@ namespace SafeExamBrowser.Settings.Browser
///
public string CustomUserAgent { get; set; }
+ ///
+ /// Determines whether all cookies are deleted when terminating the browser application.
+ ///
+ public bool DeleteCookiesOnShutdown { get; set; }
+
+ ///
+ /// Determines whether all cookies are deleted when starting the browser application.
+ ///
+ public bool DeleteCookiesOnStartup { get; set; }
+
///
/// Defines a custom directory for file downloads. If not defined, all downloads will be saved in the current user's download directory.
///