SEBWIN-775: Removed Zoom proctoring implementation.

This commit is contained in:
Damian Büchel 2023-11-01 10:42:26 +01:00
parent 75016158c5
commit 8c3d9a31d7
5 changed files with 28 additions and 241 deletions

View file

@ -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)

View file

@ -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.");

View file

@ -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 "";
}
}

View file

@ -117,7 +117,6 @@
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="JitsiMeet\index.html" />
<EmbeddedResource Include="Zoom\index.html" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />

View file

@ -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>