From e8ebd2840ea0a40b63ffa7ba178c33c8b6c8cb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20B=C3=BCchel?= Date: Wed, 17 Apr 2024 09:19:18 +0200 Subject: [PATCH] SEBWIN-833: Completely deleted all Jitsi Meet and Zoom video proctoring code and removed WebView2 dependency. --- .../DataMapping/ProctoringDataMapper.cs | 382 ------------------ .../ConfigurationData/DataProcessor.cs | 10 - .../ConfigurationData/DataValues.cs | 25 -- .../ConfigurationData/Keys.cs | 41 -- .../Applications/ApplicationMonitor.cs | 7 +- .../JitsiMeet/JitsiMeetImplementation.cs | 255 ------------ .../JitsiMeet/index.html | 69 ---- .../ProctoringControl.cs | 104 ----- .../ProctoringFactory.cs | 8 - .../SafeExamBrowser.Proctoring.csproj | 21 - SafeExamBrowser.Proctoring/packages.config | 1 - .../Operations/DisclaimerOperationTests.cs | 33 +- .../ProctoringWorkaroundOperationTests.cs | 100 ----- .../SafeExamBrowser.Runtime.UnitTests.csproj | 1 - SafeExamBrowser.Runtime/CompositionRoot.cs | 1 - .../Operations/DisclaimerOperation.cs | 69 +--- .../ProctoringWorkaroundOperation.cs | 49 --- .../SafeExamBrowser.Runtime.csproj | 1 - .../Proctoring/JitsiMeetSettings.cs | 109 ----- .../Proctoring/ProctoringSettings.cs | 17 - .../Proctoring/WindowVisibility.cs | 36 -- .../Proctoring/ZoomSettings.cs | 99 ----- .../SafeExamBrowser.Settings.csproj | 3 - .../Windows/AboutWindow.xaml | 5 - .../Windows/AboutWindow.xaml | 5 - Setup/Resources/License.rtf | 73 ++-- SetupBundle/Bundle.wxs | 1 - SetupBundle/SetupBundle.wixproj | 1 - SetupBundle/WebView2Runtime.wxs | 24 -- 29 files changed, 39 insertions(+), 1511 deletions(-) delete mode 100644 SafeExamBrowser.Proctoring/JitsiMeet/JitsiMeetImplementation.cs delete mode 100644 SafeExamBrowser.Proctoring/JitsiMeet/index.html delete mode 100644 SafeExamBrowser.Proctoring/ProctoringControl.cs delete mode 100644 SafeExamBrowser.Runtime.UnitTests/Operations/ProctoringWorkaroundOperationTests.cs delete mode 100644 SafeExamBrowser.Runtime/Operations/ProctoringWorkaroundOperation.cs delete mode 100644 SafeExamBrowser.Settings/Proctoring/JitsiMeetSettings.cs delete mode 100644 SafeExamBrowser.Settings/Proctoring/WindowVisibility.cs delete mode 100644 SafeExamBrowser.Settings/Proctoring/ZoomSettings.cs delete mode 100644 SetupBundle/WebView2Runtime.wxs diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/ProctoringDataMapper.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/ProctoringDataMapper.cs index d083686a..67ade69e 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/ProctoringDataMapper.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/ProctoringDataMapper.cs @@ -21,60 +21,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping case Keys.Proctoring.ForceRaiseHandMessage: MapForceRaiseHandMessage(settings, value); break; - case Keys.Proctoring.JitsiMeet.AllowChat: - MapJitsiMeetAllowChat(settings, value); - break; - case Keys.Proctoring.JitsiMeet.AllowClosedCaptions: - MapJitsiMeetAllowClosedCaptions(settings, value); - break; - case Keys.Proctoring.JitsiMeet.AllowRaiseHand: - MapJitsiMeetAllowRaiseHands(settings, value); - break; - case Keys.Proctoring.JitsiMeet.AllowRecording: - MapJitsiMeetAllowRecording(settings, value); - break; - case Keys.Proctoring.JitsiMeet.AllowTileView: - MapJitsiMeetAllowTileView(settings, value); - break; - case Keys.Proctoring.JitsiMeet.AudioMuted: - MapJitsiMeetAudioMuted(settings, value); - break; - case Keys.Proctoring.JitsiMeet.AudioOnly: - MapJitsiMeetAudioOnly(settings, value); - break; - case Keys.Proctoring.JitsiMeet.Enabled: - MapJitsiMeetEnabled(settings, value); - break; - case Keys.Proctoring.JitsiMeet.ReceiveAudio: - MapJitsiMeetReceiveAudio(settings, value); - break; - case Keys.Proctoring.JitsiMeet.ReceiveVideo: - MapJitsiMeetReceiveVideo(settings, value); - break; - case Keys.Proctoring.JitsiMeet.RoomName: - MapJitsiMeetRoomName(settings, value); - break; - case Keys.Proctoring.JitsiMeet.SendAudio: - MapJitsiMeetSendAudio(settings, value); - break; - case Keys.Proctoring.JitsiMeet.SendVideo: - MapJitsiMeetSendVideo(settings, value); - break; - case Keys.Proctoring.JitsiMeet.ServerUrl: - MapJitsiMeetServerUrl(settings, value); - break; - case Keys.Proctoring.JitsiMeet.ShowMeetingName: - MapJitsiMeetShowMeetingName(settings, value); - break; - case Keys.Proctoring.JitsiMeet.Subject: - MapJitsiMeetSubject(settings, value); - break; - case Keys.Proctoring.JitsiMeet.Token: - MapJitsiMeetToken(settings, value); - break; - case Keys.Proctoring.JitsiMeet.VideoMuted: - MapJitsiMeetVideoMuted(settings, value); - break; case Keys.Proctoring.ScreenProctoring.ClientId: MapClientId(settings, value); break; @@ -120,51 +66,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping case Keys.Proctoring.ShowTaskbarNotification: MapShowTaskbarNotification(settings, value); break; - case Keys.Proctoring.WindowVisibility: - MapWindowVisibility(settings, value); - break; - case Keys.Proctoring.Zoom.AllowChat: - MapZoomAllowChat(settings, value); - break; - case Keys.Proctoring.Zoom.AllowClosedCaptions: - MapZoomAllowClosedCaptions(settings, value); - break; - case Keys.Proctoring.Zoom.AllowRaiseHand: - MapZoomAllowRaiseHands(settings, value); - break; - case Keys.Proctoring.Zoom.AudioMuted: - MapZoomAudioMuted(settings, value); - break; - case Keys.Proctoring.Zoom.Enabled: - MapZoomEnabled(settings, value); - break; - case Keys.Proctoring.Zoom.MeetingNumber: - MapZoomMeetingNumber(settings, value); - break; - case Keys.Proctoring.Zoom.ReceiveAudio: - MapZoomReceiveAudio(settings, value); - break; - case Keys.Proctoring.Zoom.ReceiveVideo: - MapZoomReceiveVideo(settings, value); - break; - case Keys.Proctoring.Zoom.SendAudio: - MapZoomSendAudio(settings, value); - break; - case Keys.Proctoring.Zoom.SendVideo: - MapZoomSendVideo(settings, value); - break; - case Keys.Proctoring.Zoom.Signature: - MapZoomSignature(settings, value); - break; - case Keys.Proctoring.Zoom.Subject: - MapZoomSubject(settings, value); - break; - case Keys.Proctoring.Zoom.UserName: - MapZoomUserName(settings, value); - break; - case Keys.Proctoring.Zoom.VideoMuted: - MapZoomVideoMuted(settings, value); - break; } } @@ -176,150 +77,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping } } - private void MapJitsiMeetAllowChat(AppSettings settings, object value) - { - if (value is bool allow) - { - settings.Proctoring.JitsiMeet.AllowChat = allow; - } - } - - private void MapJitsiMeetAllowClosedCaptions(AppSettings settings, object value) - { - if (value is bool allow) - { - settings.Proctoring.JitsiMeet.AllowClosedCaptions = allow; - } - } - - private void MapJitsiMeetAllowRaiseHands(AppSettings settings, object value) - { - if (value is bool allow) - { - settings.Proctoring.JitsiMeet.AllowRaiseHand = allow; - } - } - - private void MapJitsiMeetAllowRecording(AppSettings settings, object value) - { - if (value is bool allow) - { - settings.Proctoring.JitsiMeet.AllowRecording = allow; - } - } - - private void MapJitsiMeetAllowTileView(AppSettings settings, object value) - { - if (value is bool allow) - { - settings.Proctoring.JitsiMeet.AllowTileView = allow; - } - } - - private void MapJitsiMeetAudioMuted(AppSettings settings, object value) - { - if (value is bool audioMuted) - { - settings.Proctoring.JitsiMeet.AudioMuted = audioMuted; - } - } - - private void MapJitsiMeetAudioOnly(AppSettings settings, object value) - { - if (value is bool audioOnly) - { - settings.Proctoring.JitsiMeet.AudioOnly = audioOnly; - } - } - - private void MapJitsiMeetEnabled(AppSettings settings, object value) - { - if (value is bool enabled) - { - settings.Proctoring.JitsiMeet.Enabled = enabled; - } - } - - private void MapJitsiMeetReceiveAudio(AppSettings settings, object value) - { - if (value is bool receive) - { - settings.Proctoring.JitsiMeet.ReceiveAudio = receive; - } - } - - private void MapJitsiMeetReceiveVideo(AppSettings settings, object value) - { - if (value is bool receive) - { - settings.Proctoring.JitsiMeet.ReceiveVideo = receive; - } - } - - private void MapJitsiMeetRoomName(AppSettings settings, object value) - { - if (value is string name) - { - settings.Proctoring.JitsiMeet.RoomName = name; - } - } - - private void MapJitsiMeetSendAudio(AppSettings settings, object value) - { - if (value is bool send) - { - settings.Proctoring.JitsiMeet.SendAudio = send; - } - } - - private void MapJitsiMeetSendVideo(AppSettings settings, object value) - { - if (value is bool send) - { - settings.Proctoring.JitsiMeet.SendVideo = send; - } - } - - private void MapJitsiMeetServerUrl(AppSettings settings, object value) - { - if (value is string url) - { - settings.Proctoring.JitsiMeet.ServerUrl = url; - } - } - - private void MapJitsiMeetShowMeetingName(AppSettings settings, object value) - { - if (value is bool show) - { - settings.Proctoring.JitsiMeet.ShowMeetingName = show; - } - } - - private void MapJitsiMeetSubject(AppSettings settings, object value) - { - if (value is string subject) - { - settings.Proctoring.JitsiMeet.Subject = subject; - } - } - - private void MapJitsiMeetToken(AppSettings settings, object value) - { - if (value is string token) - { - settings.Proctoring.JitsiMeet.Token = token; - } - } - - private void MapJitsiMeetVideoMuted(AppSettings settings, object value) - { - if (value is bool muted) - { - settings.Proctoring.JitsiMeet.VideoMuted = muted; - } - } - private void MapCaptureApplicationData(AppSettings settings, object value) { if (value is bool capture) @@ -463,144 +220,5 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping settings.Proctoring.ShowTaskbarNotification = show; } } - - private void MapWindowVisibility(AppSettings settings, object value) - { - const int HIDDEN = 0; - const int ALLOW_SHOW = 1; - const int ALLOW_HIDE = 2; - const int VISIBLE = 3; - - if (value is int visibility) - { - switch (visibility) - { - case HIDDEN: - settings.Proctoring.WindowVisibility = WindowVisibility.Hidden; - break; - case ALLOW_SHOW: - settings.Proctoring.WindowVisibility = WindowVisibility.AllowToShow; - break; - case ALLOW_HIDE: - settings.Proctoring.WindowVisibility = WindowVisibility.AllowToHide; - break; - case VISIBLE: - settings.Proctoring.WindowVisibility = WindowVisibility.Visible; - break; - } - } - } - - private void MapZoomAllowChat(AppSettings settings, object value) - { - if (value is bool allow) - { - settings.Proctoring.Zoom.AllowChat = allow; - } - } - - private void MapZoomAllowClosedCaptions(AppSettings settings, object value) - { - if (value is bool allow) - { - settings.Proctoring.Zoom.AllowClosedCaptions = allow; - } - } - - private void MapZoomAllowRaiseHands(AppSettings settings, object value) - { - if (value is bool allow) - { - settings.Proctoring.Zoom.AllowRaiseHand = allow; - } - } - - private void MapZoomAudioMuted(AppSettings settings, object value) - { - if (value is bool muted) - { - settings.Proctoring.Zoom.AudioMuted = muted; - } - } - - private void MapZoomEnabled(AppSettings settings, object value) - { - if (value is bool enabled) - { - settings.Proctoring.Zoom.Enabled = enabled; - } - } - - private void MapZoomMeetingNumber(AppSettings settings, object value) - { - if (value is string number) - { - settings.Proctoring.Zoom.MeetingNumber = number; - } - } - - private void MapZoomReceiveAudio(AppSettings settings, object value) - { - if (value is bool receive) - { - settings.Proctoring.Zoom.ReceiveAudio = receive; - } - } - - private void MapZoomReceiveVideo(AppSettings settings, object value) - { - if (value is bool receive) - { - settings.Proctoring.Zoom.ReceiveVideo = receive; - } - } - - private void MapZoomSendAudio(AppSettings settings, object value) - { - if (value is bool send) - { - settings.Proctoring.Zoom.SendAudio = send; - } - } - - private void MapZoomSendVideo(AppSettings settings, object value) - { - if (value is bool send) - { - settings.Proctoring.Zoom.SendVideo = send; - } - } - - private void MapZoomSignature(AppSettings settings, object value) - { - if (value is string signature) - { - settings.Proctoring.Zoom.Signature = signature; - } - } - - private void MapZoomSubject(AppSettings settings, object value) - { - if (value is string subject) - { - settings.Proctoring.Zoom.Subject = subject; - } - } - - private void MapZoomUserName(AppSettings settings, object value) - { - if (value is string name) - { - settings.Proctoring.Zoom.UserName = name; - } - } - - private void MapZoomVideoMuted(AppSettings settings, object value) - { - if (value is bool muted) - { - settings.Proctoring.Zoom.VideoMuted = muted; - } - } } } diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataProcessor.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataProcessor.cs index 9973a3b1..61b84d98 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/DataProcessor.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataProcessor.cs @@ -12,7 +12,6 @@ using System.IO; using System.Security.Cryptography; using SafeExamBrowser.Settings; using SafeExamBrowser.Settings.Applications; -using SafeExamBrowser.Settings.Proctoring; using SafeExamBrowser.Settings.Security; namespace SafeExamBrowser.Configuration.ConfigurationData @@ -77,15 +76,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData private void InitializeProctoringSettings(AppSettings settings) { settings.Proctoring.Enabled = settings.Proctoring.ScreenProctoring.Enabled; - - // The video proctoring implementations are disabled for version 3.7.0 and will be completely removed for version 3.8.0. - settings.Proctoring.JitsiMeet.Enabled = false; - settings.Proctoring.Zoom.Enabled = false; - - if (settings.Proctoring.JitsiMeet.Enabled && !settings.Proctoring.JitsiMeet.ReceiveVideo) - { - settings.Proctoring.WindowVisibility = WindowVisibility.Hidden; - } } private void RemoveLegacyBrowsers(AppSettings settings) diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs index 995bc151..bf527256 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs @@ -243,20 +243,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData settings.Proctoring.Enabled = false; settings.Proctoring.ForceRaiseHandMessage = false; - settings.Proctoring.JitsiMeet.AllowChat = false; - settings.Proctoring.JitsiMeet.AllowClosedCaptions = false; - settings.Proctoring.JitsiMeet.AllowRaiseHand = false; - settings.Proctoring.JitsiMeet.AllowRecording = false; - settings.Proctoring.JitsiMeet.AllowTileView = false; - settings.Proctoring.JitsiMeet.AudioMuted = true; - settings.Proctoring.JitsiMeet.AudioOnly = false; - settings.Proctoring.JitsiMeet.Enabled = false; - settings.Proctoring.JitsiMeet.ReceiveAudio = false; - settings.Proctoring.JitsiMeet.ReceiveVideo = false; - settings.Proctoring.JitsiMeet.SendAudio = true; - settings.Proctoring.JitsiMeet.SendVideo = true; - settings.Proctoring.JitsiMeet.ShowMeetingName = false; - settings.Proctoring.JitsiMeet.VideoMuted = false; settings.Proctoring.ScreenProctoring.Enabled = false; settings.Proctoring.ScreenProctoring.ImageDownscaling = 1.0; settings.Proctoring.ScreenProctoring.ImageFormat = ImageFormat.Png; @@ -268,17 +254,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData settings.Proctoring.ScreenProctoring.MinInterval = 1000; settings.Proctoring.ShowRaiseHandNotification = true; settings.Proctoring.ShowTaskbarNotification = true; - settings.Proctoring.WindowVisibility = WindowVisibility.Hidden; - settings.Proctoring.Zoom.AllowChat = false; - settings.Proctoring.Zoom.AllowClosedCaptions = false; - settings.Proctoring.Zoom.AllowRaiseHand = false; - settings.Proctoring.Zoom.AudioMuted = true; - settings.Proctoring.Zoom.Enabled = false; - settings.Proctoring.Zoom.ReceiveAudio = false; - settings.Proctoring.Zoom.ReceiveVideo = false; - settings.Proctoring.Zoom.SendAudio = true; - settings.Proctoring.Zoom.SendVideo = true; - settings.Proctoring.Zoom.VideoMuted = false; settings.Security.AllowApplicationLogAccess = false; settings.Security.AllowTermination = true; diff --git a/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs b/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs index b405cd7e..c5c06382 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs @@ -234,29 +234,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData internal const string ForceRaiseHandMessage = "raiseHandButtonAlwaysPromptMessage"; internal const string ShowRaiseHand = "raiseHandButtonShow"; internal const string ShowTaskbarNotification = "showProctoringViewButton"; - internal const string WindowVisibility = "remoteProctoringViewShow"; - - internal static class JitsiMeet - { - internal const string AllowChat = "jitsiMeetFeatureFlagChat"; - internal const string AllowClosedCaptions = "jitsiMeetFeatureFlagCloseCaptions"; - internal const string AllowRaiseHand = "jitsiMeetFeatureFlagRaiseHand"; - internal const string AllowRecording = "jitsiMeetFeatureFlagRecording"; - internal const string AllowTileView = "jitsiMeetFeatureFlagTileView"; - internal const string AudioMuted = "jitsiMeetAudioMuted"; - internal const string AudioOnly = "jitsiMeetAudioOnly"; - internal const string Enabled = "jitsiMeetEnable"; - internal const string ReceiveAudio = "jitsiMeetReceiveAudio"; - internal const string ReceiveVideo = "jitsiMeetReceiveVideo"; - internal const string RoomName = "jitsiMeetRoom"; - internal const string SendAudio = "jitsiMeetSendAudio"; - internal const string SendVideo = "jitsiMeetSendVideo"; - internal const string ServerUrl = "jitsiMeetServerURL"; - internal const string ShowMeetingName = "jitsiMeetFeatureFlagDisplayMeetingName"; - internal const string Subject = "jitsiMeetSubject"; - internal const string Token = "jitsiMeetToken"; - internal const string VideoMuted = "jitsiMeetVideoMuted"; - } internal static class ScreenProctoring { @@ -278,24 +255,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData internal const string CaptureWindowTitle = "screenProctoringMetadataWindowTitleEnabled"; } } - - internal static class Zoom - { - internal const string AllowChat = "zoomFeatureFlagChat"; - internal const string AllowClosedCaptions = "zoomFeatureFlagCloseCaptions"; - internal const string AllowRaiseHand = "zoomFeatureFlagRaiseHand"; - internal const string AudioMuted = "zoomAudioMuted"; - internal const string Enabled = "zoomEnable"; - internal const string MeetingNumber = "zoomRoom"; - internal const string ReceiveAudio = "zoomReceiveAudio"; - internal const string ReceiveVideo = "zoomReceiveVideo"; - internal const string SendAudio = "zoomSendAudio"; - internal const string SendVideo = "zoomSendVideo"; - internal const string Signature = "zoomToken"; - internal const string Subject = "zoomSubject"; - internal const string UserName = "zoomUserInfoDisplayName"; - internal const string VideoMuted = "zoomVideoMuted"; - } } internal static class Security diff --git a/SafeExamBrowser.Monitoring/Applications/ApplicationMonitor.cs b/SafeExamBrowser.Monitoring/Applications/ApplicationMonitor.cs index f7f36b15..79d656ab 100644 --- a/SafeExamBrowser.Monitoring/Applications/ApplicationMonitor.cs +++ b/SafeExamBrowser.Monitoring/Applications/ApplicationMonitor.cs @@ -242,7 +242,6 @@ namespace SafeExamBrowser.Monitoring.Applications { var isClient = true; var isRuntime = true; - var isWebView = true; isClient &= process.Name == "SafeExamBrowser.Client.exe"; isClient &= process.OriginalName == "SafeExamBrowser.Client.exe"; @@ -250,16 +249,12 @@ namespace SafeExamBrowser.Monitoring.Applications isRuntime &= process.Name == "SafeExamBrowser.exe"; isRuntime &= process.OriginalName == "SafeExamBrowser.exe"; - isWebView &= process.Name == "msedgewebview2.exe"; - isWebView &= process.OriginalName == "msedgewebview2.exe"; - #if !DEBUG isClient &= process.Signature == "2bc82fe8e56a39f96bc6c4b91d6703a0379b76a2"; isRuntime &= process.Signature == "2bc82fe8e56a39f96bc6c4b91d6703a0379b76a2"; - isWebView &= process.Signature == "a4baabd12432ab9c7c297385260e95c3dae83bf2"; #endif - return isClient || isRuntime || isWebView; + return isClient || isRuntime; } private void Close(Window window) diff --git a/SafeExamBrowser.Proctoring/JitsiMeet/JitsiMeetImplementation.cs b/SafeExamBrowser.Proctoring/JitsiMeet/JitsiMeetImplementation.cs deleted file mode 100644 index 537d6189..00000000 --- a/SafeExamBrowser.Proctoring/JitsiMeet/JitsiMeetImplementation.cs +++ /dev/null @@ -1,255 +0,0 @@ -/* - * 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 System; -using System.IO; -using System.Reflection; -using System.Threading; -using System.Windows; -using Microsoft.Web.WebView2.Wpf; -using SafeExamBrowser.Configuration.Contracts; -using SafeExamBrowser.Core.Contracts.Resources.Icons; -using SafeExamBrowser.I18n.Contracts; -using SafeExamBrowser.Logging.Contracts; -using SafeExamBrowser.Server.Contracts.Events.Proctoring; -using SafeExamBrowser.Settings.Proctoring; -using SafeExamBrowser.SystemComponents.Contracts; -using SafeExamBrowser.UserInterface.Contracts; -using SafeExamBrowser.UserInterface.Contracts.Proctoring; - -namespace SafeExamBrowser.Proctoring.JitsiMeet -{ - internal class JitsiMeetImplementation : ProctoringImplementation - { - private readonly AppConfig appConfig; - private readonly IFileSystem fileSystem; - private readonly IModuleLogger logger; - private readonly ProctoringSettings settings; - private readonly IText text; - private readonly IUserInterfaceFactory uiFactory; - - private ProctoringControl control; - private string filePath; - private WindowVisibility initialVisibility; - private IProctoringWindow window; - - internal override string Name => nameof(JitsiMeet); - - internal JitsiMeetImplementation( - AppConfig appConfig, - IFileSystem fileSystem, - IModuleLogger logger, - ProctoringSettings settings, - IText text, - IUserInterfaceFactory uiFactory) - { - this.appConfig = appConfig; - this.fileSystem = fileSystem; - this.logger = logger; - this.settings = settings; - this.text = text; - this.uiFactory = uiFactory; - } - - internal override void Initialize() - { - var start = true; - - initialVisibility = settings.WindowVisibility; - settings.JitsiMeet.ServerUrl = Sanitize(settings.JitsiMeet.ServerUrl); - - start &= !string.IsNullOrWhiteSpace(settings.JitsiMeet.RoomName); - start &= !string.IsNullOrWhiteSpace(settings.JitsiMeet.ServerUrl); - - if (start) - { - logger.Info($"Initialized proctoring: All settings are valid, starting automatically..."); - Start(); - } - else - { - ShowNotificationInactive(); - logger.Info($"Initialized proctoring: Not all settings are valid or a server session is active, not starting automatically."); - } - } - - internal override void ProctoringConfigurationReceived(bool allowChat, bool receiveAudio, bool receiveVideo) - { - logger.Info("Proctoring configuration received."); - - settings.JitsiMeet.AllowChat = allowChat; - settings.JitsiMeet.ReceiveAudio = receiveAudio; - settings.JitsiMeet.ReceiveVideo = receiveVideo; - - if (allowChat || receiveVideo) - { - settings.WindowVisibility = WindowVisibility.AllowToHide; - } - else - { - settings.WindowVisibility = initialVisibility; - } - - Stop(); - Start(); - - logger.Info($"Successfully updated configuration: {nameof(allowChat)}={allowChat}, {nameof(receiveAudio)}={receiveAudio}, {nameof(receiveVideo)}={receiveVideo}."); - } - - internal override void ProctoringInstructionReceived(InstructionEventArgs args) - { - if (args is JitsiMeetInstruction instruction) - { - logger.Info($"Proctoring instruction received: {instruction.Method}"); - - if (instruction.Method == InstructionMethod.Join) - { - settings.JitsiMeet.RoomName = instruction.RoomName; - settings.JitsiMeet.ServerUrl = instruction.ServerUrl; - settings.JitsiMeet.Token = instruction.Token; - - Stop(); - Start(); - } - else - { - Stop(); - } - - logger.Info("Successfully processed instruction."); - } - } - - internal override void Start() - { - Application.Current.Dispatcher.Invoke(() => - { - try - { - var content = LoadContent(settings); - - filePath = Path.Combine(appConfig.TemporaryDirectory, $"{Path.GetRandomFileName()}_index.html"); - fileSystem.Save(content, filePath); - - control = new ProctoringControl(logger.CloneFor(nameof(ProctoringControl)), settings); - control.CreationProperties = new CoreWebView2CreationProperties { UserDataFolder = appConfig.TemporaryDirectory }; - control.EnsureCoreWebView2Async().ContinueWith(_ => - { - control.Dispatcher.Invoke(() => - { - control.CoreWebView2.Navigate(filePath); - }); - }); - - window = uiFactory.CreateProctoringWindow(control); - window.SetTitle(settings.JitsiMeet.Enabled ? settings.JitsiMeet.Subject : ""); - window.Show(); - - if (settings.WindowVisibility == WindowVisibility.AllowToShow || settings.WindowVisibility == WindowVisibility.Hidden) - { - window.Hide(); - } - - ShowNotificationActive(); - - logger.Info("Started proctoring."); - } - catch (Exception e) - { - logger.Error($"Failed to start proctoring! Reason: {e.Message}", e); - } - }); - } - - internal override void Stop() - { - if (control != default && window != default) - { - control.Dispatcher.Invoke(() => - { - control.ExecuteScriptAsync("api.executeCommand('hangup'); api.dispose();"); - - Thread.Sleep(2000); - - window.Close(); - control = default; - window = default; - fileSystem.Delete(filePath); - - ShowNotificationInactive(); - - logger.Info("Stopped proctoring."); - }); - } - } - - internal override void Terminate() - { - Stop(); - logger.Info("Terminated proctoring."); - } - - protected override void ActivateNotification() - { - if (settings.WindowVisibility == WindowVisibility.Visible) - { - window?.BringToForeground(); - } - else if (settings.WindowVisibility == WindowVisibility.AllowToHide || settings.WindowVisibility == WindowVisibility.AllowToShow) - { - window?.Toggle(); - } - } - - private string LoadContent(ProctoringSettings settings) - { - var assembly = Assembly.GetAssembly(typeof(ProctoringController)); - var path = $"{typeof(ProctoringController).Namespace}.JitsiMeet.index.html"; - - using (var stream = assembly.GetManifestResourceStream(path)) - using (var reader = new StreamReader(stream)) - { - var html = reader.ReadToEnd(); - - html = html.Replace("%%_ALLOW_CHAT_%%", settings.JitsiMeet.AllowChat ? "chat" : ""); - html = html.Replace("%%_ALLOW_CLOSED_CAPTIONS_%%", settings.JitsiMeet.AllowClosedCaptions ? "closedcaptions" : ""); - html = html.Replace("%%_ALLOW_RAISE_HAND_%%", settings.JitsiMeet.AllowRaiseHand ? "raisehand" : ""); - html = html.Replace("%%_ALLOW_RECORDING_%%", settings.JitsiMeet.AllowRecording ? "recording" : ""); - html = html.Replace("%%_ALLOW_TILE_VIEW", settings.JitsiMeet.AllowTileView ? "tileview" : ""); - html = html.Replace("'%_AUDIO_MUTED_%'", settings.JitsiMeet.AudioMuted && settings.WindowVisibility != WindowVisibility.Hidden ? "true" : "false"); - html = html.Replace("'%_AUDIO_ONLY_%'", settings.JitsiMeet.AudioOnly ? "true" : "false"); - html = html.Replace("'%_VIDEO_MUTED_%'", settings.JitsiMeet.VideoMuted && settings.WindowVisibility != WindowVisibility.Hidden ? "true" : "false"); - - return html; - } - } - - private string Sanitize(string serverUrl) - { - return serverUrl?.Replace($"{Uri.UriSchemeHttp}{Uri.SchemeDelimiter}", "").Replace($"{Uri.UriSchemeHttps}{Uri.SchemeDelimiter}", ""); - } - - private void ShowNotificationActive() - { - CanActivate = true; - IconResource = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Proctoring_Active.xaml") }; - Tooltip = text.Get(TextKey.Notification_ProctoringActiveTooltip); - - InvokeNotificationChanged(); - } - - private void ShowNotificationInactive() - { - CanActivate = false; - IconResource = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Proctoring_Inactive.xaml") }; - Tooltip = text.Get(TextKey.Notification_ProctoringInactiveTooltip); - - InvokeNotificationChanged(); - } - } -} diff --git a/SafeExamBrowser.Proctoring/JitsiMeet/index.html b/SafeExamBrowser.Proctoring/JitsiMeet/index.html deleted file mode 100644 index 91d09b02..00000000 --- a/SafeExamBrowser.Proctoring/JitsiMeet/index.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - -
- - - - \ No newline at end of file diff --git a/SafeExamBrowser.Proctoring/ProctoringControl.cs b/SafeExamBrowser.Proctoring/ProctoringControl.cs deleted file mode 100644 index bcc0945c..00000000 --- a/SafeExamBrowser.Proctoring/ProctoringControl.cs +++ /dev/null @@ -1,104 +0,0 @@ -/* - * 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 Microsoft.Web.WebView2.Core; -using Microsoft.Web.WebView2.Wpf; -using Newtonsoft.Json.Linq; -using SafeExamBrowser.Logging.Contracts; -using SafeExamBrowser.Settings.Proctoring; -using SafeExamBrowser.UserInterface.Contracts.Proctoring; -using SafeExamBrowser.UserInterface.Contracts.Proctoring.Events; - -namespace SafeExamBrowser.Proctoring -{ - internal class ProctoringControl : WebView2, IProctoringControl - { - private readonly ILogger logger; - private readonly ProctoringSettings settings; - - public event FullScreenChangedEventHandler FullScreenChanged; - - internal ProctoringControl(ILogger logger, ProctoringSettings settings) - { - this.logger = logger; - this.settings = settings; - - CoreWebView2InitializationCompleted += ProctoringControl_CoreWebView2InitializationCompleted; - } - - private void ProctoringControl_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) - { - if (e.IsSuccess) - { - CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; - CoreWebView2.Settings.AreDevToolsEnabled = false; - CoreWebView2.Settings.IsStatusBarEnabled = false; - CoreWebView2.ContainsFullScreenElementChanged += CoreWebView2_ContainsFullScreenElementChanged; - CoreWebView2.PermissionRequested += CoreWebView2_PermissionRequested; - CoreWebView2.WebMessageReceived += CoreWebView2_WebMessageReceived; - logger.Info("Successfully initialized."); - } - else - { - logger.Error("Failed to initialize!", e.InitializationException); - } - } - - private void CoreWebView2_ContainsFullScreenElementChanged(object sender, object e) - { - FullScreenChanged?.Invoke(CoreWebView2.ContainsFullScreenElement); - logger.Debug($"Full screen {(CoreWebView2.ContainsFullScreenElement ? "activated" : "deactivated")}."); - } - - private void CoreWebView2_PermissionRequested(object sender, CoreWebView2PermissionRequestedEventArgs e) - { - if (e.PermissionKind == CoreWebView2PermissionKind.Camera || e.PermissionKind == CoreWebView2PermissionKind.Microphone) - { - e.State = CoreWebView2PermissionState.Allow; - logger.Info($"Granted access to {e.PermissionKind}."); - } - else - { - logger.Info($"Denied access to {e.PermissionKind}."); - } - } - - private void CoreWebView2_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e) - { - var message = e.TryGetWebMessageAsString(); - - logger.Debug($"Received web message '{message}'."); - - switch (message) - { - case "credentials": - SendCredentials(); - break; - } - } - - private void SendCredentials() - { - var message = new JObject(); - var credentials = new JObject(); - - if (settings.JitsiMeet.Enabled) - { - credentials.Add(new JProperty("domain", settings.JitsiMeet.ServerUrl)); - credentials.Add(new JProperty("roomName", settings.JitsiMeet.RoomName)); - credentials.Add(new JProperty("subject", settings.JitsiMeet.ShowMeetingName ? settings.JitsiMeet.Subject : "")); - credentials.Add(new JProperty("token", settings.JitsiMeet.Token)); - } - - message.Add("credentials", credentials); - logger.Debug("Sending credentials to proctoring client."); - - CoreWebView2.PostWebMessageAsJson(message.ToString()); - } - } -} diff --git a/SafeExamBrowser.Proctoring/ProctoringFactory.cs b/SafeExamBrowser.Proctoring/ProctoringFactory.cs index 436039a2..e9c670fd 100644 --- a/SafeExamBrowser.Proctoring/ProctoringFactory.cs +++ b/SafeExamBrowser.Proctoring/ProctoringFactory.cs @@ -12,7 +12,6 @@ using SafeExamBrowser.Configuration.Contracts; using SafeExamBrowser.I18n.Contracts; using SafeExamBrowser.Logging.Contracts; using SafeExamBrowser.Monitoring.Contracts.Applications; -using SafeExamBrowser.Proctoring.JitsiMeet; using SafeExamBrowser.Proctoring.ScreenProctoring; using SafeExamBrowser.Proctoring.ScreenProctoring.Service; using SafeExamBrowser.Settings.Proctoring; @@ -57,13 +56,6 @@ namespace SafeExamBrowser.Proctoring { var implementations = new List(); - if (settings.JitsiMeet.Enabled) - { - var logger = this.logger.CloneFor(nameof(JitsiMeet)); - - implementations.Add(new JitsiMeetImplementation(appConfig, fileSystem, logger, settings, text, uiFactory)); - } - if (settings.ScreenProctoring.Enabled) { var logger = this.logger.CloneFor(nameof(ScreenProctoring)); diff --git a/SafeExamBrowser.Proctoring/SafeExamBrowser.Proctoring.csproj b/SafeExamBrowser.Proctoring/SafeExamBrowser.Proctoring.csproj index b019ffd3..4dcabf23 100644 --- a/SafeExamBrowser.Proctoring/SafeExamBrowser.Proctoring.csproj +++ b/SafeExamBrowser.Proctoring/SafeExamBrowser.Proctoring.csproj @@ -62,15 +62,6 @@ ..\packages\KGySoft.Drawing.Core.8.1.0\lib\net46\KGySoft.Drawing.Core.dll - - ..\packages\Microsoft.Web.WebView2.1.0.2365.46\lib\net45\Microsoft.Web.WebView2.Core.dll - - - ..\packages\Microsoft.Web.WebView2.1.0.2365.46\lib\net45\Microsoft.Web.WebView2.WinForms.dll - - - ..\packages\Microsoft.Web.WebView2.1.0.2365.46\lib\net45\Microsoft.Web.WebView2.Wpf.dll - ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll @@ -87,8 +78,6 @@ - - @@ -176,19 +165,9 @@ SafeExamBrowser.WindowsApi.Contracts - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - \ No newline at end of file diff --git a/SafeExamBrowser.Proctoring/packages.config b/SafeExamBrowser.Proctoring/packages.config index 81e6eeba..30f406d8 100644 --- a/SafeExamBrowser.Proctoring/packages.config +++ b/SafeExamBrowser.Proctoring/packages.config @@ -3,6 +3,5 @@ - \ No newline at end of file diff --git a/SafeExamBrowser.Runtime.UnitTests/Operations/DisclaimerOperationTests.cs b/SafeExamBrowser.Runtime.UnitTests/Operations/DisclaimerOperationTests.cs index 8a5318e6..008e508d 100644 --- a/SafeExamBrowser.Runtime.UnitTests/Operations/DisclaimerOperationTests.cs +++ b/SafeExamBrowser.Runtime.UnitTests/Operations/DisclaimerOperationTests.cs @@ -44,7 +44,6 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations { var count = 0; - settings.Proctoring.JitsiMeet.Enabled = true; settings.Proctoring.ScreenProctoring.Enabled = true; sut.ActionRequired += (args) => @@ -58,7 +57,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations var result = sut.Perform(); - Assert.AreEqual(2, count); + Assert.AreEqual(1, count); Assert.AreEqual(OperationResult.Success, result); } @@ -67,8 +66,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations { var disclaimerShown = false; - settings.Proctoring.JitsiMeet.Enabled = true; - settings.Proctoring.ScreenProctoring.Enabled = false; + settings.Proctoring.ScreenProctoring.Enabled = true; sut.ActionRequired += (args) => { @@ -83,15 +81,6 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations Assert.IsTrue(disclaimerShown); Assert.AreEqual(OperationResult.Aborted, result); - - disclaimerShown = false; - settings.Proctoring.JitsiMeet.Enabled = false; - settings.Proctoring.ScreenProctoring.Enabled = true; - - result = sut.Repeat(); - - Assert.IsTrue(disclaimerShown); - Assert.AreEqual(OperationResult.Aborted, result); } [TestMethod] @@ -99,7 +88,6 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations { var disclaimerShown = false; - settings.Proctoring.Enabled = false; sut.ActionRequired += (args) => { if (args is MessageEventArgs m) @@ -120,7 +108,6 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations { var count = 0; - settings.Proctoring.JitsiMeet.Enabled = true; settings.Proctoring.ScreenProctoring.Enabled = true; sut.ActionRequired += (args) => @@ -134,7 +121,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations var result = sut.Perform(); - Assert.AreEqual(2, count); + Assert.AreEqual(1, count); Assert.AreEqual(OperationResult.Success, result); } @@ -143,8 +130,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations { var disclaimerShown = false; - settings.Proctoring.JitsiMeet.Enabled = true; - settings.Proctoring.ScreenProctoring.Enabled = false; + settings.Proctoring.ScreenProctoring.Enabled = true; sut.ActionRequired += (args) => { @@ -159,15 +145,6 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations Assert.IsTrue(disclaimerShown); Assert.AreEqual(OperationResult.Aborted, result); - - disclaimerShown = false; - settings.Proctoring.JitsiMeet.Enabled = false; - settings.Proctoring.ScreenProctoring.Enabled = true; - - result = sut.Repeat(); - - Assert.IsTrue(disclaimerShown); - Assert.AreEqual(OperationResult.Aborted, result); } [TestMethod] @@ -175,7 +152,6 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations { var disclaimerShown = false; - settings.Proctoring.Enabled = false; sut.ActionRequired += (args) => { if (args is MessageEventArgs m) @@ -196,7 +172,6 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations { var disclaimerShown = false; - settings.Proctoring.Enabled = true; sut.ActionRequired += (args) => { if (args is MessageEventArgs m) diff --git a/SafeExamBrowser.Runtime.UnitTests/Operations/ProctoringWorkaroundOperationTests.cs b/SafeExamBrowser.Runtime.UnitTests/Operations/ProctoringWorkaroundOperationTests.cs deleted file mode 100644 index 7a366fe8..00000000 --- a/SafeExamBrowser.Runtime.UnitTests/Operations/ProctoringWorkaroundOperationTests.cs +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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 Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using SafeExamBrowser.Configuration.Contracts; -using SafeExamBrowser.Core.Contracts.OperationModel; -using SafeExamBrowser.Logging.Contracts; -using SafeExamBrowser.Runtime.Operations; -using SafeExamBrowser.Settings; -using SafeExamBrowser.Settings.Security; - -namespace SafeExamBrowser.Runtime.UnitTests.Operations -{ - [TestClass] - public class ProctoringWorkaroundOperationTests - { - private SessionContext context; - private Mock logger; - private AppSettings settings; - private ProctoringWorkaroundOperation sut; - - [TestInitialize] - public void Initialize() - { - context = new SessionContext(); - logger = new Mock(); - settings = new AppSettings(); - - context.Next = new SessionConfiguration(); - context.Next.Settings = settings; - sut = new ProctoringWorkaroundOperation(logger.Object, context); - } - - [TestMethod] - public void Perform_MustSwitchToDisableExplorerShellIfProctoringActive() - { - settings.Proctoring.JitsiMeet.Enabled = true; - settings.Security.KioskMode = KioskMode.CreateNewDesktop; - - var result = sut.Perform(); - - Assert.AreEqual(KioskMode.DisableExplorerShell, settings.Security.KioskMode); - Assert.AreEqual(OperationResult.Success, result); - } - - [TestMethod] - public void Perform_MustDoNothingIfProctoringNotActive() - { - settings.Proctoring.JitsiMeet.Enabled = false; - settings.Security.KioskMode = KioskMode.None; - - var result = sut.Perform(); - - Assert.AreEqual(KioskMode.None, settings.Security.KioskMode); - Assert.AreEqual(OperationResult.Success, result); - } - - [TestMethod] - public void Repeat_MustSwitchToDisableExplorerShellIfProctoringActive() - { - settings.Proctoring.JitsiMeet.Enabled = true; - settings.Security.KioskMode = KioskMode.CreateNewDesktop; - - var result = sut.Repeat(); - - Assert.AreEqual(KioskMode.DisableExplorerShell, settings.Security.KioskMode); - Assert.AreEqual(OperationResult.Success, result); - } - - [TestMethod] - public void Repeat_MustDoNothingIfProctoringNotActive() - { - settings.Proctoring.JitsiMeet.Enabled = false; - settings.Security.KioskMode = KioskMode.None; - - var result = sut.Repeat(); - - Assert.AreEqual(KioskMode.None, settings.Security.KioskMode); - Assert.AreEqual(OperationResult.Success, result); - } - - [TestMethod] - public void Revert_MustDoNothing() - { - settings.Proctoring.JitsiMeet.Enabled = true; - settings.Security.KioskMode = KioskMode.None; - - var result = sut.Revert(); - - Assert.AreEqual(KioskMode.None, settings.Security.KioskMode); - Assert.AreEqual(OperationResult.Success, result); - } - } -} diff --git a/SafeExamBrowser.Runtime.UnitTests/SafeExamBrowser.Runtime.UnitTests.csproj b/SafeExamBrowser.Runtime.UnitTests/SafeExamBrowser.Runtime.UnitTests.csproj index abb39475..a416f734 100644 --- a/SafeExamBrowser.Runtime.UnitTests/SafeExamBrowser.Runtime.UnitTests.csproj +++ b/SafeExamBrowser.Runtime.UnitTests/SafeExamBrowser.Runtime.UnitTests.csproj @@ -145,7 +145,6 @@ - diff --git a/SafeExamBrowser.Runtime/CompositionRoot.cs b/SafeExamBrowser.Runtime/CompositionRoot.cs index 968821e0..b78d9abe 100644 --- a/SafeExamBrowser.Runtime/CompositionRoot.cs +++ b/SafeExamBrowser.Runtime/CompositionRoot.cs @@ -106,7 +106,6 @@ namespace SafeExamBrowser.Runtime sessionOperations.Enqueue(new DisplayMonitorOperation(displayMonitor, logger, sessionContext, text)); sessionOperations.Enqueue(new ServiceOperation(logger, runtimeHost, serviceProxy, sessionContext, THIRTY_SECONDS, userInfo)); sessionOperations.Enqueue(new ClientTerminationOperation(logger, processFactory, proxyFactory, runtimeHost, sessionContext, THIRTY_SECONDS)); - sessionOperations.Enqueue(new ProctoringWorkaroundOperation(logger, sessionContext)); sessionOperations.Enqueue(new KioskModeOperation(desktopFactory, desktopMonitor, explorerShell, logger, processFactory, sessionContext)); sessionOperations.Enqueue(new ClientOperation(logger, processFactory, proxyFactory, runtimeHost, sessionContext, THIRTY_SECONDS)); sessionOperations.Enqueue(new SessionActivationOperation(logger, sessionContext)); diff --git a/SafeExamBrowser.Runtime/Operations/DisclaimerOperation.cs b/SafeExamBrowser.Runtime/Operations/DisclaimerOperation.cs index 88006313..8b5e7b4d 100644 --- a/SafeExamBrowser.Runtime/Operations/DisclaimerOperation.cs +++ b/SafeExamBrowser.Runtime/Operations/DisclaimerOperation.cs @@ -31,21 +31,11 @@ namespace SafeExamBrowser.Runtime.Operations { var result = OperationResult.Success; - if (Context.Next.Settings.Proctoring.JitsiMeet.Enabled) - { - result = ShowVideoProctoringDisclaimer(); - } - - if (result == OperationResult.Success && Context.Next.Settings.Proctoring.ScreenProctoring.Enabled) + if (Context.Next.Settings.Proctoring.ScreenProctoring.Enabled) { result = ShowScreenProctoringDisclaimer(); } - if (result == OperationResult.Success && Context.Next.Settings.Proctoring.Zoom.Enabled) - { - result = ShowZoomError(); - } - return result; } @@ -53,21 +43,11 @@ namespace SafeExamBrowser.Runtime.Operations { var result = OperationResult.Success; - if (Context.Next.Settings.Proctoring.JitsiMeet.Enabled) - { - result = ShowVideoProctoringDisclaimer(); - } - - if (result == OperationResult.Success && Context.Next.Settings.Proctoring.ScreenProctoring.Enabled) + if (Context.Next.Settings.Proctoring.ScreenProctoring.Enabled) { result = ShowScreenProctoringDisclaimer(); } - if (result == OperationResult.Success && Context.Next.Settings.Proctoring.Zoom.Enabled) - { - result = ShowZoomError(); - } - return result; } @@ -102,50 +82,5 @@ namespace SafeExamBrowser.Runtime.Operations return OperationResult.Aborted; } } - - private OperationResult ShowVideoProctoringDisclaimer() - { - var args = new MessageEventArgs - { - Action = MessageBoxAction.OkCancel, - Icon = MessageBoxIcon.Information, - Message = TextKey.MessageBox_VideoProctoringDisclaimer, - Title = TextKey.MessageBox_VideoProctoringDisclaimerTitle - }; - - StatusChanged?.Invoke(TextKey.OperationStatus_WaitDisclaimerConfirmation); - ActionRequired?.Invoke(args); - - if (args.Result == MessageBoxResult.Ok) - { - logger.Info("The user confirmed the video proctoring disclaimer."); - - return OperationResult.Success; - } - else - { - logger.Warn("The user did not confirm the video proctoring disclaimer! Aborting session initialization..."); - - return OperationResult.Aborted; - } - } - - private OperationResult ShowZoomError() - { - var args = new MessageEventArgs - { - Action = MessageBoxAction.Ok, - Icon = MessageBoxIcon.Error, - Message = TextKey.MessageBox_ZoomNotSupported, - Title = TextKey.MessageBox_ZoomNotSupportedTitle - }; - - logger.Error("Zoom proctoring is enabled but not supported! Aborting session initialization..."); - - StatusChanged?.Invoke(TextKey.OperationStatus_WaitErrorConfirmation); - ActionRequired?.Invoke(args); - - return OperationResult.Aborted; - } } } diff --git a/SafeExamBrowser.Runtime/Operations/ProctoringWorkaroundOperation.cs b/SafeExamBrowser.Runtime/Operations/ProctoringWorkaroundOperation.cs deleted file mode 100644 index 511c1d61..00000000 --- a/SafeExamBrowser.Runtime/Operations/ProctoringWorkaroundOperation.cs +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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 SafeExamBrowser.Core.Contracts.OperationModel; -using SafeExamBrowser.Core.Contracts.OperationModel.Events; -using SafeExamBrowser.Logging.Contracts; -using SafeExamBrowser.Settings.Security; - -namespace SafeExamBrowser.Runtime.Operations -{ - internal class ProctoringWorkaroundOperation : SessionOperation - { - private readonly ILogger logger; - - public override event ActionRequiredEventHandler ActionRequired { add { } remove { } } - public override event StatusChangedEventHandler StatusChanged { add { } remove { } } - - public ProctoringWorkaroundOperation(ILogger logger, SessionContext context) : base(context) - { - this.logger = logger; - } - - public override OperationResult Perform() - { - if (Context.Next.Settings.Proctoring.JitsiMeet.Enabled && Context.Next.Settings.Security.KioskMode == KioskMode.CreateNewDesktop) - { - Context.Next.Settings.Security.KioskMode = KioskMode.DisableExplorerShell; - logger.Info("Switched kiosk mode to Disable Explorer Shell due to remote proctoring being enabled."); - } - - return OperationResult.Success; - } - - public override OperationResult Repeat() - { - return Perform(); - } - - public override OperationResult Revert() - { - return OperationResult.Success; - } - } -} diff --git a/SafeExamBrowser.Runtime/SafeExamBrowser.Runtime.csproj b/SafeExamBrowser.Runtime/SafeExamBrowser.Runtime.csproj index 3e7520d4..6b1bc2ba 100644 --- a/SafeExamBrowser.Runtime/SafeExamBrowser.Runtime.csproj +++ b/SafeExamBrowser.Runtime/SafeExamBrowser.Runtime.csproj @@ -109,7 +109,6 @@ - diff --git a/SafeExamBrowser.Settings/Proctoring/JitsiMeetSettings.cs b/SafeExamBrowser.Settings/Proctoring/JitsiMeetSettings.cs deleted file mode 100644 index f36a5f13..00000000 --- a/SafeExamBrowser.Settings/Proctoring/JitsiMeetSettings.cs +++ /dev/null @@ -1,109 +0,0 @@ -/* - * 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 System; - -namespace SafeExamBrowser.Settings.Proctoring -{ - /// - /// All settings for the meeting provider Jitsi Meet. - /// - [Serializable] - public class JitsiMeetSettings - { - /// - /// Determines whether the user can use the chat. - /// - public bool AllowChat { get; set; } - - /// - /// Determines whether the user can use close captions. - /// - public bool AllowClosedCaptions { get; set; } - - /// - /// Determines whether the user can use the raise hand feature. - /// - public bool AllowRaiseHand { get; set; } - - /// - /// Determines whether the user can record the meeting. - /// - public bool AllowRecording { get; set; } - - /// - /// Determines whether the user may use the tile view. - /// - public bool AllowTileView { get; set; } - - /// - /// Determines whether the audio starts muted. - /// - public bool AudioMuted { get; set; } - - /// - /// Determines whether the meeting runs in an audio-only mode. - /// - public bool AudioOnly { get; set; } - - /// - /// Determines whether proctoring with Jitsi Meet is enabled. - /// - public bool Enabled { get; set; } - - /// - /// Determines whether the user may receive the video stream of other meeting participants. - /// - public bool ReceiveAudio { get; set; } - - /// - /// Determines whether the user may receive the audio stream of other meeting participants. - /// - public bool ReceiveVideo { get; set; } - - /// - /// The name of the meeting room. - /// - public string RoomName { get; set; } - - /// - /// Determines whether the audio stream of the user will be sent to the server. - /// - public bool SendAudio { get; set; } - - /// - /// Determines whether the video stream of the user will be sent to the server. - /// - public bool SendVideo { get; set; } - - /// - /// The URL of the Jitsi Meet server. - /// - public string ServerUrl { get; set; } - - /// - /// Determines whether the subject will be shown as meeting name. - /// - public bool ShowMeetingName { get; set; } - - /// - /// The subject of the meeting. - /// - public string Subject { get; set; } - - /// - /// The authentication token for the meeting. - /// - public string Token { get; set; } - - /// - /// Determines whether the video starts muted. - /// - public bool VideoMuted { get; set; } - } -} diff --git a/SafeExamBrowser.Settings/Proctoring/ProctoringSettings.cs b/SafeExamBrowser.Settings/Proctoring/ProctoringSettings.cs index d687540a..e17d4a57 100644 --- a/SafeExamBrowser.Settings/Proctoring/ProctoringSettings.cs +++ b/SafeExamBrowser.Settings/Proctoring/ProctoringSettings.cs @@ -26,11 +26,6 @@ namespace SafeExamBrowser.Settings.Proctoring /// public bool ForceRaiseHandMessage { get; set; } - /// - /// All settings for remote proctoring with Jitsi Meet. - /// - public JitsiMeetSettings JitsiMeet { get; set; } - /// /// All settings for the screen proctoring. /// @@ -46,21 +41,9 @@ namespace SafeExamBrowser.Settings.Proctoring /// public bool ShowTaskbarNotification { get; set; } - /// - /// Determines the visibility of the proctoring window. - /// - public WindowVisibility WindowVisibility { get; set; } - - /// - /// All settings for remote proctoring with Zoom. - /// - public ZoomSettings Zoom { get; set; } - public ProctoringSettings() { - JitsiMeet = new JitsiMeetSettings(); ScreenProctoring = new ScreenProctoringSettings(); - Zoom = new ZoomSettings(); } } } diff --git a/SafeExamBrowser.Settings/Proctoring/WindowVisibility.cs b/SafeExamBrowser.Settings/Proctoring/WindowVisibility.cs deleted file mode 100644 index c2a146e9..00000000 --- a/SafeExamBrowser.Settings/Proctoring/WindowVisibility.cs +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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/. - */ - -namespace SafeExamBrowser.Settings.Proctoring -{ - /// - /// Defines all possible visibility states for the proctoring window. - /// - public enum WindowVisibility - { - /// - /// The proctoring window is hidden and cannot be shown by the user. - /// - Hidden, - - /// - /// The proctoring window is initially hidden but may be shown by the user. - /// - AllowToShow, - - /// - /// The proctoring window is initially visible but may be hidden by the user. - /// - AllowToHide, - - /// - /// The proctoring window is always visible and cannot be hidden by the user. - /// - Visible - } -} diff --git a/SafeExamBrowser.Settings/Proctoring/ZoomSettings.cs b/SafeExamBrowser.Settings/Proctoring/ZoomSettings.cs deleted file mode 100644 index 524af652..00000000 --- a/SafeExamBrowser.Settings/Proctoring/ZoomSettings.cs +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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 System; - -namespace SafeExamBrowser.Settings.Proctoring -{ - /// - /// All settings for the meeting provider Zoom. - /// - [Serializable] - public class ZoomSettings - { - /// - /// Determines whether the user can use the chat. - /// - public bool AllowChat { get; set; } - - /// - /// Determines whether the user can use closed captions. - /// - public bool AllowClosedCaptions { get; set; } - - /// - /// Determines whether the user can use the raise hand feature. - /// - public bool AllowRaiseHand { get; set; } - - /// - /// Determines whether the audio starts muted. - /// - public bool AudioMuted { get; set; } - - /// - /// Determines whether proctoring with Zoom is enabled. - /// - public bool Enabled { get; set; } - - /// - /// The number of the meeting. - /// - public string MeetingNumber { get; set; } - - /// - /// The password of the meeting. - /// - public string Password { get; set; } - - /// - /// Determines whether the user may receive the video stream of other meeting participants. - /// - public bool ReceiveAudio { get; set; } - - /// - /// Determines whether the user may receive the audio stream of other meeting participants. - /// - public bool ReceiveVideo { get; set; } - - /// - /// The SDK key to be used for authentication. - /// - public string SdkKey { get; set; } - - /// - /// Determines whether the audio stream of the user will be sent to the server. - /// - public bool SendAudio { get; set; } - - /// - /// Determines whether the video stream of the user will be sent to the server. - /// - public bool SendVideo { get; set; } - - /// - /// The signature to be used for authentication. - /// - public string Signature { get; set; } - - /// - /// The subject of the meeting. - /// - public string Subject { get; set; } - - /// - /// The user name to be used for the meeting. - /// - public string UserName { get; set; } - - /// - /// Determines whether the video starts muted. - /// - public bool VideoMuted { get; set; } - } -} diff --git a/SafeExamBrowser.Settings/SafeExamBrowser.Settings.csproj b/SafeExamBrowser.Settings/SafeExamBrowser.Settings.csproj index 2d0e2e76..28847fe5 100644 --- a/SafeExamBrowser.Settings/SafeExamBrowser.Settings.csproj +++ b/SafeExamBrowser.Settings/SafeExamBrowser.Settings.csproj @@ -75,12 +75,9 @@ - - - diff --git a/SafeExamBrowser.UserInterface.Desktop/Windows/AboutWindow.xaml b/SafeExamBrowser.UserInterface.Desktop/Windows/AboutWindow.xaml index a8a0edbc..c5ecac73 100644 --- a/SafeExamBrowser.UserInterface.Desktop/Windows/AboutWindow.xaml +++ b/SafeExamBrowser.UserInterface.Desktop/Windows/AboutWindow.xaml @@ -43,11 +43,6 @@ Copyright © 2008-2024 The Chromium Embedded Framework Authors. All rights reserved. - Edge WebView2 Runtime - - Copyright © 2019-2024 Microsoft. All rights reserved. - - Font-Awesome-WPF Copyright © 2014-2024 charri. All rights reserved. diff --git a/SafeExamBrowser.UserInterface.Mobile/Windows/AboutWindow.xaml b/SafeExamBrowser.UserInterface.Mobile/Windows/AboutWindow.xaml index 73d01541..292560f9 100644 --- a/SafeExamBrowser.UserInterface.Mobile/Windows/AboutWindow.xaml +++ b/SafeExamBrowser.UserInterface.Mobile/Windows/AboutWindow.xaml @@ -43,11 +43,6 @@ Copyright © 2008-2024 The Chromium Embedded Framework Authors. All rights reserved. - Edge WebView2 Runtime - - Copyright © 2019-2024 Microsoft. All rights reserved. - - Font-Awesome-WPF Copyright © 2014-2024 charri. All rights reserved. diff --git a/Setup/Resources/License.rtf b/Setup/Resources/License.rtf index c4d857a4..ccf82244 100644 --- a/Setup/Resources/License.rtf +++ b/Setup/Resources/License.rtf @@ -3,15 +3,15 @@ {\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} {\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} {\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f47\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\f48\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f50\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f51\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f52\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\f53\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f54\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f55\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f57\fbidi \fswiss\fcharset238\fprq2 Arial CE;} -{\f58\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\f60\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f61\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f62\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} -{\f63\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\f64\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f65\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f387\fbidi \froman\fcharset238\fprq2 Cambria Math CE;} -{\f388\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f390\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f391\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f394\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;} -{\f395\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f417\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f418\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f420\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;} -{\f421\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f422\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f423\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\f424\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} -{\f425\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f46\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\f47\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f49\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f50\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f51\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\f52\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f53\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f54\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f56\fbidi \fswiss\fcharset238\fprq2 Arial CE;} +{\f57\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\f59\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f60\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f61\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\f62\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\f63\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f64\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f386\fbidi \froman\fcharset238\fprq2 Cambria Math CE;} +{\f387\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f389\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f390\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f393\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;} +{\f394\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f416\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f417\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f419\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;} +{\f420\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f421\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f422\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\f423\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\f424\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} {\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} {\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} {\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} @@ -41,8 +41,8 @@ \widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang2055\langfe2052\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp2055\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}}{\*\listtable{\list\listtemplateid-1\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\'01*;}{\levelnumbers;}}{\listname ;}\listid-2}}{\*\listoverridetable {\listoverride\listid-2\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }}\ls1}} -{\*\rsidtbl \rsid1002736\rsid1848078\rsid11218156\rsid13781912}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator B\'fcchel Damian (ID)} -{\creatim\yr2023\mo3\dy8\min15}{\revtim\yr2024\mo3\dy5\hr18\min16}{\version4}{\edmins0}{\nofpages2}{\nofwords340}{\nofchars2143}{\nofcharsws2479}{\vern89}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +{\*\rsidtbl \rsid1002736\rsid1848078\rsid11218156\rsid13781912\rsid15287357}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator B\'fcchel Damian (ID)} +{\creatim\yr2023\mo3\dy8\min15}{\revtim\yr2024\mo4\dy16\hr18\min43}{\version5}{\edmins0}{\nofpages1}{\nofwords306}{\nofchars1935}{\nofcharsws2237}{\vern93}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} \paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect \widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120 \dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot1002736 \nouicompat \fet0{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1 @@ -57,13 +57,13 @@ Safe Exam Browser for Windows}{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\ \par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 This application is subject to the terms of the Mozilla Public License, version 2.0. If a copy of the MPL was not distributed with this application, you can obtain one at }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 HYPERLINK http://mozilla.org/MPL/2.0/ }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5000000068007400740070003a002f002f006d006f007a0069006c006c0061002e006f00720067002f004d0050004c002f0032002e0030002f000000795881f43b1d7f48af2c825dc485276300000000a5ab000300}} -}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 http://mozilla.org/MPL/2.0/}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5000000068007400740070003a002f002f006d006f007a0069006c006c0061002e006f00720067002f004d0050004c002f0032002e0030002f000000795881f43b1d7f48af2c825dc485276300000000a5ab00030000} +}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 http://mozilla.org/MPL/2.0/}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 . \par \hich\af1\dbch\af31505\loch\f1 See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 HYPERLINK https://github.com/SafeExamBrowser }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5e000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0053006100660065004500780061006d00420072006f0077007300650072000000795881f43b1d7f48af2c825d -c485276300000000a5ab000300}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://github.com/SafeExamBrowser}}}\sectd \ltrsect +c485276300000000a5ab00030054}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://github.com/SafeExamBrowser}}}\sectd \ltrsect \linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information about Safe Exam Browser. \par \par }{\rtlch\fcs1 \ab\af1\afs24 \ltrch\fcs0 \b\f1\fs24\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 Frameworks & Third-Party Software}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 @@ -73,11 +73,11 @@ c485276300000000a5ab000300}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\f \nowidctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls1\rin0\lin720\itap0\pararsid1002736 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 .NET Framework\line }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 \hich\f1 Copyright \'a9\loch\f1 2002-}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid1002736\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 202}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid1848078 \hich\af1\dbch\af31505\loch\f1 4}{\rtlch\fcs1 -\af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 Microsoft. All rights reserved. }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid13781912 -\hich\af1\dbch\af31505\loch\f1 See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid13781912 \hich\af1\dbch\af31505\loch\f1 HYPERLINK https://dotnet.microsoft.com/ }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 -\f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield +\af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 Micros\hich\af1\dbch\af31505\loch\f1 oft. All rights reserved. }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang7\langfe2052\langnp7\insrsid13781912 \hich\af1\dbch\af31505\loch\f1 See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid13781912 \hich\af1\dbch\af31505\loch\f1 +HYPERLINK https://dotnet.microsoft.com/ }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b54000000680074007400700073003a002f002f0064006f0074006e00650074002e006d006900630072006f0073006f00660074002e0063006f006d002f000000795881f43b1d7f48af2c825dc485276300000000a5ab -000300}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid13781912 \hich\af1\dbch\af31505\loch\f1 https://dotnet.microsoft.com/}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +00030000}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid13781912 \hich\af1\dbch\af31505\loch\f1 https://dotnet.microsoft.com/}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid13781912 \hich\af1\dbch\af31505\loch\f1 for more information.}{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang7\langfe2052\langnp7\insrsid13781912 \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \f3\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \loch\af3\dbch\af31505\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa200\sl276\slmult1 \nowidctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls1\rin0\lin720\itap0\pararsid1002736 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 @@ -87,7 +87,7 @@ Copyright \'a9\loch\f1 2010-}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 HYPERLINK https://github.com/cefsharp/cefsharp }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b62000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f00630065006600730068006100720070002f00630065006600730068006100720070000000795881f43b1d7f48 -af2c825dc485276300000000a5ab000300}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://github.com/cefsharp/cefsharp}}}\sectd \ltrsect +af2c825dc485276300000000a5ab00030020}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://github.com/cefsharp/cefsharp}}}\sectd \ltrsect \linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information.}{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \f3\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \loch\af3\dbch\af31505\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa200\sl276\slmult1 @@ -97,28 +97,19 @@ af2c825dc485276300000000a5ab000300}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fc \hich\af1\dbch\af31505\loch\f1 The Chromium Embedded Framework Authors. All rights reserved. See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 HYPERLINK https://bitbucket.org/chromiumembedded/cef/wiki/Home }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b82000000680074007400700073003a002f002f006200690074006200750063006b00650074002e006f00720067002f006300680072006f006d00690075006d0065006d006200650064006400650064002f0063006500 -66002f00770069006b0069002f0048006f006d0065000000795881f43b1d7f48af2c825dc485276300000000a5ab000300}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 +66002f00770069006b0069002f0048006f006d0065000000795881f43b1d7f48af2c825dc485276300000000a5ab00030000}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://bitbucket.org/chromiumembedded/cef/wiki/Home}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information. \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \f3\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \loch\af3\dbch\af31505\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa200\sl276\slmult1 \nowidctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls1\rin0\lin720\itap0\pararsid1002736 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 -\hich\af1\dbch\af31505\loch\f1 Edge WebView2 Runtime\line }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 \hich\f1 Copyright \'a9\loch\f1 2019-}{\rtlch\fcs1 -\af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid1848078 \hich\af1\dbch\af31505\loch\f1 2024}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 - Microsoft. All rights reserved. See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 -HYPERLINK https://developer.microsoft.com/en-us/microsoft-edge/webview2/ }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b96000000680074007400700073003a002f002f0064006500760065006c006f007000650072002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f006d0069006300 -72006f0073006f00660074002d0065006400670065002f00770065006200760069006500770032002f000000795881f43b1d7f48af2c825dc485276300000000a5ab000320}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 -\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://developer.microsoft.com/en-us/microsoft-edge/webview2/}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 -\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information. -\par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \f3\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \loch\af3\dbch\af31505\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\nowidctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls1\rin0\lin720\itap0\pararsid1002736 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 Font-Awesome-WPF}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \line \hich\af1\dbch\af31505\loch\f1 \hich\f1 Copyright \'a9\loch\f1 2014-}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid1848078 \hich\af1\dbch\af31505\loch\f1 2024}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 charri. All rights reserved. See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 HYPERLINK https://github.com/charri/Font-Awesome-WPF/ }{ \rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b70000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f006300680061007200720069002f0046006f006e0074002d0041007700650073006f006d0065002d0057005000 -46002f000000795881f43b1d7f48af2c825dc485276300000000a5ab000369}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https\hich\af1\dbch\af31505\loch\f1 -://github.com/charri/Font-Awesome-WPF/}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information. +46002f000000795881f43b1d7f48af2c825dc485276300000000a5ab00036973}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 +https://github.com/charri/Font-Awesome-WPF/}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information. + \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \f3\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \loch\af3\dbch\af31505\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa200\sl276\slmult1 \nowidctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls1\rin0\lin720\itap0\pararsid1002736 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 KnownFolders}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \line \hich\af1\dbch\af31505\loch\f1 \hich\f1 Copyright \'a9\loch\f1 2017-}{\rtlch\fcs1 \af1\afs20 @@ -126,7 +117,7 @@ HYPERLINK https://developer.microsoft.com/en-us/microsoft-edge/webview2/ }{\rtlc Syroot. All rights reserved. See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 HYPERLINK https://gitlab.com/Syroot/KnownFolders }{ \rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b66000000680074007400700073003a002f002f006700690074006c00610062002e0063006f006d002f005300790072006f006f0074002f004b006e006f0077006e0046006f006c0064006500720073000000795881f4 -3b1d7f48af2c825dc485276300000000a5ab000378}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://gitlab.com/Syroot/KnownFolders}}}\sectd \ltrsect +3b1d7f48af2c825dc485276300000000a5ab00037876}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://gitlab.com/Syroot/KnownFolders}}}\sectd \ltrsect \linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information. \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \f3\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \loch\af3\dbch\af31505\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa200\sl276\slmult1 \nowidctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls1\rin0\lin720\itap0\pararsid1002736 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 @@ -135,7 +126,7 @@ HYPERLINK https://developer.microsoft.com/en-us/microsoft-edge/webview2/ }{\rtlc Mark Heath & contributors. All rights reserved. See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 HYPERLINK https://github.com/naudio/NAudio }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5a000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f006e0061007500640069006f002f004e0041007500640069006f000000795881f43b1d7f48af2c825dc4852763 -00000000a5ab000361}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://github.com/naudio/NAudio}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj { +00000000a5ab00036170}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://github.com/naudio/NAudio}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj { \rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information. \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \f3\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \loch\af3\dbch\af31505\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa200\sl276\slmult1 \nowidctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls1\rin0\lin720\itap0\pararsid1002736 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 @@ -144,7 +135,7 @@ HYPERLINK https://developer.microsoft.com/en-us/microsoft-edge/webview2/ }{\rtlc James Newton-King. All rights reserved. See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 HYPERLINK https://www.newtonsoft.com/json }{ \rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b58000000680074007400700073003a002f002f007700770077002e006e006500770074006f006e0073006f00660074002e0063006f006d002f006a0073006f006e000000795881f43b1d7f48af2c825dc48527630000 -0000a5ab000300}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://www.newtonsoft.com/json}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj { +0000a5ab00030000}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://www.newtonsoft.com/json}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj { \rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information. \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \f3\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \loch\af3\dbch\af31505\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa200\sl276\slmult1 \nowidctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls1\rin0\lin720\itap0\pararsid1002736 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 @@ -153,13 +144,13 @@ HYPERLINK https://developer.microsoft.com/en-us/microsoft-edge/webview2/ }{\rtlc DigiExam. All rights reserved. See }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 HYPERLINK https://github.com/DigiExam/simplewifi }{ \rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang7\langfe2052\langnp7\insrsid1002736 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b66000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0044006900670069004500780061006d002f00730069006d0070006c00650077006900660069000000795881f4 -3b1d7f48af2c825dc485276300000000a5ab000300}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://github.com/DigiExam/simplewifi}}}\sectd \ltrsect +3b1d7f48af2c825dc485276300000000a5ab00030000}}}{\fldrslt {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 https://github.com/DigiExam/simplewifi}}}\sectd \ltrsect \linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 for more information. \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \f3\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \loch\af3\dbch\af31505\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa200\sl276\slmult1 \nowidctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls1\rin0\lin720\itap0\pararsid1002736 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 -\hich\af1\dbch\af31505\loch\f1 Visual C++ Redistributable}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \line \hich\af1\dbch\af31505\loch\f1 \hich\f1 Copyright \'a9\loch\f1 1993-}{\rtlch\fcs1 -\af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid1848078 \hich\af1\dbch\af31505\loch\f1 2024}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \hich\af1\dbch\af31505\loch\f1 - Microsoft. All rights reserved. +\hich\af1\dbch\af31505\loch\f1 V\hich\af1\dbch\af31505\loch\f1 isual C++ Redistributable}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 \line \hich\af1\dbch\af31505\loch\f1 \hich\f1 Copyright +\'a9\loch\f1 1993-}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid1848078 \hich\af1\dbch\af31505\loch\f1 2024}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2052\langnp1033\insrsid13781912\charrsid1002736 +\hich\af1\dbch\af31505\loch\f1 Microsoft. All rights reserved. \par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a 9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad 5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 @@ -304,8 +295,8 @@ fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e500000000000000000000000050bc -fcdf206fda01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000004010 +c1461d90da01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/SetupBundle/Bundle.wxs b/SetupBundle/Bundle.wxs index 40fa0e76..c58a0bd6 100644 --- a/SetupBundle/Bundle.wxs +++ b/SetupBundle/Bundle.wxs @@ -16,7 +16,6 @@ - - diff --git a/SetupBundle/WebView2Runtime.wxs b/SetupBundle/WebView2Runtime.wxs deleted file mode 100644 index 4c7172e2..00000000 --- a/SetupBundle/WebView2Runtime.wxs +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - -