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" <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">
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> <modelVersion>4.0.0</modelVersion>
<groupId>ch.ethz.seb</groupId> <groupId>ch.ethz.seb</groupId>
@ -212,8 +210,8 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<configuration> <configuration>
<source>10</source> <source>17</source>
<target>10</target> <target>17</target>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
@ -277,17 +275,11 @@
<groupId>com.fasterxml.jackson.dataformat</groupId> <groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId> <artifactId>jackson-dataformat-xml</artifactId>
</dependency> </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 <!-- NOTE since org.springframework.security.oauth is not fully migrated
to spring-boot-starter-security we have to declare a separate version here. 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 This refers to the latest version of spring-security-oauth2 and should be
@ -304,10 +296,6 @@
<artifactId>spring-security-jwt</artifactId> <artifactId>spring-security-jwt</artifactId>
<version>1.0.9.RELEASE</version> <version>1.0.9.RELEASE</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- Springdoc-openapi --> <!-- Springdoc-openapi -->
<dependency> <dependency>
@ -316,8 +304,6 @@
<version>1.5.10</version> <version>1.5.10</version>
</dependency> </dependency>
<!-- Flyway --> <!-- Flyway -->
<dependency> <dependency>
<groupId>org.flywaydb</groupId> <groupId>org.flywaydb</groupId>
@ -390,6 +376,11 @@
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <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.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridData;
@ -163,12 +165,17 @@ interface CellFieldBuilderAdapter {
this.orientationsOfGroup = orientationsOfGroup; this.orientationsOfGroup = orientationsOfGroup;
for (final Orientation o : this.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); this.x = Math.min(xpos, this.x);
final int ypos = o.yPosition - ((o.title == TitleOrientation.TOP) ? 1 : 0); final int ypos = o.yPosition - ((o.title == TitleOrientation.TOP) ? 1 : 0);
this.y = Math.min(ypos, this.y); this.y = Math.min(ypos, this.y);
this.width = Math.max(this.width, o.xpos() + o.width()); this.width = Math.max(this.width, o.xpos() + o.width());
this.height = Math.max(this.height, o.ypos() + o.height()); 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; this.width = this.width - this.x;
@ -243,7 +250,7 @@ interface CellFieldBuilderAdapter {
} }
this.width = this.width - this.x; this.width = this.width - this.x;
this.height = this.height - this.y + 2; this.height = this.height - this.y + 10;
} }
@Override @Override
@ -279,7 +286,6 @@ interface CellFieldBuilderAdapter {
this.width, this.width,
labelKey); labelKey);
expandItem.setHeight(this.height * HEIGHT_PER_FIELD);
final Composite body = (Composite) expandItem.getControl(); final Composite body = (Composite) expandItem.getControl();
final ViewGridBuilder expandBuilder = new ViewGridBuilder( final ViewGridBuilder expandBuilder = new ViewGridBuilder(
body, body,
@ -287,10 +293,22 @@ interface CellFieldBuilderAdapter {
this, this,
builder.examConfigurationService); builder.examConfigurationService);
final Set<String> groups = new HashSet<>();
for (final Orientation orientation : value) { for (final Orientation orientation : value) {
final ConfigurationAttribute attribute = builder.viewContext.getAttribute(orientation.attributeId); final ConfigurationAttribute attribute = builder.viewContext.getAttribute(orientation.attributeId);
expandBuilder.add(attribute); 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(); expandBuilder.compose();
} }
} }

View file

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

View file

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

View file

@ -89,6 +89,8 @@ public class ViewGridBuilder {
this.registeredExpandables = null; this.registeredExpandables = null;
} }
private ExpandBarCellFieldBuilderAdapter expandBarBuilderAdapter = null;
ViewGridBuilder( ViewGridBuilder(
final Composite parent, final Composite parent,
final ViewContext viewContext, final ViewContext viewContext,
@ -100,6 +102,7 @@ public class ViewGridBuilder {
this.viewContext = viewContext; this.viewContext = viewContext;
this.isGroupBuilder = false; this.isGroupBuilder = false;
this.isExpandBarBuilder = true; this.isExpandBarBuilder = true;
this.expandBarBuilderAdapter = expandBarBuilderAdapter;
this.xOffset = expandBarBuilderAdapter.x; this.xOffset = expandBarBuilderAdapter.x;
this.yOffset = expandBarBuilderAdapter.y; this.yOffset = expandBarBuilderAdapter.y;
this.grid = new CellFieldBuilderAdapter[expandBarBuilderAdapter.height - 1][expandBarBuilderAdapter.width]; this.grid = new CellFieldBuilderAdapter[expandBarBuilderAdapter.height - 1][expandBarBuilderAdapter.width];
@ -241,6 +244,10 @@ public class ViewGridBuilder {
final GroupCellFieldBuilderAdapter groupBuilder = final GroupCellFieldBuilderAdapter groupBuilder =
new GroupCellFieldBuilderAdapter(this.viewContext.getOrientationsOfGroup(attribute)); new GroupCellFieldBuilderAdapter(this.viewContext.getOrientationsOfGroup(attribute));
if (this.expandBarBuilderAdapter != null) {
groupBuilder.width = this.expandBarBuilderAdapter.width;
}
final int xpos = groupBuilder.x - this.xOffset; final int xpos = groupBuilder.x - this.xOffset;
final int ypos = groupBuilder.y - this.yOffset; 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_FEATURES = "zoomFeatureFlagChat";
public static final String ZOOM_GROUP_CONTROLS = "zoomAudioMuted"; 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 @Override
public boolean observesAttribute(final ConfigurationAttribute attribute) { public boolean observesAttribute(final ConfigurationAttribute attribute) {
return KEY_ENABLE_AI.equals(attribute.name) || return KEY_ENABLE_AI.equals(attribute.name) ||
KEY_ENABLE_JITSI.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 @Override
@ -78,6 +83,14 @@ public class ProctoringViewRules implements ValueChangeRule {
context.disableGroup(AI_GROUP_FACE_NUMBER); context.disableGroup(AI_GROUP_FACE_NUMBER);
context.disableGroup(AI_GROUP_FACE_ANGLE); 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 # webservice configuration
sebserver.init.adminaccount.gen-on-init=false sebserver.init.adminaccount.gen-on-init=false
sebserver.webservice.distributed=true sebserver.webservice.distributed=false
#sebserver.webservice.master.delay.threshold=10000 #sebserver.webservice.master.delay.threshold=10000
sebserver.webservice.http.external.scheme=http sebserver.webservice.http.external.scheme=http
sebserver.webservice.http.external.servername=localhost sebserver.webservice.http.external.servername=localhost

View file

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

View file

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

View file

@ -3,16 +3,31 @@
-- ----------------------------------------------------------------- -- -----------------------------------------------------------------
INSERT IGNORE INTO configuration_attribute VALUES 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'), (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'), (1300, 'enableScreenProctoring', 'CHECKBOX', null, null, null, null, 'false'),
(1301, 'screenProctoringScreenshotMinInterval', 'NUMBER_INPUT ', null, null, null, null, '1000'), (1301, 'screenProctoringScreenshotMinInterval', 'INTEGER', null, null, null, null, '1000'),
(1302, 'screenProctoringScreenshotMaxInterval', 'NUMBER_INPUT ', null, null, null, null, '5000'), (1302, 'screenProctoringScreenshotMaxInterval', 'INTEGER', null, null, null, null, '5000'),
(1303, 'screenProctoringImageFormat', 'SINGLE_SELECTION ', null, '0,1', null, null, '0'), (1303, 'screenProctoringImageFormat', 'SINGLE_SELECTION', null, '0', 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,4,5', null, null, '2'),
(1305, 'screenProctoringImageQuantization', 'SINGLE_SELECTION ', null, '0,1,2,3', null, null, '0'),
(1306, 'screenProctoringImageDownscale', 'SINGLE_SELECTION', null, '0,1,2,3,4,5,6,7,8,9,10', null, null, '0'), (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'), (1320, 'screenProctoringMetadataURLEnabled', 'CHECKBOX', null, null, null, null, 'true'),
(1321, 'screenProctoringMetadataWindowTitleEnabled', '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.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=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.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=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.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) 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.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=Image Format
sebserver.examconfig.props.label.screenProctoringImageFormat.0=PNG 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=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.tooltip=Indicating to use black/white, grayscale or color quantization.
sebserver.examconfig.props.label.screenProctoringImageQuantization.0=TBD ALG1 sebserver.examconfig.props.label.screenProctoringImageQuantization.0=Black and White
sebserver.examconfig.props.label.screenProctoringImageQuantization.1=TBD ALG2 sebserver.examconfig.props.label.screenProctoringImageQuantization.1=Grayscale 2 Bpp
sebserver.examconfig.props.label.screenProctoringImageQuantization.2=TBD ALG3 sebserver.examconfig.props.label.screenProctoringImageQuantization.2=Grayscale 4 Bpp
sebserver.examconfig.props.label.screenProctoringImageQuantization.3=TBD ALG4 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=Image Downscale
sebserver.examconfig.props.label.screenProctoringImageDownscale.tooltip=Image downscale factor sebserver.examconfig.props.label.screenProctoringImageDownscale.tooltip=Image downscale factor from 1 to 2
sebserver.examconfig.props.label.screenProctoringImageDownscale.0=1 sebserver.examconfig.props.label.screenProctoringImageDownscale.0=1.0
sebserver.examconfig.props.label.screenProctoringImageDownscale.1=1.5 sebserver.examconfig.props.label.screenProctoringImageDownscale.1=1.1
sebserver.examconfig.props.label.screenProctoringImageDownscale.2=2 sebserver.examconfig.props.label.screenProctoringImageDownscale.2=1.2
sebserver.examconfig.props.label.screenProctoringImageDownscale.3=2.5 sebserver.examconfig.props.label.screenProctoringImageDownscale.3=1.3
sebserver.examconfig.props.label.screenProctoringImageDownscale.4=3 sebserver.examconfig.props.label.screenProctoringImageDownscale.4=1.4
sebserver.examconfig.props.label.screenProctoringImageDownscale.5=3.5 sebserver.examconfig.props.label.screenProctoringImageDownscale.5=1.5
sebserver.examconfig.props.label.screenProctoringImageDownscale.6=4 sebserver.examconfig.props.label.screenProctoringImageDownscale.6=1.6
sebserver.examconfig.props.label.screenProctoringImageDownscale.7=4.5 sebserver.examconfig.props.label.screenProctoringImageDownscale.7=1.7
sebserver.examconfig.props.label.screenProctoringImageDownscale.8=5 sebserver.examconfig.props.label.screenProctoringImageDownscale.8=1.8
sebserver.examconfig.props.label.screenProctoringImageDownscale.9=5.5 sebserver.examconfig.props.label.screenProctoringImageDownscale.9=1.9
sebserver.examconfig.props.label.screenProctoringImageDownscale.10=6 sebserver.examconfig.props.label.screenProctoringImageDownscale.10=2.0
sebserver.examconfig.props.label.screenProctoringMetadataURLEnabled=Enable URL Recording 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.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=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.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 # SEB Exam Configuration Template
################################ ################################

View file

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