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

697
pom.xml
View file

@ -1,128 +1,126 @@
<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>
<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>
<artifactId>seb-server</artifactId>
<version>${revision}</version>
<name>seb-server</name>
<description>web-service for SEB maintenance and monitoring active SEB sessions</description>
<groupId>ch.ethz.seb</groupId>
<artifactId>seb-server</artifactId>
<version>${revision}</version>
<name>seb-server</name>
<description>web-service for SEB maintenance and monitoring active SEB sessions</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.15</version>
</parent>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.15</version>
</parent>
<packaging>jar</packaging>
<packaging>jar</packaging>
<properties>
<sebserver-version>1.6-SNAPSHOT</sebserver-version>
<build-version>${sebserver-version}</build-version>
<revision>${sebserver-version}</revision>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<properties>
<sebserver-version>1.6-SNAPSHOT</sebserver-version>
<build-version>${sebserver-version}</build-version>
<revision>${sebserver-version}</revision>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<!-- NOTE: There currently are two profiles, a default one to build on
<!-- NOTE: There currently are two profiles, a default one to build on
Java 11 (from eclipse and command-line) and one to build still on Java 8
to support the Jenkins build on CI-Server that still no Java 11 installed -->
<profiles>
<profile>
<id>Java 17</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<java.version>17</java.version>
</properties>
<build>
<finalName>${project.artifactId}-${build-version}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>${java.version}</release>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<systemPropertyVariables>
<file.encoding>UTF-8</file.encoding>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.4.0-b180830.0438</version><!--$NO-MVN-MAN-VER$ --> <!-- TODO move to stable version when available -->
</dependency>
</dependencies>
</profile>
<profiles>
<profile>
<id>Java 17</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<java.version>17</java.version>
</properties>
<build>
<finalName>${project.artifactId}-${build-version}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>${java.version}</release>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<systemPropertyVariables>
<file.encoding>UTF-8</file.encoding>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.4.0-b180830.0438</version> <!--$NO-MVN-MAN-VER$ --> <!-- TODO move to stable version when available -->
</dependency>
</dependencies>
</profile>
<profile>
<id>let_reporting</id>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<profile>
<id>let_reporting</id>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.10.0</version>
<configuration>
<skipEmptyReport>false</skipEmptyReport>
<failOnViolation>false</failOnViolation>
<targetJdk>${java.version}</targetJdk>
<linkXRef>false</linkXRef>
<rulesets>
<ruleset>pmd-rulesets.xml</ruleset>
</rulesets>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
<goal>cpd-check</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- <plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.10.0</version>
<configuration>
<skipEmptyReport>false</skipEmptyReport>
<failOnViolation>false</failOnViolation>
<targetJdk>${java.version}</targetJdk>
<linkXRef>false</linkXRef>
<rulesets>
<ruleset>pmd-rulesets.xml</ruleset>
</rulesets>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
<goal>cpd-check</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.4</version>
@ -143,269 +141,262 @@
</execution>
</executions>
</plugin>-->
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.5.3.0</version>
<configuration>
<effort>Max</effort>
<failOnError>false</failOnError>
<threshold>Low</threshold>
<xmlOutput>true</xmlOutput>
<excludeFilterFile>findbugs-excludes.xml</excludeFilterFile>
</configuration>
<dependencies>
<!-- overwrite dependency on spotbugs if you want to specify the version of spotbugs -->
<dependency>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs</artifactId>
<version>4.6.0</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<excludes>
<exclude>ch/ethz/seb/sebserver/gui/**/*</exclude>
<exclude>ch/ethz/seb/sebserver/webservice/datalayer/batis/mapper/**/*</exclude>
<exclude>ch/ethz/seb/sebserver/webservice/datalayer/batis/model/**/*</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.5.3.0</version>
<configuration>
<effort>Max</effort>
<failOnError>false</failOnError>
<threshold>Low</threshold>
<xmlOutput>true</xmlOutput>
<excludeFilterFile>findbugs-excludes.xml</excludeFilterFile>
</configuration>
<dependencies>
<!-- overwrite dependency on spotbugs if you want to specify the version of spotbugs -->
<dependency>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs</artifactId>
<version>4.6.0</version>
</dependency>
</dependencies>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<excludes>
<exclude>ch/ethz/seb/sebserver/gui/**/*</exclude>
<exclude>ch/ethz/seb/sebserver/webservice/datalayer/batis/mapper/**/*</exclude>
<exclude>ch/ethz/seb/sebserver/webservice/datalayer/batis/model/**/*</exclude>
</excludes>
<source>17</source>
<target>17</target>
</configuration>
</execution>
</executions>
</plugin>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</build>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>10</source>
<target>10</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- Data Base -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
</dependency>
<dependencies>
<!-- Data Base -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis.dynamic-sql</groupId>
<artifactId>mybatis-dynamic-sql</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis.dynamic-sql</groupId>
<artifactId>mybatis-dynamic-sql</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
<!-- Spring / Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<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>
<!-- Spring / Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</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.
This refers to the latest version of spring-security-oauth2 and should be
compatible with the overall version of spring boot SEE: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0.0-M5-Release-Notes#oauth-20-support
TODO: once spring-security-oauth2 is fully migrated we should be able to
remove this dependency -->
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<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>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.5.10</version>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>1.0.9.RELEASE</version>
</dependency>
<!-- Springdoc-openapi -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.5.10</version>
</dependency>
<!-- Flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>7.8.2</version>
</dependency>
<!-- Flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>7.8.2</version>
</dependency>
<!-- EHCache -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
<!-- EHCache -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
<!-- Apache HTTP -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- Apache HTTP -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- Eclipse RAP / RWT -->
<dependency>
<groupId>org.eclipse.rap</groupId>
<artifactId>org.eclipse.rap.rwt</artifactId>
<version>3.15.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.rap</groupId>
<artifactId>org.eclipse.rap.fileupload</artifactId>
<version>3.7.0</version>
</dependency>
<!-- Eclipse RAP / RWT -->
<dependency>
<groupId>org.eclipse.rap</groupId>
<artifactId>org.eclipse.rap.rwt</artifactId>
<version>3.15.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.rap</groupId>
<artifactId>org.eclipse.rap.fileupload</artifactId>
<version>3.7.0</version>
</dependency>
<!-- Misc -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.cryptonode.jncryptor</groupId>
<artifactId>jncryptor</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>com.github.vladimir-bukhtoyarov</groupId>
<artifactId>bucket4j-core</artifactId>
<version>4.10.0</version>
</dependency>
<!-- Misc -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.cryptonode.jncryptor</groupId>
<artifactId>jncryptor</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>com.github.vladimir-bukhtoyarov</groupId>
<artifactId>bucket4j-core</artifactId>
<version>4.10.0</version>
</dependency>
<!-- Testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
<!-- Testing -->
<dependency>
<groupId>junit</groupId>
<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>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</dependencies>
</project>

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,18 +154,26 @@ public class TextFieldBuilder implements InputFieldBuilder {
@Override
public void enable(final boolean group) {
this.control.setData(RWT.CUSTOM_VARIANT, null);
this.control.setEditable(true);
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) {
this.control.setData(RWT.CUSTOM_VARIANT, CustomVariant.CONFIG_INPUT_READONLY.key);
this.control.setEditable(false);
final GridData gridData = (GridData) this.control.getLayoutData();
gridData.heightHint = (this.attribute.type == AttributeType.TEXT_AREA)
? WidgetFactory.TEXT_AREA_INPUT_MIN_HEIGHT
: WidgetFactory.TEXT_INPUT_MIN_HEIGHT;
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();
gridData.heightHint = (this.attribute.type == AttributeType.TEXT_AREA)
? WidgetFactory.TEXT_AREA_INPUT_MIN_HEIGHT
: WidgetFactory.TEXT_INPUT_MIN_HEIGHT;
}
}
@Override

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'),
(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')
(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 {