SEBWIN-775: Removed Zoom proctoring implementation.
This commit is contained in:
		
							parent
							
								
									75016158c5
								
							
						
					
					
						commit
						8c3d9a31d7
					
				
					 5 changed files with 28 additions and 241 deletions
				
			
		|  | @ -76,17 +76,12 @@ namespace SafeExamBrowser.Configuration.ConfigurationData | |||
| 
 | ||||
| 		private void InitializeProctoringSettings(AppSettings settings) | ||||
| 		{ | ||||
| 			settings.Proctoring.Enabled = settings.Proctoring.JitsiMeet.Enabled || settings.Proctoring.Zoom.Enabled; | ||||
| 			settings.Proctoring.Enabled = settings.Proctoring.JitsiMeet.Enabled; | ||||
| 
 | ||||
| 			if (settings.Proctoring.JitsiMeet.Enabled && !settings.Proctoring.JitsiMeet.ReceiveVideo) | ||||
| 			{ | ||||
| 				settings.Proctoring.WindowVisibility = WindowVisibility.Hidden; | ||||
| 			} | ||||
| 
 | ||||
| 			if (settings.Proctoring.Zoom.Enabled && !settings.Proctoring.Zoom.ReceiveVideo) | ||||
| 			{ | ||||
| 				settings.Proctoring.WindowVisibility = WindowVisibility.Hidden; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		private void RemoveLegacyBrowsers(AppSettings settings) | ||||
|  |  | |||
|  | @ -94,14 +94,6 @@ namespace SafeExamBrowser.Proctoring | |||
| 				credentials.Add(new JProperty("subject", settings.JitsiMeet.ShowMeetingName ? settings.JitsiMeet.Subject : "")); | ||||
| 				credentials.Add(new JProperty("token", settings.JitsiMeet.Token)); | ||||
| 			} | ||||
| 			else if (settings.Zoom.Enabled) | ||||
| 			{ | ||||
| 				credentials.Add(new JProperty("meetingNumber", settings.Zoom.MeetingNumber)); | ||||
| 				credentials.Add(new JProperty("password", settings.Zoom.Password)); | ||||
| 				credentials.Add(new JProperty("sdkKey", settings.Zoom.SdkKey)); | ||||
| 				credentials.Add(new JProperty("signature", settings.Zoom.Signature)); | ||||
| 				credentials.Add(new JProperty("userName", settings.Zoom.UserName)); | ||||
| 			} | ||||
| 
 | ||||
| 			message.Add("credentials", credentials); | ||||
| 			logger.Debug("Sending credentials to proctoring client."); | ||||
|  |  | |||
|  | @ -101,12 +101,6 @@ namespace SafeExamBrowser.Proctoring | |||
| 				start = !string.IsNullOrWhiteSpace(settings.JitsiMeet.RoomName); | ||||
| 				start &= !string.IsNullOrWhiteSpace(settings.JitsiMeet.ServerUrl); | ||||
| 			} | ||||
| 			else if (settings.Zoom.Enabled) | ||||
| 			{ | ||||
| 				start = !string.IsNullOrWhiteSpace(settings.Zoom.SdkKey) && !string.IsNullOrWhiteSpace(settings.Zoom.Signature); | ||||
| 				start &= !string.IsNullOrWhiteSpace(settings.Zoom.MeetingNumber); | ||||
| 				start &= !string.IsNullOrWhiteSpace(settings.Zoom.UserName); | ||||
| 			} | ||||
| 
 | ||||
| 			if (start) | ||||
| 			{ | ||||
|  | @ -167,13 +161,6 @@ namespace SafeExamBrowser.Proctoring | |||
| 			settings.JitsiMeet.ServerUrl = args.JitsiMeetServerUrl; | ||||
| 			settings.JitsiMeet.Token = args.JitsiMeetToken; | ||||
| 
 | ||||
| 			settings.Zoom.MeetingNumber = args.ZoomMeetingNumber; | ||||
| 			settings.Zoom.Password = args.ZoomPassword; | ||||
| 			settings.Zoom.SdkKey = args.ZoomSdkKey; | ||||
| 			settings.Zoom.Signature = args.ZoomSignature; | ||||
| 			settings.Zoom.Subject = args.ZoomSubject; | ||||
| 			settings.Zoom.UserName = args.ZoomUserName; | ||||
| 
 | ||||
| 			StopProctoring(); | ||||
| 			StartProctoring(); | ||||
| 		} | ||||
|  | @ -186,10 +173,6 @@ namespace SafeExamBrowser.Proctoring | |||
| 			settings.JitsiMeet.ReceiveAudio = receiveAudio; | ||||
| 			settings.JitsiMeet.ReceiveVideo = receiveVideo; | ||||
| 
 | ||||
| 			settings.Zoom.AllowChat = allowChat; | ||||
| 			settings.Zoom.ReceiveAudio = receiveAudio; | ||||
| 			settings.Zoom.ReceiveVideo = receiveVideo; | ||||
| 
 | ||||
| 			if (allowChat || receiveVideo) | ||||
| 			{ | ||||
| 				settings.WindowVisibility = WindowVisibility.AllowToHide; | ||||
|  | @ -225,26 +208,19 @@ namespace SafeExamBrowser.Proctoring | |||
| 					}); | ||||
| 
 | ||||
| 					window = uiFactory.CreateProctoringWindow(control); | ||||
| 					window.SetTitle(settings.JitsiMeet.Enabled ? settings.JitsiMeet.Subject : settings.Zoom.Subject); | ||||
| 					window.SetTitle(settings.JitsiMeet.Enabled ? settings.JitsiMeet.Subject : ""); | ||||
| 					window.Show(); | ||||
| 
 | ||||
| 					if (settings.WindowVisibility == WindowVisibility.AllowToShow || settings.WindowVisibility == WindowVisibility.Hidden) | ||||
| 					{ | ||||
| 						if (settings.Zoom.Enabled) | ||||
| 						{ | ||||
| 							window.HideWithDelay(); | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| 							window.Hide(); | ||||
| 						} | ||||
| 						window.Hide(); | ||||
| 					} | ||||
| 
 | ||||
| 					IconResource = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/ProctoringNotification_Active.xaml") }; | ||||
| 					Tooltip = text.Get(TextKey.Notification_ProctoringActiveTooltip); | ||||
| 					NotificationChanged?.Invoke(); | ||||
| 
 | ||||
| 					logger.Info($"Started proctoring with {(settings.JitsiMeet.Enabled ? "Jitsi Meet" : "Zoom")}."); | ||||
| 					logger.Info($"Started proctoring with {(settings.JitsiMeet.Enabled ? "Jitsi Meet" : "")}."); | ||||
| 				} | ||||
| 				catch (Exception e) | ||||
| 				{ | ||||
|  | @ -263,10 +239,6 @@ namespace SafeExamBrowser.Proctoring | |||
| 					{ | ||||
| 						control.ExecuteScriptAsync("api.executeCommand('hangup'); api.dispose();"); | ||||
| 					} | ||||
| 					else if (settings.Zoom.Enabled) | ||||
| 					{ | ||||
| 						control.ExecuteScriptAsync("ZoomMtg.leaveMeeting({});"); | ||||
| 					} | ||||
| 
 | ||||
| 					Thread.Sleep(2000); | ||||
| 
 | ||||
|  | @ -282,36 +254,34 @@ namespace SafeExamBrowser.Proctoring | |||
| 
 | ||||
| 		private string LoadContent(ProctoringSettings settings) | ||||
| 		{ | ||||
| 			var provider = settings.JitsiMeet.Enabled ? "JitsiMeet" : "Zoom"; | ||||
| 			var assembly = Assembly.GetAssembly(typeof(ProctoringController)); | ||||
| 			var path = $"{typeof(ProctoringController).Namespace}.{provider}.index.html"; | ||||
| 
 | ||||
| 			using (var stream = assembly.GetManifestResourceStream(path)) | ||||
| 			using (var reader = new StreamReader(stream)) | ||||
| 			if (settings.JitsiMeet.Enabled) | ||||
| 			{ | ||||
| 				var html = reader.ReadToEnd(); | ||||
| 				var assembly = Assembly.GetAssembly(typeof(ProctoringController)); | ||||
| 				var path = $"{typeof(ProctoringController).Namespace}.JitsiMeet.index.html"; | ||||
| 
 | ||||
| 				if (settings.JitsiMeet.Enabled) | ||||
| 				using (var stream = assembly.GetManifestResourceStream(path)) | ||||
| 				using (var reader = new StreamReader(stream)) | ||||
| 				{ | ||||
| 					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"); | ||||
| 				} | ||||
| 				else if (settings.Zoom.Enabled) | ||||
| 				{ | ||||
| 					html = html.Replace("'%_ALLOW_CHAT_%'", settings.Zoom.AllowChat ? "true" : "false"); | ||||
| 					html = html.Replace("'%_ALLOW_CLOSED_CAPTIONS_%'", settings.Zoom.AllowClosedCaptions ? "true" : "false"); | ||||
| 					html = html.Replace("'%_ALLOW_RAISE_HAND_%'", settings.Zoom.AllowRaiseHand ? "true" : "false"); | ||||
| 					html = html.Replace("'%_AUDIO_MUTED_%'", settings.Zoom.AudioMuted && settings.WindowVisibility != WindowVisibility.Hidden ? "true" : "false"); | ||||
| 					html = html.Replace("'%_VIDEO_MUTED_%'", settings.Zoom.VideoMuted && settings.WindowVisibility != WindowVisibility.Hidden ? "true" : "false"); | ||||
| 				} | ||||
| 					var html = reader.ReadToEnd(); | ||||
| 
 | ||||
| 				return html; | ||||
| 					if (settings.JitsiMeet.Enabled) | ||||
| 					{ | ||||
| 						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; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				return ""; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -117,7 +117,6 @@ | |||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <EmbeddedResource Include="JitsiMeet\index.html" /> | ||||
|     <EmbeddedResource Include="Zoom\index.html" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="packages.config" /> | ||||
|  |  | |||
|  | @ -1,169 +0,0 @@ | |||
| <html> | ||||
| 	<head> | ||||
| 		<link type="text/css" rel="stylesheet" href="https://source.zoom.us/2.10.1/css/bootstrap.css" /> | ||||
| 		<link type="text/css" rel="stylesheet" href="https://source.zoom.us/2.10.1/css/react-select.css" /> | ||||
| 		<meta charset="utf-8" /> | ||||
| 		<meta http-equiv="origin-trial" content="" /> | ||||
| 	</head> | ||||
| 	<body> | ||||
| 		<script src="https://source.zoom.us/2.10.1/lib/vendor/react.min.js"></script> | ||||
| 		<script src="https://source.zoom.us/2.10.1/lib/vendor/react-dom.min.js"></script> | ||||
| 		<script src="https://source.zoom.us/2.10.1/lib/vendor/redux.min.js"></script> | ||||
| 		<script src="https://source.zoom.us/2.10.1/lib/vendor/redux-thunk.min.js"></script> | ||||
| 		<script src="https://source.zoom.us/2.10.1/lib/vendor/lodash.min.js"></script> | ||||
| 		<script src="https://source.zoom.us/zoom-meeting-2.10.1.min.js"></script> | ||||
| 		<script type="text/javascript"> | ||||
| 			var audioJoin = 0; | ||||
| 			var videoJoin = 0; | ||||
| 			var join = 0; | ||||
| 
 | ||||
| 			function controlUserInterface(_) { | ||||
| 				var audioButton = document.getElementsByClassName('join-audio-container__btn')[0]; | ||||
| 				var audioContainer = audioButton ? audioButton.parentElement : null; | ||||
| 				var chat = document.querySelector("div[feature-type='chat']"); | ||||
| 				var fullScreenButton = document.getElementsByClassName('full-screen-icon')[0]; | ||||
| 				var info = document.getElementsByClassName('meeting-info-container')[0]; | ||||
| 				var joinAudioButton = document.getElementsByClassName('join-audio-by-voip__join-btn')[0]; | ||||
| 				var joinButton = document.getElementsByClassName('joinWindowBtn')[0]; | ||||
| 				var leave = document.getElementsByClassName('footer__leave-btn-container')[0]; | ||||
| 				var more = document.querySelector("div[feature-type='more']"); | ||||
| 				var participants = document.querySelector("div[feature-type='participants']"); | ||||
| 				var reaction = document.querySelector("div[feature-type='reaction']"); | ||||
| 				var settings = document.querySelector("div[feature-type='settings']"); | ||||
| 				var sharing = document.querySelector("div[feature-type='sharing']"); | ||||
| 				var videoButton = document.getElementsByClassName('send-video-container__btn')[0]; | ||||
| 				var videoContainer = videoButton ? videoButton.parentElement : null; | ||||
| 
 | ||||
| 				if (audioContainer && !'%_AUDIO_MUTED_%') { | ||||
| 					audioContainer.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (chat && !'%_ALLOW_CHAT_%') { | ||||
| 					chat.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (fullScreenButton) { | ||||
| 					fullScreenButton.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (info) { | ||||
| 					info.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (joinAudioButton && !'%_AUDIO_MUTED_%' && audioJoin < 500) { | ||||
| 					joinAudioButton.click(); | ||||
| 					audioJoin++; | ||||
| 				} | ||||
| 
 | ||||
| 				if (joinButton && join < 500) { | ||||
| 					joinButton.click(); | ||||
| 					join++; | ||||
| 				} | ||||
| 
 | ||||
| 				if (leave) { | ||||
| 					leave.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (more) { | ||||
| 					more.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (participants) { | ||||
| 					participants.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (reaction) { | ||||
| 					reaction.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (settings) { | ||||
| 					settings.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (sharing) { | ||||
| 					sharing.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				if (videoButton && !'%_VIDEO_MUTED_%' && videoJoin < 500) { | ||||
| 					videoButton.click(); | ||||
| 					videoJoin++; | ||||
| 				} | ||||
| 
 | ||||
| 				if (videoContainer && !'%_VIDEO_MUTED_%') { | ||||
| 					videoContainer.style.visibility = 'hidden'; | ||||
| 				} | ||||
| 
 | ||||
| 				requestAnimationFrame(controlUserInterface); | ||||
| 			} | ||||
| 
 | ||||
| 			function startMeeting(credentials) { | ||||
| 				var error = function (res) { | ||||
| 					alert(`Failed to initialize meeting: ${JSON.stringify(res)}`); | ||||
| 				}; | ||||
| 
 | ||||
| 				var success = function () { | ||||
| 					requestAnimationFrame(controlUserInterface); | ||||
| 
 | ||||
| 					ZoomMtg.join({ | ||||
| 						meetingNumber: new Number(credentials.meetingNumber), | ||||
| 						passWord: credentials.password, | ||||
| 						sdkKey: credentials.sdkKey, | ||||
| 						signature: credentials.signature, | ||||
| 						userName: credentials.userName, | ||||
| 						error: function (res) { | ||||
| 							alert(`Failed to join meeting: ${JSON.stringify(res)}`); | ||||
| 						} | ||||
| 					}); | ||||
| 				}; | ||||
| 
 | ||||
| 				var params = { | ||||
| 					audioPanelAlwaysOpen: false, | ||||
| 					disableCallOut: true, | ||||
| 					disableInvite: true, | ||||
| 					disableJoinAudio: false, | ||||
| 					disableRecord: true, | ||||
| 					disableReport: true, | ||||
| 					disableVoIP: false, | ||||
| 					leaveUrl: 'doesnotexist', | ||||
| 					isLockBottom: true, | ||||
| 					isShowJoiningErrorDialog: true, | ||||
| 					isSupportAV: true, | ||||
| 					isSupportBreakout: false, | ||||
| 					isSupportChat: '%_ALLOW_CHAT_%', | ||||
| 					isSupportCC: '%_ALLOW_CLOSED_CAPTIONS_%', | ||||
| 					isSupportPolling: false, | ||||
| 					isSupportQA: false, | ||||
| 					isSupportNonverbal: false, | ||||
| 					screenShare: false, | ||||
| 					sharingMode: 'both', | ||||
| 					showMeetingHeader: true, | ||||
| 					showPureSharingContent: false, | ||||
| 					videoDrag: true, | ||||
| 					videoHeader: true, | ||||
| 					meetingInfo: ['topic', 'host', 'participant'], | ||||
| 					error: error, | ||||
| 					success: success | ||||
| 				}; | ||||
| 
 | ||||
| 				if (!ZoomMtg.checkSystemRequirements()) { | ||||
| 					alert('This system does not meet the necessary requirements for Zoom!'); | ||||
| 				} | ||||
| 
 | ||||
| 				ZoomMtg.setZoomJSLib('https://source.zoom.us/2.10.1/lib', '/av'); | ||||
| 				ZoomMtg.preLoadWasm(); | ||||
| 				ZoomMtg.prepareWebSDK(); | ||||
| 				ZoomMtg.init(params); | ||||
| 			} | ||||
| 
 | ||||
| 			function webMessageReceived(args) { | ||||
| 				if ('credentials' in args.data) { | ||||
| 					startMeeting(args.data.credentials); | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			window.addEventListener('unload', () => ZoomMtg.leaveMeeting({})); | ||||
| 			window.chrome.webview.addEventListener('message', webMessageReceived); | ||||
| 			window.chrome.webview.postMessage('credentials'); | ||||
| 		</script> | ||||
| 	</body> | ||||
| </html> | ||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Damian Büchel
						Damian Büchel