seb-server/src/main/java/ch/ethz/seb/sebserver/webservice/WebserviceInfo.java

304 lines
11 KiB
Java
Raw Normal View History

2020-02-20 16:12:04 +01:00
/*
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package ch.ethz.seb.sebserver.webservice;
import java.net.InetAddress;
import java.net.UnknownHostException;
2022-03-08 15:39:22 +01:00
import java.util.Arrays;
2020-02-20 16:12:04 +01:00
import java.util.Collections;
2022-03-08 15:39:22 +01:00
import java.util.HashSet;
2020-02-20 16:12:04 +01:00
import java.util.LinkedHashMap;
import java.util.Map;
2022-03-08 15:39:22 +01:00
import java.util.Set;
import java.util.UUID;
2020-02-20 16:12:04 +01:00
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2022-06-21 10:12:07 +02:00
import org.springframework.beans.factory.annotation.Value;
2020-02-20 16:12:04 +01:00
import org.springframework.context.annotation.Lazy;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.web.util.UriComponentsBuilder;
import ch.ethz.seb.sebserver.gbl.Constants;
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.WebserviceInfoDAO;
2020-02-20 16:12:04 +01:00
@Lazy
@Service
@WebServiceProfile
public class WebserviceInfo {
private static final Logger log = LoggerFactory.getLogger(WebserviceInfo.class);
private static final String VERSION_KEY = "sebserver.version";
private static final String WEB_SERVICE_TEST_PROPERTY = "sebserver.test.property";
private static final String WEB_SERVICE_SERVER_NAME_KEY = "sebserver.webservice.http.external.servername";
2020-05-06 16:07:13 +02:00
private static final String WEB_SERVICE_HTTP_SCHEME_KEY = "sebserver.webservice.http.external.scheme";
2020-02-20 16:12:04 +01:00
private static final String WEB_SERVICE_HTTP_PORT = "sebserver.webservice.http.external.port";
private static final String WEB_SERVICE_HOST_ADDRESS_KEY = "server.address";
private static final String WEB_SERVICE_SERVER_PORT_KEY = "server.port";
private static final String WEB_SERVICE_EXAM_API_DISCOVERY_ENDPOINT_KEY =
"sebserver.webservice.api.exam.endpoint.discovery";
private static final String WEB_SERVICE_EXTERNAL_ADDRESS_ALIAS = "sebserver.webservice.lms.address.alias";
private static final String WEB_SERVICE_CONTEXT_PATH = "server.servlet.context-path";
2020-02-20 16:12:04 +01:00
private final String sebServerVersion;
private final String testProperty;
private final String httpScheme;
private final String hostAddress; // internal
private final String webserverName; // external
private final String serverPort; // internal
private final String webserverPort; // external
private final String discoveryEndpoint;
private final String contextPath;
2020-02-20 16:12:04 +01:00
private final String serverURLPrefix;
private final boolean isDistributed;
private final String webserviceUUID;
2020-02-20 16:12:04 +01:00
private final long distributedUpdateInterval;
2021-12-07 10:41:54 +01:00
2020-02-20 16:12:04 +01:00
private Map<String, String> lmsExternalAddressAlias;
2022-03-08 15:39:22 +01:00
private final Set<String> activeProfiles;
2020-02-20 16:12:04 +01:00
private final WebserviceInfoDAO webserviceInfoDAO;
private boolean isMaster = false;
2022-06-21 10:12:07 +02:00
@Value("${sebserver.webservice.api.admin.accessTokenValiditySeconds:3600}")
private int adminAccessTokenValSec;
@Value("${sebserver.webservice.api.admin.refreshTokenValiditySeconds:-1}")
private int adminRefreshTokenValSec;
@Value("${sebserver.webservice.api.exam.accessTokenValiditySeconds:43200}")
private int examAPITokenValiditySeconds;
public WebserviceInfo(
final WebserviceInfoDAO webserviceInfoDAO,
final Environment environment) {
this.webserviceInfoDAO = webserviceInfoDAO;
2020-02-20 16:12:04 +01:00
this.sebServerVersion = environment.getRequiredProperty(VERSION_KEY);
this.testProperty = environment.getProperty(WEB_SERVICE_TEST_PROPERTY, "NOT_AVAILABLE");
this.httpScheme = environment.getRequiredProperty(WEB_SERVICE_HTTP_SCHEME_KEY);
this.hostAddress = environment.getRequiredProperty(WEB_SERVICE_HOST_ADDRESS_KEY);
this.webserverName = environment.getProperty(WEB_SERVICE_SERVER_NAME_KEY, "");
this.serverPort = environment.getRequiredProperty(WEB_SERVICE_SERVER_PORT_KEY);
this.webserverPort = environment.getProperty(WEB_SERVICE_HTTP_PORT);
this.discoveryEndpoint = environment.getRequiredProperty(WEB_SERVICE_EXAM_API_DISCOVERY_ENDPOINT_KEY);
this.contextPath = environment.getProperty(WEB_SERVICE_CONTEXT_PATH, "");
2022-06-16 16:30:59 +02:00
this.webserviceUUID = UUID.randomUUID().toString()
+ Constants.UNDERLINE
2022-06-27 13:25:28 +02:00
+ this.sebServerVersion;
2020-02-20 16:12:04 +01:00
this.distributedUpdateInterval = environment.getProperty(
"sebserver.webservice.distributed.updateInterval",
2021-12-07 10:41:54 +01:00
Long.class,
2023-05-31 20:30:12 +02:00
2000L);
2021-12-07 10:41:54 +01:00
2022-03-08 15:39:22 +01:00
this.activeProfiles = new HashSet<>(Arrays.asList(environment.getActiveProfiles()));
2020-02-20 16:12:04 +01:00
if (StringUtils.isEmpty(this.webserverName)) {
log.warn("NOTE: External server name, property : 'sebserver.webservice.http.external.servername' "
+ "is not set from configuration. The external server name is set to the server address!");
}
final UriComponentsBuilder builder = UriComponentsBuilder.newInstance()
.scheme(this.httpScheme)
.host((StringUtils.isNotBlank(this.webserverName))
? this.webserverName
: this.hostAddress);
if (StringUtils.isNotBlank(this.webserverPort)) {
builder.port(this.webserverPort);
}
if (StringUtils.isNotBlank(this.contextPath) && !this.contextPath.equals("/")) {
builder.path(this.contextPath);
}
2020-02-20 16:12:04 +01:00
this.serverURLPrefix = builder.toUriString();
this.isDistributed = BooleanUtils.toBoolean(environment.getProperty(
"sebserver.webservice.distributed",
Constants.FALSE_STRING));
final String addressAlias = environment.getProperty(WEB_SERVICE_EXTERNAL_ADDRESS_ALIAS, "");
if (StringUtils.isNotBlank(addressAlias)) {
try {
final String[] aliass = StringUtils.split(addressAlias, Constants.LIST_SEPARATOR);
final Map<String, String> mapping = new LinkedHashMap<>();
for (final String alias : aliass) {
final String[] nameValue =
StringUtils.split(alias, Constants.FORM_URL_ENCODED_NAME_VALUE_SEPARATOR);
mapping.put(nameValue[0], nameValue[1]);
}
this.lmsExternalAddressAlias = Collections.unmodifiableMap(mapping);
} catch (final Exception e) {
log.error("Failed to parse sebserver.webservice.lms.address.alias: ", e);
this.lmsExternalAddressAlias = Collections.emptyMap();
}
} else {
this.lmsExternalAddressAlias = Collections.emptyMap();
}
}
public boolean isMaster() {
return this.isMaster;
}
public void updateMaster() {
this.isMaster = this.webserviceInfoDAO.isMaster(this.getWebserviceUUID());
}
public String getWebserviceUUID() {
return this.webserviceUUID;
}
2020-06-04 08:52:01 +02:00
public String getSEBServerVersion() {
2020-02-20 16:12:04 +01:00
return this.sebServerVersion;
}
public String getTestProperty() {
return this.testProperty;
}
2022-03-08 15:39:22 +01:00
public boolean hasProfile(final String profile) {
return this.activeProfiles.contains(profile);
}
2020-02-20 16:12:04 +01:00
public String getHttpScheme() {
return this.httpScheme;
}
public String getHostAddress() {
return this.hostAddress;
}
public String getWebserviceDomainName() {
return this.webserverName;
}
public String getServerPort() {
return this.serverPort;
}
public String getServerExternalPort() {
return this.webserverPort;
}
public Object getContextPath() {
return this.contextPath;
}
2020-02-20 16:12:04 +01:00
public String getDiscoveryEndpoint() {
return this.discoveryEndpoint;
}
public String getDiscoveryEndpointAddress() {
return this.serverURLPrefix + this.discoveryEndpoint;
}
public long getDistributedUpdateInterval() {
return this.distributedUpdateInterval;
2021-12-07 10:41:54 +01:00
}
2020-02-20 16:12:04 +01:00
public String getLocalHostName() {
try {
return InetAddress.getLocalHost().getHostName();
} catch (final UnknownHostException e) {
2022-06-01 15:39:12 +02:00
log.error("Failed to get local host name: {}", e.getMessage());
return Constants.EMPTY_NOTE;
2020-02-20 16:12:04 +01:00
}
}
public String getLocalHostAddress() {
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (final UnknownHostException e) {
2022-06-01 15:39:12 +02:00
log.error("Failed to get local host address: {}", e.getMessage());
return Constants.EMPTY_NOTE;
2020-02-20 16:12:04 +01:00
}
}
public String getLoopbackHostName() {
return InetAddress.getLoopbackAddress().getHostName();
}
public String getLoopbackHostAddress() {
return InetAddress.getLoopbackAddress().getHostAddress();
}
2022-06-27 13:01:09 +02:00
/** Get the server URL prefix in the form of;
2020-02-20 16:12:04 +01:00
* [scheme{http|https}]://[server-address{DNS-name|IP}]:[port]
*
* E.g.: https://seb.server.ch:8080
*
* @return the server URL prefix */
public String getExternalServerURL() {
return this.serverURLPrefix;
}
public boolean isDistributed() {
return this.isDistributed;
}
public Map<String, String> getLmsExternalAddressAlias() {
return this.lmsExternalAddressAlias;
}
public String getLmsExternalAddressAlias(final String internalAddress) {
return this.lmsExternalAddressAlias
.entrySet()
.stream()
.filter(entry -> internalAddress.contains(entry.getKey()))
.findFirst()
.map(Map.Entry::getValue)
.orElse(null);
}
2022-06-21 10:12:07 +02:00
public int getAdminAccessTokenValSec() {
return this.adminAccessTokenValSec;
}
public int getAdminRefreshTokenValSec() {
return this.adminRefreshTokenValSec;
}
public int getExamAPITokenValiditySeconds() {
return this.examAPITokenValiditySeconds;
}
2020-02-20 16:12:04 +01:00
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("WebserviceInfo [testProperty=");
builder.append(this.testProperty);
builder.append(", httpScheme=");
builder.append(this.httpScheme);
builder.append(", hostAddress=");
builder.append(this.hostAddress);
builder.append(", webserverName=");
builder.append(this.webserverName);
builder.append(", serverPort=");
builder.append(this.serverPort);
builder.append(", webserverPort=");
builder.append(this.webserverPort);
builder.append(", discoveryEndpoint=");
builder.append(this.discoveryEndpoint);
builder.append(", serverURLPrefix=");
builder.append(this.serverURLPrefix);
builder.append(", isDistributed=");
builder.append(this.isDistributed);
builder.append(", lmsExternalAddressAlias=");
builder.append(this.lmsExternalAddressAlias);
builder.append("]");
return builder.toString();
}
}