SEBWIN-357: Implemented browser session configuration.

This commit is contained in:
dbuechel 2020-02-17 12:10:04 +01:00
parent 42e107d7c7
commit 91765e2d55
5 changed files with 111 additions and 33 deletions

View file

@ -78,6 +78,8 @@ namespace SafeExamBrowser.Browser
public void Initialize() public void Initialize()
{ {
logger.Info("Starting initialization...");
var cefSettings = InitializeCefSettings(); var cefSettings = InitializeCefSettings();
var success = Cef.Initialize(cefSettings, true, default(IApp)); var success = Cef.Initialize(cefSettings, true, default(IApp));
@ -85,6 +87,11 @@ namespace SafeExamBrowser.Browser
if (success) if (success)
{ {
if (settings.DeleteCookiesOnStartup)
{
DeleteCookies();
}
logger.Info("Initialized browser."); logger.Info("Initialized browser.");
} }
else else
@ -100,6 +107,8 @@ namespace SafeExamBrowser.Browser
public void Terminate() public void Terminate()
{ {
logger.Info("Initiating termination...");
foreach (var instance in instances) foreach (var instance in instances)
{ {
instance.Terminated -= Instance_Terminated; instance.Terminated -= Instance_Terminated;
@ -107,19 +116,15 @@ namespace SafeExamBrowser.Browser
logger.Info($"Terminated browser instance {instance.Id}."); logger.Info($"Terminated browser instance {instance.Id}.");
} }
if (settings.DeleteCookiesOnShutdown)
{
DeleteCookies();
}
Cef.Shutdown(); Cef.Shutdown();
logger.Info("Terminated browser."); 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) private void CreateNewInstance(string url = null)
{ {
var id = ++instanceIdCounter; var id = ++instanceIdCounter;
@ -140,6 +145,41 @@ namespace SafeExamBrowser.Browser
WindowsChanged?.Invoke(); 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() private CefSettings InitializeCefSettings()
{ {
var warning = logger.LogLevel == LogLevel.Warning; var warning = logger.LogLevel == LogLevel.Warning;
@ -149,6 +189,7 @@ namespace SafeExamBrowser.Browser
CachePath = appConfig.BrowserCachePath, CachePath = appConfig.BrowserCachePath,
LogFile = appConfig.BrowserLogFilePath, LogFile = appConfig.BrowserLogFilePath,
LogSeverity = error ? LogSeverity.Error : (warning ? LogSeverity.Warning : LogSeverity.Info), LogSeverity = error ? LogSeverity.Error : (warning ? LogSeverity.Warning : LogSeverity.Info),
PersistSessionCookies = !settings.DeleteCookiesOnShutdown,
UserAgent = InitializeUserAgent() UserAgent = InitializeUserAgent()
}; };
@ -161,11 +202,12 @@ namespace SafeExamBrowser.Browser
cefSettings.CefCommandLineArgs.Add("disable-pdf-extension", ""); cefSettings.CefCommandLineArgs.Add("disable-pdf-extension", "");
} }
logger.Debug($"Cache path: {cefSettings.CachePath}"); logger.Debug($"Cache Path: {cefSettings.CachePath}");
logger.Debug($"Engine version: Chromium {Cef.ChromiumVersion}, CEF {Cef.CefVersion}, CefSharp {Cef.CefSharpVersion}"); logger.Debug($"Engine Version: Chromium {Cef.ChromiumVersion}, CEF {Cef.CefVersion}, CefSharp {Cef.CefSharpVersion}");
logger.Debug($"Log file: {cefSettings.LogFile}"); logger.Debug($"Log File: {cefSettings.LogFile}");
logger.Debug($"Log severity: {cefSettings.LogSeverity}"); logger.Debug($"Log Severity: {cefSettings.LogSeverity}.");
logger.Debug($"PDF reader: {(settings.AllowPdfReader ? "Enabled" : "Disabled")}"); logger.Debug($"PDF Reader: {(settings.AllowPdfReader ? "Enabled" : "Disabled")}.");
logger.Debug($"Session Persistence: {(cefSettings.PersistSessionCookies ? "Enabled" : "Disabled")}.");
return cefSettings; return cefSettings;
} }
@ -203,6 +245,25 @@ namespace SafeExamBrowser.Browser
} }
} }
/// <summary>
/// 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 <see cref="Handlers.RequestHandler"/>!
/// </summary>
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) private string ToScheme(ProxyProtocol protocol)
{ {
switch (protocol) switch (protocol)
@ -231,24 +292,5 @@ namespace SafeExamBrowser.Browser
instances.Remove(instances.First(i => i.Id == id)); instances.Remove(instances.First(i => i.Id == id));
WindowsChanged?.Invoke(); WindowsChanged?.Invoke();
} }
/// <summary>
/// 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 <see cref="Handlers.RequestHandler"/>!
/// </summary>
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}";
}
}
} }
} }

View file

@ -61,6 +61,12 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
case Keys.Browser.AdditionalWindow.WindowWidth: case Keys.Browser.AdditionalWindow.WindowWidth:
MapWindowWidthAdditionalWindow(settings, value); MapWindowWidthAdditionalWindow(settings, value);
break; break;
case Keys.Browser.DeleteCookiesOnShutdown:
MapDeleteCookiesOnShutdown(settings, value);
break;
case Keys.Browser.DeleteCookiesOnStartup:
MapDeleteCookiesOnStartup(settings, value);
break;
case Keys.Browser.DownloadDirectory: case Keys.Browser.DownloadDirectory:
MapDownloadDirectory(settings, value); MapDownloadDirectory(settings, value);
break; 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) private void MapDownloadDirectory(AppSettings settings, object value)
{ {
if (value is string directory) if (value is string directory)

View file

@ -120,6 +120,8 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
settings.Browser.AllowPdfReader = true; settings.Browser.AllowPdfReader = true;
settings.Browser.AllowPdfReaderToolbar = false; settings.Browser.AllowPdfReaderToolbar = false;
settings.Browser.AllowUploads = true; settings.Browser.AllowUploads = true;
settings.Browser.DeleteCookiesOnShutdown = true;
settings.Browser.DeleteCookiesOnStartup = true;
settings.Browser.EnableBrowser = true; settings.Browser.EnableBrowser = true;
settings.Browser.MainWindow.AllowAddressBar = false; settings.Browser.MainWindow.AllowAddressBar = false;
settings.Browser.MainWindow.AllowBackwardNavigation = false; settings.Browser.MainWindow.AllowBackwardNavigation = false;

View file

@ -49,6 +49,8 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
internal const string AllowPdfReaderToolbar = "allowPDFReaderToolbar"; internal const string AllowPdfReaderToolbar = "allowPDFReaderToolbar";
internal const string CustomUserAgentDesktop = "browserUserAgentWinDesktopModeCustom"; internal const string CustomUserAgentDesktop = "browserUserAgentWinDesktopModeCustom";
internal const string CustomUserAgentMobile = "browserUserAgentWinTouchModeCustom"; internal const string CustomUserAgentMobile = "browserUserAgentWinTouchModeCustom";
internal const string DeleteCookiesOnShutdown = "examSessionClearCookiesOnEnd";
internal const string DeleteCookiesOnStartup = "examSessionClearCookiesOnStart";
internal const string DownloadDirectory = "downloadDirectoryWin"; internal const string DownloadDirectory = "downloadDirectoryWin";
internal const string DownloadPdfFiles = "downloadPDFFiles"; internal const string DownloadPdfFiles = "downloadPDFFiles";
internal const string EnableBrowser = "enableSebBrowser"; internal const string EnableBrowser = "enableSebBrowser";

View file

@ -71,6 +71,16 @@ namespace SafeExamBrowser.Settings.Browser
/// </summary> /// </summary>
public string CustomUserAgent { get; set; } public string CustomUserAgent { get; set; }
/// <summary>
/// Determines whether all cookies are deleted when terminating the browser application.
/// </summary>
public bool DeleteCookiesOnShutdown { get; set; }
/// <summary>
/// Determines whether all cookies are deleted when starting the browser application.
/// </summary>
public bool DeleteCookiesOnStartup { get; set; }
/// <summary> /// <summary>
/// Defines a custom directory for file downloads. If not defined, all downloads will be saved in the current user's download directory. /// Defines a custom directory for file downloads. If not defined, all downloads will be saved in the current user's download directory.
/// </summary> /// </summary>