SEBSERV-405 and SEBSERV-434 SEB Settings

This commit is contained in:
anhefti 2023-08-31 14:46:13 +02:00
parent 6c23bf56bf
commit 5982a9e864
12 changed files with 854 additions and 453 deletions

33
pom.xml
View file

@ -1,6 +1,4 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ch.ethz.seb</groupId>
@ -212,8 +210,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>10</source>
<target>10</target>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
@ -277,17 +275,11 @@
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-reactor-netty</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>-->
<!-- NOTE since org.springframework.security.oauth is not fully migrated
to spring-boot-starter-security we have to declare a separate version here.
This refers to the latest version of spring-security-oauth2 and should be
@ -304,10 +296,6 @@
<artifactId>spring-security-jwt</artifactId>
<version>1.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- Springdoc-openapi -->
<dependency>
@ -316,8 +304,6 @@
<version>1.5.10</version>
</dependency>
<!-- Flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
@ -390,6 +376,11 @@
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>

View file

@ -11,7 +11,9 @@ package ch.ethz.seb.sebserver.gui.service.examconfig.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
@ -163,12 +165,17 @@ interface CellFieldBuilderAdapter {
this.orientationsOfGroup = orientationsOfGroup;
for (final Orientation o : this.orientationsOfGroup) {
final int xpos = o.xPosition - ((o.title == TitleOrientation.LEFT) ? 1 : 0);
final int xpos = o.xPosition
- ((o.title == TitleOrientation.LEFT || o.title == TitleOrientation.LEFT_SPAN) ? 1 : 0);
this.x = Math.min(xpos, this.x);
final int ypos = o.yPosition - ((o.title == TitleOrientation.TOP) ? 1 : 0);
this.y = Math.min(ypos, this.y);
this.width = Math.max(this.width, o.xpos() + o.width());
this.height = Math.max(this.height, o.ypos() + o.height());
if (o.groupId.equals("screenshot[proctoring|ScreenProctoring]")) {
this.x = o.xpos() - o.width();
}
}
this.width = this.width - this.x;
@ -243,7 +250,7 @@ interface CellFieldBuilderAdapter {
}
this.width = this.width - this.x;
this.height = this.height - this.y + 2;
this.height = this.height - this.y + 10;
}
@Override
@ -279,7 +286,6 @@ interface CellFieldBuilderAdapter {
this.width,
labelKey);
expandItem.setHeight(this.height * HEIGHT_PER_FIELD);
final Composite body = (Composite) expandItem.getControl();
final ViewGridBuilder expandBuilder = new ViewGridBuilder(
body,
@ -287,10 +293,22 @@ interface CellFieldBuilderAdapter {
this,
builder.examConfigurationService);
final Set<String> groups = new HashSet<>();
for (final Orientation orientation : value) {
final ConfigurationAttribute attribute = builder.viewContext.getAttribute(orientation.attributeId);
expandBuilder.add(attribute);
final String groupKey = ViewGridBuilder.getGroupKey(orientation.groupId);
if (groupKey != null) {
groups.add(groupKey);
}
}
int h = (value.size() + ((groups.size() > 0) ? groups.size() + 1 : 0)) * HEIGHT_PER_FIELD;
if (expandItemKey.equals("ScreenProctoring")) {
h = h + 50;
}
expandItem.setHeight(h);
expandBuilder.compose();
}
}

View file

@ -33,10 +33,6 @@ import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
@GuiProfile
public class SliderFieldBuilder implements InputFieldBuilder {
public SliderFieldBuilder() {
// TODO Auto-generated constructor stub
}
@Override
public boolean builderFor(
final ConfigurationAttribute attribute,
@ -63,16 +59,17 @@ public class SliderFieldBuilder implements InputFieldBuilder {
WidgetFactory.setTestId(slider, attributeNameKey);
WidgetFactory.setARIALabel(slider, i18nSupport.getText(attributeNameKey));
final int thumb = slider.getThumb();
try {
final String[] split = StringUtils.split(
attribute.getResources(),
Constants.LIST_SEPARATOR);
slider.setMinimum(Integer.parseInt(split[0]));
slider.setMaximum(Integer.parseInt(split[1]));
slider.setMaximum(Integer.parseInt(split[1]) + thumb);
} catch (final NumberFormatException e) {
slider.setMinimum(0);
slider.setMaximum(100);
slider.setMinimum(1);
slider.setMaximum(100 + thumb);
}
final SliderInputField inputField = new SliderInputField(
@ -93,7 +90,9 @@ public class SliderFieldBuilder implements InputFieldBuilder {
};
slider.addListener(SWT.FocusOut, valueChangeEventListener);
slider.addListener(SWT.Traverse, valueChangeEventListener);
slider.addListener(SWT.Selection, event -> {
slider.setToolTipText(String.valueOf(slider.getSelection()));
});
}
return inputField;
}

View file

@ -154,12 +154,19 @@ public class TextFieldBuilder implements InputFieldBuilder {
@Override
public void enable(final boolean group) {
if (group) {
this.control.getParent().getParent().setEnabled(true);
} else {
this.control.setData(RWT.CUSTOM_VARIANT, null);
this.control.setEditable(true);
}
}
@Override
public void disable(final boolean group) {
if (group) {
this.control.getParent().getParent().setEnabled(false);
} else {
this.control.setData(RWT.CUSTOM_VARIANT, CustomVariant.CONFIG_INPUT_READONLY.key);
this.control.setEditable(false);
final GridData gridData = (GridData) this.control.getLayoutData();
@ -167,6 +174,7 @@ public class TextFieldBuilder implements InputFieldBuilder {
? WidgetFactory.TEXT_AREA_INPUT_MIN_HEIGHT
: WidgetFactory.TEXT_INPUT_MIN_HEIGHT;
}
}
@Override
public String getValue() {

View file

@ -89,6 +89,8 @@ public class ViewGridBuilder {
this.registeredExpandables = null;
}
private ExpandBarCellFieldBuilderAdapter expandBarBuilderAdapter = null;
ViewGridBuilder(
final Composite parent,
final ViewContext viewContext,
@ -100,6 +102,7 @@ public class ViewGridBuilder {
this.viewContext = viewContext;
this.isGroupBuilder = false;
this.isExpandBarBuilder = true;
this.expandBarBuilderAdapter = expandBarBuilderAdapter;
this.xOffset = expandBarBuilderAdapter.x;
this.yOffset = expandBarBuilderAdapter.y;
this.grid = new CellFieldBuilderAdapter[expandBarBuilderAdapter.height - 1][expandBarBuilderAdapter.width];
@ -241,6 +244,10 @@ public class ViewGridBuilder {
final GroupCellFieldBuilderAdapter groupBuilder =
new GroupCellFieldBuilderAdapter(this.viewContext.getOrientationsOfGroup(attribute));
if (this.expandBarBuilderAdapter != null) {
groupBuilder.width = this.expandBarBuilderAdapter.width;
}
final int xpos = groupBuilder.x - this.xOffset;
final int ypos = groupBuilder.y - this.yOffset;

View file

@ -37,11 +37,16 @@ public class ProctoringViewRules implements ValueChangeRule {
public static final String ZOOM_GROUP_FEATURES = "zoomFeatureFlagChat";
public static final String ZOOM_GROUP_CONTROLS = "zoomAudioMuted";
public static final String KEY_ENABLE_SPS = "enableScreenProctoring";
public static final String SPS_GROUP_SCREENSHOT = "screenProctoringScreenshotMinInterval";
public static final String SPS_GROUP_METADATA = "screenProctoringMetadataURLEnabled";
@Override
public boolean observesAttribute(final ConfigurationAttribute attribute) {
return KEY_ENABLE_AI.equals(attribute.name) ||
KEY_ENABLE_JITSI.equals(attribute.name) ||
KEY_ENABLE_ZOOM.equals(attribute.name);
KEY_ENABLE_ZOOM.equals(attribute.name) ||
KEY_ENABLE_SPS.equals(attribute.name);
}
@Override
@ -78,6 +83,14 @@ public class ProctoringViewRules implements ValueChangeRule {
context.disableGroup(AI_GROUP_FACE_NUMBER);
context.disableGroup(AI_GROUP_FACE_ANGLE);
}
} else if (KEY_ENABLE_SPS.equals(attribute.name)) {
if (BooleanUtils.toBoolean(value.value)) {
context.enableGroup(SPS_GROUP_SCREENSHOT);
context.enableGroup(SPS_GROUP_METADATA);
} else {
context.disableGroup(SPS_GROUP_SCREENSHOT);
context.disableGroup(SPS_GROUP_METADATA);
}
}
}

View file

@ -25,7 +25,7 @@ sebserver.webservice.clean-db-on-startup=false
# webservice configuration
sebserver.init.adminaccount.gen-on-init=false
sebserver.webservice.distributed=true
sebserver.webservice.distributed=false
#sebserver.webservice.master.delay.threshold=10000
sebserver.webservice.http.external.scheme=http
sebserver.webservice.http.external.servername=localhost

View file

@ -1,3 +1,4 @@
spring.config.use-legacy-processing=true
spring.application.name=SEB Server
spring.profiles.active=ws,gui,dev
sebserver.version=@sebserver-version@

View file

@ -14,9 +14,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Riot</string>
<string>remoting_host.exe</string>
<key>originalName</key>
<string>Riot</string>
<string>remoting_host.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -36,9 +36,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>seamonkey</string>
<string>CiscoWebExStart.exe</string>
<key>originalName</key>
<string>seamonkey</string>
<string>CiscoWebExStart.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -58,9 +58,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Discord</string>
<string>CiscoCollabHost.exe</string>
<key>originalName</key>
<string>Discord</string>
<string>CiscoCollabHost.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -80,9 +80,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Slack</string>
<string>AA_v3.exe</string>
<key>originalName</key>
<string>Slack</string>
<string>AA_v3.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -102,9 +102,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Teams</string>
<string>ptoneclk.exe</string>
<key>originalName</key>
<string>Teams</string>
<string>ptoneclk.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -124,9 +124,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>CamRecorder</string>
<string>webexmta.exe</string>
<key>originalName</key>
<string>CamRecorder</string>
<string>webexmta.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -146,9 +146,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>join.me</string>
<string>Teams.exe</string>
<key>originalName</key>
<string>join.me</string>
<string>Teams.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -168,9 +168,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>RPCSuite</string>
<string>join.me.sentinel.exe</string>
<key>originalName</key>
<string>RPCSuite</string>
<string>join.me.sentinel.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -190,9 +190,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>RPCService</string>
<string>join.me.exe</string>
<key>originalName</key>
<string>RPCService</string>
<string>join.me.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -212,9 +212,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>RemotePCDesktop</string>
<string>g2mstart.exe</string>
<key>originalName</key>
<string>RemotePCDesktop</string>
<string>g2mstart.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -234,9 +234,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>beamyourscreen-host</string>
<string>g2mlauncher.exe</string>
<key>originalName</key>
<string>beamyourscreen-host</string>
<string>g2mlauncher.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -256,9 +256,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>AeroAdmin</string>
<string>Telegram.exe</string>
<key>originalName</key>
<string>AeroAdmin</string>
<string>Telegram.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -278,9 +278,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Mikogo-host</string>
<string>Zoom.exe</string>
<key>originalName</key>
<string>Mikogo-host</string>
<string>Zoom.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -300,9 +300,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>chromoting</string>
<string>Element.exe</string>
<key>originalName</key>
<string>chromoting</string>
<string>Element.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -322,9 +322,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>vncserverui</string>
<string>slack.exe</string>
<key>originalName</key>
<string>vncserverui</string>
<string>slack.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -344,9 +344,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>vncviewer</string>
<string>CamtasiaUtl.exe</string>
<key>originalName</key>
<string>vncviewer</string>
<string>CamtasiaUtl.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -366,9 +366,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>vncserver</string>
<string>CamRecorder.exe</string>
<key>originalName</key>
<string>vncserver</string>
<string>CamRecorder.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -388,9 +388,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>TeamViewer</string>
<string>CamPlay.exe</string>
<key>originalName</key>
<string>TeamViewer</string>
<string>CamPlay.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -410,9 +410,339 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>GotoMeetingWinStore</string>
<string>Camtasia_Studio.exe</string>
<key>originalName</key>
<string>GotoMeetingWinStore</string>
<string>Camtasia_Studio.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>CamtasiaStudio.exe</string>
<key>originalName</key>
<string>CamtasiaStudio.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Camtasia.exe</string>
<key>originalName</key>
<string>Camtasia.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Discord.exe</string>
<key>originalName</key>
<string>Discord.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>RPCSuite.exe</string>
<key>originalName</key>
<string>RPCSuite.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>RPCService.exe</string>
<key>originalName</key>
<string>RPCService.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>RemotePCDesktop.exe</string>
<key>originalName</key>
<string>RemotePCDesktop.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>beamyourscreen-host.exe</string>
<key>originalName</key>
<string>beamyourscreen-host.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>AeroAdmin.exe</string>
<key>originalName</key>
<string>AeroAdmin.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Mikogo-host.exe</string>
<key>originalName</key>
<string>Mikogo-host.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>chromoting.exe</string>
<key>originalName</key>
<string>chromoting.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>vncserverui.exe</string>
<key>originalName</key>
<string>vncserverui.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>vncviewer.exe</string>
<key>originalName</key>
<string>vncviewer.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>vncserver.exe</string>
<key>originalName</key>
<string>vncserver.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>TeamViewer.exe</string>
<key>originalName</key>
<string>TeamViewer.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>GotoMeetingWinStore.exe</string>
<key>originalName</key>
<string>GotoMeetingWinStore.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -454,9 +784,9 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>SkypeHost</string>
<string>SkypeHost.exe</string>
<key>originalName</key>
<string>SkypeHost</string>
<string>SkypeHost.exe</string>
<key>description</key>
<string />
<key>identifier</key>
@ -476,9 +806,31 @@
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Skype</string>
<string>SkypeApp.exe</string>
<key>originalName</key>
<string>Skype</string>
<string>SkypeApp.exe</string>
<key>description</key>
<string />
<key>identifier</key>
<string />
<key>windowHandlingProcess</key>
<string />
<key>user</key>
<string />
</dict>
<dict>
<key>active</key>
<true />
<key>currentUser</key>
<true />
<key>strongKill</key>
<false />
<key>os</key>
<integer>1</integer>
<key>executable</key>
<string>Skype.exe</string>
<key>originalName</key>
<string>Skype.exe</string>
<key>description</key>
<string />
<key>identifier</key>

View file

@ -3,16 +3,31 @@
-- -----------------------------------------------------------------
INSERT IGNORE INTO configuration_attribute VALUES
(1200, 'signature', 'TEXTBOX', null, null, null, null, null),
(1200, 'signature', 'TEXT_FIELD', null, null, null, null, null),
(1201, 'clipboardPolicy', 'RADIO_SELECTION', null, '0,1,2', null, null, '2'),
(1202, 'browserShowFileSystemElementPath', 'CHECKBOX', null, null, null, null, 'true'),
(1300, 'enableScreenProctoring', 'CHECKBOX', null, null, null, null, 'false'),
(1301, 'screenProctoringScreenshotMinInterval', 'NUMBER_INPUT ', null, null, null, null, '1000'),
(1302, 'screenProctoringScreenshotMaxInterval', 'NUMBER_INPUT ', null, null, null, null, '5000'),
(1303, 'screenProctoringImageFormat', 'SINGLE_SELECTION ', null, '0,1', null, null, '0'),
(1304, 'screenProctoringImageBitsPerPixel', 'SINGLE_SELECTION ', null, '0,1,2,3,4,5,6', null, null, '2'),
(1305, 'screenProctoringImageQuantization', 'SINGLE_SELECTION ', null, '0,1,2,3', null, null, '0'),
(1301, 'screenProctoringScreenshotMinInterval', 'INTEGER', null, null, null, null, '1000'),
(1302, 'screenProctoringScreenshotMaxInterval', 'INTEGER', null, null, null, null, '5000'),
(1303, 'screenProctoringImageFormat', 'SINGLE_SELECTION', null, '0', null, null, '0'),
(1305, 'screenProctoringImageQuantization', 'SINGLE_SELECTION', null, '0,1,2,3,4,5', null, null, '2'),
(1306, 'screenProctoringImageDownscale', 'SINGLE_SELECTION', null, '0,1,2,3,4,5,6,7,8,9,10', null, null, '0'),
(1320, 'screenProctoringMetadataURLEnabled', 'CHECKBOX', null, null, null, null, 'true'),
(1321, 'screenProctoringMetadataWindowTitleEnabled', 'CHECKBOX', null, null, null, null, 'true')
;
SET @proct_view_id = (SELECT id FROM view WHERE name='proctoring' AND template_id=0 LIMIT 1);
INSERT IGNORE INTO orientation (config_attribute_id, template_id, view_id, group_id, x_position, y_position, width, height, title) VALUES
(1300, 0, @proct_view_id, '[proctoring|ScreenProctoring]', 6, 1, 6, 1, 'NONE'),
(1301, 0, @proct_view_id, 'screenshot[proctoring|ScreenProctoring]', 9, 2, 3, 1, 'LEFT_SPAN'),
(1302, 0, @proct_view_id, 'screenshot[proctoring|ScreenProctoring]', 9, 3, 3, 1, 'LEFT_SPAN'),
(1303, 0, @proct_view_id, 'screenshot[proctoring|ScreenProctoring]', 9, 4, 3, 1, 'LEFT_SPAN'),
(1305, 0, @proct_view_id, 'screenshot[proctoring|ScreenProctoring]', 9, 5, 3, 1, 'LEFT_SPAN'),
(1306, 0, @proct_view_id, 'screenshot[proctoring|ScreenProctoring]', 9, 6, 3, 1, 'LEFT_SPAN'),
(1320, 0, @proct_view_id, 'metadata[proctoring|ScreenProctoring]', 6, 8, 6, 1, 'NONE'),
(1321, 0, @proct_view_id, 'metadata[proctoring|ScreenProctoring]', 6, 9, 6, 1, 'NONE')
;

View file

@ -1870,6 +1870,7 @@ sebserver.examconfig.props.label.clipboardPolicy.1=Block
sebserver.examconfig.props.label.clipboardPolicy.1.tooltip=Completely blocks the usage of the system clipboard by continuously cleaning the content and blocking the<br/>keyboard shortcuts for cut, copy and paste.
sebserver.examconfig.props.label.clipboardPolicy.2=SEB Only
sebserver.examconfig.props.label.clipboardPolicy.2.tooltip=Continuously cleaning the content of the system clipboard and enables an isolated clipboard only working within the browser application of SEB.
sebserver.examconfig.props.label.browserShowFileSystemElementPath=Show path of file system elements (Win)
sebserver.examconfig.props.label.enableScreenProctoring=Enable Screen Proctoring
sebserver.examconfig.props.label.enableScreenProctoring.tooltip=Enables the screen proctoring for SEB. Note the this cannot be used together with other proctoring features.
sebserver.examconfig.props.label.screenProctoringScreenshotMinInterval=Minimal Screenshot Interval (ms)
@ -1878,40 +1879,36 @@ sebserver.examconfig.props.label.screenProctoringScreenshotMaxInterval=Maximal S
sebserver.examconfig.props.label.screenProctoringScreenshotMaxInterval.tooltip=Defines the maximum interval between two screen shots in milliseconds.<br/>This is used if no user-interactions happened since last screen shot. In this case this shall defined the<br/>maximal interval time between two screen shots if no triggering (user-interaction) happens
sebserver.examconfig.props.label.screenProctoringImageFormat=Image Format
sebserver.examconfig.props.label.screenProctoringImageFormat.0=PNG
sebserver.examconfig.props.label.screenProctoringImageFormat.1=WEBP
sebserver.examconfig.props.label.screenProctoringImageBitsPerPixel=Bits per Pixel
sebserver.examconfig.props.label.screenProctoringImageBitsPerPixel.tooltip=The number of bits for one pixel
sebserver.examconfig.props.label.screenProctoringImageBitsPerPixel.0=1
sebserver.examconfig.props.label.screenProctoringImageBitsPerPixel.1=2
sebserver.examconfig.props.label.screenProctoringImageBitsPerPixel.2=4
sebserver.examconfig.props.label.screenProctoringImageBitsPerPixel.3=8
sebserver.examconfig.props.label.screenProctoringImageBitsPerPixel.4=16
sebserver.examconfig.props.label.screenProctoringImageBitsPerPixel.5=32
sebserver.examconfig.props.label.screenProctoringImageBitsPerPixel.6=64
sebserver.examconfig.props.label.screenProctoringImageQuantization=Image Color Quantization
sebserver.examconfig.props.label.screenProctoringImageQuantization.tooltip=Indicating to use grayscale or color quantization. This also depends on setting of "Bits per Pixel"
sebserver.examconfig.props.label.screenProctoringImageQuantization.0=TBD ALG1
sebserver.examconfig.props.label.screenProctoringImageQuantization.1=TBD ALG2
sebserver.examconfig.props.label.screenProctoringImageQuantization.2=TBD ALG3
sebserver.examconfig.props.label.screenProctoringImageQuantization.3=TBD ALG4
sebserver.examconfig.props.label.screenProctoringImageQuantization.tooltip=Indicating to use black/white, grayscale or color quantization.
sebserver.examconfig.props.label.screenProctoringImageQuantization.0=Black and White
sebserver.examconfig.props.label.screenProctoringImageQuantization.1=Grayscale 2 Bpp
sebserver.examconfig.props.label.screenProctoringImageQuantization.2=Grayscale 4 Bpp
sebserver.examconfig.props.label.screenProctoringImageQuantization.3=Grayscale 8 Bpp
sebserver.examconfig.props.label.screenProctoringImageQuantization.4=Color 16 Bpp
sebserver.examconfig.props.label.screenProctoringImageQuantization.5=Color 24 Bpp
sebserver.examconfig.props.label.screenProctoringImageDownscale=Image Downscale
sebserver.examconfig.props.label.screenProctoringImageDownscale.tooltip=Image downscale factor
sebserver.examconfig.props.label.screenProctoringImageDownscale.0=1
sebserver.examconfig.props.label.screenProctoringImageDownscale.1=1.5
sebserver.examconfig.props.label.screenProctoringImageDownscale.2=2
sebserver.examconfig.props.label.screenProctoringImageDownscale.3=2.5
sebserver.examconfig.props.label.screenProctoringImageDownscale.4=3
sebserver.examconfig.props.label.screenProctoringImageDownscale.5=3.5
sebserver.examconfig.props.label.screenProctoringImageDownscale.6=4
sebserver.examconfig.props.label.screenProctoringImageDownscale.7=4.5
sebserver.examconfig.props.label.screenProctoringImageDownscale.8=5
sebserver.examconfig.props.label.screenProctoringImageDownscale.9=5.5
sebserver.examconfig.props.label.screenProctoringImageDownscale.10=6
sebserver.examconfig.props.label.screenProctoringImageDownscale.tooltip=Image downscale factor from 1 to 2
sebserver.examconfig.props.label.screenProctoringImageDownscale.0=1.0
sebserver.examconfig.props.label.screenProctoringImageDownscale.1=1.1
sebserver.examconfig.props.label.screenProctoringImageDownscale.2=1.2
sebserver.examconfig.props.label.screenProctoringImageDownscale.3=1.3
sebserver.examconfig.props.label.screenProctoringImageDownscale.4=1.4
sebserver.examconfig.props.label.screenProctoringImageDownscale.5=1.5
sebserver.examconfig.props.label.screenProctoringImageDownscale.6=1.6
sebserver.examconfig.props.label.screenProctoringImageDownscale.7=1.7
sebserver.examconfig.props.label.screenProctoringImageDownscale.8=1.8
sebserver.examconfig.props.label.screenProctoringImageDownscale.9=1.9
sebserver.examconfig.props.label.screenProctoringImageDownscale.10=2.0
sebserver.examconfig.props.label.screenProctoringMetadataURLEnabled=Enable URL Recording
sebserver.examconfig.props.label.screenProctoringMetadataURLEnabled.tooltip=Enable the recording of browser URL input during a screen proctoring session
sebserver.examconfig.props.label.screenProctoringMetadataWindowTitleEnabled=Enable Window Title Recording
sebserver.examconfig.props.label.screenProctoringMetadataWindowTitleEnabled.tooltip=Enable the recording of the title of the active window during a screen proctoring session
sebserver.examconfig.props.group.ScreenProctoring=SEB Screen Proctoring Settings
sebserver.examconfig.props.group.screenshot=Screenshot Settings
sebserver.examconfig.props.group.metadata=Metadata Recording
################################
# SEB Exam Configuration Template
################################

View file

@ -10,7 +10,7 @@ package ch.ethz.seb.sebserver.gbl.client;
import static org.junit.Assert.assertEquals;
import org.junit.jupiter.api.Test;
import org.junit.Test;
public class ProxyDataTest {