/* * Copyright (c) 2024 ETH Zürich, IT Services * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ using CefSharp; using SafeExamBrowser.Browser.Content; using SafeExamBrowser.Configuration.Contracts; using SafeExamBrowser.Configuration.Contracts.Cryptography; using SafeExamBrowser.I18n.Contracts; using BrowserSettings = SafeExamBrowser.Settings.Browser.BrowserSettings; namespace SafeExamBrowser.Browser.Handlers { internal class RenderProcessMessageHandler : IRenderProcessMessageHandler { private readonly AppConfig appConfig; private readonly Clipboard clipboard; private readonly ContentLoader contentLoader; private readonly IKeyGenerator keyGenerator; private readonly BrowserSettings settings; private readonly IText text; internal RenderProcessMessageHandler(AppConfig appConfig, Clipboard clipboard, IKeyGenerator keyGenerator, BrowserSettings settings, IText text) { this.appConfig = appConfig; this.clipboard = clipboard; this.contentLoader = new ContentLoader(text); this.keyGenerator = keyGenerator; this.settings = settings; this.text = text; } public void OnContextCreated(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame) { var browserExamKey = keyGenerator.CalculateBrowserExamKeyHash(settings.ConfigurationKey, settings.BrowserExamKeySalt, frame.Url); var configurationKey = keyGenerator.CalculateConfigurationKeyHash(settings.ConfigurationKey, frame.Url); var api = contentLoader.LoadApi(browserExamKey, configurationKey, appConfig.ProgramBuildVersion); var clipboardScript = contentLoader.LoadClipboard(); var pageZoomScript = contentLoader.LoadPageZoom(); frame.ExecuteJavaScriptAsync(api); if (!settings.AllowPageZoom) { frame.ExecuteJavaScriptAsync(pageZoomScript); } if (!settings.AllowPrint) { frame.ExecuteJavaScriptAsync($"window.print = function() {{ alert('{text.Get(TextKey.Browser_PrintNotAllowed)}') }}"); } if (settings.UseIsolatedClipboard) { frame.ExecuteJavaScriptAsync(clipboardScript); if (clipboard.Content != default) { frame.ExecuteJavaScriptAsync($"SafeExamBrowser.clipboard.update('', '{clipboard.Content}');"); } } } public void OnContextReleased(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame) { } public void OnFocusedNodeChanged(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IDomNode node) { } public void OnUncaughtException(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, JavascriptException exception) { } } }