SEBWIN-475: Implemented missing configuration options for Zoom proctoring.

This commit is contained in:
Damian Büchel 2021-06-25 09:55:02 +02:00
parent 2775abe172
commit f0b71ec10c
7 changed files with 146 additions and 17 deletions

View file

@ -20,8 +20,8 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
case Keys.Proctoring.JitsiMeet.AllowChat: case Keys.Proctoring.JitsiMeet.AllowChat:
MapJitsiMeetAllowChat(settings, value); MapJitsiMeetAllowChat(settings, value);
break; break;
case Keys.Proctoring.JitsiMeet.AllowCloseCaptions: case Keys.Proctoring.JitsiMeet.AllowClosedCaptions:
MapJitsiMeetAllowCloseCaptions(settings, value); MapJitsiMeetAllowClosedCaptions(settings, value);
break; break;
case Keys.Proctoring.JitsiMeet.AllowRaiseHand: case Keys.Proctoring.JitsiMeet.AllowRaiseHand:
MapJitsiMeetAllowRaiseHands(settings, value); MapJitsiMeetAllowRaiseHands(settings, value);
@ -77,18 +77,36 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
case Keys.Proctoring.WindowVisibility: case Keys.Proctoring.WindowVisibility:
MapWindowVisibility(settings, value); MapWindowVisibility(settings, value);
break; 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.ApiKey: case Keys.Proctoring.Zoom.ApiKey:
MapZoomApiKey(settings, value); MapZoomApiKey(settings, value);
break; break;
case Keys.Proctoring.Zoom.ApiSecret: case Keys.Proctoring.Zoom.ApiSecret:
MapZoomApiSecret(settings, value); MapZoomApiSecret(settings, value);
break; break;
case Keys.Proctoring.Zoom.AudioMuted:
MapZoomAudioMuted(settings, value);
break;
case Keys.Proctoring.Zoom.Enabled: case Keys.Proctoring.Zoom.Enabled:
MapZoomEnabled(settings, value); MapZoomEnabled(settings, value);
break; break;
case Keys.Proctoring.Zoom.MeetingNumber: case Keys.Proctoring.Zoom.MeetingNumber:
MapZoomMeetingNumber(settings, value); MapZoomMeetingNumber(settings, value);
break; break;
case Keys.Proctoring.Zoom.SendAudio:
MapZoomSendAudio(settings, value);
break;
case Keys.Proctoring.Zoom.SendVideo:
MapZoomSendVideo(settings, value);
break;
case Keys.Proctoring.Zoom.Signature: case Keys.Proctoring.Zoom.Signature:
MapZoomSignature(settings, value); MapZoomSignature(settings, value);
break; break;
@ -98,6 +116,9 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
case Keys.Proctoring.Zoom.UserName: case Keys.Proctoring.Zoom.UserName:
MapZoomUserName(settings, value); MapZoomUserName(settings, value);
break; break;
case Keys.Proctoring.Zoom.VideoMuted:
MapZoomVideoMuted(settings, value);
break;
} }
} }
@ -109,11 +130,11 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
} }
} }
private void MapJitsiMeetAllowCloseCaptions(AppSettings settings, object value) private void MapJitsiMeetAllowClosedCaptions(AppSettings settings, object value)
{ {
if (value is bool allow) if (value is bool allow)
{ {
settings.Proctoring.JitsiMeet.AllowCloseCaptions = allow; settings.Proctoring.JitsiMeet.AllowClosedCaptions = allow;
} }
} }
@ -280,6 +301,30 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
} }
} }
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 MapZoomApiKey(AppSettings settings, object value) private void MapZoomApiKey(AppSettings settings, object value)
{ {
if (value is string key) if (value is string key)
@ -296,6 +341,14 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
} }
} }
private void MapZoomAudioMuted(AppSettings settings, object value)
{
if (value is bool muted)
{
settings.Proctoring.Zoom.AudioMuted = muted;
}
}
private void MapZoomEnabled(AppSettings settings, object value) private void MapZoomEnabled(AppSettings settings, object value)
{ {
if (value is bool enabled) if (value is bool enabled)
@ -312,6 +365,22 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
} }
} }
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) private void MapZoomSignature(AppSettings settings, object value)
{ {
if (value is string signature) if (value is string signature)
@ -335,5 +404,13 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
settings.Proctoring.Zoom.UserName = name; settings.Proctoring.Zoom.UserName = name;
} }
} }
private void MapZoomVideoMuted(AppSettings settings, object value)
{
if (value is bool muted)
{
settings.Proctoring.Zoom.VideoMuted = muted;
}
}
} }
} }

View file

@ -218,7 +218,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
settings.Proctoring.Enabled = false; settings.Proctoring.Enabled = false;
settings.Proctoring.JitsiMeet.AllowChat = false; settings.Proctoring.JitsiMeet.AllowChat = false;
settings.Proctoring.JitsiMeet.AllowCloseCaptions = false; settings.Proctoring.JitsiMeet.AllowClosedCaptions = false;
settings.Proctoring.JitsiMeet.AllowRaiseHand = false; settings.Proctoring.JitsiMeet.AllowRaiseHand = false;
settings.Proctoring.JitsiMeet.AllowRecording = false; settings.Proctoring.JitsiMeet.AllowRecording = false;
settings.Proctoring.JitsiMeet.AllowTileView = false; settings.Proctoring.JitsiMeet.AllowTileView = false;
@ -234,9 +234,15 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
settings.Proctoring.ShowTaskbarNotification = true; settings.Proctoring.ShowTaskbarNotification = true;
settings.Proctoring.WindowVisibility = WindowVisibility.Hidden; settings.Proctoring.WindowVisibility = WindowVisibility.Hidden;
settings.Proctoring.Zoom.AllowChat = false; 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.Enabled = false;
settings.Proctoring.Zoom.ReceiveAudio = false; settings.Proctoring.Zoom.ReceiveAudio = false;
settings.Proctoring.Zoom.ReceiveVideo = 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.AllowApplicationLogAccess = false;
settings.Security.AllowTermination = true; settings.Security.AllowTermination = true;

View file

@ -229,7 +229,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
internal static class JitsiMeet internal static class JitsiMeet
{ {
internal const string AllowChat = "jitsiMeetFeatureFlagChat"; internal const string AllowChat = "jitsiMeetFeatureFlagChat";
internal const string AllowCloseCaptions = "jitsiMeetFeatureFlagCloseCaptions"; internal const string AllowClosedCaptions = "jitsiMeetFeatureFlagCloseCaptions";
internal const string AllowRaiseHand = "jitsiMeetFeatureFlagRaiseHand"; internal const string AllowRaiseHand = "jitsiMeetFeatureFlagRaiseHand";
internal const string AllowRecording = "jitsiMeetFeatureFlagRecording"; internal const string AllowRecording = "jitsiMeetFeatureFlagRecording";
internal const string AllowTileView = "jitsiMeetFeatureFlagTileView"; internal const string AllowTileView = "jitsiMeetFeatureFlagTileView";
@ -250,13 +250,20 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
internal static class Zoom internal static class Zoom
{ {
internal const string AllowChat = "zoomFeatureFlagChat";
internal const string AllowClosedCaptions = "zoomFeatureFlagCloseCaptions";
internal const string AllowRaiseHand = "zoomFeatureFlagRaiseHand";
internal const string ApiKey = "zoomApiKey"; internal const string ApiKey = "zoomApiKey";
internal const string ApiSecret = "zoomApiSecret"; internal const string ApiSecret = "zoomApiSecret";
internal const string AudioMuted = "zoomAudioMuted";
internal const string Enabled = "zoomEnable"; internal const string Enabled = "zoomEnable";
internal const string MeetingNumber = "zoomRoom"; internal const string MeetingNumber = "zoomRoom";
internal const string SendAudio = "zoomSendAudio";
internal const string SendVideo = "zoomSendVideo";
internal const string Signature = "zoomToken"; internal const string Signature = "zoomToken";
internal const string Subject = "zoomSubject"; internal const string Subject = "zoomSubject";
internal const string UserName = "zoomUserInfoDisplayName"; internal const string UserName = "zoomUserInfoDisplayName";
internal const string VideoMuted = "zoomVideoMuted";
} }
} }

View file

@ -240,7 +240,7 @@ namespace SafeExamBrowser.Proctoring
if (settings.JitsiMeet.Enabled) if (settings.JitsiMeet.Enabled)
{ {
html = html.Replace("%%_ALLOW_CHAT_%%", settings.JitsiMeet.AllowChat ? "chat" : ""); html = html.Replace("%%_ALLOW_CHAT_%%", settings.JitsiMeet.AllowChat ? "chat" : "");
html = html.Replace("%%_ALLOW_CLOSED_CAPTIONS_%%", settings.JitsiMeet.AllowCloseCaptions ? "closedcaptions" : ""); html = html.Replace("%%_ALLOW_CLOSED_CAPTIONS_%%", settings.JitsiMeet.AllowClosedCaptions ? "closedcaptions" : "");
html = html.Replace("%%_ALLOW_RAISE_HAND_%%", settings.JitsiMeet.AllowRaiseHand ? "raisehand" : ""); html = html.Replace("%%_ALLOW_RAISE_HAND_%%", settings.JitsiMeet.AllowRaiseHand ? "raisehand" : "");
html = html.Replace("%%_ALLOW_RECORDING_%%", settings.JitsiMeet.AllowRecording ? "recording" : ""); html = html.Replace("%%_ALLOW_RECORDING_%%", settings.JitsiMeet.AllowRecording ? "recording" : "");
html = html.Replace("%%_ALLOW_TILE_VIEW", settings.JitsiMeet.AllowTileView ? "tileview" : ""); html = html.Replace("%%_ALLOW_TILE_VIEW", settings.JitsiMeet.AllowTileView ? "tileview" : "");
@ -255,12 +255,16 @@ namespace SafeExamBrowser.Proctoring
else if (settings.Zoom.Enabled) else if (settings.Zoom.Enabled)
{ {
html = html.Replace("'%_ALLOW_CHAT_%'", settings.Zoom.AllowChat ? "true" : "false"); 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("%%_API_KEY_%%", settings.Zoom.ApiKey); html = html.Replace("%%_API_KEY_%%", settings.Zoom.ApiKey);
html = html.Replace("%%_API_SECRET_%%", settings.Zoom.ApiSecret); html = html.Replace("%%_API_SECRET_%%", settings.Zoom.ApiSecret);
html = html.Replace("'%_AUDIO_MUTED_%'", settings.Zoom.AudioMuted && settings.WindowVisibility != WindowVisibility.Hidden ? "true" : "false");
html = html.Replace("%%_MEETING_NUMBER_%%", settings.Zoom.MeetingNumber); html = html.Replace("%%_MEETING_NUMBER_%%", settings.Zoom.MeetingNumber);
html = html.Replace("%%_PASSWORD_%%", settings.Zoom.Password); html = html.Replace("%%_PASSWORD_%%", settings.Zoom.Password);
html = html.Replace("%%_SIGNATURE_%%", settings.Zoom.Signature); html = html.Replace("%%_SIGNATURE_%%", settings.Zoom.Signature);
html = html.Replace("%%_USER_NAME_%%", settings.Zoom.UserName); html = html.Replace("%%_USER_NAME_%%", settings.Zoom.UserName);
html = html.Replace("'%_VIDEO_MUTED_%'", settings.Zoom.VideoMuted && settings.WindowVisibility != WindowVisibility.Hidden ? "true" : "false");
} }
return html; return html;

View file

@ -34,33 +34,38 @@
var audioContainer = document.getElementsByClassName('join-audio-container')[0]; var audioContainer = document.getElementsByClassName('join-audio-container')[0];
var leave = document.getElementsByClassName('footer__leave-btn-container')[0]; var leave = document.getElementsByClassName('footer__leave-btn-container')[0];
var more = document.getElementsByClassName('more-button')[0]; var more = document.getElementsByClassName('more-button')[0];
var raiseHandContainer = document.getElementsByClassName('participants-section-container__participants-footer')[0];
var videoButton = document.getElementsByClassName('send-video-container__btn')[0]; var videoButton = document.getElementsByClassName('send-video-container__btn')[0];
var videoContainer = document.getElementsByClassName('send-video-container')[0]; var videoContainer = document.getElementsByClassName('send-video-container')[0];
if (audioButton && audioJoin < 100) { if (audioButton && !'%_AUDIO_MUTED_%' && audioJoin < 100) {
audioButton.click(); audioButton.click();
audioJoin++; audioJoin++;
} }
if (audioContainer) { if (audioContainer && !'%_AUDIO_MUTED_%') {
audioContainer.style.visibility = "hidden"; audioContainer.style.visibility = 'hidden';
} }
if (leave) { if (leave) {
leave.style.visibility = "hidden"; leave.style.visibility = 'hidden';
} }
if (more) { if (more) {
more.style.visibility = "hidden"; more.style.visibility = 'hidden';
} }
if (videoButton && videoJoin < 100) { if (raiseHandContainer && !'%_ALLOW_RAISE_HAND_%') {
raiseHandContainer.style.visibility = 'hidden';
}
if (videoButton && !'%_VIDEO_MUTED_%' && videoJoin < 100) {
videoButton.click(); videoButton.click();
videoJoin++; videoJoin++;
} }
if (videoContainer) { if (videoContainer && !'%_VIDEO_MUTED_%') {
videoContainer.style.visibility = "hidden"; videoContainer.style.visibility = 'hidden';
} }
requestAnimationFrame(initializeUserInterface); requestAnimationFrame(initializeUserInterface);
@ -100,7 +105,7 @@
isSupportAV: true, isSupportAV: true,
isSupportBreakout: false, isSupportBreakout: false,
isSupportChat: '%_ALLOW_CHAT_%', isSupportChat: '%_ALLOW_CHAT_%',
isSupportCC: false, isSupportCC: '%_ALLOW_CLOSED_CAPTIONS_%',
isSupportPolling: false, isSupportPolling: false,
isSupportQA: false, isSupportQA: false,
isSupportNonverbal: false, isSupportNonverbal: false,

View file

@ -24,7 +24,7 @@ namespace SafeExamBrowser.Settings.Proctoring
/// <summary> /// <summary>
/// Determines whether the user can use close captions. /// Determines whether the user can use close captions.
/// </summary> /// </summary>
public bool AllowCloseCaptions { get; set; } public bool AllowClosedCaptions { get; set; }
/// <summary> /// <summary>
/// Determines whether the user can use the raise hand feature. /// Determines whether the user can use the raise hand feature.

View file

@ -21,6 +21,16 @@ namespace SafeExamBrowser.Settings.Proctoring
/// </summary> /// </summary>
public bool AllowChat { get; set; } public bool AllowChat { get; set; }
/// <summary>
/// Determines whether the user can use closed captions.
/// </summary>
public bool AllowClosedCaptions { get; set; }
/// <summary>
/// Determines whether the user can use the raise hand feature.
/// </summary>
public bool AllowRaiseHand { get; set; }
/// <summary> /// <summary>
/// The API key to be used for authentication. /// The API key to be used for authentication.
/// </summary> /// </summary>
@ -31,6 +41,11 @@ namespace SafeExamBrowser.Settings.Proctoring
/// </summary> /// </summary>
public string ApiSecret { get; set; } public string ApiSecret { get; set; }
/// <summary>
/// Determines whether the audio starts muted.
/// </summary>
public bool AudioMuted { get; set; }
/// <summary> /// <summary>
/// Determines whether proctoring with Zoom is enabled. /// Determines whether proctoring with Zoom is enabled.
/// </summary> /// </summary>
@ -56,6 +71,16 @@ namespace SafeExamBrowser.Settings.Proctoring
/// </summary> /// </summary>
public bool ReceiveVideo { get; set; } public bool ReceiveVideo { get; set; }
/// <summary>
/// Determines whether the audio stream of the user will be sent to the server.
/// </summary>
public bool SendAudio { get; set; }
/// <summary>
/// Determines whether the video stream of the user will be sent to the server.
/// </summary>
public bool SendVideo { get; set; }
/// <summary> /// <summary>
/// The signature to be used for authentication. /// The signature to be used for authentication.
/// </summary> /// </summary>
@ -70,5 +95,10 @@ namespace SafeExamBrowser.Settings.Proctoring
/// The user name to be used for the meeting. /// The user name to be used for the meeting.
/// </summary> /// </summary>
public string UserName { get; set; } public string UserName { get; set; }
/// <summary>
/// Determines whether the video starts muted.
/// </summary>
public bool VideoMuted { get; set; }
} }
} }