code cleanup
This commit is contained in:
parent
3e3887a90c
commit
abe1cc77d8
3 changed files with 97 additions and 118 deletions
|
@ -12,14 +12,11 @@ import java.io.OutputStream;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.cache.annotation.CacheEvict;
|
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
import org.springframework.context.event.EventListener;
|
|
||||||
import org.springframework.security.oauth2.provider.ClientDetails;
|
import org.springframework.security.oauth2.provider.ClientDetails;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.SebClientConfig;
|
import ch.ethz.seb.sebserver.gbl.model.sebconfig.SebClientConfig;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.impl.BulkActionEvent;
|
|
||||||
|
|
||||||
public interface ClientConfigService {
|
public interface ClientConfigService {
|
||||||
|
|
||||||
|
@ -63,7 +60,6 @@ public interface ClientConfigService {
|
||||||
/** Internally used to check OAuth2 access for a active SebClientConfig.
|
/** Internally used to check OAuth2 access for a active SebClientConfig.
|
||||||
*
|
*
|
||||||
* @param config the SebClientConfig to check access
|
* @param config the SebClientConfig to check access
|
||||||
* @return true if the system was able to gain an access token for the client. False otherwise
|
* @return true if the system was able to gain an access token for the client. False otherwise */
|
||||||
*/
|
|
||||||
boolean checkAccess(SebClientConfig config);
|
boolean checkAccess(SebClientConfig config);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,10 +8,41 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl;
|
package ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.PipedInputStream;
|
||||||
|
import java.io.PipedOutputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.http.HttpEntity;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
import org.springframework.security.oauth2.provider.ClientDetails;
|
||||||
|
import org.springframework.security.oauth2.provider.client.BaseClientDetails;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
|
import org.springframework.util.MultiValueMap;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.WebSecurityConfig;
|
import ch.ethz.seb.sebserver.WebSecurityConfig;
|
||||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.API;
|
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
|
||||||
import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
|
import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.SebClientConfig;
|
import ch.ethz.seb.sebserver.gbl.model.sebconfig.SebClientConfig;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
||||||
|
@ -28,39 +59,6 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.SebConfigEncrypti
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.ZipService;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.ZipService;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl.SebConfigEncryptionServiceImpl.EncryptionContext;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl.SebConfigEncryptionServiceImpl.EncryptionContext;
|
||||||
import ch.ethz.seb.sebserver.webservice.weblayer.oauth.WebserviceResourceConfiguration;
|
import ch.ethz.seb.sebserver.webservice.weblayer.oauth.WebserviceResourceConfiguration;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.apache.commons.lang3.BooleanUtils;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
|
||||||
import org.springframework.context.annotation.Lazy;
|
|
||||||
import org.springframework.http.HttpEntity;
|
|
||||||
import org.springframework.http.HttpHeaders;
|
|
||||||
import org.springframework.http.HttpMethod;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.MediaType;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
||||||
import org.springframework.security.oauth2.common.OAuth2AccessToken;
|
|
||||||
import org.springframework.security.oauth2.provider.ClientDetails;
|
|
||||||
import org.springframework.security.oauth2.provider.client.BaseClientDetails;
|
|
||||||
import org.springframework.security.oauth2.provider.token.TokenStore;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.util.LinkedMultiValueMap;
|
|
||||||
import org.springframework.util.MultiValueMap;
|
|
||||||
import org.springframework.web.client.RestTemplate;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.io.PipedInputStream;
|
|
||||||
import java.io.PipedOutputStream;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.Base64;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
@Service
|
@Service
|
||||||
|
@ -107,7 +105,6 @@ public class ClientConfigServiceImpl implements ClientConfigService {
|
||||||
private final SebConfigEncryptionService sebConfigEncryptionService;
|
private final SebConfigEncryptionService sebConfigEncryptionService;
|
||||||
private final PasswordEncoder clientPasswordEncoder;
|
private final PasswordEncoder clientPasswordEncoder;
|
||||||
private final ZipService zipService;
|
private final ZipService zipService;
|
||||||
private final TokenStore tokenStore;
|
|
||||||
private final WebserviceInfo webserviceInfo;
|
private final WebserviceInfo webserviceInfo;
|
||||||
|
|
||||||
protected ClientConfigServiceImpl(
|
protected ClientConfigServiceImpl(
|
||||||
|
@ -116,7 +113,6 @@ public class ClientConfigServiceImpl implements ClientConfigService {
|
||||||
final ClientCredentialService clientCredentialService,
|
final ClientCredentialService clientCredentialService,
|
||||||
final SebConfigEncryptionService sebConfigEncryptionService,
|
final SebConfigEncryptionService sebConfigEncryptionService,
|
||||||
final ZipService zipService,
|
final ZipService zipService,
|
||||||
final TokenStore tokenStore,
|
|
||||||
@Qualifier(WebSecurityConfig.CLIENT_PASSWORD_ENCODER_BEAN_NAME) final PasswordEncoder clientPasswordEncoder,
|
@Qualifier(WebSecurityConfig.CLIENT_PASSWORD_ENCODER_BEAN_NAME) final PasswordEncoder clientPasswordEncoder,
|
||||||
final WebserviceInfo webserviceInfo) {
|
final WebserviceInfo webserviceInfo) {
|
||||||
|
|
||||||
|
@ -126,7 +122,6 @@ public class ClientConfigServiceImpl implements ClientConfigService {
|
||||||
this.sebConfigEncryptionService = sebConfigEncryptionService;
|
this.sebConfigEncryptionService = sebConfigEncryptionService;
|
||||||
this.zipService = zipService;
|
this.zipService = zipService;
|
||||||
this.clientPasswordEncoder = clientPasswordEncoder;
|
this.clientPasswordEncoder = clientPasswordEncoder;
|
||||||
this.tokenStore = tokenStore;
|
|
||||||
this.webserviceInfo = webserviceInfo;
|
this.webserviceInfo = webserviceInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +274,7 @@ public class ClientConfigServiceImpl implements ClientConfigService {
|
||||||
config.fallbackAttemptInterval);
|
config.fallbackAttemptInterval);
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(config.fallbackPassword)) {
|
if (StringUtils.isNotBlank(config.fallbackPassword)) {
|
||||||
CharSequence decrypt = clientCredentialService.decrypt(config.fallbackPassword);
|
final CharSequence decrypt = this.clientCredentialService.decrypt(config.fallbackPassword);
|
||||||
fallbackAddition += String.format(
|
fallbackAddition += String.format(
|
||||||
SEB_CLIENT_CONFIG_STRING_TEMPLATE,
|
SEB_CLIENT_CONFIG_STRING_TEMPLATE,
|
||||||
SebClientConfig.ATTR_FALLBACK_PASSWORD,
|
SebClientConfig.ATTR_FALLBACK_PASSWORD,
|
||||||
|
@ -287,7 +282,7 @@ public class ClientConfigServiceImpl implements ClientConfigService {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(config.quitPassword)) {
|
if (StringUtils.isNotBlank(config.quitPassword)) {
|
||||||
CharSequence decrypt = clientCredentialService.decrypt(config.quitPassword);
|
final CharSequence decrypt = this.clientCredentialService.decrypt(config.quitPassword);
|
||||||
fallbackAddition += String.format(
|
fallbackAddition += String.format(
|
||||||
SEB_CLIENT_CONFIG_STRING_TEMPLATE,
|
SEB_CLIENT_CONFIG_STRING_TEMPLATE,
|
||||||
SebClientConfig.ATTR_QUIT_PASSWORD,
|
SebClientConfig.ATTR_QUIT_PASSWORD,
|
||||||
|
@ -323,34 +318,34 @@ public class ClientConfigServiceImpl implements ClientConfigService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkAccess(SebClientConfig config) {
|
public boolean checkAccess(final SebClientConfig config) {
|
||||||
if (!config.isActive()) {
|
if (!config.isActive()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
RestTemplate restTemplate = new RestTemplate();
|
final RestTemplate restTemplate = new RestTemplate();
|
||||||
String externalServerURL = webserviceInfo.getExternalServerURL() +
|
final String externalServerURL = this.webserviceInfo.getExternalServerURL() +
|
||||||
API.OAUTH_TOKEN_ENDPOINT;
|
API.OAUTH_TOKEN_ENDPOINT;
|
||||||
|
|
||||||
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
final MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
|
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
|
||||||
ClientCredentials credentials = sebClientConfigDAO
|
final ClientCredentials credentials = this.sebClientConfigDAO
|
||||||
.getSebClientCredentials(config.getModelId())
|
.getSebClientCredentials(config.getModelId())
|
||||||
.getOrThrow();
|
.getOrThrow();
|
||||||
CharSequence plainClientSecret = clientCredentialService.getPlainClientSecret(credentials);
|
final CharSequence plainClientSecret = this.clientCredentialService.getPlainClientSecret(credentials);
|
||||||
String basicAuth = credentials.clientId +
|
final String basicAuth = credentials.clientId +
|
||||||
String.valueOf(Constants.COLON) +
|
String.valueOf(Constants.COLON) +
|
||||||
plainClientSecret;
|
plainClientSecret;
|
||||||
String encoded = Base64.getEncoder()
|
final String encoded = Base64.getEncoder()
|
||||||
.encodeToString(basicAuth.getBytes());
|
.encodeToString(basicAuth.getBytes());
|
||||||
|
|
||||||
headers.add(HttpHeaders.AUTHORIZATION, "Basic " + encoded);
|
headers.add(HttpHeaders.AUTHORIZATION, "Basic " + encoded);
|
||||||
HttpEntity<String> entity = new HttpEntity<>(
|
final HttpEntity<String> entity = new HttpEntity<>(
|
||||||
"grant_type=client_credentials&scope=read write",
|
"grant_type=client_credentials&scope=read write",
|
||||||
headers);
|
headers);
|
||||||
|
|
||||||
ResponseEntity<String> exchange = restTemplate.exchange(
|
final ResponseEntity<String> exchange = restTemplate.exchange(
|
||||||
externalServerURL,
|
externalServerURL,
|
||||||
HttpMethod.POST,
|
HttpMethod.POST,
|
||||||
entity,
|
entity,
|
||||||
|
@ -362,25 +357,12 @@ public class ClientConfigServiceImpl implements ClientConfigService {
|
||||||
log.warn("Failed to check access SebClientConfig {} response: {}", config, exchange.getStatusCode());
|
log.warn("Failed to check access SebClientConfig {} response: {}", config, exchange.getStatusCode());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (final Exception e) {
|
||||||
log.warn("Failed to check access for SebClientConfig: {} cause: {}", config, e.getMessage());
|
log.warn("Failed to check access for SebClientConfig: {} cause: {}", config, e.getMessage());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void flushClientConfigData(final EntityKey key) {
|
|
||||||
try {
|
|
||||||
final String clientName = this.sebClientConfigDAO.getSebClientCredentials(key.modelId)
|
|
||||||
.getOrThrow()
|
|
||||||
.clientIdAsString();
|
|
||||||
|
|
||||||
final Collection<OAuth2AccessToken> tokensByClientId = this.tokenStore.findTokensByClientId(clientName);
|
|
||||||
tokensByClientId.forEach(this.tokenStore::removeAccessToken);
|
|
||||||
} catch (final Exception e) {
|
|
||||||
log.error("Unexpected error while trying to flush ClientConfig data for {}", key, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void passwordEncryption(
|
private void passwordEncryption(
|
||||||
final OutputStream output,
|
final OutputStream output,
|
||||||
final CharSequence encryptionPassword,
|
final CharSequence encryptionPassword,
|
||||||
|
|
|
@ -8,6 +8,30 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.webservice.weblayer.api;
|
package ch.ethz.seb.sebserver.webservice.weblayer.api;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PipedInputStream;
|
||||||
|
import java.io.PipedOutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import javax.servlet.ServletOutputStream;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.joda.time.DateTime;
|
||||||
|
import org.joda.time.DateTimeZone;
|
||||||
|
import org.mybatis.dynamic.sql.SqlTable;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
|
import org.springframework.validation.FieldError;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.API;
|
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||||
import ch.ethz.seb.sebserver.gbl.api.APIMessage;
|
import ch.ethz.seb.sebserver.gbl.api.APIMessage;
|
||||||
|
@ -25,29 +49,6 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.dao.SebClientConfigDAO;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.ClientConfigService;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.ClientConfigService;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.validation.BeanValidationService;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.validation.BeanValidationService;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.apache.commons.lang3.BooleanUtils;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.joda.time.DateTime;
|
|
||||||
import org.joda.time.DateTimeZone;
|
|
||||||
import org.mybatis.dynamic.sql.SqlTable;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.MediaType;
|
|
||||||
import org.springframework.scheduling.annotation.EnableAsync;
|
|
||||||
import org.springframework.validation.FieldError;
|
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
import org.springframework.web.client.RestTemplate;
|
|
||||||
|
|
||||||
import javax.servlet.ServletOutputStream;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.PipedInputStream;
|
|
||||||
import java.io.PipedOutputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
@WebServiceProfile
|
@WebServiceProfile
|
||||||
@RestController
|
@RestController
|
||||||
|
@ -146,16 +147,16 @@ public class SebClientConfigController extends ActivatableEntityController<SebCl
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Result<SebClientConfig> notifySaved(SebClientConfig entity) {
|
protected Result<SebClientConfig> notifySaved(final SebClientConfig entity) {
|
||||||
if (entity.isActive()) {
|
if (entity.isActive()) {
|
||||||
// try to get access token for SEB client
|
// try to get access token for SEB client
|
||||||
sebClientConfigService.checkAccess(entity);
|
this.sebClientConfigService.checkAccess(entity);
|
||||||
}
|
}
|
||||||
return super.notifySaved(entity);
|
return super.notifySaved(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
private SebClientConfig checkPasswordMatch(final SebClientConfig entity) {
|
private SebClientConfig checkPasswordMatch(final SebClientConfig entity) {
|
||||||
Collection<APIMessage> errors = new ArrayList<>();
|
final Collection<APIMessage> errors = new ArrayList<>();
|
||||||
if (entity.hasEncryptionSecret() && !entity.encryptSecret.equals(entity.encryptSecretConfirm)) {
|
if (entity.hasEncryptionSecret() && !entity.encryptSecret.equals(entity.encryptSecretConfirm)) {
|
||||||
errors.add(APIMessage.fieldValidationError(
|
errors.add(APIMessage.fieldValidationError(
|
||||||
new FieldError(
|
new FieldError(
|
||||||
|
|
Loading…
Reference in a new issue